1. 程式人生 > >資料庫系統概論總結(二)

資料庫系統概論總結(二)

外連線

左連線: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的所有學生記錄]

參考:資料庫系統概論 王刪