一、子查询
子查询是另一个语句中的select语句嵌套在另一个select中。注意子查询语法上必须使用()包起来。
嵌套的那个语句返回的结果有可能是:
- 一个字段,一行记录,一个列或一个表。
- 嵌套的位置
- where / having语句里面作为条件使用
- 在from语句中作为新表使用
子查询的结果作为新表
sql
select * from (
select
ename,
salary,
salary - (select avg(salary) from t_employee) as diff
from t_employee
) where abs(diff) > 500;
子查询的结果作为条件
-
使用聚合函数将多个结果合并为一个值
sqlselect * from t_employee where salary > ( select avg(salary) from t_employee; ) and gender = '男';
-
使用ALL / ANY/EXIST对多个数据进行比较
sqlselect * from t_employee where salary > ALL( -- 大于所有人的薪资 select salary from t_employee; ) and gender = '男';
使用窗口函数来获取新表
问题:查询每个部门薪资排名前两位的的员工
sql
select ename, salary, did,
row_number() over(partition by did
order by salary desc) as cnt
from t_employee;
子查询复制表
sql
create table dept like t_department; -- 复制表
insert into dept (select * from t_department); -- 复制表数据
create table emp as (select * from t_employee); -- 复制表和数据
二、事务
事务(Database Transaction) 是一个逻辑工作单元,要么完全的执行,要么完全的不执行。如果操作过程中无法执行下去,则会撤销已经执行的操作,恢复到执行前的数据状态。
事务的ACID四特性
- 原子性:不可分割
- 一致性:有引用关系的表的更新要一致的改变
- 隔离性:多个事务操作数据必须是线程安全的
- 持久性:一旦事务被提交,数据库中数据的改变应该是永久的
事务的前提
MySQL的两种引擎:InnoDB是支持事务的,MyISAM是不支持事务的。
MySQL是默认自动提交事务的,可以设置关闭。
set autocommit = false;
这个设置当你关闭可视化软件后会重新回到自动提交。使用commit;
关键字才会对数据库产生持久化影响。
基本操作
- 开启事务
begin;
执行后,数据库开启了临时的手动提交状态 - 提交事务
commit;
提交begin后面的SQL语句,恢复自动提交 - 事务回滚
rollback;
撤销begin后面的SQL语句,恢复自动提交
事务只对DML数据操作语言有效,比如常用的增删改操作。但是比如truncate等DDL数据库定义语句,直接删除了表之后重新创建了一个新表,这个无法回滚撤销。
事务的隔离级别
事务间干扰产生的问题
- 脏读:别人处理过程中的数据被自己读取了,最后结果可能撤销和修改,是脏数据。
- 不可重复读:读取了前一事务提交的数据,有些时候不可重复读并不是问题。
- 虚读:指一个事务内读取到了别的事务插入的数据,导致前后读取不一致,和不可重复读的区别是:不可重复读查询的是同一个数据项,幻读针对的是一批数据整体。
隔离级别
- 串行化(serializable):解决了三个问题
- 可重复读(repeatable-read):解决了不可重复读问题
- 读已提交(read-committed):解决了脏读问题
- 读未提交(read-uncommitted):三个问题都会出现
查询隔离等级:select @@transaction_isolation;
设置隔离等级:set transaction_isolation = 'read_uncommitted'
这个设置是会话级别的,当前会话结束后会恢复到原先的样子。
三、权限管理
权限级别
- 全局权限
- 数据库权限
- 表权限
- 字段权限
- 存储过程以及
用户管理
- 创建新用户:create user 'tom'@% identified by '密码';%表示可以远程登录该主机。
- 查看当前用户的权限: show grants for 'tom'@'%';
- 给用户授权:
grant select on db1.emp to 'ray@%'
grant all on db1.* to 'ray'@'%';
- 收回客户权限
revoke select on db1.emp from 'ray'@'%';
revoke all on db1.* from 'ray'@'%';
- 删除用户
drop user 'ray'@'%';
您也可以在可视化工具的窗口里面寻找User and Privileges进行操作。