SQL总结(一)基本查询
SQL查詢的事情很簡單,但是常常因為很簡單的事情而出錯。遇到一些比較復雜的查詢我們更是忘記了SQL查詢的基本語法。本文希望通過簡單的總結,把常用的查詢方法予以總結,希望能夠明確在心。
場景:學生信息系統,包括學生信息、教師信息、專業信息和選課信息。
--學生信息表 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 )1、基本查詢
從表中查詢某些列的值,這是最基本的查詢語句。
SELECT 列名1,列名2 FROM 表名2、Where(條件)
作用:按照一定的條件查詢數據
語法:
運算符:
比較操作符都比較簡單,不再贅述。關于BETWEEN和LIKE,專門拿出來重點說下。
3、BETWEEN
在兩個值之間,比如我從學生中查詢年齡在18-20之間的學生信息
SELECT ID,Name,Age FROM Students WHERE Age BETWEEN 18 AND 204、LIKE
作用:模糊查詢。LIKE關鍵字與通配符一起使用
主要的通配符:
實例:
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 '[!張李]%'5、AND
AND?在?WHERE?子語句中把兩個或多個條件結合起來。表示和的意思,多個條件都成立。
1)查詢年齡大于18且姓張的學生信息
SELECT ID,Name FROM Students WHERE Age>18 AND Name LIKE '張%'6、OR
OR可在WHERE?子語句中把兩個或多個條件結合起來。或關系,表示多個條件,只有一個符合即可。
1)查詢姓氏為張、李的學生信息
SELECT ID,Name FROM Students WHERE Name LIKE '張%' OR Name LIKE '李%'7、IN
IN 操作符允許我們在 WHERE 子句中規定多個值。表示:在哪些值當中。
1)查詢年齡是18、19、20的學生信息
SELECT ID,Name FROM Students WHERE Age IN (18,19,20)8、NOT 否定
NOT對于條件的否定,取非。
1)查詢非張姓氏的學習信息
SELECT ID,Name FROM Students WHERE Name NOT LIKE '張%'9、ORDER BY(排序)
功能:對需要查詢后的結果集進行排序
實例:
1)查詢學生信息表的學號、姓名、年齡,并按Age升序排列
SELECT ID,Name,Age FROM Students ORDER BY Age或指明ASC
SELECT ID,Name,Age FROM Students ORDER BY Age ASC2 ) 查詢學生信息,并按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升序排列。
查詢結果,例子:
10、AS(Alias)
可以為列名稱和表名稱指定別名(Alias)
作用:我們可以將查詢的列,或者表指定需要的名字,如表名太長,用其簡稱,在連表查詢中經常用到。
1 ) 將結果列改為需要的名稱
SELECT ID AS StudentID,Name AS StudentName FROM Students2)用表名的別名,標識列的來源
SELECT S.ID,S.Name,M.Name AS MajorName FROM Students AS S LEFT JOIN Majors AS M ON S.MajorID = M.ID3 ) 在合計函數中,給合計結果命名
SELECT COUNT(ID) AS StudentCount FROM Students11、Distinct
含義:不同的
作用:查詢時忽略重復值。
語法:
實例:
1)查詢學生所在城市名,排除重復
SELECT DISTINCT City FROM Student2 ) 查詢成績分布分布情況
SELECT DISTINCT(Score),Count(ID) FROM Student GROUP BY Score學生成績可能重復,以此得到分數、得到這一成績的學生數。后續會詳細介紹GROUP BY?用法。
12、MAX/MIN
- MAX 函數返回一列中的最大值。NULL 值不包括在計算中。
- MIN 函數返回一列中的最小值。NULL 值不包括在計算中。
- MIN 和 MAX 也可用于文本列,以獲得按字母順序排列的最高或最低值。
1)查詢學生中最高的分數
SELECT MAX(Score) FROM Students2 ) 查詢學生中最小年齡
SELECT MIN(Age) FROM Students13、SUM
查詢某列的合計值。
1)查詢ID為1001的學生的各科總成績
SC即為學生的成績表,字段:StudentID,CourseID,Score.
SELECT SUM(Score) AS TotalScore FROM SC WHERE StudentID='1001'14、AVG
AVG 函數返回數值列的平均值
1 ) 查詢學生的平均年齡
SELECT AVG(Age) AS AgeAverage FROM Students2)求課程ID為C001的平均成績
SELECT AVG(Score) FROM SC WHERE CourseID='C001'15、COUNT
COUNT() 函數返回匹配指定條件的行數。
1 ) 查詢學生總數
SELECT COUNT(ID) FROM Students2) 查詢學生年齡分布的總數
SELECT COUNT(DISTINCT Age) FROM Students3 ) 查詢男生總數
SELECT COUNT(ID) FROM Students WHERE Sex='男'4)查詢男女生各有多少人
SELECT Sex,COUNT(ID) FROM Students GROUP BY Sex16、GROUP BY
GROUP BY 語句用于結合合計函數,根據一個或多個列對結果集進行分組。
1)查詢男女生分布,上面已經給了答案。
SELECT Sex,COUNT(ID) FROM Students GROUP BY Sex2) 查詢學生的城市分布情況
SELECT City,COUNT(ID) FROM Students GROUP BY City3 ) 學生的平均成績,查詢結果包括:學生ID,平均成績
SELECT StudentID,AVG(Score) FROM SC GROUP BY StudentID4)刪除學生信息中重復記錄
根據列進行分組,如果全部列相同才定義為重復,則就需要GROUP BY所有字段。否則可按指定字段進行處理。
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 關鍵字無法與合計函數一起使用。
語法:
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 value1)查詢平均成績大等于于60的學生ID及平均成績
SELECT StudentID,AVG(Score) FROM SC GROUP BY StudentID HAVING AVG(Score)>=602)還是用HAVING的SQL語句中,可以有普通的WHERE條件
查詢平均成績大于等于60,且學生ID等于1的學生的ID及平均成績。
SELECT StudentID,AVG(Score) FROM SC WHERE StudentID='1' GROUP BY StudentID HAVING AVG(Score)>=603)查詢總成績在600分以上(包括600)的學生ID
SELECT StudentID FROM SC GROUP BY StudentID HAVING SUM(Score)>=60018、TOP
TOP 子句用于規定要返回的記錄的數目。對于大數據很有用的,在分頁時也會常常用到。
1)查詢年齡最大的三名學生信息
SELECT TOP 3 ID,Name FROM Students ORDER BY Age DESC2)還是上一道題,如果有相同年齡的如何處理呢?
SELECT ID,Name,Age FROM Students WHERE Age IN (SELECT TOP 3 Age FROM Students)19、Case語句
計算條件列表,并返回多個可能的結果表達式之一。
CASE 表達式有兩種格式:
- CASE 簡單表達式,它通過將表達式與一組簡單的表達式進行比較來確定結果。
- CASE 搜索表達式,它通過計算一組布爾表達式來確定結果。
簡單表達式語法:
CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END搜索式語法:
CASEWHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END1)查詢學習信息,如果Sex為0則顯示為男,如果為1顯示為女,其他顯示為其他。
SELECT ID, Name, CASE Sex WHEN '0' THEN '男' WHEN '1' THEN '女' ELSE '其他' END AS Sex FROM Students2)查詢學生信息,根據年齡統計是否成年,大于等于18為成年,小于18為未成年
SELECT ID, Name, CASE WHEN Age>=18 THEN '成年' ELSE '未成年'END AS 是否成年 FROM Students3)統計成年未成年學生的個數
要求結果
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 Students4)行列轉換。統計男女生中未成年、成年的人數
結果如下:
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作者:停留的風
文章源自:http://www.cnblogs.com/yank/p/3672478.html
總結
以上是生活随笔為你收集整理的SQL总结(一)基本查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网友花2499元就买到了努比亚Z50:系
- 下一篇: 散热效果更好,三星 Galaxy S23