多表查询
一对一,一对多,多对多(两个一对多)
一对一:其中一方设置unique的外键。
一对多:多的一方设置外键。
多对多:建立中间表,设置两个外键。
直接查询:select * from A, B;
笛卡尔积,结果是AB两表所有记录的排列组合。后面再加where可以筛选查询条件。
内连接
只连接两个表共有部分。
select * from A, B where A.id=B.id;-- 隐式内连接
select * from A [inner] join B on 条件;
外连接
完全包含左/右表中的数据。另一个表没有对应数据则补null。
select * from A left [outer] join B on 条件;-- 左外连接
select * from A right [outer] join B on 条件;-- 右外连接
自连接
select * from A AS1 inner join A AS2 where 条件;-- 自连接可以是内或外连接。必须起别名!!!
联合 Union
Union 会把查询结果联合起来。
union all:结果可能重复。
union:重复的结果合并。
想做union操作,两个要联合的表必须字段数相同,字段类型匹配。
子查询
上一次查询的结果作为下一次查询的条件。
select * from (select * from b);
标量子查询:结果为一个。可以做> < =操作。
列子查询:结果为一列。可以做 IN NOT IN SOME ALL ANY 操作。(ANY SOME 等价)
行子查询:结果为一行。可以做 = <> IN NOT IN 操作。
表子查询:结果为多行多列。最常用 IN NOT IN 操作。