这篇博客讲一下其他的子句并进行简单的总结,介绍事务控制语言(TCL)数据控制语言(DCL)
一、having子句
1、在分组查询时,需要对分组之后的数据进行过滤的话,不能再使用where子句,需要使用having。
2、having子句可以使用聚合函数,支持上述分组之后过滤。
3、为什么不能使用where呢?
例:select max(sal),min(sal),avg(sal),deptno from emp where avg(sal)>2000 group by deptno
上述sql表示查询emp表中每个部门的最高工资、最低工资和平均工资,在执行时,这个sql会在执行from找到emp表后就执行where子句,但是此时,where子句之后接的是avg(sal),是一个聚合函数,此时还没有将数据进行分组,所以无法获得每个部门的信息,使用where子句会报错。由于having子句在group by之后执行,获得分组之后执行,则可以获得结果。
正确的写法是:select max(sal),min(sal),avg(sal),deptno from emp group by deptno having
4、所以where和having的区别都有什么呢?
(1)where后面放的是字段名,having后面可以放聚合函数(where属于一次过滤,having可以对分组结果二次过滤)
(2)书写位置:where放在group by之前,having放在group by之后
(3)执行顺序:where先执行,having后执行
二、子句总结
一个基本的查询语句包含的子句有:select、from、where、group by、having、order by
格式:select..from..[where..][group by..][having..][order by..]
执行顺序:from --> where --> group by --> having --> select --> order by
三、事务控制语言TCL
1、 事务的含义:在执行DML语言进行数据库管理时(例如进行批量数据的删除、修改、增加),比如在一个员工系统中,如果想删除一个人的信息,不仅要删除他的基本信息,还应该删除与此人有关的其他信息,如邮箱、地址等。从DML语言开始执行到执行结束,就会构成一个事务。
2、只有DML操作会触发一个事务,对于事务,要保证其完整性,要么成功,要么撤回。
3、事务要求符合的四个条件:
(1)原子性:事务要么成功,要么撤回,不可切割。
(2)一致性:事务开始前和结束后,要保证数据的一致性。
(3)隔离性:当涉及多用户操作同一张表时,数据库为每一个用户开启一个事务,那么当其中一个事务正在运行时,其他事务应该处于等待状态,保证事务之间不会受到影响。
(4)持久性:当一个事务被提交后,我们要保证数据库里的数据是永久改变的,即是数据库崩溃了,也要保证事务的完整性。
4、TCL涉及的关键字:
(1)commit:提交
(2)rollback:撤回、回滚
(3)savepoint:保存点
5、存储引擎(ENGINE):就是指表类型。当存储引擎为innodb时,才支持事务。有一个默认的存储引擎为Myisam。不支持事务。
6、事务的验证:
(1)start transaction
(2)savepoint 保存点名称
(3)DML
(4)commit/rollback
/* 1、开始事务 */
start transaction
/* 2、设置保留点 */
savepoint a
/* 3、向a表中插入一条数据 */
insert into a values(2,'李四')
/* 4、回滚 */
rollback
四、数据控制语言(DCL) 不太重要哦
1、作用:用来创建用户、给用户授权、撤销权限、删除用户。
2、基本用法:
(1)创建用户:create user maomao@localhost identified by "密码"
maomao是想要创建的用户,localhost是ip
(2)显示用户权限:show grants for 用户名@ip
(3)授权:grant 权限1,权限2,... on 数据库名.* to 用户名@ip
DML权限:insert,delete,update
DQL权限:select
DDL权限:create,alter,drop...
(4)撤销权限:revoke 权限1,权限2,... on 数据库名.* from 用户名@ip
(5)删除用户:drop user 用户名
(6)使权限立即生效:flush privileges