連接查詢
(多表)連接查詢
SELECT [ ALL|DISTINCT ]<目標(biāo)列表達(dá)式1>[,<目標(biāo)列表達(dá)式2>,... ]
FROM <表名或視圖名1> [,<表名或視圖名2> ,... ]
[ WHERE <元組選擇條件表達(dá)式> ]
連接條件與元組選擇條件進(jìn)行AND(與)操作
缺少連接條件,在多表的廣義笛卡爾積進(jìn)行查詢
案例:查詢選修課程號(hào)為”C01”的學(xué)生學(xué)號(hào)和成績
SELECT SNO,GRADE
FROM SC
WHERE CNO='C01';
案例:查詢選修課程號(hào)為”C01”的學(xué)生姓名和成績
SELECT SN,GRADE
FROM SC,S
WHERE CNO='C01' AND SC.SNO=S.SNO;
查詢語句是在SC表和S表的廣義笛卡爾積的結(jié)果進(jìn)行的選擇,并不是兩個(gè)表自然連接的結(jié)果。因此在笛卡爾積的基礎(chǔ)上篩選出兩個(gè)表的學(xué)號(hào)sno值相同,同時(shí)課程號(hào)CNO = ‘C01’的元組
案例:查詢選修“數(shù)據(jù)結(jié)構(gòu)”課程的學(xué)生的學(xué)號(hào)、姓名和成績
SELECT S.SNO,SN,GRADE
FROM S,SC,C
WHERE S.SNO=SC.SNO AND
C.CNO=SC.CNO AND
CN='數(shù)據(jù)結(jié)構(gòu)';
注意:select子句中學(xué)號(hào)屬性名sno前加上表名可以是S或SC,否則,無法識(shí)別SNO來自于哪張基本表,在語句執(zhí)行時(shí)會(huì)報(bào)錯(cuò)
外連接查詢
?在SQL語句中,外連接在FROM子句中指定,其語法規(guī)則如下:
?FROM? <左關(guān)系>? LEFT | RIGHT | FULL? [OUTER]?JOIN<右關(guān)系>
????????????? ?ON<連接條件>
說明:
? 左外連接:? LEFT [OUTER] JOIN
? 右外連接:? RIGHT [OUTER] JOIN
? 全外連接:? FULL [OUTER] JOIN
? 連接條件可包括對(duì)參與連接的關(guān)系進(jìn)行元組選擇的條件
案例:查詢所有學(xué)生姓名及選修課程號(hào)為“C01”的成績,沒有選修該課程的學(xué)生,成績顯示為空
SELECT SN,GRADE
FROM S?LEFT OUTER JOIN SC
ON SC.SNO=S.SNOANDCNO='C01'?
?常規(guī)連接查詢也稱為內(nèi)連接查詢, 在FROM子句中指定,其語法規(guī)則如下:
??? FROM? <左關(guān)系> [ INNER] JOIN?? <右關(guān)系>? ON <連接條件>
案例:查詢選修“數(shù)據(jù)結(jié)構(gòu)”課程的學(xué)生的學(xué)號(hào)、姓名和成績
SELECT S.SNO, SN, GRADE
FROM (S INNER JOIN SC ON S.SNO=SC.SNO )
????????????? INNER JOIN C?? ON? C.CNO=SC.CNO
WHERE??? CN='數(shù)據(jù)結(jié)構(gòu)';
自身連接查詢
案例:查詢每門課程的間接先修課程號(hào)(即先修課程的先修課程號(hào))
SELECT FIRST.CNO, SECOND.PC
?FROM C FIRST,? C SECOND
?WHERE? FIRST.PC=SECOND.CNO;
連接查詢
SQL連接查詢的典型格式:
??????? SELECT A1,A2,… ,Am
??????? FROM R1, R2, … ,Rn
??????? WHERE F