SQL基礎回顧

數據庫基礎回顧(一)html


 

數據庫的一些基本概念這裏就不寫了,數據模型有不少,最經常使用的是關係模型。數據庫

  關係模型:ide

    1)關係:一個關係對應一張二維表,每一個關係都有一個關係名;函數

    2)元組:表中的一行爲一個元組;spa

    3)屬性:表中的一列爲一個屬性,每一個屬性都有一個屬性名;3d

    4)碼:也稱爲碼鍵,表中的某個屬性或屬性組,它能夠惟一肯定關係中的一個元組;code

    5)域:屬性的取值範圍;   htm

    6)份量:元組中的一個屬性值;blog

 

SQL語言

  SQL:結構化查詢語言是關係數據庫的標準語言。其特色有綜合統1、高度非過程化、面向集合操做等。使用SQL語言能夠對基本表、視圖、查詢表進行操做。排序

  經常使用四大操做:增刪查改.

  SQL查詢:基本結構包含三個子句:SELECT、FROM、WHERE。

 簡單查詢

    投影運算

    1)查詢指定列

      SELECT 屬性名 FROM 表

    2)消除重複元組

      SQL默認不消除重複元組,若是須要,可使用DISTINCT關鍵字

      SELECT DISTINCT xxx FROM 表

    3)查詢全部列

      方法一是將列名一一列出,方法二是使用*符號,*表示全部屬性。

    4)給屬性列區別名

      SELECT 屬性名 (AS) 別名 FROM 表

    選擇運算

    1)比較運算(>,>=,=,<,<=,<>,!=)

      SELECT 屬性名 FROM 表 WHERE 比較運算

    2)範圍查詢(BETWEEN AND)

      SELECT 屬性名 FROM 表 WHERE BETWEEN AND

    3)集合查詢(IN)

      SELECT 屬性名 FROM 表 WHERE 屬性 (NOT) IN(集合)

    4)空值查詢(null)

      SELECT 屬性名 FROM 表 WHERE 屬性 IS (NOT) null

    5)字符匹配查詢(LIKE)

      SELECT 屬性名 FROM 表 WHERE 屬性 (NOT) LIKE 「xxx」

    6)邏輯查詢(AND、OR、NOT)

      SELECT 屬性名 FROM 表 WHERE 表達式 AND 表達式

    排序運算

      ORDERD BY <表達式1> [ASC|DESC] ,  <表達式2> [ASC|DESC],......

 

 鏈接查詢

     等值與非等值鏈接

    等值與非等值鏈接運算是在WHERE子句中加入鏈接多個關係的鏈接條件,格式爲:

    WHERE[表1.]<屬性名1><比較運算符>[表2.]<屬性名2>[<邏輯運算符>[表3.]<屬性名3><比較運算符>[表4.]<屬性名4>...]

    鏈接屬性必須具備可比性

    現有三張表:                                             

       學生表Student

學號 姓名 性別
studentNo studentName sex
char(7) varchar(20) char(2)

         課程表Course

課程號 課程名
courseNo courseName
char(3) varchar(30)

       成績表Score

學號 課程號 成績
studentNo courseNo score
char(7) char(3) numeric

 

    1)等值鏈接(比較運算符爲=)

      查詢選修了課程名稱爲「計算機原理」的同窗學號和姓名。

      SELECT studentNo,studentName

      FROM Student a, Course b, Score c

      WHERE b.courseName="計算機原理" AND b.courseNo=c.courseNo AND c.studentNo=a.studentNo        

      分析:查詢的結果要在SELECT子句中,涉及到的表包含學生表,課程表,成績表。

        courseNo既是課程表主碼,也是成績表的外碼,因此這兩張表的鏈接條件是課程號相同,studentNo既是學生表的主碼,也是成績表的外碼,這兩張表的鏈接條件是學號相同。

        選擇條件要選出courseName爲‘計算機原理’的信息。

    2)天然鏈接

      SQL不直接支持天然鏈接,完成天然鏈接的方法是在等值鏈接的基礎上,去掉重複列。

    3)非等值鏈接(使用比較少)

    自錶鏈接

      某個表與本身進行鏈接。

      示例好比上面的表裏,同時選修了‘001’課程號和‘002’課程號的學生的信息時,就會用到自錶鏈接。

      假設成績表a查詢選修‘001’課程的同窗,成績表b查詢選修‘002’課程的同窗,那麼則須要將成績表a與成績表b在學號上作等值鏈接,也是自錶鏈接,鏈接成功表示學生同時選修了‘001’和‘002’課程。

    外鏈接

      通常的連接中,只有知足鏈接條件的元組纔會被檢索出來,若是要將不知足鏈接條件的元組也顯示出來,在相應的位置用空值替代,則這種查詢稱爲外鏈接查詢。

      外鏈接查詢包括:

      左外鏈接:鏈接結果中包含左關係所有元組,對於左關係中沒有鏈接的元組,在其右關係相應的屬性用空值替代。

      右外鏈接:與左外鏈接相反。

      全外鏈接:包含左右關係中的所有元組。  

  嵌套子查詢  

    子查詢分爲兩類:

    1. 相關子查詢
    2. 非相關子查詢

 

    在主查詢中,每查詢一條記錄,須要從新作一次子查詢,這種稱爲相關子查詢。

    在主查詢中,子查詢只須要執行一次,子查詢結果再也不變化,供主查詢使用,這種查詢方式稱爲非相關子查詢。

 

    1)使用IN的子查詢。

      示例1:查詢選修過課程名包含「系統」的課程的同窗的學號。(非相關子查詢)

SELECT studentNo
FROM Student
WHERE studentNo IN 
        (SELECT studentNo FROM Score
         WHERE courseNo IN
                (SELECT courseNo FROM Course
                 WHERE courseName LIKE '%系統%')
        )
View Code

      示例2:查詢選修過編號爲「002」的課程且成績大於60分的同窗學號。(相關子查詢)

SELECT studentNo 
FROM Student t
WHERE 60<=
        (SELECT score FROM Score s
         WHERE courseNo='002'
         AND s.studentNo=t.studentNo)    
View Code

      該示例中主查詢每次取出一條記錄到子查詢中,子查詢完成後,主查詢須要繼續取下一條記錄到子查詢中,因此爲相關子查詢。

    2)使用比較運算符的子查詢

      比較運算中,經常使用到謂詞ANY和ALL,其中ANY表示子查詢結果中的某個值,謂詞ALL表示子查詢結果中的全部值。  

    3)使用存在量詞EXISTS的子查詢

      SQL查詢提供量詞運算,有存在量詞和全程量詞,其中全稱量詞能夠用存在量詞代替,經過NOT EXISTS實現。

      示例1:查詢選修了「數據庫」課程的同窗姓名。

SELECT studentName
FROM Student a
WHERE EXISTS
        (SELECT * FROM Score b, Course c
         WHERE b.studentNo=a.studentNo
         AND b.courseNo=c.courseNo
         AND c.courseName='數據庫')    
View Code

      1.首先取Student表第一個元組,並取其學號x.studentNo.

      2.執行子查詢,對錶Score和Course進行鏈接。

      3.若是子查詢中獲得結果,即存在符合的元組,則將Student表中元組x的學號組成新元組存放在結果集合中,不然,直接丟棄該元組。

      4.重複上述操做直至Student表中無新元組。

       

      示例2:查詢選修了全部課程的學生姓名。

      本查詢使用了全程兩次,須要轉換成存在量詞,查詢選修全部課程的學生能夠理解爲查詢這樣的學生,不存在沒有選修的課程。

      數據庫每一個學生選修課程狀況以下:

      

 

      代碼見下:

SELECT studentName
FROM Student a
WHERE NOT EXISTS
        (SELECT * FROM Course c
         WHERE NOT EXISTS
                (SELECT * FROM Score
                 WHERE studentNo=a.studentNo 
                 AND courseNo=c.courseNo)
         )
View Code

      咱們這麼分析,最裏層的子查詢中,是判斷學生a.studentNo是否選修了課程c.courseNo

      而NOT EXISTS獲得的結果集則是存在沒選修的課程的學生。

      

       最外層的NOT EXISTS獲得的結果則是與上面子查詢結果相反,即不存在沒有選修課程的學生,也就是選修了所有課程的學生。

      

       

  聚合查詢

    SQL提供了豐富的數據分類、統計和計算的功能,其統計功能是經過聚合函數來實現,分類功能是經過分組子句來實現。

    1)聚合函數:

      • count([DISTINCT|ALL]{*|<列名>}):統計關係的元組個數或一列中值的個數。
      • sum([DISTINCT|ALL]<列名>):統計一列中值的總和(此列必須爲數值型)。
      • avg([DISTINCT|ALL]<列名>):統計一列中值的平局值(此列必須爲數值型)。
      • max([DISTINCT|ALL]<列名>):統計一列中值的最大值。
      • min([DISTINCT|ALL]<列名>):統計一列中值的最小值。

      

   1.若是指定了DISTINCT謂詞,則在計算時首先消除<列名>中取值重複的元組,而後在統計。

   2.聚合函數遇到空值時,除count(*)之外全部的函數都會跳過空值,只處理非空值。   

    2)分組聚合

       查詢過程對數據進行分組運算,使用GROUP BY和HAVING子句來實現

      GROUP BY子句對查詢結果按某一列或某幾列進行分組,值相等的分爲一組;

      HAVING子句對分組的結果進行選擇,符合條件的組纔會輸出,該子句必須和GROUP BY子句配合使用

      示例:查詢每一個同窗的選課門數,平均分和最高分。

      

      

       

轉載註明出處:http://www.cnblogs.com/lg-wszz/p/7420934.html  

相關文章
相關標籤/搜索