今天學習了SQL Server 的連接查詢,來記錄一下。
什麼是連接查詢呢?
就是同時查詢多張表,有內連接查詢,外連接查詢,交叉查詢。而外連接查詢又分左外連接查詢、右外連接查詢和全外連接查詢,但是連接查詢也可以查詢一張表叫自連接查詢。
INNER JOIN:表示內連接,INNER可以省略只寫JOIN
ON:給出連接的條件
(JOIN ... ON ...)等同於 (,... where...)
先準備2張用來查詢的表 Table01,Table02:
Table01
Table02
那麼,首先就來說一下多張表的內連接查詢
select Table01.SID ,SName,CID,CContact,CPhone
from Table01 JOIN Table02
ON Table01.SID=Table02.SID
在多表連接查詢時若連接的表中有相同的字段,則在引用時必須在其前面加上表的前綴(查詢Table01中的SID就要寫Table01.SID),若查詢字段在多個表中是唯一的,則可以不加表名前綴。
查詢結果:
接着說一下查詢一張表的自連接查詢吧,其實可以看成是一種另類的內連接。
自連接查詢必須將表指定兩個別名,其實就是複製一張自己的表,使其變成兩張表了。
select S1.SID,S1.SName,S1.SDID,s1.SPostID
from Table01 AS S1 JOIN Table01 AS S2
ON S1.SDID!=S2.SDID and S1.SPostID=S2.SPostID
Table 定義別名 S1和S2
查詢結果:
下面說一下外鏈接查詢,有左連接查詢(LEFT OUTER JOIN),右連接查詢(RIGHT OUTER JOIN)和全連接查詢(FULL OUTER JOIN)。 OUTER 可以省略
先準備2張表,Table01,Table02:
Table01 Table02
1、左外連接查詢也稱左連接查詢(LEFT OUTER JOIN)
概念:返回左表中的所有行,如果左表中行在右表中沒有匹配行,則右表中所對應的的行爲空值。
select * from Table01
left join Table02
on Table01.classId = Table02.classId
查詢結果:
2、右外連接查詢也稱右連接查詢(RIGHT OUTER JOIN)
概念:與左連接相反,返回右表中的所有行,如果右表中行在左表中沒有匹配行,則左表中所對應的的行爲空值。
select * from Table01 right
join Table02
on Table01.classId = Table02.classId
查詢結果:
3、全外連接查詢也稱全連接查詢(FULL OUTER JOIN)
概念:返回左表和右表中的所有行。當某行在另一表中沒有匹配行,則另一表行爲空值(先根據左表查右表,查不到的話,右表的行爲空值,等查好後右表剩下的全展示,左錶行全爲空值)
select * from Table01 full
join Table02
on Table01.classId = Table02.classId
查詢結果:最後一種就是交叉查詢 (CROSS JOIN)也叫笛卡爾積,查詢表使用外鏈接的兩張表Table01,Table02
概念:不帶WHERE條件子句,它將會返回被連接的兩個表的笛卡爾積,就是左表的每一行分別於右表的每一行組合,返回結果的行數等於兩個錶行數的乘積(例如:Table01t和Table02,返回4*4=16條記錄),如果帶where,返回或顯示的是匹配的行數。
1、不帶 WHERE:
select * from Table01 cross join Table02也可以寫成select * from Table01,Table02
查詢結果 :
2、帶WHERE 子句,先將2個表乘積組合,再根據條件查詢
注:交叉帶條件查詢必須使用 WHERE,不能使用ON
select * from Table01 CROSS
join Table02
WHERE Table01.classId = Table02.classId
查詢結果:
總算寫完了,連接查詢就這些了,看了之後是不是覺得很簡單呢?