SqlServer:SELECT 查詢數據


SELECT 語句

SELECT 語句語法

在基本的增刪改查操作中,可以說數據庫用到的最多的操作是查操作。SELECT 語句是應用最廣泛的 SQL 語句,用於在數據庫中查詢數據,SELECT 的語法格式為。SELECT 語句是根據 WHERE 子句的篩選條件表達式,從 FROM 子句指定的表中找出滿足條件的記錄,再按 SELECT 語句中指定的字段順序,篩選出記錄中的字段值構造的結果。這個結果稱為結果集(一個表或多個表),表示符合條件的指定列的內容。

SELECT [ALL|DISTINCT| TOP n] 列名列表
FROM 表名列表
INTO 新表名
WHERE 條件
ORDER BY 列名
GROUP BY 列名

其中 ALL 表示顯示全部記錄,DISTINCT 表示只顯示唯一的值,即如果有多個記錄的選擇字段的數據相同時,只返回第一個。TOP n 表示只顯示前 n 條記錄,n 是一個用戶指定的正整數。SELECT 的各個子句的功能如下:

子句 功能 說明
SELECT 顯示指定列的內容 不可缺少,可以為列名指定別名,列名也可以是表達式
FROM 指明數據來源 不可缺少,可以為表名指定別名
INTO 將查詢結果存儲到新表中 可缺少,新表中各列的參數與原表相同,用於快速建表
WHERE 指定條件 若缺少此項,則表示全部記錄
ORDER BY 將查詢結果排序 可缺少,可以指定排序方式為升序(默認)和降序
GROUP BY 將查詢結果分排顯示 可缺少,分組依據通常是一個列名

查詢樣例

假設 Student 表中有如下一些數據:

樣例一

無條件查詢全部數據。

SELECT * FROM student

樣例二

查詢學生表的學生學號和姓名,在 SELECT 關鍵字后指明要檢索的列名。

SELECT SNO, SNAME FROM student

樣例三

查詢 student 表中不重復的班級,需要用到 DISTINCT 關鍵字。

SELECT DISTINCT class FROM STUDENT

樣例四

改變列標題的檢索,可以用空格隔開列名和新標題,也可以用 “AS” 隔開。

SELECT SNO 學號, SNAME 姓名 FROM student
SELECT SNO AS '學號', SNAME AS '姓名' FROM student

運算符

運算符包括比較運算符、范圍運算符、列表運算符、空值判斷符、邏輯運算符、通配符、模式匹配符等。這些運算符不僅可以用在 SELECT 語句中,也可以用在程序中或者其他地方。

比較運算符

比較運算符用於比較兩個值的大小,也叫關系運算符。

運算符 功能
> 大於
>= 大於或等於
小於
<= 小於或等於
!> 不大於
!< 不小於
<> 不等於
!= 不等於

范圍運算符

指的是一個值是否在指定的范圍內,包括兩個運算符。

運算符 功能
BETWEEN … AND … 在某個范圍之間
NOT BETWEEN … AND … 不在某個范圍之間

列表運算符

用於判斷表達式是否出現在列表中,包括兩個運算符。

運算符 功能
IN(項1,項2……) 在列表中
NOT IN(項1,項2……) 不在列表中

空值判斷符

用於判斷表達式是否為空,有兩個運算符。

運算符 功能
IS NULL 為空
IS NOT NULL 不為空

邏輯運算符

用於連接多個條件構成復雜的表達式,其結果是一個邏輯值,表示成立(邏輯真)或不成立(邏輯假),包括 NOT、AND、OR 三個運算符。

運算符 功能
NOT 邏輯非運算
AND 邏輯與運算
OR 邏輯或運算

通配符

常用於模糊查找,它判斷列值是否與指定的字符串格式相匹配。可使用以下通配字符:

運算符 功能
% 匹配任意類型和長度的字符
_ 匹配單個任意字符,常用來限制表達式的字符長度
[] 指定一個字符、字符串或范圍,要求所匹配對象為括號中的任一個
[^] 匹配對象為指定字符以外的任意一個字符

模式匹配符

用於判斷值是否與指定的字符通配格式相符,包括兩個運算符。

運算符 功能
LIKE 匹配
NOT LIKE 不匹配

帶過濾條件的查詢

WHERE 子句

在 SELECT 語句中的 WHERE 子句可以查詢符合要求的記錄,不符合要求的記錄將被過濾掉,不返回在結果集中。

查詢樣例

樣例一

在 student 表檢索 “95033” 班級的學生信息。

SELECT * FROM student WHERE Class = '95033'

樣例二

在 student 表中檢索姓“王”的學生信息,需要使用 LIKE 運算符和 % 通配符。

SELECT * FROM student WHERE Sname LIKE '王%'

樣例三

檢索年齡為 21,25,22 的學生學號、姓名,需要使用 IN 運算符。

SELECT Sno, Sname FROM student WHERE YEAR(GETDATE())-YEAR([Sbirthday]) IN (21,25,22)

樣例四

查詢 Student 表中不姓“王”且姓名第二字為“君”的同學記錄。

SELECT * FROM Student WHERE Sname LIKE '[^王]君%'

樣例五

假設此時有成績表 Score,表中具有以下字段和記錄。

查詢 Score 表中成績在 60 到 80 之間的所有記錄,需要使用 BETWEEN 運算符。

SELECT * FROM Score WHERE degree BETWEEN 60 AND 80;

對結果集排序

ORDER BY 子句

在 SELECT 語句中使用 ORDER BY 子句可以對查詢結果進行升序或降序排列,排序時 NULL 被認為是最小值。ORDER BY 子句的基本格式如下,其中 ASC 表示升序(默認值),DESC 是降序。

ORDER BY 列名 [ASC| DESC],…

查詢樣例

樣例一

以 Cno 升序、Degree 降序查詢 Score 表的所有記錄。

SELECT * FROM Score ORDER BY Cno, degree desc;

樣例二

查詢 Student 表中最大和最小的 Sbirthday 日期值,不使用聚集函數時可以使用 TOP 關鍵字和 ORDER BY 子句實現。

SELECT TOP 1 Sbirthday FROM Student ORDER BY Sbirthday DESC;
SELECT TOP 1 Sbirthday FROM Student ORDER BY Sbirthday;


多表查詢

在數據查詢時,數據的來源經常是數據庫中兩個或者兩個以上的表。系統先按照一定的條件將這些表連接起來,將兩個表通過列相加、行組合而形成一個虛擬表。通常情況下,兩個表之間有着公共的字段或者通過外鍵約束來建立關聯關系。如果兩個表沒有任何相同的字段,則可以通過比較類型相同的兩個列的值的大小進行查詢。

JOIN ON 子句

可以在 SELECT 語句的 WHERE 子句中使用比較運算符給出連接條件對表進行連接,其基本格式為如下。列名 1 和列名 2 兩個列必須是可以比較大小的,當使用 “=” 時為等值連接,若在等值連接中去除結果表中相同的字段名為自然連接,若有多個連接條件為復合條件連接,若一個表與自身進行連接稱為自連接。

表名1.列名1 運算符 表名2.列名2

在一個 SELECT 語句中,如果用到兩個以上的表且兩個表中有相同的列名,為了區別列的來源需要用“表名.列名”的形式。還可以為表名設置一個別名,用“FROM 表名 別名”這樣的形式用別名代替表名。

SELECT 列名列表 FROM 表名1
JOIN 表名2 ON 條件

多表連接查詢用到多張表,原則是表越少越好,能夠用一張表查詢到數據就不要用兩張表。至於要用到哪些表,主要考慮要輸出的列來自於幾個表,以及在查詢務件中要用到哪些表才能寫出表達式。

查詢樣例

例如數據庫中有 Course、Teacher 加上上述 2 張表共 4 張表,4 張表的字段和存在的記錄如下。

樣例一

查詢所有人的學號、姓名、課程號、課程名和成績,需要將 Student、Course 和 Score 3 張表連接進行查詢,使用 JOIN 子句並在 ON 指出 3 張表的相同列。

SELECT s.Sno, Sname, c.Cno, Cname, Degree
FROM Student s 
JOIN Score sc ON s.Sno = sc.Sno
JOIN Course c ON c.cno = sc.cno

樣例二

查詢 Student 表本月過生日同學的信息,包括學號,姓名,課程號,課程名,任課教師和成績,需要將 4 張表連接進行查詢

SELECT S.Sno,Sname,C.Cno,Cname,T.Tname,Degree 
FROM Student S 
JOIN Score SC ON S.Sno = SC.Sno 
JOIN Course C ON C.Cno = SC.Cno
JOIN Teacher T ON T.Tno = C.Tno
WHERE MONTH(GETDATE()) = MONTH(Sbirthday);

樣例三

查詢所有學生信息,包括學號,姓名,課程號,課程名,任課教師和成績(包括沒上課的學生,沒有選修的課程以及沒上課的教師),此處需要用到完全連接。

SELECT s.Sno, Sname, c.Cno, Cname, t.Tname, sc.Degree
FROM Student s
FULL OUTER JOIN Score sc on s.Sno = sc.Sno
FULL OUTER JOIN Course c on sc.Cno = c.Cno
FULL OUTER JOIN Teacher t on c.Tno = t.Tno

參考資料

《SqlServer 2014 數據庫技術實用教程》,胡伏湘、肖玉朝 主編,清華大學出版社


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM