1. 程式人生 > >SQL多表聯查總結

SQL多表聯查總結

col users 內連接 class pan 右外連接 查詢 sql 查詢條件

交叉連接:(不常用)
返回兩個表的笛卡爾乘積(也即全組合排列)中符合查詢條件的數據行。

內連接
返回連接表中符合連接條件和查詢條件的數據行。

左外連接
返回符合連接條件和查詢條件(即:內連接)的數據行,且還返回左表中不符合連接條件但符合查詢條件的數據行。

右外連接
返回符合連接條件和查詢條件(即:內連接)的數據行,且還返回右表中不符合連接條件但符合查詢條件的數據行。

全外連接(不常用,MySQL不支持)
返回符合連接條件和查詢條件(即:內連接)的數據行,且還返回左表中不符合連接條件但符合查詢條件的數據行以及右表中不符合連接條件但符合查詢條件的數據行。

例子

表結構和數據:
users表

id name
1 李四
2 王五
4 張三

logs表

id user_id log
1 1 操作了A
2 1 操作了B
3 2 操作了C
4 2 操作了D
5 3 操作了E

交叉連接:
語句

SELECT
a.`id`,
a.`name`,
b.`log`
FROM
`users` AS a,
`logs` AS b

結果

id name log
1 李四 操作了A
2 王五 操作了A
4 張三 操作了A
1 李四 操作了B
2 王五 操作了B
4 張三 操作了B
1 李四 操作了C
2 王五 操作了C
4 張三 操作了C
1 李四 操作了D
2 王五 操作了D
4 張三 操作了D
1 李四 操作了E
2 王五 操作了E
4 張三 操作了E

內連接:
語句

SELECT
a.`id`,
a.`name`,
b.`log`
FROM
`users` AS a
INNER JOIN `logs` AS b ON a.`id` = b.`user_id`

結果

id name log
1 李四 操作了A
1 李四 操作了B
2 王五 操作了C
2 王五 操作了D

左外連接:
語句

SELECT
a.`id`,
a.`name`,
b.`log`
FROM
`users` AS a
LEFT JOIN `logs` AS b ON a.`id` = b.`user_id
`

結果

id name log
1 李四 操作了A
1 李四 操作了B
2 王五 操作了C
2 王五 操作了D
4 張三 NULL

右外連接:
語句

SELECT
a.`id`,
a.`name`,
b.`log`
FROM
`users` AS a
RIGHT JOIN `logs` AS b ON a.`id` = b.`user_id`

結果

id name log
1 李四 操作了A
1 李四 操作了B
2 王五 操作了C
2 王五 操作了D
NULL NULL 操作了E

SQL多表聯查總結