文章目录
- 前言
- DQL | Data Query Language
- 总述 | 涵盖几乎所有关键字的DQL语句
- 单表查询
- 关键字 | 用在Select后面
- 查询内容:表字段
- 查询内容:聚合函数
- 查询内容:[排序函数+] [聚合函数+] 窗口函数
- 查询内容:表字段函数
- 关键字 | 用在Where后面
- 查询条件:比较远算符
- 查询条件:逻辑运算符
- 查询条件:表字段处理函数
- 关键字 | 用在Group By后面 + Having后面
- 分组内容:字段名
- 关键字 | 用在Order By后面
- 排序内容:表字段
- 关键字 | 用在Limit后面
- 分页内容:索引、记录数
- 多表查询
- 联合查询、子查询【重要】
前言
本文主要讲述MySQL中4中SQL语言的使用及各自特点。
SQL语言总共分四类:DDL、DML、DQL、DCL。
本章主要讲述DQL语言。
DQL | Data Query Language
数据查询语言,用来查询数据库中表的记录
总述 | 涵盖几乎所有关键字的DQL语句
编写顺序
SELECT 字段列表FROM 表名列表WHERE 条件列表GROUP BY 分段字段列表HAVING 分组后条件列表ORDER BY 排序字段列表LIMIT 分页参数
执行顺序
FROM 表名列表WHERE 条件列表GROUP BY 分段字段列表HAVING 分组后条件列表SELECT 字段列表ORDER BY 排序字段列表LIMIT 分页参数
单表查询
关键字 | 用在Select后面
查询内容:表字段
# 查询多个字段
SELECT 字段1, 字段2, 字段3 ... FROM 表名;# 查询所有字段
SELECT * FROM 表名 ;# 查询字段并设置别名(写不写as都一样)
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;# 去重查询
SELECT DISTINCT 字段列表 FROM 表名;# 聚合函数,统计相关信息
SELECT COUNT(1) FROM 表名;
查询内容:聚合函数
聚合查询:以一列数据为整体,进行纵向查询。任何值为Null的字段数据,都不参与聚合查询
函数 | 功能 |
---|---|
count( [DISTINCT] expr ) | 统计expr的数量,可以是单纯的列、数字、* |
max( column ) | 返回column列的最大值 |
min( column ) | 返回column列的最小值 |
avg( [DISTINCT] expr ) | 返回expr的平均值,expr可以是单纯的列,也可以是列之间的四则运算 |
sum( [DISTINCT] expr ) | 返回expr的总和,expr可以是单纯的列,也可以是表字段函数处理后的结果 |
# 基础语法
SELECT 聚合函数() FROM 表名;# 示例
SELECT query_name, ROUND(AVG(rating/position), 2) as quality,ROUND(SUM(IF(rating < 3, 1, 0)) * 100 / COUNT(*), 2) as poor_query_percentage
FROM Queries
GROUP BY query_name
having query_name is not null
查询内容:[排序函数+] [聚合函数+] 窗口函数
窗口函数定义:OVER()窗口函数用于定义一个窗口,对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,就能够在同一行同时返回基础列和聚合列。
窗口函数的用法:
OVER ( [ PARTITION BY column ] [ ORDER BY culumn ] )
PARTITION BY
:用于给指定列进行分组ORDER BY
:在分组的前提下,按照指定列对组内数据进行排序,以方便累计处理
应用示例:窗口函数+聚合函数+排序函数
查询内容:表字段函数
参考链接:https://blog.csdn.net/qq_45445505/article/details/137653139
关键字 | 用在Where后面
查询条件:比较远算符
比较运算符 | 写法示例 | 功能 |
---|---|---|
>、>=、<、<=、= | WHERE id > 10 | 大于、大于等于、小于、小于等于、等于 |
<> 或者 != | WHERE id <> 10 | 不等于 |
BETWEEN ... AND ... | WHERE id BETWEEN 10 AND 100 | 在某个范围之内:[最小值、最大值],是个闭区间 |
IN(...) | WHERE id in (10, 12, 14) | 在in之后的列表中的值,多选一 |
NOT IN(...) | WHERE id NOT IN (1, 5, 9) | 返回值不在列表内的行 |
LIKE 占位符 | WHERE id LikE _ABC | 模糊匹配:_匹配单个字符, %匹配任意个字符) |
IS NULL | WHERE id IS NULL | 判断是否是NULL |
IS NOT NULL | WHERE id IS NOT NULL | 判断是否不是NULL |
上述部分语句解析:
WHERE id LikE _ABC
返回以ABC为结尾,且整体长度为4的数据,例如:1ABC、AABC、ABABC(这个不是,长度不满足)WHERE id LikE %ABC
返回以ABC为结尾,且整体长度大于等于3的数据,例如:ABC、AABC、AAACABC、AAACABCA(这个不是,不满足)
# 基础语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;# 示例--占位符
select * from emp where name like '__'; # 查询姓名为两个字的员工
select * from emp where idcard like '%X'; # 查询身份证结尾为X的员工
select * from emp where idcard like '_________________X'; # 查询身份证结尾为X的员工
查询条件:逻辑运算符
常用逻辑运算符 | 功能 |
---|---|
AND 或者 && | 并且 |
OR 或者 || | 或者 |
NOT 或者 ! | 非,不是 |
查询条件:表字段处理函数
# 示例:mod函数
select *
from cinema
where description != "boring" and mod(id, 2) = 1
order by rating desc;
关键字 | 用在Group By后面 + Having后面
分组内容:字段名
# 通用语法
# 分组查询经常和聚合函数一起使用
SELECT 字段列表 FROM 表名 [ WHERE 分组前筛选条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];
Group By的作用:
- 假设以字段1、字段2进行分组。
- 则
Select *
,返回每一组的第一行数据 - 则
Select 分组字段, 聚合函数(字段)
,聚合函数针对每一个分组进行统计,而不是针对全表进行统计
Having的作用:
-
对Group By分组之后的结果进行条件筛选
-
where和having的区别?
-
执行时机:where在分组前执行;having在分组后执行
-
判断条件:where不能对聚合函数进行判断,having可以
-
执行顺序:where > 聚合函数 > having
-
示例
# 根据性别分组, 统计男性员工 和 女性员工的数量
select gender, count(*) from emp group by gender;# 根据性别分组 , 统计男性员工 和 女性员工的平均年龄
select gender, avg(age) from emp group by gender;# 查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
select workaddress, count(*) AS address_count from emp where age < 45 group by workaddress having address_count >= 3; # AS可省略# 示例:返回每个role角色下,所有人的薪水总和,然后根据role分组,筛选总和大于1500的结果
select role, sum(salary) as totle from emp group by role having totle > 1500;
关键字 | 用在Order By后面
排序内容:表字段
SELECT 字段列表 FROM 表名 ORDER BY 字段1 [ASC|DESC] , 字段2 [ASC|DESC];
排序 | |
---|---|
ASC | 升序,默认的排序方式 |
DESC | 降序 |
多字段排序的规则:当第一个字段一样时候,才会根据第二个字段排序,后续字段排序同理
示例
# 根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序
select * from emp order by age, entrydate desc;
关键字 | 用在Limit后面
分页内容:索引、记录数
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
- 分页查询算是数据库的方言,不同的数据库有不同的实现。MySQL中使用的是LIMIT
- 起始索引、待查询页码、每页记录数之间的关系:
起始索引 = (待查询的页码-1)* 每页记录数
多表查询
联合查询、子查询【重要】
参考文章:https://blog.csdn.net/qq_45445505/article/details/137051199