數據庫表的查詢

數據庫的查詢:

/選擇查詢結果輸出列/*

1.表示選擇一個表或視圖中的所有列

SELECT *
FROM STUD
WHERE 專業='計算機'

2.選擇一個表中的指定列

SELECT 學號,姓名,總學分
FROM STUD
WHERE 專業='計算機'

3.定義列別名

SELECT 學號 AS number,姓名 AS name
FROM STUD
WHERE 專業='計算機'
或者
SELECT 學號=number,姓名=name
FROM STUD
WHERE 專業='計算機'
當別名中有空格時,使用引號將標題括起來
SELECT 學號 AS ‘Student number’,姓名 AS name
FROM STUD
WHERE 專業='計算機'
不允許在WHERE子句中使用列別名。

4.替換查詢結果中的數據

SELECT 學號,姓名,等級=//將總學分的列值改爲等級
  CASE
      WHEN 總學分 IS NULL THEN'尚未選課'
      WHEN <50 THEN'不及格'
      WHEN >=50 AND <=52 THEN'合格'
      ELSE ‘優秀’
   END
FROM STUD
WHERE 專業='計算機'

5.計算列值

查詢‘c03’號課程成績加上10分後的學生學號和成績,要求給出臨時標題

SELECT Sno,Grade+10 as'成績'
FROM Course,SC
WHERE Course.Cno=SC.Cno  AND  Course.Cno='C03'

6.消除結果集中的重複行

SELECT DISTINCT 專業
FROM STUD

7.限制結果集返回行數//返回結果集的前6行

SELECT TOP 6 姓名 ,專業
FROM STUD

8.聚合函數
1)SUM ,AVG

SELECT SUM(成績) AS '總和',AVG(成績) AS '平均分分'
FROM STUD
WHERE 課程號=‘101

2)MAX,MIN

SELECT MAX(成績) AS '最高分',MIN(成績) AS '最低分'
FROM STUD
WHERE 課程號=‘101

3)COUNT,統計組中滿足條件的行數或總行數

SELECT COUNT(總學分) AS '總學分大於50人數'
FROM STUD
WHERE 總學分>50
如果使用COUNT(*)時將返回檢索行的總數目,不論其是否包含空值,如果COUNT()括號中爲列名的話,則忽略空值。

/選擇查詢條件 WHERE*/

1.表達式比較
當兩個表達式值中有一個爲空值或者都爲空值時,比較運算符將返回UNKNOWN。
表達式比較符有 <>,!=不等於,!< 不小於,!> 不大於等運算符。

SELECT *
FROM STUD
WHERE 專業=‘通信工程’ AND 學分>=42

2.模式匹配

% 代表0個或多個任意字符
_ 代表單個字符
[]指定屬於範圍,如屬於[0-9][absd]中的任何單個字符
[^]指定不屬於範圍,如不屬於[^0-9][^absd]中的任何單個字符

SELECT *
FROM STUD
WHERE 姓名 LIKE '王_'
當含有轉義字符時,LIKE '%5/%%' ESCAPE '/',這裏表示任意位置包含5%的字符串。

3.範圍比較(BETWEEN IN )

SELECT 出生時間
FROM STUD
WHERE 出生時間 NOT BETWEEN '1995-1-1' AND '1995-12-31'

SELECT *
FROM STDU
WHERE 專業 IN (‘軟件工程’,‘通信工程’)

4.空值比較

SELECT *
FROM STUD
WHERE 備註 IS NULL

5.子查詢,子查詢中不能使用ORDER BY子句
1)IN,判斷一個給定值是否在子查詢結果集中,先執行子查詢。

查詢選修了課程名爲“信息系統”的學生學號和姓名
    SELECT Sno,Sname      ③ 最後在Student關係中
    FROM    Student         取出Sno和Sname
    WHERE Sno  IN
             (SELECT Sno          ② 然後在SC關係中找出選
              FROM    SC             修了3號課程的學生學號
              WHERE  Cno IN
                     (SELECT Cno      ① 首先在Course關係中找出
                       FROM Course     “信息系統”的課程號,爲3WHERE Cname= ‘信息系統’
                     )
              );

2)比較子查詢(ALL,SUM,ANY)
這裏寫圖片描述

找出每個學生超過他選修課程平均成績的課程號。
   SELECT Sno, Cno
    FROM  SC  x
    WHERE Grade >=
    (
    SELECT AVG(Grade) 
        FROM  SC y
        WHERE y.Sno=x.Sno
    );

3)EXISTS子查詢

查詢沒有選修1號課程的學生姓名。
     SELECT Sname
     FROM Student
     WHERE NOT EXISTSSELECT *
       FROM SC
       WHERE Sno = Student.Sno AND Cno='1');

/指定查詢對象*FROM/
1.表或視圖
2.導出表

SELECT Sname
FROM (
   SELECT Sname
   FROM STUD
   WHERE SCORE>50
)AS Student//表的別名
WHERE 性別=1

/連接多表*/
1.連接謂詞
1)自然連接

 SELECT   Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
    FROM     Student,SC
    WHERE    Student.Sno = SC.Sno

2)多表連接

查詢選修2號課程且成績在90分以上的所有學生      
        SELECT Student.Sno, Sname
        FROM    Student, SC
        WHERE Student.Sno = SC.Sno
                                            /* 連接謂詞*/
             AND    SC.Cno= ‘2AND SC.Grade > 90/* 其他限定條件 */

2.以JOIN關鍵字指定的連接

1)內連接 INNER JOIN
按照ON所指定的連接條件合併兩個表,返回滿足條件的行

查詢每個學生的情況以及選修課的課程情況
SELECT *
FROM Student INNER JOIN SC
ON Student.sno=SC.sno

2)外連接 OUTER JOIN
其中的OUTER關鍵字均可省略
外連接操作以指定表爲連接主體,將主體表中不滿足連接條件的元組一併輸出
左外連接(LEFT OUTER JOIN)結果表中除了包括滿足連接條件的所有行外,還包括左表的所有行

查詢每個學生及其選修課程的情況
   SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
    FROM  Student  LEFT OUTER JOIN SC ON Student.Sno=SC.Sno; 

右外連接(RIGHT OUTER JOIN)結果表中除了包括滿足連接條件的所有行外,還包括右表的所有行

 查找選修了的課程和所有開設的課程名
  SELECT SC.*,課程名
  FROM SC RIGHT OUTER JOIN Course
  ON Sc.Sno=Course.Sno

完全外連接(FULL OUTER JOIN)結果表中除了包括滿足連接條件的所有行外,還包括兩個表的所有行

3)交叉連接 CROSS JOIN,實質是對兩個表進行笛卡爾積運算
列出所有學生的可能選課情況:

SELECT 學號,姓名,課程號,課程名
FROM COURSE CROSS JOIN SC

/指定查詢結果分組方法*GROUP BY/
根據字段對記錄分組,對結果集進行分組,常和聚合函數搭配使用。
在SELECT之後的字段名,除了GROUP BY之後的字段名和聚合函數之外,不能有其他字段名。

SELECT 專業,COUNT(*) AS 人數
FROM Student
GROUP BY 專業

/指定查詢結果分組後篩選條件*HAVING/
HAVING子句可以使用聚合函數,而WHERE不可以。常和GROUP BY搭配使用,對分組數據進行過濾。
子句的執行順序: FROM->WHERE->GROUP BY->HAVING

SELECT 學號
FROM Student
WHERE 成績>=80
GROUP BY 學號
HAVING COUNT(*) > 2

/指定查詢結果排序順序*ORDER BY/
1.對查詢結果排序輸出
對查詢結果排序輸出,ASC升序,DESC降序

SELECT *
FROM Student
WHERE 專業=‘通信工程’
ORDER BY 出生時間

2.對結果排序附加彙總
COMPUTE BY子句 常跟在ORDER BY子句之後搭配使用。

/其他參加集合操作的各查詢結果的列數必須相同,對應項的數據類型也必須相同 */
1.INTO 將SELECT查詢結果保存到新建的表中去 SELECT..INTO..FROM..WHERE
2.UNION(並) 將多個SELECT查詢結果集合併成一個結果集

查詢計算機科學系的學生及年齡不大於19歲的學生。
        SELECT *
        FROM Student
        WHERE Sdept= 'CS'
        UNION
        SELECT *
        FROM Student
        WHERE Sage<=19

UNION:將多個查詢結果合併起來時,系統自動去掉重複元組。
UNION ALL:將多個查詢結果合併起來時,保留重複元組

3.EXCEPT(交)
查詢計算機科學系的學生與年齡不大於19歲的學生的交集

SELECT *
    FROM Student
    WHERE Sdept='CS' 
    INTERSECT
    SELECT *
    FROM Student
    WHERE Sage<=19 
實際上就是查詢計算機科學系中年齡不大於19歲的學生

4**.INTERSECT(差)**

查詢計算機科學系的學生與年齡不大於19歲的學生的差集。

    SELECT *
    FROM Student
    WHERE Sdept='CS'
    EXCEPT
    SELECT  *
    FROM Student
    WHERE Sage <=19;
實際上是查詢計算機科學系中年齡大於19歲的學生

5.CTE 在SELECT語句的最前面可以使用一條WITH子句指定臨時結果集。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章