SQL查詢的事情很簡單,可是經常由於很簡單的事情而出錯。遇到一些比較複雜的查詢咱們更是忘記了SQL查詢的基本語法。express
本文但願經過簡單的總結,把經常使用的查詢方法予以總結,但願可以明確在心。函數
場景:學生信息系統,包括學生信息、教師信息、專業信息和選課信息。學習
--學生信息表 IF OBJECT_ID (N'Students', N'U') IS NOT NULL DROP TABLE Students; GO CREATE TABLE Students( ID int primary key not null, Name nvarchar(50), Age int, City nvarchar(50), MajorID int ) --專業信息表 IF OBJECT_ID (N'Majors', N'U') IS NOT NULL DROP TABLE Majors; GO CREATE TABLE Majors( ID int primary key not null, Name nvarchar(50) ) --課程表 IF OBJECT_ID (N'Courses', N'U') IS NOT NULL DROP TABLE Courses; GO CREATE TABLE Courses( ID int primary key not null, Name nvarchar(50) not null ) IF OBJECT_ID (N'SC', N'U') IS NOT NULL DROP TABLE SC; GO --選課表 CREATE TABLE SC( StudentID int not null, CourseID int not null, Score int )
從表中查詢某些列的值,這是最基本的查詢語句。大數據
SELECT 列名1,列名2 FROM 表名
做用:按照必定的條件查詢數據spa
語法:code
SELECT 列名1,列名2 FROM 表名 WHERE 列名1 運算符 值
運算符:blog
運算符 | 描述 |
---|---|
= | 等於 |
<> | 不等於 |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
BETWEEN | 在某個範圍內 |
LIKE | 搜索某種模式 |
比較操做符都比較簡單,再也不贅述。關於BETWEEN和LIKE,專門拿出來重點說下排序
在兩個值之間,好比我從學生中查詢年齡在18-20之間的學生信息ci
SELECT ID,Name,Age FROM Students WHERE Age BETWEEN 18 AND 20
做用:模糊查詢。LIKE關鍵字與通配符一塊兒使用input
主要的通配符:
通配符 |
描述 |
% |
替代一個或多個字符 |
_ |
僅替代一個字符 |
[charlist] |
字符列中的任何單一字符 |
[^charlist] 或者 [!charlist] |
不在字符列中的任何單一字符 |
實例:
1)查詢姓氏爲張的學生信息
SELECT ID,Name FROM Students WHERE Name LIKE '張%'
2)查詢名字最後一個爲「生」的同窗
SELECT ID,Name FROM Students WHERE Name LIKE '%生'
3)查詢名字中含有「生」的學生信息
SELECT ID,Name FROM Students WHERE Name LIKE '%生%'
4)查詢姓名爲兩個字,且姓張學生信息
SELECT ID,Name FROM Students WHERE Name LIKE '張_'
5)查詢姓氏爲張、李的學生信息
這個可使用or關鍵字,可是使用通配符更簡單高效
SELECT ID,Name FROM Students WHERE Name LIKE '[張李]%'
6)查詢姓氏非張、李的學生信息
這個也可使用NOT LIKE 來實現,用下面方法更好。
SELECT ID,Name FROM Students WHERE Name LIKE '[^張李]%'
或者:
SELECT ID,Name FROM Students WHERE Name LIKE '[!張李]%'
AND 在 WHERE 子語句中把兩個或多個條件結合起來。表示和的意思,多個條件都成立。
1)查詢年齡大於18且姓張的學生信息
SELECT ID,Name FROM Students WHERE Age>18 AND Name LIKE '張%'
OR可在 WHERE 子語句中把兩個或多個條件結合起來。或關係,表示多個條件,只有一個符合便可。
1)查詢姓氏爲張、李的學生信息
SELECT ID,Name FROM Students WHERE Name LIKE '張%' OR Name LIKE '李%'
IN 操做符容許咱們在 WHERE 子句中規定多個值。表示:在哪些值當中。
1)查詢年齡是1八、1九、20的學生信息
SELECT ID,Name FROM Students WHERE Age IN (18,19,20)
NOT對於條件的否認,取非。
1)查詢非張姓氏的學習信息
SELECT ID,Name FROM Students WHERE Name NOT LIKE '張%'
功能:對須要查詢後的結果集進行排序
標識 | 含義 | 說明 |
ASC | 升序 | 默認 |
DESC | 倒序 |
實例:
1)查詢學生信息表的學號、姓名、年齡,並按Age升序排列
SELECT ID,Name,Age FROM Students ORDER BY Age
或指明ASC
SELECT ID,Name,Age FROM Students ORDER BY Age ASC
2)查詢學生信息,並按Age倒序排列
SELECT ID,Name,Age FROM Students ORDER BY Age DESC
除了制定某個列排序外,還能指定多列排序,每一個排序字段能夠制定排序規則
說明:優先第一列排序,若是第一列相同,則按照第二列排序規則執行,以此類推。
3)查詢學生的信息,按照總成績倒序、學號升序排列
SELECT ID,Name,Score FROM Students ORDER BY Score DESC,ID ASC
這個查詢含義:首先按Score倒序排列,若是有多條記錄Score相同,再按ID升序排列。
查詢結果,例子:
ID |
Name |
Score |
2 |
廣坤 |
98 |
3 |
老七 |
98 |
1 |
趙四 |
79 |
能夠爲列名稱和表名稱指定別名(Alias)
做用:咱們能夠將查詢的列,或者表指定須要的名字,如表名太長,用其簡稱,在連表查詢中常常用到。
1) 將結果列改成須要的名稱
SELECT ID AS StudentID,Name AS StudentName FROM Students
2)用表名的別名,標識列的來源
SELECT S.ID,S.Name,M.Name AS MajorName FROM Students AS S LEFT JOIN Majors AS M ON S.MajorID = M.ID
3)在合計函數中,給合計結果命名
SELECT COUNT(ID) AS StudentCount FROM Students
含義:不一樣的
做用:查詢時忽略重複值。
語法:
SELECT DISTINCT 列名稱 FROM 表名稱
實例:
1)查詢學生所在城市名,排除重複
SELECT DISTINCT City FROM Student
2)查詢成績分佈分佈狀況
SELECT DISTINCT(Score),Count(ID) FROM Student GROUP BY Score
學生成績可能重複,以此獲得分數、獲得這一成績的學生數。後續會詳細介紹GROUP BY 用法。
MAX 函數返回一列中的最大值。NULL 值不包括在計算中。
MIN 函數返回一列中的最小值。NULL 值不包括在計算中。
MIN 和 MAX 也可用於文本列,以得到按字母順序排列的最高或最低值。
1)查詢學生中最高的分數
SELECT MAX(Score) FROM Students
2)查詢學生中最小年齡
SELECT MIN(Age) FROM Students
查詢某列的合計值。
1)查詢ID爲1001的學生的各科總成績
SC即爲學生的成績表,字段:StudentID,CourseID,Score.
SELECT SUM(Score) AS TotalScore FROM SC WHERE StudentID='1001'
AVG 函數返回數值列的平均值
1)查詢學生的平均年齡
SELECT AVG(Age) AS AgeAverage FROM Students
2)求課程ID爲C001的平均成績
SELECT AVG(Score) FROM SC WHERE CourseID='C001'
COUNT() 函數返回匹配指定條件的行數。
1)查詢學生總數
SELECT COUNT(ID) FROM Students
2)查詢學生年齡分佈的總數
SELECT COUNT(DISTINCT Age) FROM Students
3)查詢男生總數
SELECT COUNT(ID) FROM Students WHERE Sex='男'
4)查詢男女生各有多少人
SELECT Sex,COUNT(ID) FROM Students GROUP BY Sex
GROUP BY 語句用於結合合計函數,根據一個或多個列對結果集進行分組。
1)查詢男女生分佈,上面已經給了答案。
SELECT Sex,COUNT(ID) FROM Students GROUP BY Sex
2) 查詢學生的城市分佈狀況
SELECT City,COUNT(ID) FROM Students GROUP BY City
3)學生的平均成績,查詢結果包括:學生ID,平均成績
SELECT StudentID,AVG(Score) FROM SC GROUP BY StudentID
4)刪除學生信息中重複記錄
根據列進行分組,若是所有列相同才定義爲重複,則就須要GROUP BY全部字段。不然可按指定字段進行處理。
DELETE FROM Students WHERE ID NOT IN (SELECT MAX(ID) FROM Students GROUP BY ID,Name,Age,Sex,City,MajorID)
在 SQL 中增長 HAVING 子句緣由是,WHERE 關鍵字沒法與合計函數一塊兒使用。
語法:
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value
1)查詢平均成績大等於於60的學生ID及平均成績
SELECT StudentID,AVG(Score) FROM SC GROUP BY StudentID HAVING AVG(Score)>=60
2)仍是用HAVING的SQL語句中,能夠有普通的WHERE條件
查詢平均成績大於等於60,且學生ID等於1的學生的ID及平均成績。
SELECT StudentID,AVG(Score) FROM SC WHERE StudentID='1' GROUP BY StudentID HAVING AVG(Score)>=60
3)查詢總成績在600分以上(包括600)的學生ID
SELECT StudentID FROM SC GROUP BY StudentID HAVING SUM(Score)>=600
TOP 子句用於規定要返回的記錄的數目。對於大數據頗有用的,在分頁時也會經常用到。
1)查詢年齡最大的三名學生信息
SELECT TOP 3 ID,Name FROM Students ORDER BY Age DESC
2)仍是上一道題,若是有相同年齡的如何處理呢?
SELECT ID,Name,Age FROM Students WHERE Age IN (SELECT TOP 3 Age FROM Students)
計算條件列表,並返回多個可能的結果表達式之一。
CASE 表達式有兩種格式:
簡單表達式語法:
CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END
搜索式語法:
CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END
1)查詢學習信息,若是Sex爲0則顯示爲男,若是爲1顯示爲女,其餘顯示爲其餘。
SELECT ID, Name, CASE Sex WHEN '0' THEN '男' WHEN '1' THEN '女' ELSE '其餘' END AS Sex FROM Students
2)查詢學生信息,根據年齡統計是否成年,大於等於18爲成年,小於18爲未成年
SELECT ID, Name, CASE WHEN Age>=18 THEN '成年' ELSE '未成年'END AS 是否成年 FROM Students
3)統計成年未成年學生的個數
要求結果
成年 | 未成年 |
23 | 6 |
SQL語句
SELECT SUM(CASE WHEN Age>=18 THEN 1 ELSE 0 END) AS '成年',SUM(CASE WHEN Age<18 THEN 1 ELSE 0 END) AS '未成年' FROM Students
4)行列轉換。統計男女生中未成年、成年的人數
結果以下:
性別 | 未成年 | 成年 |
男 | 3 | 13 |
女 | 2 | 18 |
SQL語句:
SELECT CASE WHEN Sex=0 THEN '男' ELSE '女' END AS '性別', SUM(CASE WHEN Age<18 THEN 1 ELSE 0 END) AS '未成年', SUM(CASE WHEN Age>=18 THEN 1 ELSE 0 END) AS '成年' FROM Students GROUP BY Sex