SQL的四种连接查询
首先给出两个表:
a表:
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
b表:
id | job | parent_id |
---|---|---|
1 | 23 | 1 |
2 | 34 | 2 |
3 | 34 | 4 |
a.id同b.parent_id 存在关系
1. 内连接(INNER JOIN)
满足on条件表达式,内连接是取满足条件表达式的两个表的交集(即两个表都有的数据)。
> select a.*, b.* from a inner join b on a.id=b.parent_id
1 | 张三 | 1 | 23 | 1 |
2 | 李四 | 2 | 34 | 2 |
2. 左外连接(left join / left outer join)
满足on条件表达式,左外连接是以左表为准,返回左表所有的数据,与右表匹配的则有值,没有匹配的则以空(null)取代。
> select a.*, b.* from a left join b on a.id=b.parent_id
1 | 张三 | 1 | 23 | 1 |
2 | 李四 | 2 | 34 | 2 |
3 | 王五 | null | null | null |
3. 右外连接(right join / right outer join)
满足on条件表达式,右外连接是以右表为准,返回右表所有的数据,与左表匹配的则有值,没有匹配的则以空(null)取代。
> select a.*, b.* from a right join b on a.id=b.parent_id
1 | 张三 | 1 | 23 | 1 |
2 | 李四 | 2 | 34 | 2 |
null | null | 3 | 34 | 4 |
4. 全外连接(full join / full outer join)
满足on条件表达式,返回两个表符合条件的所有行,a表没有匹配的则a表的列返回null,b表没有匹配的则b表的列返回null,即返回的是左连接和右连接的并集。
> select a.*, b.* from a full join b on a.id=b.parent_id
1 | 张三 | 1 | 23 | 1 |
2 | 李四 | 2 | 34 | 2 |
null | null | 3 | 34 | 4 |
3 | 王五 | null | null | null |
扩展:交叉连接(cross join)
交叉连接将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积。
不加条件返回两个表行数的乘积,即返回的大小将是3 x 3 = 9:
> select * from a cross join b
参考网页:
《深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接》
《SQL各种连接——自连接、内连接、外连接、交叉连接的使用》