資料庫語句(二)——查詢

來源:互聯網
上載者:User

標籤:str   自己   顯示   .com   介紹   題目   改善   理解   工作原理   

 

資料查詢我們是分單表查詢,串連查詢,巢狀查詢,集合查詢以及瞭解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的方法,比如下面的,

  1. 用EXISTS/NOT EXISTS實現全稱量詞(痛點)

因為我們sql語句沒有全程量詞"(For all),所以我們可以把帶有全稱量詞的謂語轉換成等價的帶有存在量詞的謂語,        ("x)P ≡ ? ($ x(? P))

 

例子:

選擇不存在任何一門課程沒有選擇的人

 

  1. 用EXISTS/NOT EXISTS實現邏輯蘊函(痛點),因為sql語言中沒有蘊含邏輯運算,所以我們可以利用謂語演算將邏輯蘊含謂詞等價轉換為                  

p ? q ≡ ? p∨q

例子:

說完了巢狀查詢,下面就說說最後一個多表查詢的模組,就是集合查詢,其是多條件查詢的另外一種表示,集合查詢的種類有:

  • 並操作UNION
  • 交操作INTERSECT
  • 差操作EXCEPT

因為其是多條件查詢的另外一種表示,所以參加集合操作的各查詢結果的列數必須是相同的,對應項的資料類型也必須相同

下面我們看看例子:

 

 

 

 

 

最後我們進入到總結環節,首先總結一下select語句的一般格式:

最後是有關多表查詢的總結:

1)      首先先明白我們要查的資料所涉及的因素,從而得出要想把這些因素都涉及起來需要用到那些表

2)      想清楚之後,我們就要開始想我們要用哪一種查詢方式去查(根據各查詢方式的題目特點去判斷)得到我們要的資料

 

注意:我們都需要明白,有關巢狀查詢的,都需要明白我們在嵌套的時候是不相關查詢還是相關查詢,弄清楚之後在進行四種巢狀查詢的語句。

 

資料庫語句(二)——查詢

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.