表准備:
在網站 https://www.bejson.com/runcode/sql/ 或者 https://www.liaoxuefeng.com/wiki/1177760294764384/1179611432985088
執行下列sql創建表
CREATE TABLE jobs( employee varchar(30), title varchar(30));
CREATE TABLE ranks( title varchar(30), rank varchar(30));
CREATE TABLE salary( rank varchar(30), payment int(11));
insert into jobs values('張三','經理'),('李四','總經理'),('王五','總經理助理');
insert into ranks values('經理','三'),('總經理','一'),('總經理助理','二'),('董事長','零');
insert into salary values('一',20000),('二',8000),('三',7000),('四',7000);
這次我們用到3張表:
jobs 表:
ranks 表:
salary 表:
一、 內連接——Inner Join
內連接Inner join基於連接謂詞將兩張表(如A和B)的列組合在一起,產生新的結果表。
select ranks.title,ranks.rank,salary.rank,salary.payment from ranks,salary where salary.rank=ranks.rank; 隱式內連接 select * from ranks r inner join salary s on s.rank=r.rank; 顯式內連接
查詢結果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
經理 | 三 | 三 | 7000 |
總經理 | 一 | 一 | 20000 |
總經理助理 | 二 | 二 | 8000 |
二、左外連接(left outer join,outer可省略)
左表全部出現在結果集中,若右表無對應記錄,則相應字段為NULL
select * from ranks r left join salary s on r.rank=s.rank;
結果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
經理 | 三 | 三 | 7000 |
總經理 | 一 | 一 | 20000 |
總經理助理 | 二 | 二 | 8000 |
董事長 | 零 | NULL | NULL |
select * from ranks r left join salary s on r.rank=s.rank where s.rank is null;
結果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
董事長 | 零 | NULL | NULL |
三、右外連接(right outer join,outer可省略)
右表全部出現在結果集中,若左表無對應記錄,則相應字段為NULL
select * from ranks r right join salary s on r.rank=s.rank;
結果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
經理 | 三 | 三 | 7000 |
總經理 | 一 | 一 | 20000 |
總經理助理 | 二 | 二 | 8000 |
NULL | NULL | 四 | 7000 |
select * from ranks r right join salary s on r.rank=s.rank where r.rank is null;
結果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
NULL | NULL | 四 | 7000 |
四、全外連接(full outer join)
全外連接=左外連接+右外連接
select * from ranks r full outer join salary s on r.rank=s.rank;
結果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
經理 | 三 | 三 | 7000 |
總經理 | 一 | 一 | 20000 |
總經理助理 | 二 | 二 | 8000 |
董事長 | 零 | NULL | NULL |
NULL | NULL | 四 | 7000 |
select * from ranks r full outer join salary s on r.rank=s.rank where r.rank is null or s.rank is null;
結果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
董事長 | 零 | NULL | NULL |
NULL | NULL | 四 | 7000 |