數據庫查詢inner join、left join 、right join的區別和應用!
一、先來兩個表
- t_person表:
number(pr_key) | name | class |
---|---|---|
001 | 張三 | 三班 |
002 | 李四 | 三班 |
003 | 王五 | 三班 |
004 | 劉六 | 三班 |
- t_grade_list表:
id (pr_key) | num | name | grade |
---|---|---|---|
a | 001 | 張三 | 99 |
b | 002 | 李四 | 21 |
c | 003 | 王五 | 88 |
g | 101 | 馬七 | 66 |
二、inner join(內連接)、left join(左連接) 、right join(右連接):
1、內連接(inner join):又叫等值連接,結果返回的是兩個表中連接字段相等的行。
例如:
select tp.* , tg.grade from t_person tp
inner join t_grade tg on tp.number = tg.num
where 1 = 1
ORDER BY tg.grade desc
description: 查詢出有成績學員的信息和成績並降序排列,兩個表中都存在的數據纔會返回,結果如下:
2、左連接(left join) :又叫左外連接,返回的結果是返回左表中所有的記錄以及右表中連接字段相等的記錄,沒有匹配結果使用NULL填補,即左表全部行+右表匹配的行。(a left join b 默認 a爲左表)
例如:
select tp.* , tg.grade from t_person tp
left join t_grade tg on tp.number = tg.num
where 1 = 1
ORDER BY tg.grade desc
description: 查詢出人員表中所有學員的信息、有成績的就加上、沒成績的就null填充。並以成績降序排列,以左表爲主表,結果如下:
3、右連接(right join): 返回右表中所有的記錄以及左表中連接字段相等的記錄,沒有匹配結果使用NULL填補,即右邊全部行+左邊匹配的行。(a left join b 默認 b爲右表、以右爲主)
例如:
select tp.* , tg.grade from t_person tp
right join t_grade tg on tp.number = tg.num
where 1 = 1
ORDER BY tg.grade desc
description: 查詢出人員表中所有成績單裏學員的成績和信息、有信息的就加上、沒信息的null填充,並以成績降序排列,以右表爲主表,左右連接剛好相反。結果如下:
- 補充:還有個外連接 (outer join):博主主要用的是mysql、據悉mysql沒有外連接。外連接可以用左右union實現,如下:
select tp.* , tg.grade from t_person tp left join t_grade tg on tp.number = tg.num
union
select tp.* , tg.grade from t_person tp right join t_grade tg on tp.number = tg.num
where 1 = 1
ORDER BY grade desc
description: 外連接就是左右結合的效果,結果如下:
- 很久沒寫博客了、數據庫查詢之連接相對於是比較簡單的東西,就當寫個日記吧。如果對你有幫助、記得點個贊喔。如有錯誤還望指正哈。