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