在本文中,我们将详细介绍MySQL基础的各个方面,并为您提供关于mysql基础语句大全的相关解答,同时,我们也将为您带来关于Mysql入门MySQL基础教程之IN的用法详解、Mysql入门MySQL基
在本文中,我们将详细介绍MySQL基础的各个方面,并为您提供关于mysql基础语句大全的相关解答,同时,我们也将为您带来关于Mysql入门MySQL基础教程之IN的用法详解、Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程、Mysql入门Mysql基础知识点汇总、mysql入门之1小时学会MySQL基础的有用知识。
本文目录一览:- MySQL基础(mysql基础语句大全)
- Mysql入门MySQL基础教程之IN的用法详解
- Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程
- Mysql入门Mysql基础知识点汇总
- mysql入门之1小时学会MySQL基础
MySQL基础(mysql基础语句大全)
数据库管理系统
库级操作语句
进入数据库:
MysqL u p
退出数据库:
显示所有库:
创建库:
;
显示库创建信息:
;
删除库:
;
切换当前库:
;
表级操作语句
显示所有表:
创建表:
[if not exists] (create_deFinition,...);
显示表创建信息:
show
tb_name;
删除表:
tb_name;
表增删改查
指定插入:
tb_name(col_names) (col_values);
全列插入:
tb_name (all_values);
多行插入:
tb_name(col_names) (value_1),(value_2),…;
指定列查询:
col_names tb_name;
全列查询:
tb_name;
带条件查询:
col_names tb_name conditions;
col_names tb_name id ;
改:
删:
tb_name a_field a_value;
删除或改变全部数据
<div>
id 默认长度11
name (),#指定长度,最多65535个字符。 sex (),#指定长度,最多255个字符。 price (, detail dates ,#日期时间类型 YYYYMM ping ENUM(,
裤子男这条裤子超级好!!!Now(),好评
Mysql入门MySQL基础教程之IN的用法详解
《MysqL入门MysqL基础教程之IN的用法详解》要点:
本文介绍了MysqL入门MysqL基础教程之IN的用法详解,希望对您有用。如果有疑问,可以联系我们。
MysqL学习MysqL IN 语法
MysqL学习IN 运算符用于 WHERE 表达式中,以列表项的形式支持多个选择,语法如下:
MysqL学习
WHERE column IN (value1,value2,...)
WHERE column NOT IN (value1,...)
MysqL学习当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择.
MysqL学习IN 使用实例
MysqL学习选取 uid 为 2、3、5 的用户数据:
MysqL学习
SELECT * FROM user WHERE uid IN (2,3,5)
MysqL学习返回查询结果如下:
uid | username | password | regdate | |
---|---|---|---|---|
2 | 小明 | a193686a53e4de85ee3f2ff0576adf01 | xiao@163.com | 1278063917 |
3 | Jack | 0193686a35e4de85ee3f2ff0567adf490 | jack@gmail.com | 1278061380 |
5 | 5idev | a193686a53e4de85ee3f2ff0576adf01 | 5idev@5idev.com | 1291107029 |
MysqL学习IN 子查询
MysqL学习更多情况下,IN 列表项的值是不明确的,而可能是通过一个子查询得到的:
MysqL学习
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=0)
MysqL学习在这个 sql 例子里,我们实现了查出所有状态为 0 的用户(可能是被禁止)的所有文章.首先通过一个查询得到所有所有 status=0 的用户:
MysqL学习
SELECT uid FROM user WHERE status=0
MysqL学习然后将查询结果作为 IN 的列表项以实现最终的查询结果,注意在子查询中返回的结果必须是一个字段列表项.
MysqL学习IN 运算符补充说明
MysqL学习IN 列表项不仅支持数字,也支持字符甚至时间日期类型等,并且可以将这些不同类型的数据项混合排列而无须跟 column 的类型保持一致:
MysqL学习
SELECT * FROM user WHERE uid IN(1,2,'3','c')
MysqL学习一个 IN 只能对一个字段进行范围比对,如果要指定更多字段,可以使用 AND 或 OR 逻辑运算符:
MysqL学习
SELECT * FROM user WHERE uid IN(1,2) OR username IN('admin','manong')
MysqL学习使用 AND 或 OR 逻辑运算符后,IN 还可以和其他如 LIKE、>=、= 等运算符一起使用.
MysqL学习 关于 IN 运算符的效率问题
MysqL学习如果 IN 的列表项是确定的,那么可以用多个 OR 来代替:
MysqL学习
SELECT * FROM user WHERE uid IN (2,5)
MysqL学习// 等效为:
MysqL学习
SELECT * FROM user WHERE (uid=2 OR aid=3 OR aid=5)
MysqL学习一般认为,如果是对索引字段进行操作,使用 OR 效率高于 IN,但对于列表项不确定的时候(如需要子查询得到结果),就必须使用 IN 运算符.另外,对于子查询表数据小于主查询的时候,也是适用 IN 运算符的.
MysqL学习 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程
《MysqL入门MysqL基础教程第一篇 MysqL5.7.18安装和连接教程》要点:
本文介绍了MysqL入门MysqL基础教程第一篇 MysqL5.7.18安装和连接教程,希望对您有用。如果有疑问,可以联系我们。
从这篇开始,用一个新的系列文章去介绍和学习MysqL.为什么要学习MysqL,从产品角度来说,大部分软件的数据库服务还是采取关系型数据库,主要的数据库产品有Oracle、微软的MSsql、IBM的DB2、和我们要介绍的MysqL.MysqL是很多中小型的网站服务器中数据库的首选,它有免费版,也有商业版,目前是Oracle的产品.从测试人员的角度来说,越来越多的软件产品是和数据有关,例如电商,和一些某一个领域内的数据库服务查询的软件产品.测试人员除了要做基本的软件功能测试之外,公司更希望测试人员可以了解更多的业务知识,通常这些业务数据,大部分时候是要和数据库打交道.所以,测试人员,要掌握一些数据库的基本操作和会写SQL查询语句,会写SQL查询语句在很多职位介绍里都有提到.
MysqL数据库
简单的增删改查sql语句,网上有很多文章和举例.我这里是想通过安装MysqL和简单使用,然后再练习一下sql的查询编写,这样才比较有系统掌握sql语句.很多时候,你有网上的sql练习语句,但是你没有sql Server环境,你不好去理解和快速掌握sql语句.所以,我们第一篇从安装MysqL 服务端和客户端,创建数据库和连接数据库开始.
MysqL数据库
一. MysqL Server的下载和安装
MysqL数据库
1. 打开网址:https://dev.MysqL.com/downloads/MysqL/,这里我们下载的社区免费版本
MysqL数据库
2.下拉页面,找到Donwload这个按钮,根据你的机器操作系统版本,选择32还是64位版本,当前最新版本是5.7.18
MysqL数据库
3.下载完后,默认安装,我们就选择安装MysqL Server,其他的组件不勾选.
MysqL数据库
4.安装过程,给root创建一个密码,我这里设置密码为root,如下图.MysqL数据库
需要点击Add User,添加一个DAB账号:test/123456,输入用户名和密码,如下图MysqL数据库
点击下一步,默认到安装结束.安装MysqL Server后,以后每次启动电脑,就开始了数据库相关服务.现在数据库服务器端我们安装好了,接下来,我们需要安装一个可视化,图形界面客户端去连接数据库.这里我们用MysqL Workbench.
MysqL数据库
二.MysqL Workbench的下载和安装
MysqL数据库
1. 打开网址https://dev.MysqL.com/downloads/workbench/
MysqL数据库
2. 找到“Windows (x86,64-bit),MSI Installer”
MysqL数据库
3. 点击Download下载按钮
MysqL数据库
4.在新页面,下拉,我们不需要登录账户,点击No thanks,just start my download.
MysqL数据库
5.开始下载.
MysqL数据库
6.下载结束后,开始安装,界面如下:MysqL数据库
三.MysqL Workbench上连接数据库
MysqL数据库
打开MysqL Workbench,界面如下MysqL数据库
如果安装正常,MysqL Workbench会在MysqL Connections下显示本地数据库可以连接,如下图.MysqL数据库
点击这个灰色背景区域,就弹出输入root的密码,上面我们安装MysqL Server的时候,设置密码是root,输入密码后,点击连接,可以成功连接本地数据库.如果没有这个灰色,你点击旁边的+按钮,根据面板内容,选择本地服务的数据库,应该可以连接上.
MysqL数据库
1.创建一个我们自己的数据库db1MysqL数据库
点击上图红框,根据提示创建一个新数据库,名称输入db1,编码选择utf-8,创建的数据库,在左侧面板下面可以看到.MysqL数据库
上图中db1是我们新建的数据库,sys是MysqL Server安装完后,默认的一个数据库.以后我们都用MysqL Workbench来连接我们数据库,然后手动或者sql语句去创建表等相关数据,整体界面如下.MysqL数据库
基本的sql环境就介绍到这里,下一篇讲如何在db1这个数据库下创建表和表中的列的过程.MysqL数据库
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编PHP.MysqL数据库
Mysql入门Mysql基础知识点汇总
《MysqL入门MysqL基础知识点汇总》要点:
本文介绍了MysqL入门MysqL基础知识点汇总,希望对您有用。如果有疑问,可以联系我们。
MysqL入门1.什么是sql语句
MysqL入门sql语言:结构化的查询语言.(Structured Query Language),是关系数据库管理系统的标准语言.
MysqL入门它是一种解释语言:写一句执行一句,不需要整体编译执行.
MysqL入门语法特点:
MysqL入门1.没有“ ”,字符串使用‘ '包含
2.没有逻辑相等,赋值和逻辑相等都是=
3.类型不再是最严格的.任何数据都可以包含在‘ '以内
4.没有bool值的概念,但是在视图中可以输入true/false
5.它也有关系运算符:> < >= <= = <> !=,它返回一个bool值
6.它也有逻辑运算符: !(not) &&(and) ||(or)
7.它不区别大小写
MysqL入门2.使用sql语句创建数据库和表
MysqL入门语法:
MysqL入门
create database 数据库名称
on primary --默认在主文件组上
(
name='逻辑名称_data',--当你发现它不是一句完整的sql语句,而仅仅是一个处理结构中的某一句的时候,就需要添加,size=初始大小,--数值不包含在‘'以内
filegrowth=文件增长,maxsize=最大容量,filename='物理路径'
)
log on
(
name='逻辑名称_log',--一般来说日志文件不限制最大容量
filename='物理路径'
)
MysqL入门
--判断数据库文件是否已经存在 :数据库的记录都存储在master库中的sysdatabases表中
--自动切换当前数据库
--使用代码开启外围应该配置器
MysqL入门
exec sp_configure 'show advanced options',1
RECONfigURE
exec sp_configure 'xp_cmdshell',1
RECONfigURE
MysqL入门--自定义目录 xp_cmdshell可以创建出目录 'mkdir f:\project':指定创建目录
exec xp_cmdshell 'mkdir f:\project'
MysqL入门use master
--exists 函数判断()中的查询语句是否返回结果集,如果返回了结果集则得到true,否则得到false
MysqL入门
if exists( select * from sysdatabases where name='School')
drop database School --删除当前指定名称的数据库
create database School
on primary
(
name='School_data',--逻辑名称.说明最多能够存储100mb数据,如果没有限制就可以将硬盘存储满
size=3mb,--初始大小
maxsize=100mb,--最大容量
filegrowth=10%,--文件增长一次增长10%
filename='f:\project\School_data.mdf'
),
MysqL入门--创建文件组
MysqL入门
filegroup mygroup
(
name='School_data1',--文件增长一次增长10%
filename='F:\qiyi\School_data1.ndf'
)
log on
(
name='School_log',--逻辑名称
size=3mb,--初始大小
--maxsize=100mb,--文件增长一次增长10%
filename='f:\project\School_log.ldf'
),(
name='School_log1',--文件增长一次增长10%
filename='F:\qiyi\School_log1.ldf'
)
MysqL入门3.创建数据表
MysqL入门语法:
MysqL入门create table 表名
(
字段名称 字段类型 字段特征(是否为null,默认值 标识列 主键 唯一键 外键 check约束),
字段名称 字段类型 字段特征(是否为null,默认值 标识列 主键 唯一键 外键 check约束)
)
创建老师表Teacher :Id、Name、Gender、Age、Salary、Birthday
MysqL入门
use School
if exists(select * from sysobjects where name='Classes')
drop table Classes
create table Classes
(
Classid int identity(1,1),ClassName nvarchar(50) not null
)
if exists(select * from sysobjects where name='teacher')
drop table teacher
create table Teacher
(
Id int identity(1,--可以同时创建多个特征,用空格 分隔开. identity是标识列,第一个参数是种子,第二个是增量
Name nvarchar(50) not null,-- not null标记它的值不能为null--不能不填写
ClassId int not null,Gender bit not null,Age int,Salary money,--如果不标记为 not null.那么就相当于标记了null
Birthday datetime
)
MysqL入门4.数据完整性约束
MysqL入门实体完整性:实体就是指一条记录.这种完整性就是为了保证每一条记录不是重复记录.是有意义的
MysqL入门主键:非空和唯一.一个表只有一个主键,但是一个主键可以是由多个字段组成的 组合键
标识列:系统自动生成,永远不重复
唯一键:唯一,但是可以为null,只能null一次
域完整性:域就是指字段,它是为了保证字段的值是准和有效,合理值
MysqL入门类型 是否null,默认值,check约束,关系
自定义完整性:
MysqL入门check约束,存储过程 触发器
引用完整性:一个表的某个字段的值是引用自另外一个表的某个字段的值.引用的表就是外键表,被引用的表就是主键表
MysqL入门1.建立引用的字段类型必须一致
2.建立引用的字段的意义一样
3.建立主外键关系的时候选择 外键表 去建立主外键关系
4.建立主外键关系的字段在主表中必须是主键或者唯一键
MysqL入门5.对于操作的影响
MysqL入门①.在添加数据时,先添加主键表再添加外键表数据
②.在删除的时候先外键表数据再删除主键表数据
MysqL入门级联的操作:不建议使用:会破坏数据完整性
不执行任何操作:该报错就报错,该删除就删除
级联:删除主表记录,从表引用该值的记录也被删除
设置null:删除主表记录,从表对应的字段值设置为null,前提是可以为null
设置为default:删除主表记录,从表对应的字段值设置为default,前提是可以为default
主键约束(PK Primary key)唯一键约束(UQ unique) 外键约束(FK foreign key) 默认值约束(DF default) check约束(CK check)
MysqL入门语法:
MysqL入门alter table 表名
add constraint 前缀_约束名称 约束类型 约束说明(字段 关系表达式 值)
use School
if exists(select * from sysobjects where name='PK_Classes_Classid')
alter table classes drop constraint PK_Classes_Classid
alter table classes
add constraint PK_Classes_Classid primary key(classid)
--为id添加主键
alter table teacher
add constraint PK_teacher_id primary key(id)
--为name添加唯一键
alter table teacher
add constraint UQ_Teacher_Name unique(Name)
--同时创建salary的默认约束和age的check约束
alter table teacher
add constraint DF_Teacher_Salary default(5000) for salary,
constraint CK_Teacher_Age check(age>0 and age<=100)
--为teacher表的classid字段创建主外键
if exists(select * from sysobjects where name='FK_Teacher_Classes_Classid')
alter table teacher drop constraint FK_Teacher_Classes_Classid
alter table teacher
with nocheck --不检查现有数据
add constraint FK_Teacher_Classes_Classid foreign key(classid) references classes(classid)
--on delete set default 级联操作
--不执行任何操作:该报错就报错,该删除就删除 --no action --默认选择
--级联:删除主表记录,从表引用该值的记录也被删除 --cascade
--设置null:删除主表记录,前提是可以为null --set null
--设置为default:删除主表记录,前提是可以为default --set default
MysqL入门5.四中基本字符类型说明
MysqL入门--len(参数) --获取指定参数内容的字符个数
select LEN('abcd') 【4】运行结果
select LEN('中华人民共和国') 【7】
MysqL入门--DataLength(参数):获取指定内占据的字节数--空间大小
select DataLength('abcd') 【4】
select DataLength('中华人民共和国') 【14】
MysqL入门--char类型:当空间分配后,不会因为存储的内容比分配的空间小就回收分配的空间.但是如果存储的内容超出了指定的空间大小,就会报错,当你存储的内容的长度变化区间不大的时候可以考虑使用char
select LEN(char) from CharTest 【2】
select DataLength(char) from CharTest 【10】
MysqL入门--varchar var--变化的:当你存储的内容小于分配的空间的时候,多余的空间会自动收缩.但是如果存储的内容超出了指定的空间大小,就会报错 当存储的内容波动区间比较大时候使用varchar
select LEN(varchar) from CharTest 【2】
select DataLength(varchar) from CharTest 【2】
MysqL入门--nchar-- n代表它是一个unicode字符.规定不管什么样的字符都占据两个字节. char:空间是固定的
select LEN(nchar) from CharTest 【10】
select DataLength(nchar) from CharTest 【20】
MysqL入门--nvarchar n var char
select LEN(nvarchar) from CharTest 【2】
select DataLength(nvarchar) from CharTest 【4】
MysqL入门6.sql基本语句
MysqL入门数据插入
MysqL入门调用方法 一 一对应原则:类型对应,数量对应,顺序对应.
MysqL入门语法: 形参 实参
MysqL入门insert into 表名([字段列表]) values(值列表) --数据必须要符合数据完整性
插入操作是单个表的操作
插入操作insert一次只能插入一条记录
use School
--插入teacher所有字段的数据.如果在表后没有指定需要插入的字段名称,那么就默认为所有字段添加值
--但是一定需要注意的是:标识列永远不能自定义值--不能人为插入值
--仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'Teacher'中的标识列指定显式值.
insert into Teacher values('张三',5,1,30,4000,'1984-9-11')
insert into Teacher(Name,ClassId,Gender,Age,Salary,Birthday) values('张三','1984-9-11')
--不为可以为null的字段插入值 :可以null的字段可以不赋值
--列名或所提供值的数目与表定义不匹配
insert into Teacher(Name,Salary) values('李四',4000)
--非空字段一定需要赋值 :不能将值 NULL 插入列 'Gender',表 'School.dbo.Teacher';列不允许有 Null 值.INSERT 失败
insert into Teacher(Name,4000)
--为有默认值的字段插入值:
--1.不写这一列让系统自动赋值
insert into Teacher(Name,Age) values('王五',30)
--指定 null或者default
insert into Teacher(Name,Birthday) values('赵六',default,null)
--数据必须完全符合表的完整性约束
insert into Teacher(Name,Birthday) values('赵六1',300,null)
MysqL入门--任意类型的数据都可以包含在''以内, 不包括关键字
insert into Teacher(Name,Birthday) values('马鹏飞','5','0','15',null)
--但是字符串值如果没有包含在''以内.会报错 列名 '兰鹏' 无效.
insert into Teacher(Name,Birthday) values('兰鹏',null)
--但是数值组成的字符串可以不使用''包含
insert into Teacher(Name,Birthday) values(123,null)
--日期值必须包含在'‘以内,否则就是默认值
insert into Teacher(Name,Birthday) values('邹元标2','1991-9-11')
数据删除
MysqL入门语法:
MysqL入门delete [from] 表名 where 条件
delete from Teacher where Age<20
--特点:
--1.删除是一条一条进行删除的
--2.每一条记录的删除都需要将操作写入到日志文件中
--3.标识列不会从种子值重新计算,以从上次最后一条标识列值往下计算
--4.这种删除可以触发delete触发器
MysqL入门--truncate table 表名 --没有条件,它是一次性删除所有数据
--特点:
--1.一次性删除所有数据,没有条件,那么日志文件只以最小化的数据写入
--2.它可以使用标识列从种子值重新计算
--3.它不能触发delete触发器
truncate table teacher
数据更新(数据修改):一定需要考虑是否有条件
MysqL入门语法:
MysqL入门update 表名 set 字段=值,字段=值 ..where 条件
update Teacher set Gender='true'
--修改时添加条件
update Teacher set Gender=0 where Id=20
--多字段修改
update Teacher set ClassId=4,Age+=5,Salary=5000 where Id=22
--修改班级id=4,同时年龄》20岁的人员工资+500
update Teacher set Salary=Salary+500 where ClassId=4 and Age>20
数据检索--查询
MysqL入门语法: *代表所有字段
MysqL入门select */字段名称列表 from 表列表
select StudentNo,StudentName,Sex,[Address] from Student
--可以为标题设置 别名,别名可以是中文别名
select StudentNo as 学号,StudentName 姓名,性别=Sex,[Address] from Student
--添加常量列
select StudentNo as 学号,[Address],国籍='中华人民共和国' from Student
--select的作用
--1.查询
--2.输出
select 1+1
--+是运算符,系统会自动为你做类型转换
select 1+'1'
select '1'+1
--如果+两边都是字符串,那么它就是一字符串连接符
select '1'+'1'
select 'a'+1
--可以输出多列值
select 1,2,34,3,545,67,567,6,7
--Top、distinct
select * from Student
--top可以获取指定的记录数,值可以大于总记录数.但是不能是负值
select top 100 * from Student
--百分比是取ceiling()
select top 10 percent * from Student
MysqL入门--重复记录与原始的数据表数据无关,只与你查询的结果集有关系 distinct可以去除结果集中的重复记录--结果集中每一列的值都一样
select distinct LoginPwd,Email from Student
select distinct Sex from Student
MysqL入门select的作用
--聚合函数:
--1.对null过滤
--2.都需要有一个参数
--3.都是返回一个数值
--sum():求和:只能对数值而言,对字符串和日期无效
--avg():求平均值
--count():计数:得到满足条件的记录数
--max():求最大值:可以对任意类型的数据进行聚合,如果是字符串就比较拼音字母进行排序
--min():求最小值
--获取学员总人数
select COUNT(*) from Student
--查询最大年龄值
select MIN(BornDate) from Student
select max(BornDate) from Student
MysqL入门--查询总分
select SUM(StudentResult) from Result where StudentNo=2
--平均分
select avg(StudentResult) from Result where SubjectId=1
--注意细节:
select SUM(StudentName) from Student
select SUM(BornDate) from Student
MysqL入门select min(StudentName) from Student
select max(StudentName) from Student
MysqL入门--查询学号,姓名,性别,年龄,电话,地址 ---查询女生
select StudentNo,BornDate,Address from Student where Sex='女' and BornDate >'1990-1-1' and Address='广州传智播客'
--指定区间范围
select StudentNo,Address from Student where BornDate >='1990-1-1' and BornDate<='1993-1-1'
--between...and >= <=
select StudentNo,Address from Student where BornDate between '1990-1-1' and '1993-1-1'
--查询班级id 1 3 5 7的学员信息
select * from Student where ClassId=1 or ClassId=3 or ClassId=5 or ClassId=7
--指定具体的取值范围--可以是任意类型的范围.值的类型需要一致--可以相互转换
select * from Student where ClassId in(1,7)
select * from Student where ClassId not in(1,7)
MysqL入门聚合函数
--带条件的查询-模糊查询-- 只针对字符串而言
MysqL入门--查询 姓 林 的女生信息
--=是一种精确查询,需要完全匹配
select * from Student where Sex='女' and StudentName='林'
--通配符--元字符
--%:任意个任意字段 window:* 正则表达式 :.*
--_:任意的单个字符
--[]:代表一个指定的范围,范围可以是连续也可以是间断的.与正则表达式完全一样[0-9a-zA-Z].可以从这个范围中取一个字符
--[^]:取反值
select * from Student where Sex='女' and StudentName='林%'
--通配符必须在模糊查询关键的中才可以做为通配符使用,否则就是普通字符
--like 像 ....一样
select * from Student where Sex='女' and StudentName like '林%'
select * from Student where Sex='女' and StudentName like '林_'
--[]的使用 学号在11~15之间的学员信息
select * from Student where StudentNo like '[13579]'
MysqL入门---处理null值
--null:不是地址没有分配,而是不知道你需要存储什么值 所以null是指 不知道.但是=只能匹配具体的值,而null根本就不是一个值
select COUNT(email) from Student where Email !=null
select COUNT(email) from Student where Email is null
select count(email) from Student where Email is not null
--将null值替换为指定的字符串值
select StudentName,ISNULL(Email,'没有填写电子邮箱') from Student where ClassId=2
MysqL入门模糊查询
--当你看到 每一个,各自,不同,分别 需要考虑分组
--查询每一个班级的男生人数
--与聚合函数一起出现在查询中的列,要么也被聚合,要么被分组
select classid,COUNT(*) from Student where Sex='男' group by ClassId,sex
--查询每一个班级的总人数,显示人数>=2的信息
--1.聚合不应出现在 WHERE 子句中--语法错误
select ClassId,COUNT(*) as num from Student where Email is not null GROUP by ClassId having COUNT(*)>=2 order by num desc
--完整的SQL查询家庭
--5 1 2 3 4 6
--select 字段列表 from 表列表 where 数据源做筛选 group by 分组字段列表 having 分组结果集做筛选 Order by 对结果集做记录重排
MysqL入门select ClassId,COUNT(*) as num from Student where Email is not null GROUP by ClassId order by ClassId desc
MysqL入门--关于top的执行顺序 排序之后再取top值
select top 1 ClassId,COUNT(*) as num from Student GROUP by ClassId order by num desc
MysqL入门分组统计
MysqL入门7.类型转换函数
MysqL入门--select :输出为结果集--虚拟表
--print:以文本形式输出 只能输出一个字符串值.
MysqL入门print 1+'a'
select 1,2
MysqL入门select * from Student
MysqL入门--类型转换
--Convert(目标类型,源数据,[格式]) --日期有格式
print '我的成绩是:'+convert(char(3),100)
MysqL入门print '今天是个大日子:'+convert(varchar(30),getdate(),120)
select getdate()
select len(getdate())
MysqL入门--cast(源数据 as 目标类型) 它没有格式
print '我的成绩是:'+cast(100 as char(3))
MysqL入门8.日期函数
MysqL入门--getdate():获取当前服务器日期
select GETDATE()
--可以在源日期值是追加指定时间间隔的日期数
select DATEADD(dd,-90,GETDATE())
--dateDiff:找到两个日期之间指定格式的差异值
select StudentName,DATEDIFF(yyyy,BornDate) as age from Student order by age
--DATENAME:可以获取日期的指定格式的字符串表现形式
select DATENAME(dw,getdate())
--DATEPART:可以获取指定的日期部分
select cast(DATEPART(yyyy,getdate()) as CHAR(4))+'-' +cast(DATEPART(mm,getdate()) as CHAR(2))+'-' +cast(DATEPART(dd,getdate()) as CHAR(2))
MysqL入门9.数学函数
MysqL入门--rand:随机数:返回0到1之间的数,理论上说可以返回0但是不能返回1
select RAND()
--abs:absolute:取绝对值
select ABS(-100)
--ceiling:获取比当前数大的最小整数
select CEILING(1.00)
--floor:获取比当前数小的最大整数
select floor(1.99999)
power:
select POWER(3,4)
--round():四舍五入.只关注指定位数后一位
select ROUND(1.549,1)
--sign:正数==1 负数 ==-1 0=0
select SIGN(-100)
MysqL入门select ceiling(17*1.0/5)
MysqL入门10.字符串函数
MysqL入门--1.CHARINDEX --IndexOf():能够返回一个字符串在源字符串的起始位置.找不到就返回0,如果可以找到就返回从1开始的索引--没有数组的概念
--第一个参数是指需要查询的字符串,第二个是源字符串,第三个参数是指从源字符的那个索引位置开始查找
select CHARINDEX('人民','中华人民共和国人民',4)
--LEN():可以返回指定字符串的字符个数
select LEN('中华人民共和国')
--UPPER():小写字母转换为大写字母 LOWER():大写转小写
select LOWER(UPPER('sadfasdfa'))
--LTRIM:去除左空格 RTIRM:去除右空格
select lTRIM(RTRIM(' sdfsd '))+'a'
--RIGHT:可以从字符串右边开始截取指定位数的字符串 如果数值走出范围,不会报错,只会返回所有字符串值,但是不能是负值
select RIGHT('中华人民共和国',40)
select LEFT('中华人民共和国',2)
--SUBSTRING()
select SUBSTRING('中华人民共和国',2)
--REPLACE 第一个参数是源字符串,第二个参数是需要替换的字符串,第三个参数是需要替换为什么
select REPLACE('中华人民共和国','人民','居民')
select REPLACE('中 华 人民 共 和 国',' ','')
--STUFF:将源字符串中从第几个开始,一共几个字符串替换为指定的字符串
select STUFF('中华人民共和国','你懂的')
MysqL入门--sudyfsagfyas@12fasdf6.fsadfdsaf
MysqL入门declare @email varchar(50)='sudyfsagfyas@12fasdf6.fsadfdsaf'
select CHARINDEX('@',@email)
select LEFT(@email,CHARINDEX('@',@email)-1)
MysqL入门--使用right
select right(@email,len(@email)-CHARINDEX('@',@email))
--使用substring
select SUBSTRING(@email,@email)+1,LEN(@email))
--使用stuff
select STUFF(@email,@email),'')
MysqL入门11.联合结果集union
MysqL入门--联合结果集union
select * from Student where Sex='男'
--union
select * from Student where Sex='女'
MysqL入门--联合的前提是:
--1.列的数量需要一致:使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式
--2.列的类型需要可以相互转换
select StudentName,Sex from Student --在字符串排序的时候,空格是最小的,排列在最前面
union
select cast(ClassId as CHAR(3)),classname from grade
MysqL入门--union和union all的区别
--union是去除重复记录的
--union all不去除重复 :效率更高,因为不需要判断记录是否重复,也没有必须在结果庥是执行去除重复记录的操作.但是可以需要消耗更多的内存存储空间
select * from Student where ClassId=2
union all
select * from Student where ClassId=2
MysqL入门--查询office这科目的全体学员的成绩,同时在最后显示它的平均分,最高分,最低分
select ' '+cast(StudentNo as CHAR(3)),cast(SubjectId as CHAR(2)),StudentResult from Result where SubjectId=1
union
select '1','平均分',AVG(StudentResult) from Result where SubjectId=1
union
select '1','最高分',max(StudentResult) from Result where SubjectId=1
union
select '1','最低分',min(StudentResult) from Result where SubjectId=1
MysqL入门--一次性插入多条数据
--1.先将数据复制到另外一个新表中,删除源数据表,再将新表的数据插入到源数据表中
--1.select */字段 into 新表 from 源表
--1.新表是系统自动生成的,不能人为创建,如果新表名称已经存在就报错
--2.新表的表结构与查询语句所获取的列一致,但是列的属性消失,只保留非空和标识列.其它全部消失,如主键,唯一键,关系,约束,默认值
select * into newGrade from grade
MysqL入门truncate table grade
select * from newGrade
--select * into grade from newGrade
--2.insert into 目标表 select 字段列表/* from 数据源表
--1、目标表必须先存在,如果没有就报错
--2.查询的数据必须符合目标表的数据完整性
--3.查询的数据列的数量和类型必须的目标的列的数量和对象完全对应
insert into grade select classname from newGrade
delete from admin
--使用union一次性插入多条记录
--insert into 表(字段列表)
--select 值.... 用户自定义数据
--union
--select 值 ....
insert into Admin
select 'a','a'
union all
select 'a',null
MysqL入门12.CASE函数用法
MysqL入门相当于switch case---c#中的switch...case只能做等值判断
这可以对字段值或者表达式进行判断,返回一个用户自定义的值,它会生成一个新列.
2.要求then后面数据的类型一致
1.第一种做等值判断的case..end
MysqL入门case 字段或者表达式
when .值..then .自定义值
when .值..then .自定义值
.....
else 如果不满足上面所有的when就满足这个else
end
--显示具体班级的名称
select StudentNo,
case ClassId --如果case后面接有表达式或者字段,那么这种结构就只能做等值判断,真的相当于switch..case
when 1 then '一班'
when 2 then '2班'
when 3 then '3班'
when null then 'aa' --不能判断null值
else '搞不清白'
end,
sex
from Student
--2.做范围判断,相当于if..else,它可以做null值判断
--case --如果没有表达式或者字段就可实现范围判断
-- when 表达式 then 值 --不要求表达式对同一字段进行判断
-- when 表达式 then 值
-- .....
--else 其它情况
--end
select StudentNo,
case
when BornDate>'2000-1-1' then '小屁孩'
when BornDate>'1990-1-1' then '小青年'
when BornDate>'1980-1-1' then '青年'
--when Sex='女' then '是女的'
when BornDate is null then '出生不详'
else '中年'
end
from Student
MysqL入门--百分制转换为素质教育 90 -A 80--B 70 --C 60 --D <60 E NULL--没有参加考试
select StudentNo,SubjectId,
case
when StudentResult>=90 then 'A'
when StudentResult>=80 then 'B'
when StudentResult>=70 then 'C'
when StudentResult>=60 then 'D'
when StudentResult is null then '没有参加考试'
else 'E'
end 成绩,
ExamDate
from Result
MysqL入门13.IF ELSE语法
MysqL入门1.没有{},使用begin..end.如果后面只有一句,可以不使用begin..end包含
2.没有bool值,只能使用关系运算符表达式
3.也可以嵌套和多重
4.if后面的()可以省略
MysqL入门declare @subjectname nvarchar(50)='office' --科目名称
declare @subjectId int=(select Subjectid from Subject where SubjectName=@subjectname) --科目ID
declare @avg int --平均分
set @avg=(select AVG(StudentResult) from Result where SubjectId=@subjectId and StudentResult is not null) --获取平均分
print @avg
if @avg>=60
begin
print '成绩不错,输出前三名:'
select top 3 * from Result where SubjectId=@subjectId order by StudentResult desc
end
else
begin
print '成绩不好,输出后三名:'
select top 3 * from Result where SubjectId=@subjectId order by StudentResult
end
MysqL入门14.WHILE循环语法
MysqL入门1.没有{},使用begin..end
2.没有bool值,需要使用条件表达式
3.可以嵌套
4.也可以使用break,continue
MysqL入门
go
declare @subjectName nvarchar(50)='office' --科目名称
declare @subjectId int--科目ID
declare @classid int =(select classid from Subject where SubjectName=@subjectName) --查询当前科目属于那一个班级
set @subjectId=(select SubjectId from Subject where SubjectName=@subjectName) --获取科目ID
declare @totalCount int --总人数 :那一个班级需要考试这一科目
set @totalCount=(select COUNT(*) from Student where ClassId=@classid)
print @totalcount --14
declare @unpassNum int --不及格人数
set @unpassNum=(select COUNT(distinct Studentno) from Result where SubjectId=@subjectId and StudentNo in(select StudentNo from Student where ClassId=@classid) and StudentResult<60)
while(@unpassNum>@totalCount/2)
begin
--执行循环加分
update Result set StudentResult+=2 where SubjectId=@subjectId and StudentNo in(select StudentNo from Student where ClassId=@classid) and StudentResult<=98
--重新计算不及格人数
set @unpassNum=(select COUNT(distinct Studentno) from Result where SubjectId=@subjectId and StudentNo in(select StudentNo from Student where ClassId=@classid) and StudentResult<60)
end
go
declare @subjectName nvarchar(50)='office' --科目名称
declare @subjectId int--科目ID
declare @classid int =(select classid from Subject where SubjectName=@subjectName) --查询当前科目属于那一个班级
set @subjectId=(select SubjectId from Subject where SubjectName=@subjectName) --获取科目ID
declare @totalCount int --总人数
set @totalCount=(select COUNT(*) from Student where ClassId=@classid)
print @totalcount --14
declare @unpassNum int --不及格人数
while(1=1)
begin
set @unpassNum=(select COUNT(distinct Studentno) from Result where SubjectId=@subjectId and StudentNo in(select StudentNo from Student where ClassId=@classid) and StudentResult<60)
if(@unpassNum>@totalCount/2)
update Result set StudentResult+=2 where SubjectId=@subjectId and StudentNo in(select StudentNo from Student where ClassId=@classid) and StudentResult<=98
else
break
end
MysqL入门15.子查询
MysqL入门子查询:一个查询中包含另外一个查询.被包含的查询就称为子查询,包含它的查询就称父查询.
1.子查询的使用方式:使用()包含子查询
2.子查询分类:
MysqL入门独立子查询:子查询可以直接独立运行.
查询比“王八”年龄大的学员信息
select * from Student where BornDate<(select BornDate from Student where StudentName='王八')
相关子查询:子查询使用了父查询中的结果
--子查询的三种使用方式
--1.子查询做为条件,子查询接在关系运算符后面 > < >= <= = <> !=,如果是接这关系运算符后面,必须保证 子查询只返回一个值
--查询六期班的学员信息
select * from Student where ClassId=(select ClassId from grade where classname='八期班')
--子查询返回的值不止一个.当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的.
select * from Student where ClassId=(select ClassId from grade)
--查询八期班以外的学员信息
--当子查询返回多个值(多行一列),可以使用in来指定这个范围
select * from Student where ClassId in(select ClassId from grade where classname<>'八期班')
--当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式.如果是多行多列或者一行多列就需要使用exists
--使用 EXISTS 关键字引入子查询后,子查询的作用就相当于进行存在测试.外部查询的 WHERE 子句测试子查询返回的行是否存在
select * from Student where EXISTS(select * from grade)
select * from Student where ClassId in(select * from grade)
MysqL入门--2.子查询做为结果集--
select top 5 * from Student --前五条
--使用top分页
select top 5 * from Student where StudentNo not in(select top 5 studentno from Student)
--使用函数分页 ROW_NUMBER() over(order by studentno),可以生成行号,排序的原因是因为不同的排序方式获取的记录顺序不一样
select ROW_NUMBER() over(order by studentno),* from Student
--查询拥有新生成行号的结果集 注意:1.子查询必须的别名 2.必须为子查询中所有字段命名,也就意味着需要为新生成的行号列命名
select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where temp.id>0 and temp.id<=5
select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where temp.id>5 and temp.id<=10
select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where temp.id>10 and temp.id<=15
MysqL入门--3.子查询还可以做为列的值
select (select studentname from student where studentno=result.studentno),(select subjectname from subject where subjectid=result.SubjectId),StudentResult from Result
MysqL入门--使用Row_number over()实现分页
--1.先写出有行号的结果集
select ROW_NUMBER() over(order by studentno),* from Student
--2.查询有行号的结果集 子查询做为结果集必须添加别名,子查询的列必须都有名称
select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where id>0 and id<=5
--查询年龄比“廖杨”大的学员,显示这些学员的信息
select * from Student where BornDate<(select BornDate from Student where StudentName='廖杨')
--查询二期班开设的课程
select * from Subject where ClassId=(select ClassId from grade where classname='二期班')
--查询参加最近一次“office”考试成绩最高分和最低分
--1查询出科目 ID
select subjectid fromSubjectwhereSubjectName='office'--2.查询出这一科目的考试日期select MAX(ExamDate)fromresultwhereSubjectId=(select subjectid fromSubjectwhereSubjectName='office')--3,写出查询的框架select MAX(StudentResult),MIN(StudentResult)fromresultwhereSubjectId=()andExamDate=()--4.使用子查询做为条件select MAX(StudentResult),MIN(StudentResult)fromresultwhereSubjectId=(select subjectid fromSubjectwhereSubjectName='office')andExamDate=(select MAX(ExamDate)fromresultwhereSubjectId=(select subjectid fromSubjectwhereSubjectName='office'))
MysqL入门16.表连接Join
MysqL入门--1.inner join :能够找到两个表中建立连接字段值相等的记录
--查询学员信息显示班级名称
select Student.StudentNo,Student.StudentName,grade.classname
from Student
inner join grade on Student.ClassId=grade.ClassId
--左连接: 关键字前面的表是左表,后面的表是右表
--左连接可以得到左表所有数据,如果建立关联的字段值在右表中不存在,那么右表的数据就以null值替换
select PhoneNum.*,PhoneType.*
from PhoneNum
left join PhoneType on PhoneNum.pTypeId=PhoneType.ptId
--右连接: 关键字前面的表是左表,后面的表是右表
--右连接可以得到右表所有数据,如果建立关联的字段值在右左表中不存在,那么左表的数据就以null值替换
select PhoneNum.*,PhoneType.*
from PhoneNum
right join PhoneType on PhoneNum.pTypeId=PhoneType.ptId
--full join :可以得到左右连接的综合结果--去重复
select PhoneNum.*,PhoneType.*
from PhoneNum
full join PhoneType on PhoneNum.pTypeId=PhoneType.ptId
MysqL入门17.事务
MysqL入门一种处理机制.以事务处理的操作,要么都能成功执行,要么都不执行.
MysqL入门事务的四个特点 ACID:
MysqL入门A:原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行.它是一个整体,不能再拆分
C:一致性:事务在完成时,必须使所有的数据都保持一致状态..某种程度的一致
I:隔离性:事务中隔离,每一个事务是单独的请求将单独的处理,与其它事务没有关系,互不影响
D:持久性:如果事务一旦提交,就对数据的修改永久保留
使用事务:
MysqL入门将你需要操作的sql命令包含在事务中.
MysqL入门1.在事务的开启和事务的提交之间
2.在事务的开启和事务的回滚之间
MysqL入门三个关键语句:
MysqL入门开启事务:begin transaction
提交事务:commit transaction
回滚事务:rollback transaction
declare @num int =0 --记录操作过程中可能出现的错误号
begin transaction
update bank set cmoney=cmoney-500 where name='aa'
set @num=@num+@@ERROR
--说明这一句的执行有错误 但是不能在语句执行的过程中进行提交或者回滚
--语句块是一个整体,如果其中一句进行了提交或者回滚,那么后面的语句就不再属于当前事务,
--事务不能控制后面的语句的执行
MysqL入门
update bank set cmoney=cmoney+500 where name='bb'
set @num=@num+@@ERROR
select * from bank
if(@num<>0 ) --这个@@ERROR只能得到最近一一条sql语句的错误号
begin
print '操作过程中有错误,操作将回滚'
rollback transaction
end
else
begin
print '操作成功'
commit transaction
end
MysqL入门 --事务一旦开启,就必须提交或者回滚
--事务如果有提交或者回滚,必须保证它已经开启
MysqL入门18.视图
MysqL入门视图就是一张虚拟表,可以像使用子查询做为结果集一样使用视图.
MysqL入门select * from vw_getinfo
使用代码创建视图.
MysqL入门语法:
MysqL入门create view vw_自定义名称
as
查询命令
go
--查询所有学员信息
if exists(select * from sysobjects where name='vw_getAllStuInfo')
drop view vw_getAllStuInfo
go --上一个批处理结果的标记
create view vw_getAllStuInfo
as
--可以通过聚合函数获取所以记录数
select top (select COUNT(*) from Student) Student.StudentNo,grade.ClassId,grade.classname from Student
inner join grade on Student.ClassId=grade.ClassId order by StudentName --视图中不能使用order by
--select * from grade --只能创建一个查询语句
--delete from grade where ClassId>100 --在视图中不能包含增加删除修改
go
MysqL入门--使用视图..就像使用表一样
select * from vw_getAllStuInfo
--对视图进行增加删除和修改操作--可以对视图进行增加删除和修改操作,只是建议不要这么做:所发可以看到:如果操作针对单个表就可以成功,但是如果 多张的数据就会报错:不可更新,因为修改会影响多个基表.
update vw_getAllStuInfo set classname='asdas',studentname='aa' where studentno=1
MysqL入门19.触发器
MysqL入门触发器:执行一个可以改变表数据的操作(增加删除和修改),会自动触发另外一系列(类似于存储过程中的模块)的操作.
MysqL入门语法:
MysqL入门create trigger tr_表名_操作名称
on 表名 after|instead of 操作名称
as
go
if exists(select * from sysobjects where name='tr_grade_insert')
drop trigger tr_grade_insert
go
create trigger tr_grade_insert
on grade for insert ---为grade表创建名称为tr_grade_insert的触发器,在执行insert操作之后触发
as
declare @cnt int
set @cnt = (select count(*) from student)
select *,@cnt from student
select * from grade
go
--触发器不是被调用的,而是被某一个操作触 发的,意味着执行某一个操作就会自动触发 触发器
insert into grade values('fasdfdssa')
---替换触 发器:本来需要执行某一个操作,结果不做了,使用触 发器中的代码语句块进行替代
MysqL入门if exists(select * from sysobjects where name='tr_grade_insert')
drop trigger tr_grade_insert
go
create trigger tr_grade_insert
on grade instead of insert ---为grade表创建名称为tr_grade_insert的触发器,@cnt from student
select * from grade
go
MysqL入门insert into grade values('aaaaaaaaaaaa')
go
MysqL入门---触 发器的两个临时表:
--inserted: 操作之后的新表:所有新表与原始的物理表没有关系,只与当前操作的数据有关
--deleted:操作之前的旧表:所有新表与原始的物理表没有关系,只与当前操作的数据有关
MysqL入门if exists(select * from sysobjects where name='tr_grade_insert')
drop trigger tr_grade_insert
go
create trigger tr_grade_insert
on grade after insert
as
print '操作之前的表:操作之前,这一条记录还没有插入,所以没有数据'
select * from deleted
print '操作之后的表:已经成功插入一条记录,所有新表中有一条记录'
select * from inserted
go
--测试:
insert into grade values('aaaaa')
MysqL入门if exists(select * from sysobjects where name='tr_grade_update')
drop trigger tr_grade_update
go
create trigger tr_grade_update
on grade after update
as
print '操作之前的表:存储与这个修改操作相关的没有被修改之前的记录'
select * from deleted
print '操作之后的表:存储这个操作相关的被修改之后 记录'
select * from inserted
go
--测试
update grade set classname=classname+'aa' where ClassId>15
MysqL入门if exists(select * from sysobjects where name='tr_grade_delete')
drop trigger tr_grade_delete
go
create trigger tr_grade_delete
on grade after delete
as
print '操作之前的表:存储与这个修改操作相关的没有被删除之前的记录'
select * from deleted
print '操作之后的表:存储这个操作相关的被删除之后 记录--没有记录'
select * from inserted
go
MysqL入门--测试
delete from grade where ClassId>15
MysqL入门20.存储过程
MysqL入门存储过程就相当于c#中的方法
参数,返回值,参数默认值,参数:值的方式调用
在调用的时候有三个对应:类型对应,顺序对应.
MysqL入门创建语法:
MysqL入门create proc usp_用户自定义名称
对应方法的形参 --(int age,out string name)
as
对应方法体:创建变量,逻辑语句,增加删除修改和查询..return返回值
go
调用语法:
MysqL入门exec 存储过程名称 实参,实参,实参 ...
--获取所有学员信息
if exists(select * from sysobjects where name='usp_getAllStuInfo')
drop proc usp_getAllStuInfo
go
create procedure usp_getAllStuInfo
as
select * from Student
go
--调用存储过程,获取的有学员信息
execute usp_getAllStuInfo
MysqL入门--exec sp_executesql 'select * from Student'
MysqL入门--查询指定性别的学员信息
go
if exists(select * from sysobjects where name='usp_getAllStuInfoBySex')
drop proc usp_getAllStuInfoBySex
go
create procedure usp_getAllStuInfoBySex
@sex nchar(1) --性别 参数不需要declare
as
select * from Student where Sex=@sex
go
--调用存储过程,获取指定性别的学员信息
Exec usp_getAllStuInfoBySex '女'
MysqL入门--创建存储过程获取指定班级和性别的学员信息
go
if exists(select * from sysobjects where name='usp_getAllStuInfoBySexandClassName')
drop proc usp_getAllStuInfoBySexandClassName
go
create procedure usp_getAllStuInfoBySexandClassName
@classname nvarchar(50),--班级名称
@sex nchar(1)='男'--性别 有默认的参数建议写在参数列表的最后
as
declare @classid int ---班级ID
set @classid=(select classid from grade where classname=@classname) --通过参数班级名称获取对应的班级ID
select * from Student where Sex=@sex and ClassId=@classid
go
--执行存储过程获取指定班级和性别的学员信息
--exec usp_getAllStuInfoBySexandClassName '八期班'
exec usp_getAllStuInfoBySexandClassName default,'八期班' --有默认值的参数可以传递default
exec usp_getAllStuInfoBySexandClassName @classname='八期班' --也可以通过参数=值的方式调用
exec usp_getAllStuInfoBySexandClassName @classname='八期班' ,@sex='女'
exec usp_getAllStuInfoBySexandClassName @classname='八期班',@sex='女'
MysqL入门--创建存储过程,获取指定性别的学员人数及总人数
go
if exists(select * from sysobjects where name='usp_getCountBySexandClassName')
drop proc usp_getCountBySexandClassName
go
create procedure usp_getCountBySexandClassName
@cnt int=100 output,--output标记说明它是一个输出参数.output意味着你向服务器请求这个参数的值,那么在执行的时候,服务器发现这个参数标记了output,就会将这个参数的值返回输出
@totalnum int =200output,--总人数
@className nvarchar(50),--输入参数没有默认值,在调用的时候必须传入值
@sex nchar(1)='男'--输入参数有默认值,用户可以选择是否传入值
as
declare @classid int ---班级ID
set @classid=(select classid from grade where classname=@classname) --通过参数班级名称获取对应的班级ID
select * from Student where Sex=@sex and ClassId=@classid
set @cnt= (select COUNT(*) from Student where Sex=@sex and ClassId=@classid) --获取指定班级和性别的总人数
set @totalnum=(select COUNT(*) from Student) ----获取总人数
go
--调用存储过程,获取指定性别的学员人数及总人数
declare @num int,@tnum int
exec usp_getCountBySexandClassName @cnt=@num output,@totalnum=@tnum output,@className='八期班'
print @num
print @tnum
print '做完了'
---获取指定班级的人数
if exists(select * from sysobjects where name='usp_getCount')
drop proc usp_getCount
go
create procedure usp_getCount
@className nvarchar(50)='八期班'
as
declare @classid int=(select classid from grade where classname=@className)
declare @cnt int
set @cnt =(select COUNT(*) from Student where ClassId=@classid)
--return 只能返回int整数值
--return '总人数是'+cast(@cnt as varchar(2))
return @cnt
go
MysqL入门--调用存储过程,接收存储过程的返回值
declare @count int
--set @count=(exec usp_getCount)
exec @count=usp_getCount '八期班'
print @countif exists(select*from sysobjects where name='usp_getClassList')
drop proc usp_getClassList
go
create procedure usp_getClassList
asselect classid,classname from grade
go
MysqL入门21.分页存储过程
mysql入门之1小时学会MySQL基础
MysqL入门
MysqL (关系型数据库管理系统)
MysqL是一个关系型数据库管理系统,由瑞典MysqL AB 公司开发,目前属于 Oracle 旗下产品。MysqL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MysqL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
MysqL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MysqL所使用的 sql 语言是用于访问数据库的最常用标准化语言。MysqL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MysqL 作为网站数据库。
由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。
1. 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
2. 使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。关系型数据库是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
3. RDBMS特点:
1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database
4. RDBMS 术语
冗余:存储两倍数据,冗余可以使系统速度更快。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性
5. MysqL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MysqL管理
6. 启动及关闭 MysqL服务器:
(1) 检查MysqL服务器是否启动:
ps -ef | grepMysqLd
(2) 启动MysqL服务器:
root@host# cd/usr/bin
./safe_MysqLd&
(3) 关闭目前运行的 MysqL 服务器:
root@host# cd/usr/bin
./MysqLadmin-u root -p shutdown
Enterpassword: ******
7. MysqL 用户设置
在 MysqL 数据库中的 user 表添加新用户:
root@host# MysqL -u root Cp //选择数据库 Enter password:******* MysqL> use MysqL; Database changed MysqL> INSERT INTO user (host,user,password,select_priv,insert_priv,update_priv) //设置权限Y VALUES ('localhost','guest',PASSWORD('guest123'),'Y','Y'); Query OK,1 row affected (0.20 sec) MysqL> FLUSH PRIVILEGES;
注意需要执行 FLUSH PRIVILEGES 语句。这个命令执行后会重新载入授权表。
另外一种添加用户的方法为通过sql的 GRANT命令
MysqL> GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON TUTORIALS.* -> TO 'zara'@'localhost' -> IDENTIFIED BY'zara123';
8. 管理MysqL的命令
USE 数据库名 :选择要操作的MysqL数据库:
MysqL> use W3CSCHOOL;
Database changed
SHOW DATABASES: 列出 MysqL 数据库管理系统的数据库列表:
MysqL> SHOWDATABASES;
SHOW TABLES: 显示指定数据库所有表,用该命令前需用 use 命令选择操作的数据库。
MysqL> useW3CSCHOOL;
Database changed
MysqL> SHOW TABLES;
SHOW COLUMNS FROM 数据表:显示数据表的属性,属性类型,主键信息,是否NULL,默认值等其他信息。
MysqL> SHOW COLUMNSFROM W3Cschool_tbl;
+-----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
SHOW INDEX FROM 数据表:显示数据表的详细索引信息,包括PRIMARY KEY(主键)。
SHOW TABLE STATUS LIKE 数据表\G: 该命令将输出MysqL数据库管理系统的性能及统计信息。
MysqL> SHOW TABLESTATUS FROM W3CSCHOOL; # 显示数据库 W3CSCHOOL 中所有表的信息
MysqL> SHOW TABLESTATUS from W3CSCHOOL LIKE 'W3Cschool%'; #表名以W3Cschool开头的表的信息
MysqL> SHOW TABLESTATUS from W3CSCHOOL LIKE 'W3Cschool%'\G; #加上 \G,查询结果按列打印
9. PHP MysqL函数格式:MysqL_function(value,value,...);
MysqL 连接
10.使用MysqL二进制方式连接
[root@host]# MysqL -uroot -p
Enter password:******
登录成功后会出现MysqL> 命令提示窗口,你可以在上面执行任何 sql 语句。
退出 MysqL> 命令提示窗口可以使用exit 命令:MysqL> exit
11.使用 PHP脚本连接 MysqL
PHP 提供了 MysqL_connect() 函数来连接数据库。
connectionMysqL_connect(server,passwd,new_link,client_flag);5各参数均可选
使用PHP的MysqL_close() 函数来断开与MysqL数据库的链接。
bool MysqL_close (resource $link_identifier );
通常不要用MysqL_close(),因为已打开的非持久连接会在脚本执行完毕后自动关闭。
MysqL_close() 不会关闭由 MysqL_pconnect() 建立的持久连接
$conn = MysqL_connect($dbhost,$dbuser,$dbpass); if(! $conn ) { die('Could not connect: ' .MysqL_error()); } echo 'Connected successfully'; MysqL_close($conn);
MysqL 创建/删除数据库
12.使用 MysqLadmin创建数据库
用root用户登录,root用户拥有最高权限,可以使用 MysqL MysqLadmin 命令来创建数据库。
[root@host]#MysqLadmin -u root -pcreate/drop W3CSCHOOL
Enter password:*****
13.使用 PHP脚本创建数据库
PHP使用 MysqL_query 函数来创建或者删除 MysqL 数据库。
bool MysqL_query( sql,connection); $conn = MysqL_connect($dbhost,$dbpass); if(! $conn ) { die('连接错误: ' . MysqL_error()); } echo '连接成功<br />'; $sql= 'CREATE/DROP DATABASE W3CSCHOOL'; $retval= MysqL_query( $sql,$conn ); if(! $retval ) { die('创建数据库失败: ' . MysqL_error()); } echo "数据库 W3CSCHOOL创建成功\n"; MysqL_close($conn);
MysqL 选择数据库
14.使用PHP脚本选择MysqL数据库
PHP 提供了函数 MysqL_select_db来选取一个数据库。
bool MysqL_select_db( db_name,connection ); $conn = MysqL_connect($dbhost,$dbpass); if(! $conn ) { die('连接失败: ' . MysqL_error()); } echo '连接成功'; MysqL_select_db('W3CSCHOOL' ); MysqL_close($conn);
MysqL 创建/删除数据表
15.MysqL 创建数据表
创建MysqL数据表需要以下信息:
表名
表字段名
定义每个表字段
创建语法:CREATE TABLE table_name (column_name column_type);
删除语法:DROP TABLE table_name ;
以下例子中我们将在 W3CSCHOOL 数据库中创建数据表w3cschool_tbl:
tutorials_tbl( tutorial_id INT NOT NULL AUTO_INCREMENT,tutorial_title VARCHAR(100) NOT NULL,tutorial_author VARCHAR(40) NOT NULL,submission_date DATE,PRIMARY KEY ( w3cschool_id ) );
16.通过命令提示符创建表
使用 sql 语句 CREATE TABLE 来创建数据表。
MysqL> CREATE TABLE w3cschool_tbl( -> w3cschool_id INT NOTNULL AUTO_INCREMENT,-> w3cschool_titleVARCHAR(100) NOT NULL,-> w3cschool_authorVARCHAR(40) NOT NULL,-> submission_date DATE,-> PRIMARY KEY (w3cschool_id ) -> );
MySQL命令终止符为分号 (;) 。
17.使用PHP脚本创建/删除数据表或插入数据
语法:bool MysqL_query( sql,connection);
$sql = "CREATE TABLEtutorials_tbl( "创建 "tutorial_id INT NOTNULL AUTO_INCREMENT,". "tutorial_titleVARCHAR(100) NOT NULL,". "tutorial_authorVARCHAR(40) NOT NULL,". "submission_dateDATE,". "PRIMARY KEY (tutorial_id )); " ; $sql = "DROP TABLEw3cschool_tbl";删除 MysqL_select_db( 'TUTORIALS' ); $retval = MysqL_query( $sql,$conn); //判断是否成功而设置的参数; if(! $retval ) { die('数据表创建失败: ' . MysqL_error()); } echo "数据表创建成功\n"; MysqL_close($conn);
MysqL 插入数据
18.向MysqL数据表插入数据通用的 INSERT INTO sql语法:
INSERT INTO table_name (field1,field2,...fieldN )
VALUES
( value1,value2,...valueN );
如果数据是字符型,必须使用单引号或者双引号,如:"value"。
w3cschool_tbl表插入一条数据:
MysqL> INSERT INTOw3cschool_tbl
->(w3cschool_title,w3cschool_author,submission_date)
->VALUES
->("Learn PHP","JohnPoul",Now());
(->)不是sql语句的一部分,它仅表示一个新行,如sql语句太长,可通过回车键创建一个新行编写sql语句,sql语句的命令结束符为分号(;)。
19.使用PHP脚本插入数据
$sql = "INSERT INTO w3cschool_tbl ".
"(w3cschool_title,submission_date) ".
"VALUES ".
"('$w3cschool_title','$w3cschool_author','$submission_date')";
MysqL 查询数据
20.为在MysqL数据库中查询数据通用的 SELECT语法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]
可以通过SELECT 命令读取一条或者多条记录。
可以通过OFFSET指定SELECT语句开始查询的数据偏移量默认情况下偏移量为0。
可以使用 LIMIT 属性来设定返回的记录数。
你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
MysqL> SELECT * from w3cschool_tbl
21.使用PHP脚本来获取数据
使用PHP函数的MysqL_query()及sql SELECT命令来获取数据。
该函数用于执行sql命令,然后通过 PHP 函数 MysqL_fetch_array() 来使用或输出所有查询的数据。
尝试以下实例来显示数据表w3cschool_tbl 的所有记录
$sql = 'SELECT w3cschool_id,w3cschool_title,
w3cschool_author,submission_date
FROM w3cschool_tbl';
MysqL_select_db('W3CSCHOOL');
$retval = MysqL_query( $sql,$conn );
if(! $retval )
{
die('Could not get data: ' .MysqL_error());
}
while($row =MysqL_fetch_array($retval,MysqL_ASSOC))
while($row =MysqL_fetch_assoc($retval))
用MysqL_NUM参数显示数据表
while($row =MysqL_fetch_array($retval,MysqL_NUM))
用MysqL_NUM参数显示数据表
{
echo "Tutorial ID:{$row['w3cschool_id']} <br>".
"Title:{$row['w3cschool_title']} <br> ".
"Author:{$row['w3cschool_author']} <br> ".
"Submission Date : {$row['submission_date']}<br> ".
"--------------------------------<br>";
}
MysqL_free_result($retval); 释放游标内存
echo "Fetched data successfully\n";
MysqL_close($conn);
MysqL_ASSOC, 设置该参数查询结果返回关联数组,你可以使用字段名称来作为数组的索引。
MysqL 选择数据
22.从MysqL表中使用sql SELECT语句来读取数据。
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中
以下是sql SELECT语句使用 WHERE 子句从数据表中读取数据的通用语法:
SELECT field1,...fieldN FROM table_name1,table_name2...
[WHERE condition1 [AND[OR]] condition2.....
WHERE子句也可以运用于sql的 DELETE 或者 UPDATE 命令。
使用 LIKE 来比较字符串,否则MysqL的WHERE子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定WHERE子句的字符串比较是区分大小写的。
23.使用PHP脚本读取数据
使用PHP函数的MysqL_query()及相同的sql SELECT 带上 WHERE 子句的命令来获取数据。该函数用于执行sql命令,然后通过 MysqL_fetch_array() 来输出所有查询的数据。
$sql = 'SELECT w3cschool_id,submission_date
FROM w3cschool_tbl
WHEREw3cschool_author="Sanjay"';
MysqL UPDATE
24.修改或更新MysqL中的数据,我们可以使用sql UPDATE 命令来操作。
通用sql语法:
UPDATE table_name SET field1=new-value1,field2=new-value2
[WHERE Clause]
更新数据表中 w3cschool_id 为 3 的 w3cschool_title 字段值:
MysqL>UPDATE w3cschool_tbl
-> SET w3cschool_title='Learning JAVA'
- > WHERE w3cschool_id=3;
使用PHP脚本更新数据
$sql = 'UPDATE w3cschool_tbl
SETw3cschool_title="Learning JAVA"
WHERE w3cschool_id=3';
MysqL DELETE
25.DELETE FROM table_name[WHERE Clause
如果没有指定 WHERE 子句,MysqL表中的所有记录将被删除。
可以在 WHERE 子句中指定任何条件
删除w3cschool_tbl 表中 w3cschool_id 为3 的记录
MysqL> DELETE FROMw3cschool_tbl WHERE w3cschool_id=3;
用 PHP 脚本删除数据
$sql = 'DELETE FROMw3cschool_tbl
WHERE w3cschool_id=3';
MysqL LIKE 子句
QL LIKE 子句中使用百分号(%)字符来表示任意字符
没有使用百分号(%),LIKE 子句与等号(=)的效果是一样的。
26.QL SELECT语句使用 LIKE子句从数据表中读取数据的通用语法:
SELECT field1,...fieldN table_name1,table_name2...
WHERE field1 LIKEcondition1 [AND [OR]] filed2 = 'somevalue'
LIKE 通常与 % 一同使用,类似于一个元字符的搜索
在PHP脚本中使用 LIKE 子句
$sql = 'SELECTw3cschool_id,submission_date
FROM w3cschool_tbl
WHERE w3cschool_author LIKE"%jay%"';
MysqL 排序
SELECT field1,table_name2...
ORDER BY field1,[field2...] [ASC [DESC]]
ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。默认情况下,它是按升排列。
MysqL 分组
SELECT column_name,function(column_name)
FROM table_name
WHERE column_nameoperator value
GROUP BY column_name;
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
coalesce 来设置一个可以取代NUll 的名称,coalesce 语法:
select coalesce(a,b,c);
参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。
MysqL> SELECTcoalesce(name,'总数'),SUM(singin) as singin_countFROM employee_tbl GROUP BY name WITHROLLUP;
+--------------------------+--------------+
| coalesce(name,'总数') | singin_count |
+--------------------------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| 总数 | 16 |
+--------------------------+--------------+
MysqL 多表查询
27.在SELECT,UPDATE 和 DELETE 语句中使用 MysqL 的 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
| w3cschool_author |w3cschool_count |
+-----------------+----------------+
| mahran | 20 |
| mahnaz | NULL |
| Jen | NULL |
| Gill | 20 |
| John Poul | 1 |
| Sanjay | 1 |
+-----------------+----------------+
MysqL> SELECT * fromw3cschool_tbl;
+-------------+----------------+-----------------+-----------------+
| w3cschool_id | w3cschool_title | w3cschool_author |submission_date |
+-------------+----------------+-----------------+-----------------+
| 1 | Learn PHP | John Poul |2007-05-24 |
| 2 | LearnMysqL | Abdul S | 2007-05-24 |
| 3 | JAVATutorial | Sanjay | 2007-05-06 |
连接以上两张表来读取w3cschool_tbl表中所有w3cschool_author字段在tcount_tbl表对应的w3cschool_count字段值:
MysqL> SELECTa.w3cschool_id,a.w3cschool_author,b.w3cschool_count FROM w3cschool_tbl aINNER JOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author;
+-----------+---------------+--------------+
| w3cschool_id | w3cschool_author | w3cschool_count |
+-----------+---------------+--------------+
| 1 | John Poul | 1 |
| 3 | Sanjay | 1 |
w3cschool_tbl 为左表,tcount_tbl 为右表,
MysqL> SELECTa.w3cschool_id,b.w3cschool_count FROM w3cschool_tbl a LEFTJOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author;
+-------------+-----------------+----------------+
| w3cschool_id | w3cschool_author | w3cschool_count |
+-------------+-----------------+----------------+
| 1 | John Poul | 1 |
| 2 | Abdul S | NULL |
| 3 | Sanjay | 1 |
左边的数据表w3cschool_tbl的所有选取的字段数据,即便在右侧表tcount_tbl中没有对应的w3cschool_author字段值Abdul S。
MysqL NULL
IS NULL: 当列的值是NULL,此运算符返回true。
IS NOT NULL: 当列的值不为NULL,运算符返回true。
NULL值与任何其它值的比较(即使是NULL)永远返回false,
使用PHP脚本处理 NULL 值:
PHP脚本中你可以在 if...else 语句来处理变量是否为空,并生成相应的条件语句。
MysqL 正则表达式
28.MysqL中使用 REGEXP 操作符来进行正则表达式匹配。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
. 匹配除"\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
实例(表名:person_tbl )来加深我们的理解:
查找name字段中以'st'为开头的所有数据:
MysqL> SELECT name FROM person_tbl WHERE name REGEXP '^st';
查找name字段中以'ok'为结尾的所有数据:
MysqL> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
查找name字段中包含'mar'字符串的所有数据:
MysqL> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:
MysqL> SELECT name FROM person_tbl WHERE name REGEXP'^[aeIoU]|ok$';
MysqL 事务
29.MysqL 事务主要用于处理操作量大,复杂度高的数据。
在MysqL中只有使用了Innodb数据库引擎的数据库或表才支持事务
事务处理可以用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行
事务用来管理insert,update,delete语句
事务必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
1、事务的原子性:一组事务,要么成功;要么撤回。
2、稳定性: 有非法数据(外键约束之类),事务撤回。
3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。
在MysqL控制台使用事务来操作:
1,开始一个事务
start transaction
2,做保存点
savepoint 保存点名称
3,操作
4,可以回滚,可以提交,没有问题,就提交,有问题就回滚。
PHP中使用事务实例
MysqL_query("SETAUTOCOMMIT=0");//设置为不自动提交,因为MysqL默认立即执行MysqL_query("BEGIN");//开始事务定义
if(!MysqL_query("insertinto trans (id) values('2')")) { MysqL_query("ROOLBACK");//判断当执行失败时回滚 } MysqL_query("COMMIT");//执行事务 MysqL_close($handler); MysqL ALTER
30.修改数据表名或者修改数据表字段时,就需要使用到MysqL ALTER命令。
使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i字段:
MysqL> ALTER TABLEtestalter_tbl DROP i;
数据表中只剩余一个字段则无法使用DROP来删除字段。
ADD 子句来想数据表中添加列,在表 testalter_tbl 中添加 i 字段,并定义数据类型:
MysqL> ALTER TABLEtestalter_tbl ADD i INT;
以下 ALTERTABLE 语句,在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:
ALTER TABLEtestalter_tbl DROP i;
ALTER TABLEtestalter_tbl ADD i INT FirsT;
ALTER TABLEtestalter_tbl DROP i;
ALTER TABLEtestalter_tbl ADD i INT AFTER c;
FirsT 和 AFTER 关键字只占用于 ADD 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。
修改字段类型及名称:
31.在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:
MysqL> ALTER TABLEtestalter_tbl MODIFY c CHAR(10);
使用 CHANGE 子句,语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称。尝试如下实例:
MysqL> ALTER TABLEtestalter_tbl CHANGE i j BIGINT;
<p如果你现在想把字段 j 从 BIGINT 修改为 INT,sql语句如下:
MysqL> ALTER TABLEtestalter_tbl CHANGE j j INT;
ALTER修改字段的默认值,MysqL> ALTER TABLEtestalter_tbl ALTER i SET DEFAULT 1000;
ALTER 及DROP删除字段的默认值,ALTER TABLEtestalter_tbl ALTER i DROP DEFAULT;
ALTER及 TYPE修改数据表类型,MysqL> ALTER TABLEtestalter_tbl TYPE = MYISAM;
ALTER TABLE 使用RENAME修改数据表的名称,MysqL> ALTER TABLEtestalter_tbl RENAME TO alter_tbl;
MysqL 索引
索引可以大大提高MysqL的检索速度
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
创建索引,确保该索引是应用在 sql 查询语句的条件(一般作为 WHERE 子句的条件)。
索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MysqL不仅要保存数据,还要保存一下索引文件。
3方式创建普通索引
CREATE INDEX indexName ONmytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
修改表结构
ALTER mytable ADD INDEX[indexName] ON (username(length))
创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL,username VARCHAR(16) NOTNULL,INDEX [indexName](username(length)) );
删除索引的语法
DROP INDEX [indexName] ONmytable;
唯一索引:前面加UNIQUE
使用ALTER 命令添加和删除索引
有四种方式来添加数据表的索引:
ALTER TABLE tbl_name ADD PRIMARYKEY (column_list):该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD UNIQUEindex_name (column_list):这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD INDEXindex_name (column_list):添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXTindex_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
使用 ALTER 命令添加和删除主键
主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
MysqL> ALTER TABLEtestalter_tbl MODIFY i INT NOT NULL;
MysqL> ALTER TABLEtestalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER 命令删除主键:
MysqL> ALTER TABLEtestalter_tbl DROP PRIMARY KEY;
SHOW INDEX 命令列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。
MysqL> SHOW INDEX FROMtable_name\G
MysqL 临时表
临时表只在当前连接可见,当关闭连接时,MysqL会自动删除表并释放所有空间。
MysqL> CREATE TEMPORARY TABLE SalesSummary
MysqL> DROP TABLE SalesSummary;
MysqL 复制表
创建新的克隆表clone_tbl。如果你想拷贝数据表的数据你可以使用 INSERT INTO... SELECT 语句来实现。
MysqL> INSERT INTOclone_tbl (w3cschool_id,
-> w3cschool_title,
-> w3cschool_author,
-> submission_date)
-> SELECT w3cschool_id,
-> w3cschool_author,submission_date
->FROM w3cschool_tbl;
MysqL 元数据
想知道MysqL以下三种信息:
查询结果信息: SELECT,UPDATE 或 DELETE语句影响的记录数。
数据库和数据表的信息: 包含了数据库及数据表的结构信息。
MysqL服务器信息: 包含了数据库服务器的当前状态,版本号等。
(1)使用do( ) 执行 $query
my $count = $dbh->do($query);
(2)使用prepare( )及 execute( ) 执行 $query
my $sth =$dbh->prepare ($query);
my $count =$sth->execute ( );
在PHP中,使用MysqL_affected_rows( ) 函数获取查询语句影响的记录数。
$result_id =MysqL_query ($query,$conn_id); # 如果查询失败返回 $count = ($result_id ?MysqL_affected_rows ($conn_id) : 0); print ("$countrows were affected\n");
数据库和数据表列表
PERL 实例
# 获取当前数据库中所有可用的表。
my @tables =$dbh->tables ( ); foreach $table (@tables){ print "Table Name $table\n"; }
PHP 实例:
$db_list =MysqL_list_dbs($con); while ($db = MysqL_fetch_object($db_list)) { echo $db->Database . "<br/>"; }
MysqL 序列
MysqL序列是一组整数:1,2,3,...,
用 MysqLAUTO_INCREMENT 来定义列。
MysqL> CREATE TABLEinsect
-> (
-> id INT UNSIGNED NOT NULLAUTO_INCREMENT,
用 sql中的LAST_INSERT_ID() 函数来获取最后的插入表中的自增列的值。
PERL实例
使用MysqL_insertid 属性来获取 AUTO_INCREMENT 的值。实例如下:
$dbh->do("INSERT INTO insect (name,date,origin)
VALUES('moth','2001-09-14','windowsill')");
my $seq =$dbh->{MysqL_insertid};
PHP实例
PHP 通过 MysqL_insert_id ()函数来获取执行的插入sql语句中 AUTO_INCREMENT列的值。
MysqL_query("INSERT INTO insect (name,origin) VALUES('moth','windowsill')",$conn_id); $seq = MysqL_insert_id($conn_id);
重置序列
删除了数据表中的多条记录,并对剩下数据的AUTO_INCREMENT列进行重新排列,那么你可以通过删除自增的列,然后重新添加来实现。
MysqL> ALTER TABLEinsect DROP id;
MysqL> ALTER TABLEinsect
-> ADD id INT UNSIGNED NOT NULLAUTO_INCREMENT FirsT,
-> ADD PRIMARY KEY (id);
一般情况下序列的开始值为1,但如果你需要指定一个开始值100:
-> id INT UNSIGNednOT NULL AUTO_INCREMENT = 100,
或在表创建成功后,通过以下语句来实现:
MysqL> ALTER TABLE tAUTO_INCREMENT = 100;
MysqL 处理重复数据
防止表中出现重复数据
在MysqL数据表中设置指定的字段为PRIMARY KEY(主键)或者UNIQUE(唯一)索引保证数据的唯一性。
设置表中字段first_name,last_name数据不能重复,你可以设置双主键模式来设置数据的唯一性, 如果你设置了双主键,那么那个键的默认值不能为NULL,可设置为NOT NULL。如下所示:
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL,last_name CHAR(20) NOT NULL,sexCHAR(10),PRIMARY KEY (last_name,first_name) );
INSERT IGnorEINTO与INSERT INTO的区别就是INSERT IGnorE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
用了INSERT IGnorE INTO,执行后不会出错,也不会向数据表中插入重复数据:
MysqL> INSERT IGnorE INTO person_tbl(last_name,first_name)
->VALUES( 'Jay','Thomas');
Query OK,1 row affected (0.00 sec)
REPLACE INTO into如果存在primary 或 unique相同的记录,则先删除掉。再插入新记录。
UNIQUE(last_name,first_name)
查询重复记录
select user_name,count(*) as count fromuser_table group by user_name having count>1;
select * from people
where peopleId in (select peopleId from peoplegroup by peopleId having count(peopleId) > 1)
统计重复数据
统计表中 first_name 和 last_name的重复记录数:
MysqL> SELECT COUNT(*) as repetitions,last_name,first_name ->FROM person_tbl ->GROUP BY last_name,first_name ->HAVING repetitions > 1;
过滤重复数据
读取不重复的数据可以在SELECT 语句中使用 disTINCT 关键字来过滤重复数据。
MysqL> SELECT disTINCT last_name,first_name
->FROM person_tbl
->ORDER BY last_name;
也可以使用 GROUP BY 来读取数据表中不重复的数据:
MysqL> SELECT last_name,first_name ->FROM person_tbl ->GROUP BY (last_name,first_name);
删除重复数据
删除数据表中的重复数据,你可以使用以下的sql语句:
MysqL> CREATE TABLE tmp SELECT last_name,first_name,sex -> FROMperson_tbl; -> GROUP BY(last_name,first_name); MysqL> DROP TABLE person_tbl; MysqL> ALTER TABLE tmp RENAME TO person_tbl;
也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:
MysqL> ALTER IGnorE TABLE person_tbl ->ADD PRIMARY KEY (last_name,first_name);
MysqL 及 sql 注入
没有过滤特殊字符时,出现的sql情况:
// 设定$name 中插入了我们不需要的sql语句
$name = "Qadir';DELETE FROM users;";
MysqL_query("SELECT* FROM users WHERE name='{$name}'");
以上的注入语句中,我们没有对 $name 的变量进行过滤,$name中插入了我们不需要的sql语句,将删除 users 表中的所有数据。
防止sql注入,注意以下几个要点:
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御sql注入,XSS攻击等。
在脚本语言,如Perl和PHP可以对用户输入的数据进行转义从而来防止sql注入。
PHP的MysqL扩展提供了MysqL_real_escape_string()函数来转义特殊的输入字符。
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name =MysqL_real_escape_string($name); MysqL_query("SELECT * FROMusers WHERE name='{$name}'");
Like语句中的注入
like查询时,如用户输入的值有"_"和"%",则会出现这种情况:用户本只想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf"等等;用户要查询"30%"(注:百分之三十)时也会出现问题。
在PHP脚本中我们可以使用addcslashes()函数来处理以上情况,如下实例:
$sub =addcslashes(MysqL_real_escape_string("%something_"),"%_");
// $sub == \%something\_
MysqL_query("SELECT * FROMmessages WHERE subject LIKE '{$sub}%'");
addcslashes() 函数在指定的字符前添加反斜杠。
语法格式:
addcslashes(string,characters)
MysqL 导出数据
使用 SELECT ...INTO OUTFILE 语句导出数据
将数据表w3cschool_tbl 数据导出到 /tmp/tutorials.txt 文件中:
MysqL> SELECT * FROMtutorials_tbl
-> INTO OUTFILE '/tmp/tutorials.txt';
生成一个文件,各值用逗号隔开。这种格式可以被许多程序使用。
SELECT a,a+b INTOOUTFILE '/tmp/result.text' FIELDS TERMINATED BY',' OPTIONALLY ENCLOSED BY '"' LInes TERMINATED BY'\n' FROM test_table;
SELECT ... INTO OUTFILE 语句有以下属性:
LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。为了将一个数据库的数据写入一个文件,使用SELECT ... INTO OUTFILE,为了将文件读回数据库,使用LOAD DATA INFILE。
SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有FILE权限,才能使用此语法。
输出不能是一个已存在的文件。防止文件数据被篡改。
你需要有一个登陆服务器的账号来检索文件。否则SELECT ... INTO OUTFILE 不会起任何作用。
在UNIX中,该文件被创建后是可读的,权限由MysqL服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除
导出表作为原始数据
MysqLdump是MysqL用于转存储数据库的实用程序。
将数据表tutorials_tbl 导出到 /tmp 目录中:
$ MysqLdump -u root -p--no-create-info \
--tab=/tmp W3CSCHOOL w3cschool_tbl
password ******
导出整个数据库的数据,可以使用以下命令:
$ MysqLdump -u root -pW3CSCHOOL > database_dump.txt
password ******
备份所有数据库,可以使用以下命令:
$ MysqLdump -u root -p--all-databases > database_dump.txt
password ******
在 MysqLdump 命令中指定数据库名及数据表。
在源主机上执行以下命令,将数据备份至 dump.txt 文件中:
$ MysqLdump -u root -pdatabase_name table_name > dump.txt
password *****
将备份的数据库导入到MysqL服务器中,可以使用以下命令,使用以下命令你需要确认数据库已经创建:
$ MysqL -u root -pdatabase_name < dump.txt password *****
以下命令将导出的数据直接导入到远程的服务器上,但请确保两台服务器是相通的,是可以相互访问的:</p>
$ MysqLdump -u root -pdatabase_name \
| MysqL -h other-host.com database_name
MysqL 导入数据
从当前目录中读取文件dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。
MysqL> LOAD DATALOCAL INFILE 'dump.txt' INTO TABLE mytbl;
如果用户指定一个FIELDS 子句,它的子句(TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户必须至少指定它们中的一个。
MysqL> LOAD DATALOCAL INFILE 'dump.txt' INTO TABLE mytbl
-> FIELDS TERMINATED BY ':'
-> LInes TERMINATED BY '\r\n';
指定列的顺序。
如,在数据文件中的列顺序是a,c,但在插入表的列顺序为b,c,a,则数据导入语法如下:
MysqL> LOAD DATALOCAL INFILE 'dump.txt'
-> INTO TABLE mytbl (b,a);
使用mysqlimport 导入数据
mysqlimport客户端提供了LOADDATA INFILEQL语句的一个命令行接口。mysqlimport的大多数选项直接对应LOAD DATA INFILE子句。
从文件 dump.txt 中将数据导入到 mytbl数据表中,可以使用以下命令:
$ mysqlimport -u root-p --local database_name dump.txt
password *****
mysqlimport命令可以指定选项来设置指定格式,命令语句格式如下:
$ mysqlimport -u root-p --local --fields-terminated-by=":" \
--lines-terminated-by="\r\n" database_name dump.txt
password *****
mysqlimport 语句中使用 --columns 选项来设置列的顺序:
$ mysqlimport -u root-p --local --columns=b,a \
database_name dump.txt
password *****
关于MySQL基础和mysql基础语句大全的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Mysql入门MySQL基础教程之IN的用法详解、Mysql入门MySQL基础教程第一篇 mysql5.7.18安装和连接教程、Mysql入门Mysql基础知识点汇总、mysql入门之1小时学会MySQL基础的相关信息,请在本站寻找。
本文标签: