在 SELECT 查詢中使用 JOIN 聯接

2021-09-03 06:36:22 字數 3378 閱讀 2281

在 select 語句中,如果 from 子句引用了多個表源或檢視,可以使用 join 指示指定的聯接操作應在指定的表源或檢視之間執行。

一、交叉聯接:cross join

交叉聯接將執行乙個叉積(迪卡爾乘積),將乙個表的每一行與另乙個表的所有行進行匹配,生成乙個虛擬表。如果乙個表有5行,另乙個表有6行,結果生成的虛擬表一共得到 5*6=30 行。

(1) ansi sql-89 語法

select a.columna, b.columna

from table1 as a , table2 as b

(2) ansi sql-92 語法(推薦)

select a.columna, b.columna

from table1 as a

cross join table2 as b

二、內部聯接:[ inner ] join

內部聯接用於返回所有匹配的行對。如果未指定任何聯接型別,則預設為內部聯接。

內部聯接的處理過程包括以下步驟:

a. 首先,像交叉聯接一樣,生成乙個迪卡爾乘積。

b. 然後,再按照謂詞進行篩選(放棄兩個表中不匹配的行)。

c. 最後,返回所有匹配的行。

(1) ansi sql-89 語法

select a.columna, b.columna

from table1 as a , table2 as b

where a.idcol = b.idcol

(2) ansi sql-92 語法(推薦)

select a.columna, b.columna

from table1 as a

join table2 as b

on a.idcol = b.idcol

三、外部聯接

外部聯接的處理過程包括以下步驟:

a. 首先,像交叉聯接一樣,生成乙個迪卡爾乘積。

b. 然後,再按照謂詞進行篩選(放棄兩個表中不匹配的行)。

c. 根據 left/right/full 選項「新增外部行」

d. 最後,返回所有匹配的行。

例如,下面是2個表。

table1:

empid firstname

001  mark

002  jim

003  tom

table2:

empid lastname

002  smith

005  johnson

1. 左外聯接:left [ outer ] join

指定在結果集中包括左表中所有不滿足聯接條件的行,除了由內部聯接返回所有的行之外,還將另外乙個表的輸出列設定為 null。

select a.empid, a.firstname, b.lastname

from table1 as a

left outer join table2 as b

on a.empid = b.empid

返回的結果為:

empid firstname lastname

001  mark   (null)

002  jim   smith

003  tom   (null)

2. 右外聯接:right [outer] join

指定在結果集中包括右表中所有不滿足聯接條件的行,除了由內部聯接返回所有的行之外,還將與另外乙個表對應的輸出列設定為 null。

返回的結果為:

empid firstname lastname

002  jim   smith

005  (null)  johnson

3. 全外聯接:full [ outer ] join

指定在結果集中包括左表或右表中不滿足聯接條件的行,並將對應於另乙個表的輸出列設為 null。這是對通常由 inner join 返回的所有行的補充。

返回的結果為:

empid firstname lastname

001  mark   (null)

002  jim   smith

003  tom   (null)

005(null)  johnson

四、自聯接

1. 語法

自聯接即聯接同乙個表的多個例項。自聯接支援交叉聯接、內部聯接和外部連線。例如:

select a.columna, b.columnb

from table1 as a

join table1 as b

on a.idcol = b.idcol

2. 示例

本例首先生成乙個表,並在表中儲存0到9的整數,然後生成自交叉聯接,從而生成1到1000的整數。

(1)構建乙個基本表

create table table1(columna int)

insert into table1(columna) values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)

(2)構建自交叉聯接

select t1.columna * 100 + t2.columna * 10 + t3.columna + 1 as myint

from table1 as t1

cross join table1 as t2

cross join

table1 as t3

order by myint

五、復合聯接

當兩個表具有復合關係時,可能需要復合聯接。例如:

select a.columna, b.columnb

from table1 as a

join table2 as b

on a.columna = b.columna

and a.columnb = b.columnb

六、多重聯接

聯接運算僅操作兩個表,可以通過多個聯接運算實現多重聯接。

select a.columna, b.columnb, c.columnc

from table1 as a

join table2 as b

on a.columna = b.columna

join table3 as c

and a.columnb = c.columnb

在 SELECT 查詢中使用分組集

group by 子句可以包括 grouping sets cube rollup with cube 或 with rollup等從屬子句,從而為 select 子句 列表中的聚合函式提供有關每個組 而不是各行 的資訊。更多詳細資訊,請參考 with cube 或 with rollup 等從屬子...

在 SELECT 查詢中使用 JOIN 聯接

在 select 語句中,如果 from 子句引用了多個表源或檢視,可以使用 join 指示指定的聯接操作應在指定的表源或檢視之間執行。一 交叉聯接 cross join 交叉聯接將執行乙個叉積 迪卡爾乘積 將乙個表的每一行與另乙個表的所有行進行匹配,生成乙個虛擬表。如果乙個表有5行,另乙個表有6行...

在 SELECT 查詢中使用 JOIN 聯接

在 select 語句中,如果 from 子句引用了多個表源或檢視,可以使用 join 指示指定的聯接操作應在指定的表源或檢視之間執行。一 交叉聯接 cross join 交叉聯接將執行乙個叉積 迪卡爾乘積 將乙個表的每一行與另乙個表的所有行進行匹配,生成乙個虛擬表。如果乙個表有5行,另乙個表有6行...