1. 多表查询
笛卡尔积:
笛卡尔积乘积是指在数学中,两个集合 A结合 和 B集合的所有组合情况
在SQL语句中,我们该如何去除无效的笛卡尔积呢?
即 给多张表查询加上连接查询的条件呢即可
多表查询需求实现步骤
- 需求中数据涉及哪些表
- 表联合查询使用 从表的外键=主表主键,去除无效的笛卡尔积数据,
同时有其他额外条件 用 where 进行过滤- 如果有分组,完成分组操作,有条件补充分组条件
- 回到select中把需要的数据定义出来
- 排序、分页
连接的分类
1.内连接
内连接根据连接条件从两个表中筛选出匹配的记录,并返回匹配的结果。只有在两表之间存在匹配的行时,才会有返回结果
分类:
隐式内连接
select 字段列表 from 表1 , 表2 where 条件 ... ;
显示内连接
select 字段列表 from 表1 [ inner ] join 表2 on 连接条件 ... ;
2.外连接
外连接根据连接条件从两个表中筛选出匹配的记录,并返回匹配的结果以及不符合条件的记录。如果某个表中没有匹配的记录,则返回NULL值
分类
左外连接
查询左表的全部数据,显示右表与左表交集的部分数据
左表在前
select 字段列表 from 表1 left [ outer ] join 表2 on 条件 ... ;
右外连接
查询右表的全部数据,显示左表与右表交集的部分数据
右表在前
select 字段列表 from 表1 right [ outer ] join 表2 on 条件 ... ;
子查询
1.又称嵌套查询,SQL语句中嵌套SELECT语句
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。
2.分类
根据子查询的结果不同,分为:
A. 标量子查询 (子查询结果为单个值)
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询
常见的操作符:= , <> , > , >= , < , <=
B. 列子查询(子查询结果为一列)
子查询返回的结果是一列(可以是多行)
常见的操作符
IN: 在指定的集合范围之内,多选一
NOT IN:不在指定的集合范围之内
C. 行子查询(子查询结果为一行)
子查询返回的结果是一行(可以是多列)
常见的操作符:=、<>、IN、NOT IN
D. 表子查询(子查询结果为多行多列)
子查询返回的结果是多行多列,常作为临时表
常见的操作符:IN
根据子查询位置,分为:
A. WHERE之后
B. FROM之后
C. SELECT之后
2. 事物
-
定义:事物是一组操作的集合,它是一个不可分割的工作单位,事物会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么全部成功,要么全部失败
-
操作
开启事务: START TRANSACTION 或 BEGIN
提交事务: COMMIT
回滚事务: ROLLBACK
例:我们可以在删除部门,并删除该部门下的员工时,进行事物控制:
-- 开启事务
start transaction ;
-- 删除学工部
delete from dept where id = 1;
-- 删除学工部的员工
delete from emp2 where dept_id = 1;
如果执行成功,则提交事物,执行如下
-- 提交事务 (成功时执行)
commit ;
如果执行失败,则回滚事务,执行如下
-- 回滚事务 (出错时执行)
rollback ;
- 四大特性
ACID
原子性(Atomicity):事物是不可分割的最小操作单元,要么全部成功,要么全部失败
一致性(Consistency):事物完成时,必须使所有数据都保持一致的状态
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久性的