目錄
基本語法
一、基礎查詢
1、查詢多個字段
2、字段設置別名
3、去除重復記錄
4、示例代碼
二、條件查詢
1、語法
2、條件列表常用的運算符
3、示例代碼
三、分組查詢
(一)聚合函數
1、介紹
2、常見的聚合函數
3、語法
4、示例代碼
(二)分組查詢
1、語法
2、where 與 having 區別
3、注意事項
4、示例代碼
四、排序查詢
1、語法
2、排序方式
3、注意事項
4、示例代碼
五、分頁查詢
1、語法
2、注意事項
3、示例代碼
六、DQL語言的實戰應用
(一)執行順序
(二)各個字句的作用
(三)實際書寫代碼的思路
????????DQL 英文全稱是Data Query Language,即數據查詢語言,用來查詢數據庫中表的記錄。
????????在一個正常的業務系統中,查詢操作的頻次是要遠高于增刪改的。
????????當我們去訪問企業官網、電商網站,在這些網站中我們所看到的數據,實際都是需要從數據庫中查詢并展示的。而且在查詢的過程中,可能還會涉及到條件、排序、分頁等操作。
基本語法
DQL 查詢語句,語法結構如下:
select字段列表
from表名列表
where條件列表
group by分組字段列表
having分組后條件列表
order by排序字段列表
limit分頁參數
????????我們在講解這部分內容的時候,會將上面的完整語法進行拆分,分為以下幾個部分.
? ? ? ? ① 基本查詢 (不帶任何條件);② 條件查詢 (WHERE);③ 聚合函數 (count、max、min、avg、sum);④ 分組查詢 (group by);⑤ 排序查詢 (order by);⑥ 分頁查詢 (limit)
一、基礎查詢
1、查詢多個字段
????????在基本查詢的DQL語句中,不帶任何的查詢條件,查詢的語法如下:????????
select 字段1, 字段2, 字段3 ... from 表名 ;
select * from?表名 ;?
????????注意:* 號代表查詢所有字段,在實際開發中盡量少用(不直觀、影響效率)。
2、字段設置別名
select 字段1 [ as 別名1 ] , 字段2 [ as 別名2 ] ... from 表名;
select 字段1 [ 別名1 ] , 字段2 [ 別名2 ] ... from 表名;
????????注意:關鍵字 as 可以省略,方括號表示可以不添加。
3、去除重復記錄
select?distinct 字段列表 from 表名;
????????select 的意思是選擇,在這里選擇對應的字段的意思就是,選到了什么字段,什么字段就顯示出來,那一列就顯示出來,沒有被選擇到的就不顯示出來。
????????from 的意思是來自,后面接表名,也就是說明數據來源于哪個表。
4、示例代碼
(1)查詢指定字段 name, workno, age 并返回
select name,workno,age from emp;
(2)查詢返回所有字段
select id ,workno,name,gender,age,idcard,workaddress,entrydate from emp;
select * from emp;
(3)查詢所有人員的工作地址、起別名
select workaddress as '工作地址' from emp;
-- as可以省略
select workaddress '工作地址' from emp;
(4)查詢公司員工的上班地址有哪些(不要重復)
select distinct workaddress '工作地址' from emp;
二、條件查詢
1、語法
select 字段列表 from?表名 where?條件列表 ;
2、條件列表常用的運算符
(1)常用的比較運算符如下:
(2)常用的邏輯運算符如下:
3、示例代碼
(1)查詢年齡在15歲(包含) 到 20歲(包含)之間的員工信息
select * from emp where age >= 15 && age <= 20;
select * from emp where age >= 15 and age <= 20;
select * from emp where age between 15 and 20;
(2)查詢性別為女且年齡小于25歲的員工信息
select * from emp where gender = '女' and age < 25;
(3)查詢姓名為兩個字的員工信息
select * from emp where name like '__';
--like后面有兩條_,說明匹配兩個任意字符
(4)查詢身份證號最后一位是X的員工信息
select * from emp where idcard like '%X';
--%可以表示任意字符,'%X只要保證最后一位是X就行了'
select * from emp where idcard like '_________________X';
三、分組查詢
(一)聚合函數
1、介紹
? ? ? ? 聚合函數即將一列數據作為一個整體,進行縱向計算 。select 的作用就是選擇要展現的列,其后面可以接字段與聚合函數。
????????select 后面接字段就是正常輸出一列;而接聚合函數,就是對這一列進行相應的處理,再展示出來,其行數會做出相應的調整。
????????直接引用表中原始字段,未經過聚合函數處理,這列則被稱為非聚合列。而經過聚合函數處理的列,則稱為聚合列。
? ? ? ? 聚合函數可以單獨使用,但是如當與非聚合列一起出現時,必須通過 group by?明確分組規則,否則會導致語法錯誤。
2、常見的聚合函數
3、語法
select 聚合函數(字段列表) from 表名 ;
??????注意:NULL值是不參與所有聚合函數運算的
4、示例代碼
(1)統計該企業員工數量
select count(*) from emp; -- 統計的是總記錄數
select count(idcard) from emp; -- 統計的是idcard字段不為null的記錄數
(2)統計該企業員工的最大年齡
select max(age) from emp;
(3)統計西安地區員工的年齡之和
select sum(age) from emp where workaddress = '西安';
(二)分組查詢
1、語法
select 字段列表 from?表名 [where?條件] group?by?分組字段名 [having?分組后過濾條件];
2、where 與 having 區別
(1)執行時機不同:where是分組之前進行過濾,不滿足where條件,不參與分組;而having是分組之后對結果進行過濾。
(2)判斷條件不同:where不能對聚合函數進行判斷,而having可以。
3、注意事項
(1)分組之后,查詢的字段一般為聚合函數和分組字段,查詢其他字段無任何意義。[重點]
? ? ? ? 例如,我根據性別 gender 分組,分組結為男與女,所以此時就會得到得到男與女兩組,即男女兩行;但這兩行并沒有數據,僅知道一行存放男性的數據、一行存放女性的數據。
????????此時使用聚合函數max(age),就會在這兩行呈現對應數據,即男性的最大年齡與女性的最大年齡;再接gender字段,則在兩行中分別填放男、女;
????????但如果接 workplace 字段,性別男或性別女會對應多個工作地址,系統根本不知道顯示哪個。所以 select 的后面只能接作為分組依據的字段或聚合函數。
(2)執行順序
????????where > group by> 聚合函數 > having?
(3)支持多字段分組,具體語法為:group by columnA,columnB
4、示例代碼
(1)根據性別分組 , 統計男性員工和女性員工的數量
select gender, count(*) from emp group by gender ;
(2)查詢年齡小于45的員工 , 并根據工作地址分組 , 獲取員工數量大于等于3的工作地址
select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count >= 3;
(3)統計各個工作地址上班的男性及女性員工的數量
select workaddress, gender, count(*) '數量' from emp group by gender , workaddress ;
四、排序查詢
????????排序在日常開發中是非常常見的一個操作,有升序排序,也有降序排序。
1、語法
select 字段列表 from 表名 order by 字段1 排序方式1 , 字段2 排序方式2 ;
2、排序方式
asc:升序(默認值)
desc:降序
3、注意事項
(1)如果是升序,可以不指定排序方式ASC,因為默認升序;
(2)如果是多字段排序,當第一個字段值相同時,才會根據第二個字段進行排序 ;
4、示例代碼
(1)根據年齡對公司的員工進行升序排序
select * from emp order by age asc;
select * from emp order by age;
(2)根據入職時間, 對員工進行降序排序
select * from emp order by entrydate desc;
(3)根據年齡對公司的員工進行升序排序 , 年齡相同 , 再按照入職時間進行降序排序
select * from emp order by age asc , entrydate desc;
五、分頁查詢
????????分頁操作在業務系統開發時,也是非常常見的一個功能,我們在網站中看到的各種各樣的分頁條,后臺都需要借助于數據庫的分頁操作。
1、語法
select 字段列表 from 表名 limit 起始索引, 查詢記錄數 ;
2、注意事項
(1)起始索引從0開始,起始索引 = (查詢頁碼 - 1)* 每頁顯示記錄數。
(2)分頁查詢是數據庫的方言,不同的數據庫有不同的實現,MySQL中是LIMIT。
(3)如果查詢的是第一頁數據,起始索引可以省略,直接簡寫為 limit 10。
3、示例代碼
(1)查詢第1頁員工數據, 每頁展示10條記錄
select * from emp limit 0,10;
select * from emp limit 10;
(2)查詢第2頁員工數據, 每頁展示10條記錄,即起始索引 = (頁碼-1) * 頁展示記錄數
select * from emp limit 10,10;
六、DQL語言的實戰應用
(一)執行順序
????????在講解DQL語句的具體語法之前,我們已經講解了DQL語句的完整語法,及編寫順序,現在我們要來說明的是DQL語句在執行時的執行順序,也就是先執行哪一部分,后執行哪一部分。
(二)各個字句的作用
① from:指定要查詢的表。
② where:篩選滿足條件的行。
③ group by:按照指定列對結果進行分組。
④ having:分組后,篩選滿足條件的行。
⑤ select:選擇要返回的列。
⑥ order by:對結果進行排序。
????????所以說一條語句執行的完整過程是:
????????from 先決定查詢哪個表,where 篩選滿足條件的行,group by再對指定的列進行分組,沒有參與分組的列可以忽略了,因為根本select不出來,接著having 對分組后的結果進行二次篩選,篩選滿足條件的行;
????????在前置操作完成后,select 就可以選擇需要輸出的列;
????????order by可以對輸出的結果進行相應的排序,如果需要分頁,則可以使用limit。
(三)實際書寫代碼的思路
????????題目:編寫一個SQL查詢,找出入職日期在2022年之后,所在部門員工平均工資超過5200的部門,統計這些部門的員工數量,最后按照員工數量從多到少排序。以下是表的具體內容:
-- 創建員工表
create table 員工 (員工編號 int primary key,員工姓名 varchar(50),部門 varchar(50),工資 decimal(10, 2),入職日期 date
);-- 插入示例數據
insert into 員工表 (員工編號, 員工姓名, 部門, 工資, 入職日期)
values (1, '愛麗絲', '人力資源部', 5000, '2022-01-01'),(2, '鮑勃', '信息技術部', 6000, '2022-03-15'),(3, '查理', '人力資源部', 5500, '2022-05-20'),(4, '大衛', '信息技術部', 7000, '2022-07-10'),(5, '伊芙', '財務部', 4500, '2022-09-05');
????????寫代碼的思路其實就是“代碼的書寫順序”,語句的書寫順序符合的是人的思路,語句的執行順序符合的是計算機的邏輯。【重點】
? ? ? ? 我們可以把書寫代碼的過程分為三部分:分組之前、分組、分組之后。
? ? ? ? 分組之前:第一步要知道,需要輸出哪幾列,從哪個表得到數據,即 select 與 from。根據“統計這些部門的員工數量”,可以知道,我們需要輸出的有兩列:部門、數量;數量需要使用聚合函數 count。接著,找出分組之前的篩選條件(where),是“入職日期在 2022 年之后”。
? ? ? ? 分組:然后要確定分組條件(group by)。我們已經知道了,輸出的兩列是部門與數量,因為輸出的列除了聚合函數以外,就是分組條件,所以分組條件是部門。
? ? ? ? 分組之后:確定分組后的篩選條件(having)與排序規則(order by)。接著由“所在部門員工平均工資超過5200的部門”可知,在分組之后,我們還要根據平均工資 5200 進行相應的篩選;最后根據員工數量的多少進行排序。
? ? ? ? 三步之后,即可得到以下代碼:
select department,count(employee_id)
fromemployees
where hire_date >= '2022-01-01'
group by department
having avg(salary) > 5200
order by count(employee_id) desc;
????????以上即為數據查詢語言 DQL 的所有內容,我們首先對整體語句拆分,作逐個擊破;然后對其整體的執行過程與書寫思路作講解,從而能在日常代碼書寫中,將語句寫出。