SQL總結(jié)(一)基本查詢

作者:停留的風(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)于BETWEENLIKE,專門拿出來(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ì)算中醋火。
  • MINMAX也可用于文本列悠汽,以獲得按字母順序排列的最高或最低值。

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蓝丙,隨后出現(xiàn)的幾起案子级遭,更是在濱河造成了極大的恐慌,老刑警劉巖渺尘,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挫鸽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鸥跟,警方通過(guò)查閱死者的電腦和手機(jī)丢郊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)医咨,“玉大人枫匾,你說(shuō)我怎么就攤上這事∧饣矗” “怎么了干茉?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)很泊。 經(jīng)常有香客問(wèn)我角虫,道長(zhǎng),這世上最難降的妖魔是什么委造? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任戳鹅,我火速辦了婚禮,結(jié)果婚禮上昏兆,老公的妹妹穿的比我還像新娘粉楚。我一直安慰自己,他們只是感情好亮垫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布模软。 她就那樣靜靜地躺著,像睡著了一般饮潦。 火紅的嫁衣襯著肌膚如雪燃异。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天继蜡,我揣著相機(jī)與錄音回俐,去河邊找鬼逛腿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仅颇,可吹牛的內(nèi)容都是我干的单默。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忘瓦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搁廓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起耕皮,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤境蜕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后凌停,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粱年,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年罚拟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了台诗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赐俗,死狀恐怖拉庶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秃励,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布吉捶,位于F島的核電站夺鲜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏呐舔。R本人自食惡果不足惜币励,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望珊拼。 院中可真熱鬧食呻,春花似錦、人聲如沸逢勾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至干旧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妹蔽,已是汗流浹背椎眯。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工挠将, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人编整。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓舔稀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親掌测。 傳聞我的和親對(duì)象是個(gè)殘疾皇子内贮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法赏半,內(nèi)部類的語(yǔ)法贺归,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法断箫,線程的語(yǔ)...
    子非魚_t_閱讀 31,631評(píng)論 18 399
  • SQL語(yǔ)言基礎(chǔ) 本章拂酣,我們將會(huì)重點(diǎn)探討SQL語(yǔ)言基礎(chǔ),學(xué)習(xí)用SQL進(jìn)行數(shù)據(jù)庫(kù)的基本數(shù)據(jù)查詢操作仲义。另外請(qǐng)注意本章的S...
    厲鉚兄閱讀 5,325評(píng)論 2 46
  • 女人年近百半 應(yīng)該什么樣子谣拣?什么身材募寨? 是“大腹”婆,還是跟更年期在斗爭(zhēng)森缠? 今天介紹的女主 今年已經(jīng)是47歲的女人...
    因?yàn)橄贪?/span>閱讀 388評(píng)論 0 0
  • 前面兩篇文章簡(jiǎn)單介紹了一下Masonry的屬性及方法拔鹰,那么我們這一篇做一個(gè)小Demo加深一下練習(xí)。我們就仿照做一個(gè)...
    南方_H閱讀 1,243評(píng)論 6 9
  • 余初生之年贵涵,天朝尚疲力列肢,東拒紅俄,西絕韃虜宾茂,然民風(fēng)樸素瓷马,文化單純,神州大地跨晴,紅旗招展决采,吾輩自詡為:紅旗下的蛋。 求...
    達(dá)耳聞閱讀 257評(píng)論 0 3