多表关系
- 一对多:在多的一方建立外键,指向一的一方的主键
- 多对多:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
- 一对一:单表的拆分,将一张表的基础字段放在一张表中,其他字段放到另一张表中,提升操作效率,在任意一方加入外键,关联另外一方的主键,并设置外键为唯一的(UNIQUE)
多表查询
s e l e c t ∗ f r o m t b 1 , t b 2 w h e r e t b 1 . i d = t 2 2 . i d ; select * from~~tb_1,~tb_2~~where~~tb_1.id = t2_2.id; select∗from tb1, tb2 where tb1.id=t22.id;
连接查询
- 内连接:相当于查询A、B交集部分数据
隐式内连接:SELECT 字段列表 FROM 表1,表2 WHERE 条件;
显式内连接:SELECT 字段列表 FROM 表1[INNER] JOIN表2 ON 条件;
-
外连接:
左外连接:查询 左表 所有数据,以及两张表交集部分的数据
SELECT 字段列表 FROM 表1 LEFT [INNER] JOIN表2 ON 条件;
右外连接:查询 右表 所有数据,以及两张表交集部分的数据
SELECT 字段列表 FROM 表1 RIGHT [INNER] JOIN表2 ON 条件;
通常使用左外连接,两张表交换顺序后通过左外连接也可以实现右外连接
-
自连接:当前表与自身的连接查询,自连接必须使用表别名,自连接可以是内连接查询也可以是外连接查询
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件;
联合查询
SELECT 字段列表 FROM 表A
UNION[ALL](删掉ALL去重)
SELECT 字段列表 FROM 表B
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
UNION ALL 会将全部的数据直接合并在一起,UNION 会对合并之后的数据去重
子查询:SQL语句中嵌套SELECT语句,称为嵌套查询,又称为子查询
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
根据子查询结果分类
-
标量子查询(子查询结果为单个值)
常用操作符> 、<、>=、<=、=
select * from emp where dept_id = (select id from dept where name = ‘销售部’);
-
列子查询(子查询结果为一列,可以是多行)
常用操作符
操作符 | 描述 |
---|---|
IN | 在指定的集合范围之内,多选一 |
NOT IN | 不在指定的集合范围之内 |
ANY | 子查询返回列表中,有任意一个满足即可 |
SOME | 与ANY等同 |
ALL | 子查询返回列表的所有值都必须满足 |
- 行子查询(子查询结果为一行,可以是多列)
常用操作符:=、<、>、IN、NOT IN
select * from emp where (salary,managerid) = (select salary,managerid from emp where name = ‘张忌’)
- 表子查询(子查询结果为多行多列)
常用操作符:IN
select * from emp where (job,salary) in (select job,salary from emp where name = ‘张忌’ or name = ‘xz’)
根据子查询位置分离:
- WHERE 之后
- FROM 之后
- SELECT 之后