数据库之连接
数据库中多表之间的查询通常使用连接的方式来实现。连接分为内连接、外连接和交叉连接。
内连接:内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。包括相等连接和自然连接。
外连接:外连接又分为左外连接、右外连接和完整外连接。
1. 左外连接(LEFT JOIN或LEFT OUTER JOIN):左外连接的结果集包括 LEFT JOIN子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2. 右外连接(RIGHT JOIN或RIGHT OUTER JOIN):右外连接是左外连接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3. 完整外连接(FULL JOIN或FULL OUTER JOIN):完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
交叉连接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
A表 | B表 | |||
id | name | id | age | parent_id |
1 | 张三 | 1 | 23 | 1 |
2 | 李四 | 2 | 24 | 2 |
3 | 王五 | 3 | 25 | 4 |
内连接
select a.*, b.* from a inner join b on a.id=b.parent_id | ||||
1 | 张三 | 1 | 23 | 1 |
2 | 李四 | 2 | 24 | 2 |
左连接
select a.*, b.* from a left join b on a.id=b.parent_id | ||||
1 | 张三 | 1 | 23 | 1 |
2 | 李四 | 2 | 24 | 2 |
3 | 王五 | null | null | null |
右连接
select a.*, b.* from a right join b on a.id=b.parent_id | ||||
1 | 张三 | 1 | 23 | 1 |
2 | 李四 | 2 | 24 | 2 |
null | null | 3 | 25 | 4 |
完全连接
select a.*, b.* from a full join b on a.id=b.parent_id | ||||
1 | 张三 | 1 | 23 | 1 |
2 | 李四 | 2 | 24 | 2 |
null | null | 3 | 25 | 4 |
3 | 王五 | null | null | null |