一、MySQL基础
在数据驱动的今天,DQL(Data Query Language,数据查询语言) 是数据库操作的"黄金钥匙"。它不仅是SQL的子集,更是我们从海量数据中精准提取价值的核心工具。
1. DQL
DQL是SQL(Structured Query Language)中专门用于数据检索 的子集,其核心使命是"从数据库中获取所需数据 "。与DML(数据操作语言)的"增删改"不同,DQL专注于"查",是数据分析、报表生成和业务决策的基础。
💡 关键区别 :DQL是只读操作,它不会修改数据库中的任何数据,只提供数据的视图。

DQL的精髓全部浓缩在SELECT语句中。它的完整语法结构如下:

1.2 基本查询
小贴士 :在生产环境中,永远不要用*,除非你确定需要所有字段。精准查询能显著减少网络传输和数据库压力。


1.3 条件查询
-
比较运算符:精准定位
-
逻辑运算符:构建复杂条件
-
模糊查询:通配符的魔力

sql
-- 数据准备
create table emp(
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(10) comment '姓名',
gender char comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
workaddress varchar(50) comment '工作地址',
entrydate date comment '入职时间'
) comment '员工表';
insert into emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
values (1,'1','刘燕','女',24,'123456789123456789','北京','2000-01-01'),
(2,'2','曾供','女',18,'123456789123456781','娄底','2005-11-11'),
(3,'3','莱克瓦','男',20,'123456789123456782','广州','2005-05-31'),
(4,'4','james','男',35,'123456789123456783','洛杉矶','1995-06-21');
-- ----------------------> 查询需求 <-----------------------------------
-- 基本查询
-- 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;
-- 4. 查询公司员工的上班地址(不能重复)
select distinct workaddress as '工作地址' from emp;
-- 增加一些员工
insert into emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
values (5,'5','Kobe','男','40','null','Nets','1978-08-24'),
(6,'6','LiDong','女','88','123456789123456787','涟源县','1937-07-10'),
(7,'7','盛宇','男','36','123456789123456687','长沙市','1997-07-10'),
(8,'8','谢丽','女','44','123456789123456287','广州市','1977-07-10');
-- 条件查询
-- 1. 查询年龄等于 88 的员工
select * from emp where age = 88;
-- 2. 查询年龄小于 20 的员工信息
select * from emp where age < 20;
-- 3. 查询年龄小于等于 20 的员工信息
select * from emp where age <= 20;
-- 4. 查询没有身份证号的员工信息
select * from emp where idcard is null;
-- 5. 查询有身份证号的员工信息
select * from emp where idcard is not null;
-- 6. 查询年龄不等于 88 的员工信息
-- 不等于 != 或者 <>
select * from emp where age != 88;
select * from emp where age <> 88;
-- 7. 查询年龄在 15岁(包含) 到 20岁(包含)之间的员工信息
-- && or and
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;
-- 8. 查询性别为 女 且年龄小于 25岁的员工信息
select * from emp where gender = '女' and age < 25;
-- 9. 查询年龄等于 18 或 20 或 40 的员工信息
-- 两者效果一致
select * from emp where age = 18 or age = 20 or age = 44;
select * from emp where age in(18,20,44);
-- 10. 查询姓名为两个子的员工信息
-- 利用模糊匹配 __两个下划线代表两个字符
select * from emp where name like '__';
-- 11. 查询身份证号最后一位是X的员工信息
-- %意味着前面是多少个字符都无所谓,只需要保证最后一个是X即可
select * from emp where emp.idcard like '%X';
1.4 聚合函数
聚合函数是DQL的"宝藏",它能将多行数据转换为有意义的统计信息。

💡 实际案例 :某电商平台使用AVG()计算用户平均订单金额,发现客单价为250元,据此调整营销策略。
sql
-- 聚合函数
-- 所有的null值不参与计算!!!
-- 1. 统计该企业员工数据
select count(*) from emp;
select count(idcard) from emp;
-- 2. 统计该企业员工的平均年龄
select avg(age) from emp;
-- 3. 统计该企业员工的最大年龄
select max(age) from emp;
-- 4. 统计该企业员工的最小年龄
select min(age) from emp;
-- 5. 统计该企业广州地区员工的年龄之和
select sum(age) from emp where workaddress = '广州';
1.5 分组查询
分组查询让数据按类别组织,是数据分析的基石。
🚫 WHERE vs HAVING:分组前 vs 分组后

💡 关键区别 :WHERE在分组前过滤数据,HAVING在分组后过滤结果。
sql
-- 分组查询
-- 1. 根据性别分组,统计男性员工 和 女性员工的数量
select gender,count(*) from emp group by gender ;
-- 2. 根据性别分组,统计男性员工 和 女性员工的平均年龄
select gender,avg(age) from emp group by gender ;
-- 3. 查询年龄小于45岁的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
-- 分组前过滤:where ,分组后过滤用having
select workaddress,count(*) from emp where age < 45 group by workaddress having count(*) >=3;
1.6 排序查询
-
排序:数据的"秩序之美"
-
分页:大数据的"高效处理"

sql
-- 排序查询
-- 1. 根据年龄对公司的员工进行升序排序
-- asc也可以省略,默认是升序
select * from emp order by age asc;
select * from emp order by age desc;
-- 2. 根据入职时间,对员工进行降序排序
select * from emp order by entrydate desc ;
-- 3. 根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序
select * from emp order by age asc ,entrydate desc ;
1.7 分页查询
💡 分页公式 :LIMIT (page-1)*size, size

sql
-- 分页查询
-- 1. 查询第1页员工数据,每页展示5条记录
select * from emp limit 0,5;
-- 2. 查询第2页员工数据,每页展示5条记录
-- 起始索引 =( 页码-1)* 展示x记录数
select * from emp limit 5,5;
1.8 执行顺序

DQL不仅是数据库操作的语言,更是数据洞察的艺术。掌握DQL,你就能从海量数据中精准提取价值,为业务决策提供有力支持。
