目錄
1. DQL概念
2.?DQL - 編寫順序
3. 基礎查詢
3.1?查詢多個字段
3.2 字段設置別名
3.3?去除重復記錄
3.4?案例
4. 條件查詢?
4.1 語法
4.2 條件
4.3 案例:
5. 聚合函數
5.1 常見的聚合函數:
5.2 語法
5.3 案例:
6. 分組查詢
6.1 語法
6.2 案例
7. 排序查詢
7.1 語法
7.2 排序方式
7.3 案例?
8. 分頁查詢
8.1 語法
8.2 案例
9. 執行順序
1. DQL概念
DQL英文全稱是Data Query Language(數據查詢語言),數據查詢語言,用來查詢數據庫中表的記錄。
查詢關鍵字: select
在一個正常的業務系統中,查詢操作的頻次是要遠高于增刪改的,當我們去訪問企業官網、電商網站,在這些網站中我們所看到的數據,實際都是需要從數據庫中查詢并展示的。而且在查詢的過程中,可能還會涉及到條件、排序、分頁等操作。
2.?DQL - 編寫順序
select? 字段列表
from? ?表名列表
where? 條件列表
group BY? 分組字段列表
having? 分組后條件列表
order?BY? 排序字段列表
limit??分頁參數
3. 基礎查詢
在基本查詢的DQL語句中,不帶任何的查詢條件,查詢的語法如下:
3.1?查詢多個字段
- select? 字段1, 字段2, 字段3 ... from 表名 ;
- select? * from 表名 ;
注意 : * 號代表查詢所有字段,在實際開發中盡量少用(不直觀、影響效率)。
3.2 字段設置別名
- select? 字段1 [ as?別名1 ] , 字段2 [ as?別名2 ] ... from 表名;
- select? 字段1 [ 別名1 ] , 字段2 [ 別名2 ] ... from 表名;
3.3?去除重復記錄
select? distinct 字段列表 from 表名;
3.4?案例
-- ------------------------------------------------------------------基礎查詢
# 查詢name, workno, age
select name, workno, age from emp;# 查詢所有數據
select * from emp;# 將ID=3的名字修改為張飛
update emp set name = '張飛' where id = 3;# 查詢workaddress
select workaddress from emp;# 修改別名
select workaddress as '工作地址' from emp;
select workaddress '工作地址' from emp;# 去重
select distinct workaddress '工作地址' from emp;# 修改表中wordaddress為workaddress
alter table emp change wordaddress workaddress varchar(50) comment '工作地址';
4. 條件查詢?
4.1 語法
select 字段列表 from 表名 where 條件列表 ;
4.2 條件
常用的比較運算符如下:
比較運算符 | 功能 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
between... and... | 在某個范圍之內(含最小、最大值) |
in(...) | 在in之后的列表中的值,多選一 |
like占位符 | 模糊匹配(_匹配單個字符, %匹配任意個字符) |
is NULL | 是NULL |
常用的邏輯運算符如下:
邏輯運算符 | 功能 |
and 或 && | 并且 (多個條件同時成立) |
or 或 || | 或者 (多個條件任意一個成立) |
not 或 ! | 非 , 不是 |
4.3 案例:
-- ------------------------------------------------------------------條件查詢
# 查詢年齡不等于18
select * from emp where age != 18;
select * from emp where age <> 18;# 查詢年齡小于40
select * from emp where age <= 40;# 查詢idcard不空值的數據
select * from emp where idcard is not null;# 查詢idcard是空值的數據
select * from emp where idcard is null;# 設置16行idcard為空值
update emp set idcard = null where id = 16;
update emp set idcard = '12345678998765432x' where id = 13;# 查詢年齡在30到50之間
select * from emp where age >= 30 && age <= 50;
select * from emp where age >= 30 and age <= 50;
select * from emp where age between 30 and 50;# between接最小值,and接最大值
select * from emp where age between 50 and 30;# 查詢性別女,且在蜀國的數據
select * from emp where gender = '女' and workaddress = '蜀國';# 查詢年齡等于18或等于30或等于40
select * from emp where age = 18 or age = 30 or age = 40;
select * from emp where age in(18, 30, 40);# 查詢名字為三個字的名字
select * from emp where name like '___';# 查找idcard的最后一位為x
select * from emp where idcard like '%X';
5. 聚合函數
介紹:將一列數據作為一個整體,進行縱向計算 。
5.1 常見的聚合函數:
函數 | 功能 |
count | 統計數量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
5.2 語法
select? 聚合函數(字段列表)? from 表名 ;
注意 : NULL值是不參與所有聚合函數運算的。
5.3 案例:
-- ------------------------------------------------------------------聚合函數
# 統計所有數量
select count(*) from emp;
select count(id) from emp;# 統計所有人平均年齡
select avg(age) from emp;# 統計最大年齡
select max(age) from emp;# 統計最小年齡
select min(age) from emp;# 統計蜀國將領人員的年齡之和
select sum(age) from emp where workaddress = '蜀國';
6. 分組查詢
6.1 語法
select 字段列表 from 表名 [ where 條件 ] group by 分組字段名 [ having 分組后過濾條件 ];
where與having區別:
執行時機不同:where是分組之前進行過濾,不滿足where條件,不參與分組;而having是分組之后對結果進行過濾。
判斷條件不同:where不能對聚合函數進行判斷,而having可以。
6.2 案例
-- ------------------------------------------------------------------分組查詢
# 根據性別分組,統計男性和女性的分組
select gender, count(*) from emp group by gender;# 根據性別分組,統計男性員工和女性員工的平均年齡
select gender, avg(age) from emp group by gender;# 查詢年齡小于45的人員數量,并且根據工作地址分組,獲取人員數量大于等于3的工作地址
select workaddress, count(*) from emp where age < 45 group by workaddress having count(*) >= 3;
# 起別名
select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count >= 3;
注意事項:
- 分組之后,查詢的字段一般為聚合函數和分組字段,查詢其他字段無任何意義。
- 執行順序: where > 聚合函數 > having 。
- 支持多字段分組, 具體語法為 : group by columnA,columnB
7. 排序查詢
7.1 語法
select 字段列表 from 表名 order by 字段1 排序方式1 , 字段2 排序方式2 ;
7.2 排序方式
- ASC : 升序(默認值)
- DESC: 降序
7.3 案例?
-- ------------------------------------------------------------------排序查詢
# 根據年齡升序排序
select * from emp order by age asc;
# asc可省略
select * from emp order by age;# 根據年齡升序降序
select * from emp order by age desc;# 修改入職時間
update emp set entrydate = '1990-02-03' where id = 4;
update emp set entrydate = '1993-12-03' where id = 6;
update emp set entrydate = '1993-05-03' where id = 8;
update emp set entrydate = '1909-02-03' where id = 11;# 根據入職時間做降序排序
select * from emp order by entrydate desc;# 根據年齡升序,年齡相同再按照入職時間降序排序
select * from emp order by age, entrydate desc;
注意事項:
- 如果是升序, 可以不指定排序方式ASC ;
- 如果是多字段排序,當第一個字段值相同時,才會根據第二個字段進行排序 ;
8. 分頁查詢
8.1 語法
select??字段列表 from 表名 limit?起始索引, 查詢記錄數 ;
8.2 案例
-- ------------------------------------------------------------------分頁查詢
# 查詢第1頁人員數據,根據展示5條記錄
select * from emp limit 0, 5;
# 查詢首頁0可以省略
select * from emp limit 5;# 查詢第3頁人員數據,根據展示5條記錄(頁碼-1*頁碼展示記錄數)
select * from emp limit 10,5;
注意事項:
- 起始索引從0開始,起始索引 = (查詢頁碼 - 1)* 每頁顯示記錄數。
- 分頁查詢是數據庫的方言,不同的數據庫有不同的實現,MySQL中是limit。
- 如果查詢的是第一頁數據,起始索引可以省略,直接簡寫為 limit 10。