SQL總結(一)基本查詢

SQL總結(一)基本查詢

 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 表名

 

二、Where(條件)

做用:按照必定的條件查詢數據spa

語法:code

SELECT 列名1,列名2 FROM 表名 WHERE 列名1 運算符  值

運算符:blog

運算符 描述
= 等於
<> 不等於
> 大於
< 小於
>= 大於等於
<= 小於等於
BETWEEN 在某個範圍內
LIKE 搜索某種模式

比較操做符都比較簡單,再也不贅述。關於BETWEEN和LIKE,專門拿出來重點說下排序

三、BETWEEN

在兩個值之間,好比我從學生中查詢年齡在18-20之間的學生信息ci

SELECT ID,Name,Age FROM Students WHERE Age BETWEEN 18 AND 20

 

四、LIKE

做用:模糊查詢。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

AND 在 WHERE 子語句中把兩個或多個條件結合起來。表示和的意思,多個條件都成立。

1)查詢年齡大於18且姓張的學生信息

SELECT ID,Name FROM Students WHERE Age>18 AND Name LIKE '張%'

 

六、OR 

 OR可在 WHERE 子語句中把兩個或多個條件結合起來。或關係,表示多個條件,只有一個符合便可。

1)查詢姓氏爲張、李的學生信息

SELECT ID,Name FROM Students WHERE Name LIKE '張%' OR Name LIKE '李%'

 

 七、IN

IN 操做符容許咱們在 WHERE 子句中規定多個值。表示:在哪些值當中。

1)查詢年齡是1八、1九、20的學生信息

SELECT ID,Name FROM Students WHERE Age IN (18,19,20)

 

八、NOT 否認

NOT對於條件的否認,取非。

1)查詢非張姓氏的學習信息

SELECT ID,Name FROM Students WHERE Name NOT LIKE '張%'

 

九、ORDER BY(排序)

功能:對須要查詢後的結果集進行排序

標識 含義 說明
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

 十、AS(Alias)

能夠爲列名稱和表名稱指定別名(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

 

 

十一、Distinct

含義:不一樣的

做用:查詢時忽略重複值。

語法:

SELECT DISTINCT 列名稱 FROM 表名稱

實例:

1)查詢學生所在城市名,排除重複

SELECT DISTINCT City FROM Student

2)查詢成績分佈分佈狀況

SELECT DISTINCT(Score),Count(ID) FROM Student GROUP BY Score

學生成績可能重複,以此獲得分數、獲得這一成績的學生數。後續會詳細介紹GROUP BY 用法。  

 

十二、MAX/MIN

MAX 函數返回一列中的最大值。NULL 值不包括在計算中。

MIN 函數返回一列中的最小值。NULL 值不包括在計算中。

MIN 和 MAX 也可用於文本列,以得到按字母順序排列的最高或最低值。

1)查詢學生中最高的分數

SELECT MAX(Score) FROM Students

2)查詢學生中最小年齡

SELECT MIN(Age) FROM Students

 

1三、SUM

查詢某列的合計值。

1)查詢ID爲1001的學生的各科總成績

SC即爲學生的成績表,字段:StudentID,CourseID,Score.

SELECT SUM(Score) AS TotalScore FROM SC WHERE StudentID='1001' 

1四、AVG

AVG 函數返回數值列的平均值

1)查詢學生的平均年齡

SELECT AVG(Age) AS AgeAverage FROM Students

2)求課程ID爲C001的平均成績

SELECT AVG(Score) FROM SC WHERE CourseID='C001'

 

1五、COUNT

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

 

1六、GROUP BY

 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)

1七、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 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

 

1八、TOP

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)

1九、Case語句 

計算條件列表,並返回多個可能的結果表達式之一。
CASE 表達式有兩種格式:

  • CASE 簡單表達式,它經過將表達式與一組簡單的表達式進行比較來肯定結果。
  • 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
相關文章
相關標籤/搜索