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)按结果集行列数分类
- 标量子查询(结果集为一行一列)(使用条件运算符)
select 字段 from 表 where 字段=(标量子查询) - 列子查询(结果集为多行一列)(使用逻辑运算符)
select 字段 from 表 where 字段 in(列子查询) - 行子查询(结果集为多行多列)
select 字段 from A where(字段1 字段2)=(select 字段1 字段2 from A where …) - 表子查询(作为表,结果集无限制)
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(‘新密码’);
本文详细介绍了SQL中的多表查询,包括内连接、外连接、交叉连接及其各种变体,以及如何解决笛卡尔积问题。此外,还探讨了子查询的类型和应用场景。在事务控制方面,解释了事务的四大特性(ACID),事务的并发访问问题及解决策略,并介绍了事务的隔离级别。最后,涉及了数据库用户管理,包括创建、授权、撤销权限和删除用户的相关操作。

209

被折叠的 条评论
为什么被折叠?



