SQL數據查詢之——單表查詢

1、SQL數據查詢的通常格式

數據查詢是數據庫的核心操做。SQL提供了SELECT語句進行數據查詢,其通常格式爲:數據庫

SELECT [ALL | DISTINCT]<目標列表達式>[,<目標列表達式>]···
FROM<表名或視圖名>[,<表名或視圖名>···] | (SELECT語句>)[AS]<別名>
[WHERE<條件表達式>]
[GROUP BY<列名1>[HAVING<條件表達式>]]
[ORDER BY<列名2>[ASC | DESC]];

整個SELECT語句的含義是,根據WHERE子句的條件表達式從FROM子句指定的基本表、視圖或派生表中找出知足條件的元組,再按SELECT子句中的目標列表達式選出元組中的屬性值造成結果表函數

若是有GROUP BY子句,則將結果按<列名1>的值進行分組,該屬性列值相等的元組爲一個組。一般會在每組中做用匯集函數。若是GROUP BY子句帶HAVING短語,則只有知足指定條件的組才予以輸出。spa

若是有ORDER BY子句,則結果還要按<列名2>的值的升序或降序排序。code

SELECT語句既能夠完成簡單的單表查詢,也能夠完成複雜的鏈接查詢和嵌套查詢。blog

 

2、SQL單表查詢(僅涉及一個表的查詢)

1.選擇表中的若干列

(1)查詢指定列排序

查詢全體學生的學號與姓名字符串

SELECT Sno,Sname
FROM Student;

 

查詢全體學生的姓名、學號、所在系數學

SELECT Sname,Sno,Sdept
FROM Student;

 

(2)查詢所有列it

查詢全體學生的詳細記錄table

    SELECT *
    FROM Students;
等價於
    SELECT Sno,Sname,Ssex,Sage,Sdept
    FROM Student;

 

(3)查詢通過計算的值

查詢全體學生的姓名及其出生年份

SELECT Sname,2014-Sage  //查詢結果的第2列是一個 算術表達式
FROM Student;

注意:用當時的年份(假設爲2014年)減去學生的年齡,這樣所得的便是學生的出生年份。

 

查詢全體學生的姓名、出生年份和所在的院系,要求用小寫字母表示系名

SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept)
FROM Student;

 

2.選擇表中的若干組

(1)消除取值重複的行

查詢選修了課程的學生學號

SELECT DISTINCT Sno
FROM SC;

 

(2)查詢知足條件的元組

查詢知足指定條件的元組能夠經過WHERE子句實現。WHERE子句經常使用的查詢條件以下表所示

查詢條件

謂詞

比較

=,>,<,>=,<=,!=,<>,!>,!<; NOT+上述比較運算符

肯定範圍

BETWEEN AND,NOT BETWEEN AND

肯定集合

IN,NOT IN

字符匹配

LIKE,NOT LIKE

空值

IS NULL,IS NOT NULL

多重條件(邏輯運算)

AND,OR,NOT

 

查詢計算機科學系全體學生的名單

SELECT Sname
FROM Student
WHERE Sdept='CS'

 

查詢全部年齡在20歲如下的學生姓名及其年齡

SELECT Sname,Sage
FROM Student
WHERE Sage<20;

 

查詢考試成績不合格的學生的學號

SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;

 

查詢年齡在20~23歲之間的學生的姓名、系別和年齡

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23

 

查詢年齡在20~23歲之間的學生的姓名、系別和年齡

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23

 

查詢計算機科學系(CS)、數學系(MA)和信息系(IS)學生的姓名、系別和年齡

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');

 

查詢學號爲201215121的學生的詳細狀況

    SELECT *
    FROM Student
    WHERE Sno LIKE '201215121'
等價於
    SELECT *
    FROM Student
    WHERE Sno='201215121'

此處介紹下字符匹配

謂詞LIKE能夠用來進行字符串的匹配。其通常語法格式以下:

[NOT] LIKE'<匹配串>' [ESCAPE '<換碼字符>']

 

其含義是查找指定的屬性列值與<匹配串>相匹配的元組。<匹配串>能夠是一個完整的字符串,也能夠含有通配符 % 和 _ 。其中:

  • %(百分號)表明任意長度(長度能夠爲0)的字符串。例如:a%b 表示以a開頭,以b結尾的任意長度的字符串。如acb、addgb、ab等。
  • _(下劃線)表明任意單個字符。例如:a_b表示以a開頭,以b結尾的長度爲3的任意字符串。如acb、agb等。

 

查詢全部姓劉的學生的姓名、學號和性別

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '劉%';

 

查詢姓「歐陽」且全名爲三個漢字的學生的姓名

SELECT Sname
FROM Student
WHERE Sname LIKE '歐陽_'

注意:數據庫字集爲ASCII時一個漢字須要兩個_;當字符集爲GBK時只須要一個。

 

查詢名字中第二個字爲「陽」的學生的姓名和學號

SELECT Sname,Sno,
FROM Student
WHERE Sname LIKE '_陽%';

 

查詢全部不姓劉的學生的姓名、學號和性別

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '劉%';

 若是用戶要查詢的字符串自己就含有通配符%或_,這時就要使用 ESCAPE '<換碼字符>' 短語對通配符進行轉義了。

 

查詢DB_Design 課程的課程號和學分

SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB \ _Design' ESCAPE '\';

 ESCAPE '\' 表示 「\」 爲換碼字符。這樣匹配串中緊跟在 「\」 後面的字符「_」再也不具備通配符的含義,轉義爲普通的「_」字符。

 

查詢以「DB_」開頭,且倒數第三個字符爲i的課程的詳細狀況

SELECT *
FROM Course
WHERE Cname LIKE 'DB \_%i__'ESCAPE '\';

 

某些學生選修課程後沒有參加考試,因此有選課記錄,但沒有考試成績。查詢缺乏成績的學生的學號和相應的課程號

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;  /*分數Grade是空值*/

 注意:這裏的「IS」不能用等號(=)代替。

 

查全部有成績的學生學號和課程號

SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;

 

查詢計算機科學系年齡在20歲如下的學生姓名

SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;

 

3.ORDER BY 子句

用戶能夠用ORDER BY子句對查詢結果按照一個或多個屬性列的升序(ASC)或降序(DESC)排列,默認值爲升序。

查詢選修了3號課程的學生的學號及其成績,查詢結果按分數的降序排列

SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;

 

查詢全體學生狀況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列

SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;

 

4. 彙集函數

爲了進一步方便用戶,加強檢索功能,SQL提供了許多彙集函數,主要有:

COUNT(*)

統計元組個數

COUNT([DISTINCT|ALL]<列名>)

統計一列中值的個數

SUM([DISTINCT|ALL]<列名>)

計算一列值的總和(此列必須是數值型)

AVG([DISTINCT|ALL]<列名>)

計算一列值的平均值(此列必須是數值型)

MAX([DISTINCT|ALL]<列名>)

求一列值中的最大值

MIN([DISTINCT|ALL]<列名>)

求一列值中的最小值

若是指定 DISTINCT 短語,則表示在計算時要取消指定列中的重複值。

若是不指定 DISTINCT 短語或指定 ALL 短語(ALL爲默認值),則表示不取消重複值。

 

查詢學生總人數

SELECT COUNT(*)
FROM Student;

 

查詢選修了課程的學生人數

SELECT COUNT(DISTINCT Sno)
FROM SC;

 

計算選修1號課程的學平生均成績

SELECT AVG(Grade)
FROM SC
WHERE Cno='1';

 

查詢選修1號課程的學生最高分數

SELECT MAX(Grade)
FROM SC
WHERE Cno='1';

 

查詢學生201215012選修課程的總學分數

SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;

 注意:WHERE 子句中是不能用匯集函數做爲條件表達式的。彙集函數只能用於SELECT子句和GROUP BY中的HAVING子句。

 

5.GROUP BY子句

將查詢結果按某一列或多列的值分組,值相等的爲一組。

 

求各個課程號及相應的選課人數

SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;

 

查詢選修了三門以上課程的學生學號

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;

 

查詢平均成績大於等於90分的學生學號和平均成績

    SELECT Sno,AVG(Grade)
    FROM SC
    WHERE AVG(Grade)>=90 (錯誤!)
    GROUP BY Sno;
由於WHERE子句中是不能用匯集函數做爲條件表達式的,正確的查詢語句應該是:
    SELECT Sno,AVG(Grade)
    FROM SC
    GROUP BY Sno;    
    HAVING AVG(Grade)>=90;

 

3、總結

這次整理了SQL數據查詢中有關單表查詢的程序,其中應格外注意

  • 字符匹配中 % 和 _ 的區別。
  • ESCAPE 的 換碼操做。
  • 彙集函數只能用於 SELECT子句 和 GROUP BY子句 中的 HAVING 子句。
相關文章
相關標籤/搜索