SQL中表的連接類型-自連接


舉例

題目:查詢成績中存在不及格課程的學生的姓名、學習的所有的課程及成績信息。

 

按照以前的方法,可以寫兩個SQL,分兩步查詢:

1、查出存在不及格課程的學生的學號;

SELECT DISTINCT SNO
FROM   STUDENT
WHERE  MARK<60

2、根據學號查詢其姓名、學習的所有課程及成績。

SELECT SNAME,CNO,MARK
FROM   STUDENT
WHERE  SNO IN ('202201','202202')

 

自連接

采用自連接,一個SQL即可以實現,如下

SELECT DISTINCT S1.SNAME,S1.CNO,S1.MARK
FROM   STUDENT AS S1,STUDENT AS S2
WHERE  S1.SNO = S2.SNO
AND    S2.MARK<60

補充知識:笛卡爾積  假設集合A={a, b},集合B={0, 1, 2},則兩個集合的笛卡爾積為{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

 

系統首先執行FROM子句,將STUDENT表S1與S2的笛卡爾積作為中間表。該中間表每一條記錄包含兩部分信息,直觀一點形容,左側是S1的記錄,右側是S2的記錄。而后系統執行WHERE子句,在中間表中搜索S2中分數低於60分的學生的記錄。

如圖是中間表:

(1)紅線左側是S1的數據,右側是S2的數據。

(2)黑線框住的5條數據即是S2.MARK<60的數據,因此其對應的S1的數據即是題目要查詢的數據。

 

中間表是沒有重復記錄的,但是查詢的結果是S1的部分字段,是有可能重復的,因此需要加上DISTINCT。

注意一下,DISTINCT關鍵字作用於所有的列,不僅僅是跟在他后面的那一列。

最終查詢的結果是:

總結一下自連接:

1、自連接是表與其自身進行連接,需要用到表別名S1,S2;
2、用什么建立連接?SNO。因為一個SNO可以唯一標識一個學生,而查的是學生的所有課程。
3、S2限制條件,S1查詢結果。試想,如果S1限制條件,查的也同是S1的字段,那S2用來做什么呢?

 

課后練習

1、查詢customer顧客表中與Jim同一公司的顧客;

select c1.cust_name from customer c1,customer c2 where c1.company= c2.company and c2.cust_name='Jim';

連接字段為公司名稱;

2、查詢series系列表中與A同一組的商品;

select s1.pro from series s1,series s2 where s1.group_id=s2.group_id and s2.pro='A';

 連接字段為組ID;

 

 End.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM