資料庫系統概論總結(二)
阿新 • • 發佈:2019-01-02
外連線
左連線:LEFT JOIN .... ON
以左邊的為主,右邊不存在的置為NULL
SELECT
DISTINCT cou.country,cou.country_id,c.city,c.city_id
FROM country cou LEFT JOIN city c
ON cou.country_id = c.country_id
右連線:RIGHT JOIN.....ON 以右邊的為主,左邊不存在的置為NULL SELECT cou.country,cou.country_id,c.city,c.city_id FROM country cou RIGHT JOIN city c ON cou.country_id = c.country_id
內連線:INNER JOIN.....ON
兩個表之間的交集
**巢狀查詢** 巢狀查詢指的是語句巢狀著另外一個語句,一般有IN、帶比較符、any/all、exist這些, 這裡需要強調的是: 上層的查詢塊稱為外層查詢或父查詢 下層查詢塊稱為內層查詢或子查詢 SQL語言允許多層巢狀查詢 子查詢的限制:不能使用ORDER BY子句 **注意: 不相關子查詢: 子查詢的查詢條件不依賴於父查詢,由裡向外 逐層處理。即每個子查詢在上一級查詢處 理,之前求解,子查詢的結果用於建立其父查詢的查詢條件。 相關子查詢:子查詢的查詢條件依賴於父查詢 首先取外層查詢中表的第一個元組,根據它與內層查相關的屬性值處理內層查詢,若WHERE子句返回值為真,則取此元組放入結果表 然後再取外層表的下一個元組 重複這一過程,直至外層表全部檢查完為止** 下面是一些例子,就不貼圖了 (1) SELECT Sno, Sname, Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname= 'XX'); [不相關子查詢] (2)SELECT Sno, Cno FROM SC x WHERE Grade >=(SELECT AVG(Grade)FROM SC y WHERE y.Sno=x.Sno);[相關子查詢] (3)SELECT Sname,Sage FROM Student WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept= ' CS ');[任意的一個值] (4)SELECT Sname,Sage FROM Student WHERE Sage < (SELECT MIN(Sage) FROM Student WHERE Sdept= ' CS ') [聚集函式的巢狀] (5)EXISTS謂詞 帶有EXISTS謂詞的子查詢不返回任何資料,只產生邏輯真值“true” 或邏輯假值“false”。 若內層查詢結果非空,則外層的WHERE子句返回真值 若內層查詢結果為空,則外層的WHERE子句返回假值 由EXISTS引出的子查詢,其目標列表達式通常都用 * ,因為帶 EXISTS的子查詢只返回真值或假值,給出列名無實際意義。 請比較下面的兩種情況 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= ' 1 '); [相關子查詢,如果存在就輸出,然後繼續迴圈下去] SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sname='XX');[非相關子查詢,如果表中存在叫‘XX’的學生,那麼將輸出SELECT Sname FROM Student的查詢結果,否則為空] **注意:EXIST有很多高階的用法,以後可能會涉及更多exist的邏輯轉換**
**集合查詢** 集合操作的種類 (1)並操作UNION SELECT * FROM Student WHERE Sdept= 'CS' UNION SELECT * FROM Student WHERE Sage<=19; UNION:將多個查詢結果合併起來時,系統自動去掉重複元組 UNION ALL:將多個查詢結果合併起來時,保留重複元組 (2)交操作INTERSECT,相當於AND SELECT * FROM Student WHERE Sdept='CS' INTERSECT SELECT * FROM Student WHERE Sage<=19; (3) 差操作 EXCEPT SELECT * FROM Student WHERE Sdept='CS' EXCEPT SELECT * FROM Student WHERE Sage <=19; 第一句語句的結果為A,第二句語句的結果為B,則為A-B
2.3 帶子查詢的更新語句操作
1、插入子查詢結果,一般需要檢查資料表的完整性約束等條件
如下面的例子:
第一步:建表
CREATE TABLE Dept_age
( Sdept CHAR(15) /*系名*/
Avg_age SMALLINT); /*學生平均年齡*/
第二步:插入資料
INSERT INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
2、UPDATE 子查詢結果
UPDATE SC
SET Grade=0
WHERE Sno IN
(SELETE Sno
FROM Student
WHERE Sdept= 'CS' );[修改表SC中所有學生成績為0]
3、DELETE 子查詢結果
DELETE
FROM SC
WHERE Sno IN
(SELETE Sno
FROM Student
WHERE Sdept= 'CS') ;[刪除部門為CS的所有學生記錄]
參考:資料庫系統概論 王刪