sql的join分為三種,內連線、外連線、交叉連線。
以下先建2張表,插入一些資料,後續理解起來更方便一些。
create table emp(empno int, name char(20),depart int);
create table depart(dpno int,dpname char(20));
insert into emp values (1,'bell',1);
insert into emp values (2,'smith',2);
insert into emp values (3,'jet',3);
insert into depart values (1,'design');
insert into depart values (2,'database');
insert into depart values (4,'warehouse');
1. 內連線 inner join 僅列出兩表能按照join條件連線起來的資訊,其他的資訊不顯示
select a.*,b.* from emp a inner join depart b on a.depart=b.dpno;
empno name depart dpno dpname
1 bell 1 1 design
2 smith 2 2 database
和如下語句得到的資訊是一樣的:
select a.*,b.* from emp a,depart b where a.depart=b.dpno;
但下文說到,在大表關聯的時候,使用join查詢效率更高
注釋:inner join 與 join 是相同的。
2. 外連線 outer join
(1)左外連線 left outer join = left join 顯示左表的所有記錄,右表符合join條件的資訊顯示,不符合的置空。
select a.*,b.* from emp a left join depart b on a.depart=b.dpno;
empno name depart dpno dpname
1 bell 1 1 design
2 smith 2 2 database
3 jet 3
(2)右外連線 right outer join = right join 和left join相反,顯示右表的所有記錄,左表符合join條件的資訊顯示,不符合的置空。
select a.*,b.* from emp a right join depart b on a.depart=b.dpno;
empno name depart dpno dpname
1 bell 1 1 design
2 smith 2 2 database
4 warehouse
(3)全外連線 full outer join = full join ,左右兩表的資訊都全部顯示,符合join條件的資訊顯示,不符合的置空。
select a.*,b.* from emp a full join depart b on a.depart=b.dpno;
empno name depart dpno dpname
1 bell 1 1 design
2 smith 2 2 database
4 warehouse
3 jet 3
3.交叉連線,也即生成兩表的笛卡爾積。得到的記錄相當於兩表記錄的乘積。
select a.*,b.* from emp a cross join depart b ;
empno name depart dpno dpname
1 bell 1 1 design
2 smith 2 1 design
3 jet 3 1 design
1 bell 1 2 database
2 smith 2 2 database
3 jet 3 2 database
1 bell 1 4 warehouse
2 smith 2 4 warehouse
3 jet 3 4 warehouse
相當於如下語句:
select a.*,b.* from emp a,depart b;
需要注意的是交叉連線後只能跟where,不可以跟on。
如下語句是錯的:
select a.*,b.* from emp a cross join depart b on a.depart=b.dpno;
要修改為這樣的才正確:
select a.*,b.* from emp a cross join depart b where a.depart=b.dpno;
一般來講,在大表關聯的時候,建議使用inner join或者left join,不建議使用cross join或者where
比如:select a.*,b.* from emp a,depart b where a.depart=b.dpno ; a ---不推薦
select a.*,b.* from emp a cross join depart b where a.depart=b.dpno ; b ---不推薦
select a.*,b.* from emp a inner join depart b on a.depart = b.dpno; c ----推薦
這是因為a,b中,sql需要先對兩表生成笛卡爾積,然後才根據where後的條件進行判斷,而使用c則不需要。所以c較有效率。
如果sql語句中用逗號連線2個表,則後面的連線條件用where。使用該方式會先對兩表生成笛卡爾積,開銷大。
如果sql語句中用join連線2個表,則後面的連線條件用on。
select s.studentname
, s.studentid
, s.studentdesc
, h.hallname
from students s
inner join hallprefs hp
on s.studentid = hp.studentid
inner join halls h
on hp.hallid = h.hallid
參考:stackoverflow sql inner-join with 3 tables Join 連線查詢
在大多數實際開發情況了,我們需要同時和多個表打交道,多表查詢是資料庫中使用頻率最高和效率攸關的操作了!多表查詢主要有兩種方案 這裡主要介紹一下連線查詢!連線查詢,主要使用join關鍵字,建立多個表之間的聯絡。連線查詢可以分為,內連線和外連線,同時外連線又分為左連線和右連線。下面列出了您可以使用的 j...
SQL連線查詢 JOIN
主要列舉這個圖 或者,或者,同理,select column name s from table1 left join table2 on table1.column name table2.column name 或者,select column name s from table1 left o...
mysql各種join連線查詢
注意點 在join操作中的 on where 應該放哪些條件 目前理解 on 後放2表關聯部分 where後放最終資料篩選部分 1.下圖為各種join操作的圖表解釋及sql語句 2.自測 建表資料結果如下 可以根據圖表中的sql 語句進行相關join查詢測試 3.簡單測試2個結果 測試第乙個join...