關(guān)系數(shù)據(jù)庫SQL之基本數(shù)據(jù)查詢:子查詢衷畦、分組查詢、模糊查詢
字?jǐn)?shù)1843閱讀1707評論10喜歡115
前言
上一篇關(guān)系數(shù)據(jù)庫常用SQL語句語法大全主要是關(guān)系型數(shù)據(jù)庫大體結(jié)構(gòu),本文細(xì)說一下關(guān)系型數(shù)據(jù)庫查詢的SQL語法著摔。
SQL數(shù)據(jù)查詢
語法回顧
SELECT [ALL|DISTINCT] <目標(biāo)列表達(dá)式>[,<目標(biāo)列表達(dá)式>]…FROM<表名或視圖名>[,<表名或視圖名>]…? [WHERE<條件表達(dá)式>]? [GROUPBY<列名> [HAVING<條件表達(dá)式>]]? [ORDERBY<列名> [ASC|DESC]…]
SQL查詢語句的順序:SELECT、FROM藤违、WHERE、GROUP BY纵揍、HAVING顿乒、ORDER BY。SELECT骡男、FROM是必須的淆游,HAVING子句只能與GROUP BY搭配使用傍睹。
準(zhǔn)備工作
1.創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表
2.插入基本數(shù)據(jù)
3.本文以SQL Server為例介紹
-- 創(chuàng)建學(xué)生表CREATETABLEStudents(IdintNOTNULLPRIMARYKEY,Namevarchar(20)NOTNULL,Classvarchar(15)NOTNULL,? ? Gendervarchar(10)NULL,? ? AgeintNULL,? ? Phonevarchar(15)NULL,? ? [Address]varchar(100)NULL)-- 創(chuàng)建課程表CREATETABLECourses(IdintNOTNULLPRIMARYKEYIDENTITY(1,1),Namevarchar(50)NOTNULL);-- 創(chuàng)建成績表CREATETABLEScores(IdintPRIMARYKEYIDENTITY(1,1),SIdintNOTNULL,? ? CIdintNOTNULL,? ? Gradesdecimal(5,2)NOTNULL,? ? IsPassedbitNOTNULL);-- 插入學(xué)生表基礎(chǔ)數(shù)據(jù)INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016001,'小明','一班','男',20,'18817716611','北京');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016002,'小龍','一班','男',19,'18817716622','天津');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016003,'小王','二班','男',20,'18817716633','北京');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016004,'婷婷','一班','女',17,'18817716644','濟(jì)南');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016005,'張三','一班','男',19,'18817716655','北京');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016006,'小趙','一班','男',20,'18817716666','北京');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016007,'麗麗','二班','女',18,'18817716677','北京');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016008,'花花','一班','女',19,'18817716688','沈陽');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016009,'靜靜','二班','女',20,'18817716699','北京');-- 插入課程表基礎(chǔ)數(shù)據(jù)INSERTINTOCourses(Name)VALUES('語文');INSERTINTOCourses(Name)VALUES('數(shù)學(xué)');INSERTINTOCourses(Name)VALUES('英語');-- 插入成績表基礎(chǔ)數(shù)據(jù)INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016001,1,120,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016001,2,70,0);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016001,3,89,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016002,1,90,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016002,2,88,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016002,3,96,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016003,1,112,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016003,3,102,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016004,1,80,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016004,2,86,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016004,3,47,0);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016005,1,87,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016005,2,96,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016005,3,68,0);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016006,2,95,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016006,3,100,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016007,1,87,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016007,2,57,0);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016007,3,130,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016008,1,89,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016008,3,66,0);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016009,1,97,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016009,2,104,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016009,3,68,1);
簡單查詢
簡單查詢只需要SELECT隔盛、FROM、WHERE3個關(guān)鍵字即可實現(xiàn)拾稳。
SELECT *FROMStudents;SELECT *FROMStudentsWHEREClass='一班';SELECT *FROMStudentsWHEREClass='一班'ANDAge =20;
簡單查詢結(jié)果
別名/更名
語法
SELECT 字段名1[AS] 別名 [,字段名1AS別名]…FROM<表名>
AS可以省略
當(dāng)別名中含有非字母和下劃線時或者是關(guān)鍵字時吮炕,需要加上單/雙引號
示例
SELECTIdAS'學(xué)號',Name'姓名',ClassClassNameFROMStudents;
別名/更名
子查詢(嵌套查詢)
子查詢也稱嵌套查詢,是指一個SELECT查詢語句可以嵌入另一個SELECT查詢語句之中访得。SQL中允許多級嵌套龙亲,子查詢在實際使用中非常多。
連接查詢:涉及兩個及以上的表查詢?yōu)檫B接查詢悍抑。
--查詢二班學(xué)生成績SELECT *FROMScoresWHERESIdIN(SELECTIdFROMStudentsWHEREClass='二班')
子查詢
聚合函數(shù)查詢
聚合函數(shù):是一個值的集合為輸入鳄炉,返回單個值的函數(shù)。
SQL預(yù)定義了5個聚集函數(shù):AVG(平均值)搜骡、MIN(最小值)拂盯、MAX(最大值)、SUM(求和)记靡、COUNT(計數(shù))谈竿。
具體的數(shù)據(jù)庫還會預(yù)定義一些其他常用的函數(shù),比如字符串相聚合函數(shù)摸吠、時間聚合函數(shù)……空凸。
SELECTAVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id)FROMStudents;
聚合函數(shù)查詢
分組查詢
使用GROUP BY子句可進(jìn)行分組查詢
注意:分組查詢的時候要在GROUP BY子句后面跟上所有查詢字段的列表
--根據(jù)班級分組查詢各班平均年齡、最大 年齡寸痢、最小年齡呀洲、年齡總和、班級人數(shù)SELECTClass,AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id)FROMStudentsGROUPBYClass;
分組查詢
HAVING子句
如果需要在分組前的數(shù)據(jù)進(jìn)行限制,可以使用HAVING子句
HAVING子句只能與GROUP BY搭配使用
--根據(jù)班級分組查詢各班平均年齡并且班級人數(shù)大于3人SELECTClass,AVG(Age)FROMStudentsGROUPBYClassHAVINGCOUNT(Id)>3;
HAVING子句
HAVING子句和WHERE的區(qū)別
WHERE語句在GROUP BY語句之前道逗,SQL會在分組之前計算WHERE語句丛楚;
HAVING語句在GROUP BY語句之后,SQL會在分組之后計算HAVING語句憔辫。
模糊查詢
語法
SELECT 字段列表FROM表名WHERE字段LIKE'<通配符>'
模糊查詢是通過關(guān)鍵字LIKE和通配符實現(xiàn)的
_:任何單個字符(一個'_'只匹配一個字符趣些,多個字符就使用多個_)
%:包含零個或更多字符的任意字符串(匹配任意內(nèi)容)
[]:指定范圍的字符(只匹配[]內(nèi)的字符)
[ ^]:不在指定范圍的字符(只匹配除[]內(nèi)的字符)
SQL中通配符可以混合使用
單個字符匹配
SELECT *FROMStudentsWHERENameLIKE'小_';SELECT *FROMStudentsWHEREPhoneLIKE'188177166__';
模糊查詢-單個字符匹配
任意字符匹配
SELECT *FROMStudentsWHEREPhoneLIKE'188177166__';SELECT *FROMStudentsWHEREPhoneLIKE'%';SELECT *FROMStudents;
這三條SQL語句查詢結(jié)果都相同只針對此表,原因是瞎貓碰上死耗子贰您。(數(shù)據(jù)少坏平,剛好查詢的結(jié)果是全部的內(nèi)容)
模糊查詢-任意匹配
范圍內(nèi)查詢
-- 查詢所有手機(jī)號碼結(jié)尾兩位包含1和2的信息SELECT *FROMStudentsWHEREPhoneLIKE'188177166[12][12]';
模糊查詢-范圍內(nèi)查詢
不在范圍內(nèi)查詢
-- 查詢所有手機(jī)號碼結(jié)尾兩位不包含1、3锦亦、5舶替、7的信息SELECT *FROMStudentsWHEREPhoneLIKE'188177166[^1357][^1357]';
模糊查詢-不在范圍內(nèi)查詢
關(guān)于SQL查詢就到這里告一段落,后面會更新相關(guān)內(nèi)容杠园。
如果你覺得有問題顾瞪,歡迎和你一起探討。
本文采用知識共享署名-相同方式共享 4.0 國際許可協(xié)議進(jìn)行許可抛蚁。
基于簡書上的作品創(chuàng)作陈醒。 可轉(zhuǎn)載、引用瞧甩,但需經(jīng)本人同意后署名作者且注明文章出處钉跷,并以相同方式共享。
知識共享許可協(xié)議
關(guān)系數(shù)據(jù)庫常用SQL語句語法大全 - 簡書
關(guān)系數(shù)據(jù)庫SQL之高級數(shù)據(jù)查詢:去重復(fù)肚逸、組合查詢爷辙、連接查詢、虛擬表 - 簡書
MS SQL Server中數(shù)據(jù)表朦促、視圖膝晾、函數(shù)/方法、存儲過程是否存在判斷及創(chuàng)建 - 簡書