宣城做网站公司wordpress添加视频集
一、子查询
子查询是另一个语句中的select语句嵌套在另一个select中。注意子查询语法上必须使用()包起来。
 嵌套的那个语句返回的结果有可能是:
- 一个字段,一行记录,一个列或一个表。
 - 嵌套的位置 
- where / having语句里面作为条件使用
 - 在from语句中作为新表使用
 
 
子查询的结果作为新表
select * from (select ename,salary,salary - (select avg(salary) from t_employee) as difffrom t_employee 
) where abs(diff) > 500;
 
子查询的结果作为条件
- 使用聚合函数将多个结果合并为一个值
select * from t_employee where salary > (select avg(salary) from t_employee; ) and gender = '男'; - 使用ALL / ANY/EXIST对多个数据进行比较
select * from t_employee where salary > ALL( -- 大于所有人的薪资select salary from t_employee; ) and gender = '男'; 
使用窗口函数来获取新表
问题:查询每个部门薪资排名前两位的的员工
select ename, salary, did, 
row_number() over(partition by did 
order by salary desc) as cnt 
from t_employee;
 
子查询复制表
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进行操作。
 
