你真的会玩SQL吗?和平大使 内连接、外连接
你真的會玩SQL嗎?系列目錄
你真的會玩SQL嗎?之邏輯查詢處理階段
你真的會玩SQL嗎?和平大使 內(nèi)連接、外連接
你真的會玩SQL嗎?三范式、數(shù)據(jù)完整性
你真的會玩SQL嗎?查詢指定節(jié)點(diǎn)及其所有父節(jié)點(diǎn)的方法
你真的會玩SQL嗎?讓人暈頭轉(zhuǎn)向的三值邏輯
你真的會玩SQL嗎?EXISTS和IN之間的區(qū)別
你真的會玩SQL嗎?無處不在的子查詢
你真的會玩SQL嗎?Case也瘋狂
你真的會玩SQL嗎?表表達(dá)式,排名函數(shù)
你真的會玩SQL嗎?簡單的 數(shù)據(jù)修改
你真的會玩SQL嗎?你所不知道的 數(shù)據(jù)聚合
你真的會玩SQL嗎?透視轉(zhuǎn)換的藝術(shù)
你真的會玩SQL嗎?冷落的Top和Apply
你真的會玩SQL嗎?實(shí)用函數(shù)方法匯總
你真的會玩SQL嗎?玩爆你的數(shù)據(jù)報表之存儲過程編寫(上)
你真的會玩SQL嗎?玩爆你的數(shù)據(jù)報表之存儲過程編寫(下)
?
大多數(shù)人一般寫多表查詢會這樣寫select * from tbA ,tbB ?沒有用到JOIN關(guān)鍵字,太Low了,官網(wǎng)標(biāo)準(zhǔn)建議是用JOIN明確表間的關(guān)系,下面具體來講。 連接類型:? ? ?交叉聯(lián)接 ?
在這類聯(lián)接的結(jié)果集內(nèi),兩個表中每兩個可能成對的行占一行。
??? 但是如果在交叉聯(lián)接中加入where 子句就相當(dāng)與是內(nèi)聯(lián)接
? ? 例:
SELECT title, pub_nameFROM titles Cross JOIN publishersWhere titles.pub_id = publishers.pub_id這就相當(dāng)于我們一最開始的寫法:SELECT title, pub_name ?FROM titles ,?publishers Where?titles.pub_id = publishers.pub_id
執(zhí)行過程:
?
? ? ? ?內(nèi)聯(lián)接 ?
僅顯示兩個聯(lián)接表中的匹配行的聯(lián)接。(這是查詢設(shè)計器中的默認(rèn)聯(lián)接類型。)
例:
SELECT title, pub_nameFROM titles INNER JOIN publishersON titles.pub_id = publishers.pub_id?執(zhí)行過程:
?
? ? ?左向外聯(lián)接 ?
包括第一個命名表("左"表,出現(xiàn)在 JOIN 子句的最左邊)中的所有行。不包括右表中的不匹配行。
例:
SELECT titles.title_id,titles.title,publishers.pub_nameFROM titles LEFT OUTER JOIN publishersON titles.pub_id = publishers.pub_id?
右向外聯(lián)接 ?
包括第二個命名表("右"表,出現(xiàn)在 JOIN 子句的最右邊)中的所有行。不包括左表中的不匹配行。
例:
SELECT titles.title_id, titles.title,publishers.pub_nameFROM titles RIGHT OUTER JOIN publishersON titles.pub_id = publishers.pub_id?執(zhí)行過程:
?
完整外部聯(lián)接 ?
包括所有聯(lián)接表中的所有行,不論它們是否匹配。
例:
SELECT titles.title_id, titles.title, publishers.pub_nameFROM titles FULL OUTER JOIN publishersON titles.pub_id = publishers.pub_id?
練習(xí):
此后用到的用例數(shù)據(jù)庫是SQL2008里面的
用例數(shù)據(jù)庫文件:鏈接:http://pan.baidu.com/s/1qW1QxA0?密碼:dqxx
/*返回值2007年2月12日下過訂單的客戶,以及他們的訂單。同時也返回在2007年2月12日沒有下過訂單的客戶。 涉及到表:Sales.Customers表和Sales.Orders表。 期望的輸出(按簡略格式顯示): */ custid companyname orderid orderdate ----------- --------------- ----------- ----------------------- 72 Customer AHPOP NULL NULL 58 Customer AHXHT NULL NULL 25 Customer AZJED NULL NULL 18 Customer BSVAR NULL NULL 91 Customer CCFIZ NULL NULL ... 33 Customer FVXPQ NULL NULL 53 Customer GCJSG NULL NULL 39 Customer GLLAG NULL NULL 16 Customer GYBBY NULL NULL 4 Customer HFBZG NULL NULL 5 Customer HGVLZ 10444 2007-02-12 00:00:00.000 42 Customer IAIJK NULL NULL 34 Customer IBVRG NULL NULL 63 Customer IRRVL NULL NULL 73 Customer JMIKW NULL NULL 15 Customer JUWXK NULL NULL ... 21 Customer KIDPX NULL NULL 30 Customer KSLQF NULL NULL 55 Customer KZQZT NULL NULL 71 Customer LCOUJ NULL NULL 77 Customer LCYBZ NULL NULL 66 Customer LHANT 10443 2007-02-12 00:00:00.000 38 Customer LJUCA NULL NULL 59 Customer LOLJO NULL NULL 36 Customer LVJSO NULL NULL 64 Customer LWGMD NULL NULL 29 Customer MDLWA NULL NULL ...參考SQL:
--answer: select c.custid,c.companyname,o.orderid,o.orderdate from Sales.Customers as c left join Sales.Orders as o on c.custid=o.custid and o.orderdate='2007-2-12' /* 1.將表Sales.Customers別名為c和表Sales.Orders別名為o應(yīng)用ON篩選器以custid和o.orderdate='2007-2-12'為條件左外連接,生成虛擬表VT1, 2.添加外部行,外部行中非保留表中的屬性被賦值為NULL,生成虛擬表VT2 3.處理select列表,從虛擬表VT2中查找出c.custid,c.companyname,o.orderid,o.orderdate生成虛擬表VT3 */注意 and o.orderdate='2007-2-12' 改成 where o.orderdate='2007-2-12',請注意這個結(jié)果又是什么呢? View Code?
/*返回沒有下過訂單的客戶。 涉及的表:Sales.Customers表和Sales.Orders表。 期望的輸出: */ custid companyname ----------- --------------- 22 Customer DTDMN 57 Customer WVAXS參考SQL:
--answer: select c.custid,c.companyname from Sales.Customers as c left join Sales.Orders as o on c.custid=o.custid where o.orderid is null /* 1.將表Sales.Customers別名為c和表Sales.Orders別名為o應(yīng)用ON篩選器以custid為條件左外連接,生成虛擬表VT1, 2.添加外部行,外部行中非保留表中的屬性被賦值為NULL,生成虛擬表VT2 3.應(yīng)用where篩選器選出o.orderid 為 null的數(shù)據(jù)生成虛擬表VT3 4.處理select列表,查找出c.custid,c.companyname生成虛擬表VT4 */ View Code?
總結(jié)
以上是生活随笔為你收集整理的你真的会玩SQL吗?和平大使 内连接、外连接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用函数指针调用函数
- 下一篇: BIEE连接数据库的方法