今天我們學(xué)習(xí)的是多表查詢中的連接查詢,而連接查詢又有以下分類:
今天我們主要學(xué)習(xí)內(nèi)容就是內(nèi)連接以及自然連接。首先我們來(lái)了解什么是內(nèi)連接。內(nèi)連接也叫連接,是最早的一種連接。內(nèi)連接是從結(jié)果表中刪除與其他被
連接表中沒有匹配行的所有行,所以內(nèi)連接可能會(huì)丟失信息。
內(nèi)連接對(duì)應(yīng)的sql語(yǔ)句有以下兩個(gè):
- 方言:SELECT * FROM 表1 別名1, 表2 別名2 WHERE 別名1.列名=別名2.列名
- 標(biāo)準(zhǔn):SELECT * FROM 表1 別名1 INNER JOIN 表2 別名2 ON 別名1.列名=別名2.列名
1.笛卡爾積
在學(xué)習(xí)內(nèi)連接之前,我們首先要知道什么是笛卡爾積。笛卡爾積引用自數(shù)學(xué),在數(shù)學(xué)中,兩個(gè)集合X和Y的笛卡爾積(Cartesian product),又稱直積。
假設(shè)集合A={a,b},集合B={0,1,2},則兩個(gè)集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}??梢詳U(kuò)展到多個(gè)集合的情況。類似的例子有,如果A表示某學(xué)校學(xué)生的集合,B表示該學(xué)校所有課程的集合,則A與B的笛卡爾積表示所有可能的選課情況。
數(shù)據(jù)庫(kù)user中有兩個(gè)表,分別是emp表和dept表,他們的笛卡爾積如圖1-1所示:
圖1-1 笛卡爾積
emp表中的記錄數(shù)是15,dept表中的記錄數(shù)是4,而使用:select * from emp,dept語(yǔ)句查詢出來(lái)的結(jié)果集的行數(shù)是60行。通過(guò)以上sql語(yǔ)句查詢的結(jié)果其實(shí)就是emp表與dept表的笛卡爾積。結(jié)果集的左半部分是emp表的數(shù)據(jù),右半部分是dept表的數(shù)據(jù),其中emp表中每條記錄出現(xiàn)的次數(shù)是4次,因此結(jié)果集的總記錄數(shù)是60。
我們很少使用表的笛卡爾積,因?yàn)榈芽柗e中有很多數(shù)據(jù)都是沒有任何意義的,例如圖1-1中的第一條記錄,甘寧的deptno是20,而該條記錄卻和deptno為10的dept表記錄連接在一起。
2.內(nèi)連接(方言)
(1)查詢每個(gè)員工的信息以及所在部門信息,對(duì)應(yīng)的sql語(yǔ)句是:select * from emp,dept where emp.deptno=dept.deptno,如圖1-2所示:
圖1-2 內(nèi)連接
圖1-2中有14條記錄,以上sql語(yǔ)句的where條件的作用就是去除圖1-1中emp的deptno值與dept的deptno值不相同的記錄。理論上說(shuō)圖1-2中查詢結(jié)果應(yīng)該有15條記錄,由于emp表中名為張三的記錄,他的deptno的值為50,而dept表中根本沒有這個(gè)部門,即表示,該條記錄不滿足連接條件emp.deptno=dept.deptno,因此張三那條記錄被過(guò)濾掉。
select * from emp,dept where emp.deptno=dept.deptno是內(nèi)連接的方言形式,所謂方言就是指該條sql語(yǔ)句只適用于mysql數(shù)據(jù)庫(kù),而在其他數(shù)據(jù)庫(kù)中就不能進(jìn)行內(nèi)連接查詢。
之前我們給待查詢的列起過(guò)別名,在進(jìn)行多表查詢時(shí),我們也可以給表起別名,如:select * from emp e,dept d where e.deptno=d.deptno。表的別名不僅可以在where條件中使用,還可以在select子句后面使用。
3.內(nèi)連接(標(biāo)準(zhǔn))
同樣查詢每個(gè)員工的姓名,工資以及部門名稱,對(duì)應(yīng)的sql語(yǔ)句是:select e.ename,e.sal,d.dname from emp e inner join dept d on e.deptno=d.deptno。其中on關(guān)鍵字與where關(guān)鍵字有同樣的效果,查詢結(jié)果如圖1-3所示:
圖1-3 內(nèi)連接查詢
以上查詢結(jié)果獲得的過(guò)程可以理解為:首先將兩個(gè)表做笛卡爾積,然后根據(jù)條件去掉不滿足要求的,最后再選擇ename、sal、dname這三個(gè)列。
內(nèi)連接的標(biāo)準(zhǔn)sql語(yǔ)句中on關(guān)鍵字不能換成where關(guān)鍵字,所謂的標(biāo)準(zhǔn)是指該sql語(yǔ)句不僅適用于MySQL數(shù)據(jù)庫(kù)還適用于其他數(shù)據(jù)庫(kù)。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/javaee