數據庫語句(二)——查詢
數據查詢我們是分單表查詢,連接查詢,嵌套查詢,集合查詢以及了解Select語句的一般形式。
好了,首先說說單表查詢,其分五個內容,為選擇表中的若幹列,選擇表中的若幹元組(重行與不重行的問題),ORDER BY子句,聚集函數,GROUP BY子句,前面兩者比較簡單,所以就簡單的介紹一下,選擇表中的若幹列的話,你就得多留意一下列中可能有需要計算的列和改名字的內容,而選擇表中的若幹元組,你得明白重行與不重行的問題,以及清楚的知道常用的查詢條件和查詢條件的特殊,字符匹配的應用,多重條件查詢(AND):
前兩者就是那麽簡單,好了,現在我們開始說說ORDER BY子句了,
v ORDER BY子句
n 可以按一個或多個屬性列排序
n 升序:ASC;降序:DESC;缺省值為升序
v 當排序列含空值時
n ASC:排序列為空值的元組最後顯示
n DESC:排序列為空值的元組最先顯示
例子:
[例24] 查詢選修了3號課程的學生的學號及其成績,查詢結果按分數降序排列。
SELECT Sno,Grade FROM SC WHERE Cno= ‘ 3 ‘ ORDER BY Grade DESC;
[例25] 查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列。
SELECT * FROM Student ORDER BY Sdept,Sage DESC;
然後進入到我們的聚焦函數(以記錄為單位去處理的):
例子:
[例26] 查詢學生總人數。
SELECT COUNT(*)
FROM Student;
[例27] 查詢選修了課程的學生人數。
SELECT COUNT(DISTINCT Sno)
FROM SC;
[例28] 計算1號課程的學生平均成績。
SELECT AVG(Grade)
FROM SC
WHERE Cno= ‘ 1 ‘;
最後進入到我們的GROUP BY子句
v GROUP BY子句分組:
細化聚集函數的作用對象
- 未對查詢結果分組,聚集函數將作用於整個查詢結果
- 對查詢結果分組後,聚集函數將分別作用於每個組
- 作用對象是查詢的中間結果表
- 按指定的一列或多列值分組,值相等的為一組
例子:
[練習] 求各個同學及相應的選課門數。
SELECT Sno,COUNT(Cno)
FROM SC
GROUP BY Sno;
註意點:
v HAVING短語與WHERE子句的區別:
- 作用對象不同
- WHERE子句作用於基表或視圖,從中選擇滿足條件的元組,HAVING短語作用於組,從中選擇滿足條件的組
例子:
[例32] 查詢選修了3門以上課程的學生學號。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3;
以上就是單表查詢的所有內容,現在我們就要開始說說多表查詢了,首先說說多表查詢的第一個內容,就是連接查詢, 連接查詢的含義就是涉及到多個表的查詢,而要想我們的表連接起來,必定需要有連接參數,所以必須會用到連接參數的條件,而常常我們連接表的時候需要條件的一般的格式:
因為我們特別註意的一點是連接條件中的各連接字段必須是可比的,但名字不必是相同的,而在執行我們的條件操作的時候(特指連表的條件,其他條件都是基於這個條件的操作進行的),有三種方法,
第一種為嵌套循壞法,其就是先從表一找到一個元祖,然後從頭開始掃描表二,逐一查找滿足聯建條件的元組,找到後就將表1中的第一個元組與該元組拼連起來,形成結果表中的一個元組,表二全部查完之後,在找表1的第二個元組,然後的步驟跟上相似,直到把表1的全部元組都處理完畢。但是這個方法有一個很大的弊端就是無論怎樣,他都要把表2的所有元組都要掃完後才進行表1的下一個元組的查詢,這樣子的效率就很慢,所以為了改善效率,於是提出了第二種方法和第三種方法
第二種為排序合並法,其常用於=連接的情況,其步驟是按連接屬性對表1和表2排序,對表1的第一個元組,從頭開始掃描表2,順序查找滿足連接條件的元組,找到後就將表1的第一個元組與該元組拼接起來,形成結果表中的一個元組。當遇到表2中第一條大於表1連接字段值的元組時,對表2的查詢不再繼續,然後找表1的第二條元組,重復上述步驟。
第三種為索引連接,其步驟為對表2按連接字段建立索引,然後對表1的每個元組,依次根據其連接字段值查詢表2的索引,從中找到滿足條件的元組,找到後就將表1只能夠的第一個元組與該元組拼接起來,形成表中的一個元組,重復上述步驟。
基於上面的基礎,我們分連接查詢有四種:等值於非等值連接查詢,自身連接,外連接,復合條件連接,等值與非等值連接查詢很簡單,這邊就不說了,而自身連接是一個表與其自己進行連接,我們需要給表起別名進行區別,由於所有的屬性名都是同名屬性,因此必須使用別名前綴,而外連接跟普通連接不同,普通連接操作只輸出滿足連接條件的元組,而外連接操作以指定的表為連接主題,將主題表中不滿足連接條件的元組一並輸出(為null值),而復合條件連接就是在基於等值於非等值連接的時候再進行多個條件的判斷的一種連接,簡單的說就是這個連接的條件是多個的。
嵌套查詢
首先我們說說什麽叫做嵌套查詢,而了解嵌套查詢,又要先理解好查詢塊的概念:在一個SELECT-FROM-WHERE語句稱為一個查詢塊。而將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱為嵌套查詢
註意:1)子查詢是有限制的,什麽限制呢?
- 不能使用ORDER BY子句
2) 有些嵌套查詢可以用連接運算替代
而嵌套查詢的意義是層層嵌套方式反映了 SQL語言的結構化
好了,說完嵌套查詢的相關概念,首先我們先說說嵌套查詢四種方式的一個通用基礎,就是分清楚是相關查詢還是不相關查詢。
不相關查詢就是子查詢條件不依賴於父查詢,
其工作的原理是:由裏向外 逐層處理。即每個子查詢在上一級查詢處理之前求解,子查詢的結果用於建立其父查詢的查找條件。
相關查詢就是子查詢的查詢條件依賴於父查詢,
其工作原理是:
- 首先取外層查詢中表的第一個元組,根據它與內層查詢相關的屬性值處理內層查詢,若WHERE子句返回值為真,則取此元組放入結果表
- 然後再取外層表的下一個元組
- 重復這一過程,直至外層表全部檢查完為止
說完了四大嵌套查詢的基礎之後,我們就要開始學四大嵌套查詢了,那四大,就是
一、帶有IN謂詞的子查詢
二、 帶有比較運算符的子查詢
三、 帶有ANY(SOME)或ALL謂詞的子查詢
四、 帶有EXISTS謂詞的子查詢
首先我們先說說——帶有IN謂詞的子查詢
例子:
[例39] 查詢與“劉晨”在同一個系學習的學生。
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= ‘ 劉晨 ’);
此查詢為不相關子查詢為基礎的嵌套查詢。
總結:in代表著如果其左邊的列等於右邊的任何一個數,其都可以返回一個記錄
然後說說帶有比較運算符的子查詢
當我們知道子查詢確切的返回單值的時候,可用比較符去比較,這就是帶有比較運算符的子查詢,其常和ANY或ALL謂詞配合使用。而且特別註意一點,子查詢一定要跟在比較符之後。
之後我們就要說說跟比較符一起使用的,帶有ANY(SOME)或ALL謂詞的子查詢
其的謂語詞義是ANY:任意一個值,ALL:所有值。其具體語法如下:
例子:
最後我們就說說帶有EXISTS謂詞的子查詢,其是四大嵌套查詢的難點,首先我們說說exist和not exist的作用,exist的作用就是如果子查詢中有記錄滿足條件的,那麽這條記錄就會被返回,而not exist的作用是,如果子查詢的某個記錄不符合條件,那麽其就會被返回。
直接看例子:
上面說的都是常規的exist的查詢語句,我們還有一些特殊的使用exist的方法,比如下面的,
- 用EXISTS/NOT EXISTS實現全稱量詞(難點)
因為我們sql語句沒有全程量詞"(For all),所以我們可以把帶有全稱量詞的謂語轉換成等價的帶有存在量詞的謂語, ("x)P ≡ ? ($ x(? P))
例子:
選擇不存在任何一門課程沒有選擇的人
- 用EXISTS/NOT EXISTS實現邏輯蘊函(難點),因為sql語言中沒有蘊含邏輯運算,所以我們可以利用謂語演算將邏輯蘊含謂詞等價轉換為
p ? q ≡ ? p∨q
例子:
說完了嵌套查詢,下面就說說最後一個多表查詢的模塊,就是集合查詢,其是多條件查詢的另外一種表示,集合查詢的種類有:
- 並操作UNION
- 交操作INTERSECT
- 差操作EXCEPT
因為其是多條件查詢的另外一種表示,所以參加集合操作的各查詢結果的列數必須是相同的,對應項的數據類型也必須相同
下面我們看看例子:
最後我們進入到總結環節,首先總結一下select語句的一般格式:
最後是有關多表查詢的總結:
1) 首先先明白我們要查的數據所涉及的因素,從而得出要想把這些因素都涉及起來需要用到那些表
2) 想清楚之後,我們就要開始想我們要用哪一種查詢方式去查(根據各查詢方式的題目特點去判斷)得到我們要的數據
註意:我們都需要明白,有關嵌套查詢的,都需要明白我們在嵌套的時候是不相關查詢還是相關查詢,弄清楚之後在進行四種嵌套查詢的語句。
數據庫語句(二)——查詢