MySQL-常用语句
0. 约束
0.1 约束类型
- NULL / NOT NULL : 属性为空 / 不为空
- primary key :主键
- foreign key :外键
- unique :属性值唯一
- check :检查字段值所允许的范围
0.2 对约束的几点说明
- ①使用unique约束的字段允许为NULL值。
②一个表中可以允许有多个unique约束。
③可以把unique约束定义在多个字段上。
④唯一约束不能用来定义外键
SNo CHAR(6) NOT NULL #将Sno属性定义为非空
UNIQUE s_uniq(SN, Sex)) #将SN、Sex属性定义为非空,s_uniq是非空属性组的名称
- ①一个基本表中只能有一个primary key,但可有多个unique
②primary key 约束的属性值不能是NULL
③不能为同一个列或一组列既定义unique约束,又定义primary key约束。(因为primary key 约束不可以是NULL,unique约束可以是NULL,二者冲突)
SNo CHAR(6) PRIMARY KEY #定义SNo为主键约束
PRIMARY KEY SC_Prim(SNo,CNo)) #定义SNo、CNo为主键约束,SC_Prim是主键约束名称
- 外键的取值是其对应表中的主键值或空值
FOREIGN KEY S_Fore(SNo) REFERENCES S(SNo) #定义S表中的SNo属性是外键
FOREIGN KEY C_Fore(CNo) REFERENCES C(CNo)); #定义C表中的CNo属性是外键
- ①一个表中可以定义多个CHECK约束
②每个字段只能定义一个CHECK约束
③在多个字段上定义的CHECK约束必须为表约束
score int check(score between 0 and 100) #检查分数在0-100之间
- 表结构的不同属性定义之间用" ,"隔开。不同约束间用空格隔开
create table Student #定义一个表的完整结构
(
SNo char(10) primary key,
SName varchar(10) NOT NULL,
SSex char(2) NOT NULL,
Score int NOT NULL check(Score between 0 and 100)
)
MySQL具有数据定义、数据查询 、数据操纵 、数据控制 特点
1.数据定义
1.1 创建数据库
create database xxx #创建数据库
show creat database xxx #查看创建数据库的语句
use xxx #使用当前数据库
drop database xxx #删除当前数据库
1.2.创建表(视图)
creat table xxx (列名 数据类型 [约束] ) #创建表结构
show creat table xxx #查看创建表的语句
desc xxx #查看表的详细结构
show tables #查看所有表
drop table xxx #删除当前表
视图是虚表,其数据不进行存储,其记录来自基本表,只在数据库中存储其定义
# 创建视图格式
create view <视图名>[(<视图列表>)] as <子查询>
1.3 修改表结构(视图)
ALTER TABLE <表名> ADD <列定义> [约束] #增加表列属性
ALTER TABLE <表名> ALTER COLUMN <列定义>[约束] #修改表列属性
ALTER TABLE <表名> DROP CONSTRAINT <约束名> #删除约束
ALTER TABLE <表名> DROP COLUMN <列名> #删除列
alter view <视图名>[(<视图列表>)] as <子查询> #修改视图
drop view <视图名> # 删除视图
2. 数据查询
对表的查询方法都适用于视图
SELECT〈列名〉 FROM〈表名 /视图名〉 [WHERE(检索条件)]
# [ ]内语句是可选的
eg: select SNo,SName from Student where Score>80 #从Student表查询成绩大于80的学生学号、姓名
eg: select * from Student #从Student表查询所有学生信息
2.1 条件查询
2.1.1 比较大小(=, >, <, >=, <=, ,<> )
select SNo from Student where SName='张三' #从Student表中查询张三的学号
select SNo,SName from SC where Scor>90 #从SC表查询成绩大于90分的学生学号、姓名
2.1.2 多重条件 ( NOT、AND、OR )
NOT、AND、OR ( 优先级逐渐降低 )
# 查询选修C1或C2且分数大于等于85分学生的学号、课程号、成绩
select SNo,CNo,score from SC where((score>=85) and ( CNo='C1' or CNo='C2'))
2.1.3 范围查询 ( between and )
# 查询工资在1000至1500元之间的教师的教师号、姓名及职称
select TNo,TName,Prof from Teacher where Sal between 1000 and 1500
#查询工资不在1000至1500之间的教师的教师号、姓名及职称
select TNo,TName,Prof from Teacher where Sal not between 1000 and 1500
2.1.4 模糊查询( like )
当不知道精确的查询值时,可以使用LIKE或NOT LIKE进行模糊查询
格式:<属性名> like / not like <字符串常量>
注:%表示所有任意,_ 表示1位任意
# 查询所有姓张的教师的教师号和姓名
select TNo,TName from Teacher where Tname like ' 张% '
# 查询姓名中第二个汉字是“力”的教师号和姓名
select TNo,TName from Teacher where TName='_力%'
2.1.5 空值查询 ( NULL )
某个字段没有值称之为空值( NULL )。空值不同于零和空格,它不占任何存储空间
# 查询没有考试成绩的学生的学号和相应的课程号
select SNo,CNo from SC where score is null
注:上述语句的 score is null 不能写成 score=null
2.1.6 集合查询 ( IN )
" IN "操作可以查询属性值属于指定集合的元组
# 查询没有选修C1,也没有选修C2的学生的学号、课程号和成绩
select SNo,CNo,score from SC where CNo not in ('C1','C2')
2.2 相关函数
AVG() 按列计算平均值
SUM() 按列计算值的总和
MAX() 求一列中的最大值
MIN() 求一列中的最小值
COUNT() 按列值计个数
- AVG( )、SUM( ) 、MAX( )、MIN( )忽略列值为NULL的行。
使用COUNT( )时如果指定列名那么会忽略为NULL的行,如果是COUNT( * )则不会忽略为NULL的行 - Distinct 用于消除重复行,* (ALL)表示所有。COUNT( * )和Distinct不能混用
# 求学号为2020的学生的总分和平均分
select SUM(score) as Total_Score,AVG(score) as Avg_Score fron SC where SNo='2020'
# 求选修C1号课程的最高分、最低分及之间相差的分数
select MAX(score) as Max_score,MIN(score) as Min_Score,MAX(score)-MIN(score) as sub
from SC where CNo='C1'
# 求学校*有多少个系
select COUNT(Distinct Dept) as Num_Dept from S
# 求计算机系学生的总数
select COUNT(*) from S where CName='计算机'
2.3 分组查询
- GROUP BY子句可以将查询结果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的值。若在分组后还要按照一定的条件进行筛选,则需使
用HAVING子句。 - 当在一个SQL查询中同时使用WHERE子句,GROUP BY 子句和HAVING子句时,其 顺 序 是 WHERE - GROUP BY -HAVING
- HAVING 支持所有WHERE操作符,也就是说所有适用于WHERE字句的同样适用于HAVING字句
- WHERE与HAVING子句的根本区别在于作用对象不同。
WHERE子句作用于基本表或视图,从中选择满足条件的组
HAVING子句作用于组,选择满足条件的组
# 从SC表中查询选修两门以上课程的学生的学号和选课门数
select SNo,COUNT(*) as CouNum from SC
group by SNo where (COUNT(*)>=2)
2.4 排序查询
- 当需要对查询结果排序时,可以使用ORDER BY子
句,ORDER BY子句必须出现在其他子句之后 - 排序方式可以指定,DESC为降序,ASC为升序,缺省时为升序
# 查询选修C2、C3、C4或C5课程的学号、课程号、成绩
# 查询结果按学号升序排列,学号相同再按成绩降序排列
select SNo,CNo,score from SC
where CNo in ('C2','C3','C4','C5')
order by SNo ASC,score DESC
#求选课在三门以上且各门课程均及格的学生的学号及其总成绩,查询结果按总成绩降序列出
select SNo,SUM(score) as Total_Score from SC
where score>=60
group by SNo having COUNT(*)>3
order by SUM(score) DESC
2.5 连接查询
- 表的连接方法有如下两种:
① FROM子句指明进行连接的表名,WHERE子句指明连接的列名及其连接条件
② 利用关键字JOIN进行连接:当将JOIN 关键词放于FROM子句中时,应有关键词ON与之对应以表明连接的条件
2.5.1 等值连接
# 查询姓'刘'的老师所教的课程名,课程号,教师号
select CName,CNo,TNo from T,TC where (T.TNo=TC.TNo and T.TName like '刘%' )
select CNaame,CNo,TNo from T inner join TC on T.TNo=TC.TNo where T.TName like' 刘% '
# 查询所有选课学生的学号、姓名、选课名称及成绩
select S.SNo,S.SName,CName,score
from Student,Course,SC
S.SNo=SC.SNo and SC.CNo=C.CNo
2.5.2自身连接
# 查询所有比“刘伟”工资高的教师姓名、工资
select T1.TName,T1.sal
from T as T1,T as T2
where ( T1.sal > T2.sal and T2.TName='刘伟')
2.5.3 外连接
外部连接中,参与连接的表有主从之分,以主表的每行数据去匹配从表的数据列
符合连接条件的数据将直接返回到结果集中,不符合连接条件的列将被填上NULL值后再返回
# 查询所有学生的学号、姓名、选课名称及成绩 ( 没有选课的同学的选课信息显示为空)
select S.SNo,S.SName,CName,score
from s
left outer join SC on S.SNo=SC.SNo
left outer join C on C.CNo=SC.CNo
2.6 子查询
在where子句中包含一个形如select-from-where的查询块,此查询块称为子查询块
# 查询与 “ 刘伟 ” 老师职称相同的教师号、姓名 (先查询到刘伟的职称再与别的老师的职称作比较 )
select TNo,TName from T
where Prof=
(select Prof from T where TName='刘伟')
- any(some)、all 关键字
any 可以与=、>、>=、<、<=、<>结合起来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的任何一个数据。 (相当于 or)
all可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的所有数据。( 相当于 and )
# 查询讲授课程号为C5的教师姓名
select TName from T
where TNo= any(select TNo from TC where CNo='C5')
# 查询其他系中比计算机系所有教师工资都高的教师的姓名和工资
select TName,sal
from T where sal > all(select sal from T where Dept='计算机') and Dept<>'计算机'
2.7 合并查询
- 合并查询就是使用UNION 操作符将来自不同查询的数据组合起来,形成一个具有综合信息的查询结果。
- UNION操作会自动将重复的数据行剔除,但是UNION ALL不会剔除重复行
- 参加合并查询的各子查询的使用的表结构应该相同
# 从SC数据表中查询出学号为“S1”同学的学号和总分
# 再从SC数据表中查询出学号为“S5”的同学的学号和总分
# 然后将两个查询结果合并成一个结果集
select S.SNo as SNO,SUM(score) as Total_Score
from SC where SNo='S1'
group by SNo
union
select S.SNo as SNO,SUM(score) as Total_Score
from SC where SNo='S5'
group by SNo
3. 数据操纵
注:对表结构的修改是 Alter、Drop。对实际数据的修改是 update、delete
3.1 添加数据( insert into)
# 格式
INSERT INTO <表名>[(<列名1>[,<列名2>…])] VALUES(<值>)
# 在S表中添加一条学生记录(学号:S7、姓名:郑冬、性别:女、年龄:21、系别:计算机)
insert into S values('S7', '郑冬', 21, '女', '计算机')
# 在SC表中添加一条选课记录('S7', 'C1')。
insert into SC (SNo, CNo) values ('S7', 'C1')
3.2 修改数据(update)
#格式
UPDATE <表名> SET <列名>=<表达式> [WHERE <条件>]
# 把刘伟老师转到信息系
update T set Dept='信息' where TName='刘伟'
# 把讲授C5课程的教师的岗位津贴增加1000元
update T set money=money+1000
where TNo in (select TNo from TC where TC.CNo='C5')
3.3 删除数据(delete)
# 格式
DELETE FROM<表名> [WHERE <条件>]
# 删除刘伟老师的记录
delete from T where TName='刘伟'
# 删除刘伟老师授课的记录
delete from TC where TNo=(select TNo from T where TName='刘伟')
4.数据控制
4.1 权限分类
4.2 创建用户
# 格式
creat user 'user_name' @ 'hostname' [identified] by '密码'
# user_name 是用户名,host_name 是主机名,即用户连接 MySQL时所在主机的名字
# 若在创建的过程中,只给出了用户名而没指定主机名,则主机名默认为“%”,表示任意主机
# 创建用户 u1 可以从任意主机登录,密码为 123
creat user 'u1'@ '%' identified by '123'
4.3 授予用户权限
# 格式 (其中 flush privileges 表示刷新以使权限立即生效)
grant 权限 on 数据库对象 to 用户 [flush privileges]
# 授予 u1 查询、插入、更新、删除 teach数据库中所有表数据的权限
grant select,insert,update,delete on teach.* to 'u1'@ '%'
# 授予 u1 查询teach数据库中s表的SNo、SName权限
grant select(SNo,SNmae) on teach.s to 'u1'@ '%'
# 授予 u1 使用所有数据库的所有权限
grant all on *.* to 'u1' @ '%'
4.4 撤销用户权限
# 格式 (其中 flush privileges 表示刷新以使权限立即生效)
revoke 权限 on 数据库对象 from 用户 [flush privileges]
# 撤销用户 u1 查询、插入 teach数据库中s表数据的权限
revoke select,insert on teach.s from 'u1' @ '%'