子查询和事务隔离以及用户管理

一、子查询

子查询是另一个语句中的select语句嵌套在另一个select中。注意子查询语法上必须使用()包起来。
嵌套的那个语句返回的结果有可能是:

  • 一个字段,一行记录,一个列或一个表。
  • 嵌套的位置
    • where / having语句里面作为条件使用
    • 在from语句中作为新表使用

子查询的结果作为新表

select * from (
	select 
		ename,
		salary,
	    salary - (select avg(salary) from t_employee) as diff
	from 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进行操作。
子查询和事务隔离以及用户管理_第1张图片

你可能感兴趣的:(数据库,sql)