多表查询
从多张表中查询数据
如果直接执行多表查询
sql
select * from emp,dept;
会得到大量的结果集,即两张表的全部组合结果(笛卡尔积)
但我们并不需要这么多的无效结果,只需要保留两张表关联部分的数据
通过添加连接查询条件
sql
select * from emp,dept where 外键 = 主键;
连接查询
内连接
查询两个集合的交集部分数据
隐式内连接
sql
select 字段列表 from 表1 as 别名,表2 as 别名 where 条件..
显式内连接
sql
select 字段列表 from 表1 别名1[inner] join 表2 别名2 on 连接条件
外连接
左外连接:
查询左表所有数据,以及两张表交集部分的数据
sql
select 字段列表 from 表1 left [outer] join 表2 on条件
右外连接:
查询右表所有数据,以及两张表交集部分数据
sql
select 字段列表 from 表1 right [outer] join 表2 on条件
自连接
当前表与自身的连接查询,自连接必须使用表别名
子查询
在SQL语句中嵌套select语句,称为嵌套查询,又称子查询
分为
标量子查询(子查询结果为单个值)
列子查询(查询结果为一列)
行子查询(子查询结果为一行)
表子查询(子查询结果为多行多列)
子查询可以写在
WHERE,FROM,SELECT
之后
标量子查询
最简单的子查询形式
只需要单纯的将需求分解即可
sql
select a from b where + 条件
条件: a=(select a from b where c)
列子查询
子查询的结果为一列(可以是多行)
常用操作符:
IN,NOT IN
sql
IN 在指定的集合范围内,多选
NOT IN 不在指定的集合范围内
sql
select a from b where a in (select a from b where c)
行子查询
子查询结果返回一行(一列或多列)
常用操作符:
=,<>,IN,NOT IN
sql
select * from emp where (a,b) = (select a,b from emp where ....)
#行和行进行判断
表子查询
子查询结果为多行多列(临时表)
常用操作符:
IN
事务
一组操作的集合,一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败.
开启事务
sql
START TRANSACTION 或 BEGIN;
提交事务
sql
COMMIT
回滚事务
sql
ROLLBACK
事务的四大特性
ACID
原子性:
Atomicity
事务是不可分割的最小操作单元,要么全部成功,要么全部失败.
一致性:
Consistency
事务完成时,必须使所有数据都保持一致状态.
隔离性:
Isolation
数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行.
持久性:
Durability
事务一旦提交或回滚,那对数据库中数据的改变就是永久的.