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

一、子查询

子查询是另一个语句中的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;

子查询的结果作为条件

  • 使用聚合函数将多个结果合并为一个值

    sql 复制代码
    select * 
    from t_employee
    where salary > (
    	select avg(salary) from t_employee;
    ) and gender = '男';
  • 使用ALL / ANY/EXIST对多个数据进行比较

    sql 复制代码
    select * 
    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进行操作。

相关推荐
Think Spatial 空间思维24 分钟前
【HTTPS基础概念与原理】TLS握手过程详解
数据库·网络协议·https
laowangpython44 分钟前
MySQL基础面试通关秘籍(附高频考点解析)
数据库·mysql·其他·面试
mooyuan天天1 小时前
SQL注入报错“Illegal mix of collations for operation ‘UNION‘”解决办法
数据库·web安全·sql注入·dvwa靶场·sql报错
Johny_Zhao1 小时前
Vmware workstation安装部署微软SCCM服务系统
网络·人工智能·python·sql·网络安全·信息安全·微软·云计算·shell·系统运维·sccm
运维-大白同学1 小时前
go-数据库基本操作
开发语言·数据库·golang
R-sz1 小时前
通过从数据库加载MinIO配置并初始化MinioClient,spring boot之Minio上传
数据库·oracle
洛阳泰山2 小时前
Windows系统部署MongoDB数据库图文教程
数据库·windows·mongodb
医只鸡腿子2 小时前
3.2/Q2,Charls最新文章解读
数据库·数据挖掘·数据分析·深度优先·数据库开发
bang___bang_2 小时前
PostgreSQL内幕剖析——结构与架构
数据库·postgresql
龙俊亨3 小时前
达梦数据库查看各数据库表内容
数据库