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