MySQL-常用语句(定义、查询、操纵、控制)

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与之对应以表明连接的条件
    MySQL-常用语句(定义、查询、操纵、控制)

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 权限分类

MySQL-常用语句(定义、查询、操纵、控制)
MySQL-常用语句(定义、查询、操纵、控制)
MySQL-常用语句(定义、查询、操纵、控制)

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' @ '%' 

上一篇:数据库作业4——数据查询


下一篇:数据库学习