2.SQL学习之多表查询+事务

本文详细介绍了SQL中的多表查询,包括内连接、外连接、交叉连接及其各种变体,以及如何解决笛卡尔积问题。此外,还探讨了子查询的类型和应用场景。在事务控制方面,解释了事务的四大特性(ACID),事务的并发访问问题及解决策略,并介绍了事务的隔离级别。最后,涉及了数据库用户管理,包括创建、授权、撤销权限和删除用户的相关操作。

1.多表查询

1.概念

  • 当需要的数据在多个表中,这是需要同时查询多张表获得需要的数据

2.分类

(1)按年代分类:

  • sql92标准(仅仅支持内连接)
  • sql99标准(内连接+外连接+交叉连接)

(2)按功能分类:

  • 内连接(等值连接、非等值连接、自连接)
  • 外连接(左外连接、右外连接、全外连接)
  • 交叉连接

3.笛卡尔积现象(cross)(交叉连接)

  • 多表查询时多张表未经过条件筛选造成多表乘积数据列现象

在这里插入图片描述

  • 可通过制定连接方式来指定连接条件解决笛卡尔积现象

4.内连接
在这里插入图片描述

  • sql92标准(隐式内连接) 1992年使用的sql标准,没有join关键字,条件使用where指定

  • 语法:select 字段 from A,B… where 条件;

  • sql99标准(显示内连接) 1999年使用的sql标准,使用join关键字,条件使用on指定

  • 语法:select 字段 from A inner join B on 条件;(inner 可省略)

5.左外连接(left)
在这里插入图片描述

  • 用A表记录匹配B表记录,如果B表存在匹配数据则显示,否则A表对应位置显示NULL
  • 语法:select 字段 from A left join B on 条件;

6.去交集左外连接
在这里插入图片描述

  • 用A表记录匹配B表记录,如果B表存在匹配数据则显示
  • 语法:select 字段 from A left join B on 条件 where B.字段 is null;

7.右外连接(right)
在这里插入图片描述

  • 用B表记录匹配A表记录,如果A表存在匹配数据则显示,否则B表对应位置显示NULL
  • 语法:select 字段 from A right join B on 条件;

8.去交集右外连接
在这里插入图片描述

  • 用B表记录匹配A表记录,如果A表存在匹配数据则显示
  • 语法:select 字段 from A right join B on 条件 where A.字段 is null;

9.全外连接
在这里插入图片描述

  • 获得A表和B表的差集以及交集
  • 语法:select 字段 from A full join B on 条件;

10.去交集全外连接
在这里插入图片描述

  • 获得A表和B表的差集
  • 语法:select 字段 from A full join B on 条件 where A.字段 is null or B.字段 is null;

2.子查询

1.概念

  • 嵌套在其他语句内部的select语句

2.分类

(1)按出现位置分类

  • select后面(仅支持标量子查询)
  • from后面(仅支持表子查询)
  • where或having后面(标量子查询,列子查询,行子查询)
  • exits(是否存在)后面(所有子查询)

(2)按结果集行列数分类

  1. 标量子查询(结果集为一行一列)(使用条件运算符)
    select 字段 from 表 where 字段=(标量子查询)
  2. 列子查询(结果集为多行一列)(使用逻辑运算符)
    select 字段 from 表 where 字段 in(列子查询)
  3. 行子查询(结果集为多行多列)
    select 字段 from A where(字段1 字段2)=(select 字段1 字段2 from A where …)
  4. 表子查询(作为表,结果集无限制)
    select 字段 from (子查询) 别名 where 条件 …;

3.事务控制语言

1.概念

  • 一个或一组sql语句组成的执行单元,这个执行单元要么全部执行要不全部不执行

2.事务的四大特点(ACID)

  • 原子性(Atomicity)(事务不可分割,为一个整体)
  • 一致性(Consistency)(事务前后数据完整性保持一致)
  • 隔离性(Isolation)(一个事务的执行不受其他事务的干扰)
  • 持久性(Durability)(事务一旦被提交后,其对数据的改变是永久的)

3.事务原理
在这里插入图片描述

  • 事务开启后的所有操作都会保存到临时事务日志中,事务日志只有得到commit命令后才会同步到数据库中,其他情况都会rollback并清空事务日志

4.事务操作
Mysql默认为自动提交事务

  • 可通过 set autocommit - 0;关闭自动提交功能

手动提交事务使用以下SQL语句

  • (1)start transaction;(开启事务)
  • (2)commit;(提交事务)
  • (3)rollback;(回滚事务)

手动提交事务使用步骤:

第1种情况:开启事务 -> 执行SQL语句 -> 成功 -> 提交事务

第2种情况:开启事务 -> 执行SQL语句 -> 失败 -> 回滚事务

在这里插入图片描述
回滚点

  • 设置回滚点(savepoint 回滚点名)
  • 回到回滚点(rollback to 回滚点名)

5.事务的并发访问问题(通过设置隔离级别避免)

  • (1)脏读 一个事务读取到了另一个事务中尚未提交的数据
  • (2)不可重复读 一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务update时引发的问题
  • (3)幻读 一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是insert或delete时引发的问题

6.事务隔离级别
在这里插入图片描述
设置事务隔离级别

  • set global transaction isolation level 级别;(全局修改)
  • set session transaction isolation level 级别;(单次修改)

4.DCL

1.用户创建

  • create user ‘用户名’@‘主机名’ identified by ‘密码’;

2.用户授权

  • grant 权限… on 数据库名.表名 to ‘用户名’@‘主机名’;
  • 权限:(select insert update all)

3.撤销授权

  • revoke 权限 on 数据库.表名 from ‘用户名’@‘主机名’;

4.权限查看

  • show grants for ‘用户名’@‘主机名’;

5.用户删除

  • drop user ‘用户名’@‘主机名’;

6.管理员密码修改

  • mysqladmin -uroot -p password 新密码
  • 输入老密码

7.普通用户密码修改

  • set password for ‘用户名’@‘主机名’ = password(‘新密码’);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值