笛卡尔积
- 结果集数目为多个表的所有记录数的乘积
- 多表关联,不加上过滤条件,得到结果集数目的就是笛卡尔积
连接
内连接
- 使用 INNER JOIN 关键字,典型的多表关联语法
- 用 ON 过滤条件
自连接
- 一个表与自身做连接,通过表别名来区分
自然连接
- 就是普通的多表关联查询,即内部连接,没有左外连接 右外连接
外连接
左外连接
- 有 LEFT OUTER JOIN 关键字
- 左边的表记录全选,右边的表记录可有可没有,若右边的表没有记录,则值为NULL
右外连接
- 有 RIGHT OUTER JOIN 关键字
- 右边的表记录全选,左边的表记录可有可没有,若左边的表没有记录,则值为NULL
区分连接
自然连接 内连接
- 可以认为是同一个东西
内连接、外连接
- 都可以用 ON 关键字做提前过滤,来减小关联的数据集大小,再用where关键字
- 例如
- 对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户
- 对于客户表A,订单表B,此时应该使用左外连接,即 A LEFT OUTER JOIN B
on 和 where 条件过滤的区别
- on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录
- where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
简单来说,在使用INNER JOIN时会产生一个结果集,WHERE条件在这个结果集中再根据条件进行过滤,如果把条件都放在ON中,在INNER JOIN的时候就进行过滤了。
- 例如
例子1
SELECT *
FROM A
INNER JOIN B
ON B.ID = A.ID
AND B.State = 1
INNER JOIN C
ON B.ID = C.ID
和
例子2
SELECT *
FROM A
INNER JOIN B
ON B.ID = A.ID
INNER JOIN C
ON B.ID = C.ID
WHERE B.State = 1
- 例子1,在联查B表时,就把状态不等于1的忽略掉了,这样对于状态不等于1的就不需要去联查C表了
- 例子2,则不管B的状态是否满足,都去联查C,最后再将B状态满足的查出来