基本功:SQL 多表聯合查詢的幾種方式
前言
最近在專案中用到連線查詢,連線查詢是關係資料中最主要的查詢,包括內連線、外連線等。通過連線運算子可以實現多個表查詢。下面來複習一下。
正文
連線查詢主要分為三種:內連線、外連線、交叉連線。
內連線
使用比較運算子(包括=
、>
、<
、<>
、>=
、<=
、!>
和!<
)進行表間的比較操作,查詢與連線條件相匹配的資料。根據所使用的比較方式不同,內連線分為等值連線、自然連線和自連線三種。
關鍵字 INNER JOIN
等值連線/相等連線
使用”=”關係將表連線起來的查詢,其查詢結果中列出被連線表中的所有列,包括其中的重複列
SELECT
PM_ACT_JOB_RLS.*, PM_ACT_RLS.*
FROM
PM_ACT_JOB_RLS
INNER JOIN PM_ACT_RLS ON PM_ACT_JOB_RLS.RlsPK = PM_ACT_RLS.RlsPK
自然連線
等值連線中去掉重複的列,形成的連線
SELECT
PM_ACT_JOB_RLS.JobPK,
PM_ACT_RLS.RlsPK,
RlsName
FROM
PM_ACT_JOB_RLS
INNER JOIN PM_ACT_RLS ON PM_ACT_JOB_RLS.RlsPK = PM_ACT_RLS.RlsPK
自連線
如果在一個連線查詢中,設計到的兩個表都是同一個表,這種查詢稱為自連線查詢。
--c1、c2邏輯上是兩張表,物理上是一張表
SELECT
c1.CategoryID,
c1.CategoryName
FROM
[dbo].[Category] c1
INNER JOIN [dbo].[Category] c2 ON c1.[CategoryID] = c2.[ParentID]
外連線
內連線只返回滿足連線條件的資料行,外連線不只列出與連線條件相匹配的行,而是列出左表(左外連線時)、右表(右外連線時)或兩個表(全外連線時)中所有符合搜尋條件的資料行。外連線分為左外連線、右外連結、全外連線三種。
左外連線
返回左表中的所有行,如果左表中行在右表中沒有匹配行,則在相關聯的結果集中右表的所選擇欄位均為NULL。
關鍵字 LEFT [OUTER] JOIN
--左外連線 --1679條資料
SELECT
me.*,
mo.*
FROM
MM_LOTS_EXT AS me
LEFT OUTER JOIN MM_LOT_OPERATIONS AS mo ON me.LotID = mo.SerialNumber
右外連線
返回右表中的所有行,如果右表中行在左表中沒有匹配行,則在左表中相關欄位返回NULL值。
關鍵字 RIGHT [OUTER] JOIN
--右外連線 --209條資料
SELECT
me.*,
mo.*
FROM
MM_LOTS_EXT AS me
RIGHT OUTER JOIN MM_LOT_OPERATIONS AS mo ON me.LotID = mo.SerialNumber
全外連線/完全外連線
返回兩個連線中所有的記錄資料,是左外連線和右外連線的並集。
關鍵字 FULL [OUTER] JOIN
--全外連線 --1816條資料
SELECT
me.*,
mo.*
FROM
MM_LOTS_EXT AS me
FULL OUTER JOIN MM_LOT_OPERATIONS AS mo ON me.LotID = mo.SerialNumber
交叉連線/笛卡爾積
兩個表做笛卡爾積,得到的結果集的行數是兩個表的行數的乘積。
關鍵字 CROSS JOIN
--笛卡爾積 (cross join後加條件只能用where,不能用on) --45條資料(9*5)
SELECT
*
FROM
PM_ACT_JOB_RLS
CROSS JOIN PM_ACT_RLS
注意:帶有where條件的子句,往往會先生成兩個錶行數乘積的資料表,然後從根據where條件從中選擇。
當資料量比價大的時候,笛卡爾積操作會很消耗資料庫的效能
總結
連線查詢是關係型資料庫中的一個重要標誌,這次和大家一起復習多表查詢的幾種操作,希望給您帶來幫助