【示例】MySQL-4类SQL语言-DQL

发布于:2024-05-20 ⋅ 阅读:(247) ⋅ 点赞:(0)

前言

本文主要讲述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(id) 统计id列的数量
max(salary) 返回salary列的最大值
min(salary) 返回salary列的最小值
avg(salary) 返回salary列的平均值
sum(salary) 返回salary列的总和
datediff(day1, day2) 返回day1-day2的日期差值,以天为单位,结果是整数
# 基础语法
SELECT 聚合函数(字段列表) FROM 表名;

查询内容:表字段函数

参考链接: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 或者 ! 非,不是

关键字 | 用在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