(前一章介紹了T-SQL資料操作中的增删改操作,這一章将會介紹資料操作中的查詢操作。)
查詢操作
查詢語句是在做項目中使用次數最多的資料操作語句,其主要為SELECT語句
基礎查詢文法格式:
SELECT [ALL | DISTINCT] <目标清單達式> [,<目标清單達式>] …
FROM <表名或視圖名> [, <表名或視圖名> ] …
[ WHERE <條件表達式> ]
[ GROUP BY <列名1> [ HAVING <條件表達式> ] ]
[ ORDER BY <列名2> [ ASC | DESC ] ];
1、通用的查詢方式:
SELECT *
FROM Student
GO
--代碼說明:查詢Student表中的所有資料列,得到的資料集可能及其龐大,是以不太常用
2、簡略的查詢方式
SELECT stu_Id,stu_Name,stu_Gender,stu_Age
FROM Student
GO
--代碼說明:查詢Student表中的部分資料列,相對的查詢到的資料量有一定的減少
--補充知識:
--對于隻查詢資料表中的部分資訊時,有時會看到許多重複的資訊,這是因為SQL預設會顯示所有的滿足條件的資訊,若不想要重複的資料可以使用DISTINCT關鍵字來實作
--代碼展示
SELECT ALL stu_Gender
FROM Student
GO
--代碼說明:顯示所有滿足條件的資訊(預設不删除重複項)
SELECT DISTINCT stu_Gender
FROM Student
GO
--代碼說明:顯示滿足條件的資訊(删除重複項)
3、where指定條件查詢方式
SELECT *
FROM Student
WHERE stu_Id = 101
GO
--代碼說明:在Student表中查詢學号為101的學生的全部資訊
SELECT stu_Name,stu_Gender
FROM Student
WHERE stu_Id = 101
GO
--代碼說明:在Student表中查詢學号為101的學生的部分資訊
--補充資訊
--WHERE語句的使用方法
where語句是一個條件判斷語句,隻會對滿足where語句條件的資料進行資料操作
(1)、單關系條件的where語句
1)常在where語句中使用條件判斷符号:
<(小于)、>(大于)、(>=)不小于、(<=)不大于、=(等于)、(!=、<>)(不等于)
2)空值條件判斷
使用 IS NULL 或 IS NOT NULL
(2)、多關系條件的where語句
1)常在where中使用到的邏輯符号:
AND、OR、NOT
2)between...and...條件判斷
使用between and 語句執行的效率要優于實作相同功能的邏輯條件語句
3)屬性域的判斷條件
IN關鍵字指定屬性的值域
--示例代碼:
SELECT *
FROM Student
WHERE stu_age < 5
GO
--代碼說明:查詢表中年齡小于5的學生的所有資訊
SELECT *
FROM Student
WHERE stu_age > 5
GO
--代碼說明:查詢表中年齡大于5的學生的所有資訊
SELECT *
FROM Student
WHERE stu_age <= 5
GO
--代碼說明:查詢年齡小于等于5的學生的所有資訊
SELECT *
FROM Student
WHERE stu_age >= 5
GO
--代碼說明:查詢年齡大于等于5的學生的所有資訊
SELECT *
FROM Student
WHERE stu_age = 1
GO
--代碼說明:查詢年齡等于1的學生的所有資訊
SELECT *
FROM Student
WHERE stu_age <> 5
GO
--代碼說明:查詢年齡不等于5的學生的所有資訊
SELECT *
FROM Student
WHERE stu_age != 5
GO
--代碼說明:查詢年齡不等于5的學生的所有資訊
SELECT *
FROM Student
WHERE stu_age IS NULL
GO
--代碼說明:查詢表中學生的年齡為NULL的學生的所有資訊
SELECT *
FROM Student
WHERE stu_age IS NOT NULL
GO
--代碼說明:查詢表中學生年齡不為NULL的學生的所有資訊
SELECT *
FROM Student
WHERE stu_age <> 5 AND stu_Id = 101
GO
--代碼說明:查詢表中學生年齡不為5并且學号為101的學生的所有資訊
SELECT *
FROM Student
WHERE stu_age <> 5 OR stu_Id = 101
GO
--代碼說明:查詢表中學生年齡不為5或者學号為101的學生的所有資訊
SELECT *
FROM Student
WHERE not stu_age = 5
GO
--代碼說明:查詢表中學生年齡不滿足年齡為5條件的學生的所有資訊
SELECT *
FROM Student
WHERE stu_age BETWEEN 0 AND 20
GO
--代碼說明:查詢表中學生年齡在0-20之間(包含0和20)學生的所有的資訊
SELECT *
FROM Student
WHERE stu_age IN(1,2,5)
GO
--代碼說明:查詢表中學生年齡為1或2或5學生的所有資訊
--注:域值的資料類型必須與屬性的資料類型一緻
--注意:
--1、關系判斷條件預設将會自動屏蔽掉查詢條件值為NULL的資料資訊
4、有序查詢方式
SELECT *
FROM Student
WHERE stu_age <> 5
ORDER BY stu_age
GO
--代碼說明:将查詢到的學生資訊安預設排序規則進行排序(正序)
SELECT *
FROM Student
WHERE stu_age <> 5
ORDER BY stu_age DESC
GO
--代碼說明:将查詢到的學生資訊按倒序規則進行排序
SELECT *
FROM Student
WHERE stu_age <> 5
ORDER BY stu_age ASC
--代碼說明:将查詢到的學生資訊按正序規則進行排序
5、模糊查詢方式
模糊查詢就是查詢的條件和查詢的結果可以不完全比對
常使用的通配符:
_:表示一個占位符,可以任何字元
%:表示零個或多個占位符,可以是任何字元
[]:表示隻要滿足中括号内一個字元就可以
[^]:表示不包含中括号内的任意一個字元
SELECT *
FROM Student
WHERE stu_Name LIKE N'%劉%'
GO
--代碼說明:查詢學生資訊資料表中所有學生姓名中含有劉的學生資訊
SELECT *
FROM Student
WHERE stu_Id LIKE '10_'
GO
--代碼說明:查詢學生資訊表中學号以10開頭的學生的資訊
SELECT *
FROM Student
WHERE stu_Id LIKE '10[1-2]'
GO
--代碼說明:查詢學生資訊表中學号為101或102的學生的資訊
SELECT *
FROM Student
WHERE stu_Id LIKE '10[^1-2]'
GO
--代碼說明:查詢學生資料表中學号不為101或102的學生的資訊
--注意:
--當查詢的資料中含有通配符時的處理辦法
方式一:将資料中的"通配符"放到[]中
SELECT *
FROM Student
WHERE stu_Name LIKE '%[%]%'
GO
--代碼說明:查詢姓名中含有%号的學生資訊
SELECT *
FROM Student
WHERE stu_Name LIKE '%[_]%'
GO
--代碼說明:查詢姓名中含有_的學生資訊
SELECT *
FROM Student
WHERE stu_Name LIKE '%[[]%'
GO
--代碼說明:查詢姓名中含有【的學生資訊
SELECT *
FROM Student
WHERE stu_Name LIKE '%[]]%'
GO
--代碼說明:查詢姓名中含有】的學生資訊
SELECT *
FROM Student
WHERE stu_Name LIKE '%^%'
GO
--代碼說明:查詢姓名中含有^的學生資訊
-^不用放到[]中,因為隻有當^位于[]中才是通配符
方式二:
使用ESCAPE關鍵字來定義一個轉義符
SELECT *
FROM Student
WHERE stu_Name LIKE '%\%%' ESCAPE '\'
GO
--代碼說明:定義\為轉義字元
6、分組查詢方式:
SELECT stu_gender AS 性别, AVG(stu_Age)
FROM Student
GROUP BY stu_gender
GO
--代碼說明:按性别将表中的學生分類
--AS :為查詢的列定義一個别名
--AVG:計算一組中學生的平均年齡(聚合函數)
--補充資訊:
1)、為查詢列定義别名的方式:
方式一:
SELECT stu_gender AS 性别
FROM Student
方式二:
SELECT stu_gender 性别
FROM Student
方式三:
SELECT 性别=stu_gender
FROM Student
2)、聚合函數:
經常使用的聚合函數有:
MAX():得到資料中的最大值;
MIN():得到資料中的最小值
COUNT():得到資料的條數
SUM():得到整性資料的和(必須為整形)
AVG():得到數值類型資料的平均數
示例代碼:
SELECT MAX(stu_Age) AS 最大值
FROM Student
GO
SELECT MIN(stu_Age) AS 最小值
FROM Student
GO
SELECT COUNT(*) AS 總數
FROM Student
GO
SELECT SUM(stu_Age) AS 求和
FROM Student
GO
SELECT AVG(stu_Age) AS 求平均s
FROM Student
GO
--注意:
--1、在MIN() MAX() AVG() SUN 中會自動屏蔽掉NULL值,,但是在COUNT()中不會屏蔽掉NULL
7、分組過濾查詢方式
使用having語句來過濾不符合條件的分組資訊
SELECT stu_Gender AS 性别,AVG(stu_Age)
FROM Student
GROUP BY stu_Gender
HAVING stu_Gender IS NOT NULL
GO
--代碼說明:先按性别對學生進行分組,剔除性别為NULL的分組,最後求各個分組年齡的平均值
--注意:
--1、where子句用在from語句後,having子句用在group by語句後;where語句是對整個表進行篩選,而having是對分組進行篩選
--2、having子句中可以使用統計函數,而where子句中不能使用;group by子句中也不能使用統計函數,必須是原始列
--3、必須在group by子句中列出select查詢字段中所有的非集合字段
8、連接配接查詢方式
當兩個或多個表中的資料存在聯系時(外鍵關系),對資料的查詢操作可能需要将兩個資料表根據外鍵關系連接配接起來再進行查詢操作
方式一:在where語句中通過外鍵将兩個資料表連接配接起來
SELECT stuName,cName,score
FROM Course,Score,Student
WHERE Score.stuId = Student.stuId AND Score.cId = Course.cId
GO
--代碼說明:where子句執行之後,将Course,Score,Student這三個資料表連接配接依據外鍵關系進行連接配接操作,建立一個新的臨時表(含有三個表所有資訊)
-- from子句指定查詢資料所在的資料表
-- select子句将要查詢展示的列名,當列名在多個表中都存在時,必須要指定查詢哪個表中的列(若為某個表所特有的可以不加)
方式二:使用JOIN子句進行連接配接查詢
SELECT stuName,cName,score
FROM Score
JOIN Student ON Score.stuId = Student.stuId
JOIN Course ON Score.cId = Course.cId
GO
--代碼說明:SELECT子句訓示将要顯示的資訊
-- from子句要進行連接配接的一個子表
-- (inner)join子句進行兩個表之間的連結隻有滿足條件的記錄才會被保留
--注:1、使用JOIN子句進行資料表的連結時,一次隻能連結兩張表
-- 2、INNER JOIN子句:内連接配接,隻有滿足條件的記錄才會被保留
-- LEFT JOIN子句:左連接配接,保留左表中的全部資料記錄
-- RIGHT JOIN子句:右連接配接,保留右表中的全部資料記錄
-- FULL JOIN子句:隻要其中一個表中存在比對就傳回行
-- CROSS JOIN子句:傳回笛卡爾積
方式一結果

方式二結果
9、聯合查詢方式
聯合查詢将查詢到的多張表的結果聯合到一張表中
SELECT *
FROM Student
UNION ALL
SELECT *
FROM Student
GO
--代碼說明:select子句查詢表的資料資訊
-- union子句進行結果的聯合,(ALL顯示全部的資訊,預設是去除重複記錄)
--注:連接配接兩個結果集的條件
--1. 兩個集合必須具有相同的列數
--2. 列具有相同的資料類型(至少能隐式轉換的)
--3. 最終輸出的集合的列名由第一個集合的列名來确定
--4. 使用的預設的排序規則對得到的結果進行排序(若要手動進行排序則将order by子句寫入第二個select子句中)
結果展示:
附錄:
資料表資訊展示:
多表查詢之後的資料表資訊