join查詢及相比逗號連線查詢的優勢

2021-07-14 13:16:10 字數 4330 閱讀 8406

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...