作者:停留的風(fēng)
原文地址:http://www.cnblogs.com/yank/p/3672478.html
SQL查詢的事情很簡(jiǎn)單循集,但是常常因?yàn)楹芎?jiǎn)單的事情而出錯(cuò)。遇到一些比較復(fù)雜的查詢我們更是忘記了SQL查詢的基本語(yǔ)法蔗草。
本文希望通過(guò)簡(jiǎn)單的總結(jié)咒彤,把常用的查詢方法予以總結(jié),希望能夠明確在心咒精。
場(chǎng)景:學(xué)生信息系統(tǒng)镶柱,包括學(xué)生信息、教師信息模叙、專業(yè)信息和選課信息歇拆。
--學(xué)生信息表
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
)
--專業(yè)信息表
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
)
1、基本查詢
從表中查詢某些列的值,這是最基本的查詢語(yǔ)句故觅。
SELECT 列名1,列名2 FROM 表名
2厂庇、Where(條件)
- 作用:按照一定的條件查詢數(shù)據(jù)。
- 語(yǔ)法:
SELECT 列名1,列名2 FROM 表名 WHERE 列名1 運(yùn)算符 值
- 運(yùn)算符:
比較操作符都比較簡(jiǎn)單输吏,不再贅述宋列。關(guān)于BETWEEN
和LIKE
,專門拿出來(lái)重點(diǎn)說(shuō)下评也。
3、BETWEEN
在兩個(gè)值之間灭返,比如我從學(xué)生中查詢年齡在18-20之間的學(xué)生信息:
SELECT ID,Name,Age FROM Students WHERE Age BETWEEN 18 AND 20
4盗迟、LIKE
- 作用:模糊查詢。LIKE關(guān)鍵字與通配符一起使用熙含。
- 主要的通配符:
- 實(shí)例:
1).查詢姓氏為張的學(xué)生信息:
SELECT ID,Name FROM Students WHERE Name LIKE '張%'
2).查詢名字最后一個(gè)為“生”的同學(xué):
SELECT ID,Name FROM Students WHERE Name LIKE '%生'
3).查詢名字中含有“生”的學(xué)生信息:
SELECT ID,Name FROM Students WHERE Name LIKE '%生%'
4).查詢姓名為兩個(gè)字罚缕,且姓張學(xué)生信息:
SELECT ID,Name FROM Students WHERE Name LIKE '張_'
5).查詢姓氏為張、李的學(xué)生信息:
這個(gè)可以使用or
關(guān)鍵字怎静,但是使用通配符更簡(jiǎn)單高效邮弹。
SELECT ID,Name FROM Students WHERE Name LIKE '[張李]%'
6).查詢姓氏非張、李的學(xué)生信息:
這個(gè)也可以使用NOT LIKE
來(lái)實(shí)現(xiàn)蚓聘,用下面方法更好腌乡。
SELECT ID,Name FROM Students WHERE Name LIKE '[^張李]%'
或者:
SELECT ID,Name FROM Students WHERE Name LIKE '[!張李]%'
5、AND
AND
在 WHERE 子語(yǔ)句中把兩個(gè)或多個(gè)條件結(jié)合起來(lái)夜牡。表示和的意思与纽,多個(gè)條件都成立。
查詢年齡大于18且姓張的學(xué)生信息:
SELECT ID,Name FROM Students WHERE Age>18 AND Name LIKE '張%'
**6塘装、OR **
OR
可在 WHERE 子語(yǔ)句中把兩個(gè)或多個(gè)條件結(jié)合起來(lái)急迂。或關(guān)系蹦肴,表示多個(gè)條件僚碎,只有一個(gè)符合即可。
查詢姓氏為張阴幌、李的學(xué)生信息:
SELECT ID,Name FROM Students WHERE Name LIKE '張%' OR Name LIKE '李%'
7勺阐、IN
IN
操作符允許我們?cè)?WHERE 子句中規(guī)定多個(gè)值。表示:在哪些值當(dāng)中裂七。
查詢年齡是18皆看、19、20的學(xué)生信息:
SELECT ID,Name FROM Students WHERE Age IN (18,19,20)
8背零、NOT 否定
NOT
對(duì)于條件的否定腰吟,取非。
查詢非張姓氏的學(xué)習(xí)信息:
SELECT ID,Name FROM Students WHERE Name NOT LIKE '張%'
9、ORDER BY(排序)
- 功能:對(duì)需要查詢后的結(jié)果集進(jìn)行排序毛雇。
- 實(shí)例:
1).查詢學(xué)生信息表的學(xué)號(hào)嫉称、姓名、年齡灵疮,并按Age升序排列:
SELECT ID,Name,Age FROM Students ORDER BY Age
或指明ASC:
SELECT ID,Name,Age FROM Students ORDER BY Age ASC
2).查詢學(xué)生信息织阅,并按Age倒序排列:
SELECT ID,Name,Age FROM Students ORDER BY Age DESC
除了制定某個(gè)列排序外,還能指定多列排序震捣,每個(gè)排序字段可以制定排序規(guī)則荔棉。
說(shuō)明:優(yōu)先第一列排序,如果第一列相同蒿赢,則按照第二列排序規(guī)則執(zhí)行润樱,以此類推。
3).查詢學(xué)生的信息羡棵,按照總成績(jī)倒序壹若、學(xué)號(hào)升序排列:
SELECT ID,Name,Score FROM Students ORDER BY Score DESC,ID ASC
這個(gè)查詢含義:首先按Score倒序排列,如果有多條記錄Score相同皂冰,再按ID升序排列店展。
查詢結(jié)果,例子:
10秃流、AS(Alias)
可以為列名稱和表名稱指定別名(Alias)
作用:我們可以將查詢的列赂蕴,或者表指定需要的名字,如表名太長(zhǎng)剔应,用其簡(jiǎn)稱睡腿,在連表查詢中經(jīng)常用到。
1).將結(jié)果列改為需要的名稱:
SELECT ID AS StudentID,Name AS StudentName FROM Students
2).用表名的別名峻贮,標(biāo)識(shí)列的來(lái)源:
SELECT S.ID,S.Name,M.Name AS MajorName
FROM Students AS S
LEFT JOIN Majors AS M
ON S.MajorID = M.ID
3).在合計(jì)函數(shù)中席怪,給合計(jì)結(jié)果命名:
SELECT COUNT(ID) AS StudentCount FROM Students
11、Distinct
- 含義:不同的
- 作用:查詢時(shí)忽略重復(fù)值纤控。
- 語(yǔ)法:
SELECT DISTINCT 列名稱 FROM 表名稱
- 實(shí)例:
1).查詢學(xué)生所在城市名挂捻,排除重復(fù):
SELECT DISTINCT City FROM Student
2).查詢成績(jī)分布分布情況:
SELECT DISTINCT(Score),Count(ID) FROM Student GROUP BY Score
學(xué)生成績(jī)可能重復(fù),以此得到分?jǐn)?shù)船万、得到這一成績(jī)的學(xué)生數(shù)刻撒。后續(xù)會(huì)詳細(xì)介紹GROUP BY
用法。
12耿导、MAX/MIN
-
MAX
函數(shù)返回一列中的最大值声怔。NULL
值不包括在計(jì)算中。 -
MIN
函數(shù)返回一列中的最小值舱呻。NULL
值不包括在計(jì)算中醋火。 -
MIN
和MAX
也可用于文本列悠汽,以獲得按字母順序排列的最高或最低值。
1).查詢學(xué)生中最高的分?jǐn)?shù):
SELECT MAX(Score) FROM Students
2).查詢學(xué)生中最小年齡:
SELECT MIN(Age) FROM Students
13芥驳、SUM
查詢某列的合計(jì)值柿冲。
查詢ID為1001的學(xué)生的各科總成績(jī):
SC即為學(xué)生的成績(jī)表,字段:StudentID
兆旬,CourseID
假抄,Score
.
SELECT SUM(Score) AS TotalScore FROM SC WHERE StudentID='1001'
14、AVG
AVG
函數(shù)返回?cái)?shù)值列的平均值丽猬。
1).查詢學(xué)生的平均年齡:
SELECT AVG(Age) AS AgeAverage FROM Students
2).求課程ID為C001的平均成績(jī):
SELECT AVG(Score) FROM SC WHERE CourseID='C001'
15宿饱、COUNT
COUNT()
函數(shù)返回匹配指定條件的行數(shù)。
1).查詢學(xué)生總數(shù):
SELECT COUNT(ID) FROM Students
2).查詢學(xué)生年齡分布的總數(shù):
SELECT COUNT(DISTINCT Age) FROM Students
3).查詢男生總數(shù):
SELECT COUNT(ID) FROM Students WHERE Sex='男'
4).查詢男女生各有多少人:
SELECT Sex,COUNT(ID) FROM Students GROUP BY Sex
16脚祟、GROUP BY
GROUP BY
語(yǔ)句用于結(jié)合合計(jì)函數(shù)刑棵,根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。
1).查詢男女生分布愚铡,上面已經(jīng)給了答案:
SELECT Sex,COUNT(ID) FROM Students GROUP BY Sex
2).查詢學(xué)生的城市分布情況:
SELECT City,COUNT(ID) FROM Students GROUP BY City
3).學(xué)生的平均成績(jī),查詢結(jié)果包括:學(xué)生ID胡陪,平均成績(jī):
SELECT StudentID,AVG(Score) FROM SC GROUP BY StudentID
4).刪除學(xué)生信息中重復(fù)記錄:
根據(jù)列進(jìn)行分組沥寥,如果全部列相同才定義為重復(fù),則就需要GROUP BY
所有字段柠座。否則可按指定字段進(jìn)行處理邑雅。
DELETE FROM Students WHERE ID NOT IN (SELECT MAX(ID) FROM Students GROUP BY ID,Name,Age,Sex,City,MajorID)
17、HAVING
在 SQL 中增加HAVING
子句原因是妈经,WHERE
關(guān)鍵字無(wú)法與合計(jì)函數(shù)一起使用淮野。
語(yǔ)法:
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).查詢平均成績(jī)大等于于60的學(xué)生ID及平均成績(jī):
SELECT StudentID,AVG(Score) FROM SC GROUP BY StudentID HAVING AVG(Score)>=60
2).還是用HAVING
的SQL語(yǔ)句中,可以有普通的WHERE
條件
查詢平均成績(jī)大于等于60吹泡,且學(xué)生ID等于1的學(xué)生的ID及平均成績(jī):
SELECT StudentID,AVG(Score) FROM SC
WHERE StudentID='1'
GROUP BY StudentID
HAVING AVG(Score)>=60
3).查詢總成績(jī)?cè)?00分以上(包括600)的學(xué)生ID:
SELECT StudentID FROM SC GROUP BY StudentID HAVING SUM(Score)>=600
18骤星、TOP
TOP
子句用于規(guī)定要返回的記錄的數(shù)目。對(duì)于大數(shù)據(jù)很有用的爆哑,在分頁(yè)時(shí)也會(huì)常常用到洞难。
1).查詢年齡最大的三名學(xué)生信息:
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)
19揭朝、Case語(yǔ)句
計(jì)算條件列表队贱,并返回多個(gè)可能的結(jié)果表達(dá)式之一。
CASE
表達(dá)式有兩種格式:
CASE
簡(jiǎn)單表達(dá)式潭袱,它通過(guò)將表達(dá)式與一組簡(jiǎn)單的表達(dá)式進(jìn)行比較來(lái)確定結(jié)果柱嫌。CASE
搜索表達(dá)式,它通過(guò)計(jì)算一組布爾表達(dá)式來(lái)確定結(jié)果屯换。簡(jiǎn)單表達(dá)式語(yǔ)法:
CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
- 搜索式語(yǔ)法:
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
1).查詢學(xué)習(xí)信息编丘,如果Sex為0則顯示為男,如果為1顯示為女,其他顯示為其他:
SELECT ID, Name, CASE Sex WHEN '0' THEN '男' WHEN '1' THEN '女' ELSE '其他' END AS Sex
FROM Students
2).查詢學(xué)生信息瘪吏,根據(jù)年齡統(tǒng)計(jì)是否成年癣防,大于等于18為成年,小于18為未成年:
SELECT ID, Name, CASE WHEN Age>=18 THEN '成年' ELSE '未成年'END AS 是否成年
FROM Students
3).統(tǒng)計(jì)成年未成年學(xué)生的個(gè)數(shù):
要求結(jié)果
SQL語(yǔ)句:
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).行列轉(zhuǎn)換掌眠。統(tǒng)計(jì)男女生中未成年蕾盯、成年的人數(shù):
結(jié)果如下:
SQL語(yǔ)句:
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