1. 程式人生 > >資料查詢--單表查詢(SQL)

資料查詢--單表查詢(SQL)

    SQL為使用者提供SELECT語句進行資料查詢,語句一般格式為:

SELECT [ALL|DISTINCT]<目標列表達式1>,<目標列表達式2>,...
FROM <表名或檢視名>
WHERE <條件表示式>
GROUP BY <列名1>
[HAVING <條件表示式>]
ORDER BY <列名> [ASC|DESC];

    語句的含義為:根據WHERE子句的條件表示式從FROM子句指定的表中找出滿足條件的元組,然後再按SELECT子句中的目標表達式選出元組中對應的屬性值形成目標表。

    如果有GROUP BY 子句,則將結果按<列名>的值進行分組,該屬性值相等的元組為一個組。如果GROUP BY 子句後帶有HAVING語句,則只有滿足HAVING 語句的條件方可輸出。

    如果有ORDER BY 子句,結果還要按<列表2>的值進行升(降)序排序操作後輸出。

單表查詢

    單表查詢是指只涉及一個表的查詢。 

    下面我們用一個學生的資訊表為例講解。

    表名:Student

SnoSnameSsexSageSdept
學號姓名性別年齡專業
選擇表中的若干列查詢指定列
  •     查詢指定列

     很多情況下,不同使用者對於表中的一部分屬性感興趣,這是就可以運用SELECT語句查詢使用者指定列資訊。

    例:查詢全體學生的姓名,學號,所在系。

SELECT Sname,Sno,Sdept
FROM Student;

    當然也有一些使用者需要對全部資訊進行瀏覽統計:

 SELECT *
 FROM Student;

等價於

SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
  •     查詢計算後的值

    SELECT 子句後的<目標列表達式>不僅可以是列名,也可以是表示式(計算表示式、函式表示式、字串等)

 SELECT Sname,2018-Sage,LOWER(Sdept)
 FROM Student;
  • 該語句輸出的是全體學生的姓名及出生年份,LOWER()函式將其所在專業名轉化為小寫然後輸出。
選擇表中的若干元組
  •     消除表中的重複行

    兩個本來並不完全相同的元組投影到指定的某些列上時,可能會變成相同的行,這時可以用DISTINCT消除他們:

SELECT DISTINCT Sno
FROM Student;

    使用者不指定DISTINCT關鍵詞時,預設為ALL。

SELECT Sno
FROM Student;

等價於

SELECT ALL Sno
FROM Student;
  •     查詢滿足條件的元組
常用的查詢條件
查詢條件謂詞
比較=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比較運算子
確定範圍BETWEEN AND,NOT BETWEEN AND
確定集合IN,NOT IN
字元匹配LIKE,NOT LIKE
多重條件AND,OR,NOT

例:查詢計算機專業全體學生名單。

SELECT Sname
FROM Student
WHERE Sdept='CS';

查詢20歲以下的學生姓名及其年齡。

SELECT Sname,Sage
FROM Student
WHERE Sage<20;

確定範圍在20~24歲之間的學生姓名、專業和年齡。

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 24;

查詢計算機(CS)、數學(MA)、和資訊(IS)專業的學生姓名和性別。

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

    使用者可以用ORDER BY 子句對查詢結果進行屬性值的升序(ASC)或降序(DESC)進行排序。預設值為升序。

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

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

對於空值,排序時現實的次序由具體系統實現來決定。各個系統的實現可以不同,只要保持一致就行。

聚集函式
    
主要函式
COUNT(*)統計元組個數
COUNT( [DISTINCT|ALL] <列名> )統計一列中值的個數
SUM( [DISTINCT|ALL] <列名> )計算一列值的總和(此列必須是數值型)
AVG( [DISTINCT|ALL] <列名> )
計算一列值的平均值(此列必須是數值型)
MAX( [DISTINCT|ALL] <列名> )
求一列值的最大值
MIN( [DISTINCT|ALL] <列名> )
求一列值的最小值
GROUP BY 子句

    GROUP BY 子句將查詢結果按一列或多列的值分組,值相等的為一組。分組後聚集函式將作用於每一個組,即每一個組都有一個函式值。

    如果分組後還要求按一定的條件對這些組進行篩選,最終只輸出滿足條件的組,則可以使用HAVING短語指定篩選條件。

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

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

WHERE 子句作用於表,從中選出滿足條件的組;(WHERE 子句不能用聚集函式作為條件表示式)

HAVING語句作用於組,從中選擇滿足條件的組。