mysql-DDLy语句案例
目录
案例要求:
实现思路:
代码:
总结:
案例要求:
案例 按照需求完成如下 DQL 语句编写
- 查询年龄为 20,21,22,23 岁的员工信息。
- 查询性别为 男,并且年龄在 20 - 40 岁 (含) 以内的姓名为三个字的员工。
- 统计员工表中,年龄小于 60 岁的,男性员工和女性员工的人数。
- 查询所有年龄小于等于 35 岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。
- 查询性别为男,且年龄在 20 - 40 岁 (含) 以内的前 5 个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
实现思路:
本文解析了5条MySQL查询语句,涵盖常见数据查询需求:1)查询指定年龄段的员工信息;2)筛选符合多重条件的员工(性别、年龄范围、姓名长度);3)按性别统计60岁以下员工数量;4)查询35岁以下员工并按年龄和入职时间排序;5)获取20-40岁男性员工前5条记录并排序。每条语句详细解析了语法结构、执行逻辑、业务场景和使用注意事项,重点说明了IN、BETWEEN、LIKE等运算符以及GROUP BY、ORDER BY、LIMIT等关键字的用法规则,为数据库查询操作提供了实用指导。
代码:
-- SELECT * FROM tb_user WHERE age IN(20,21,22,23)
-- SELECT * FROM tb_user WHERE sex='男' AND age BETWEEN 20 and 40 AND name LIKE '___';
-- SELECT sex, COUNT(*) FROM tb_user where age<60 GROUP BY sex
-- SELECT name, age FROM tb_user WHERE age<=35 ORDER BY age ,entry_time DESC
SELECT * FROM tb_user WHERE sex='男' AND age BETWEEN 20 and 40 ORDER BY age,entry_time LIMIT 0,5
以下是对这 5 条 MySQL 查询语句的详细解析,从语法结构、执行逻辑、业务场景到注意事项进行全面说明,帮助深入理解每条语句的功能与原理:
一、SELECT * FROM tb_user WHERE age IN(20,21,22,23)
1. 语法结构拆解
-
SELECT *
:表示查询表中所有字段(如id
、name
、sex
、age
、entry_time
等),*
是通配符,指代表结构定义的全部列。 -
FROM tb_user
:指定查询的数据来源为tb_user
表(用户表),tb_user
是表名,需确保该表在当前数据库中存在且名称正确。 -
WHERE age IN(20,21,22,23)
:筛选条件,age
是字段名,IN(...)
是比较运算符,括号内为一组离散值,用于匹配age
等于其中任意一个值的记录。
2. 执行逻辑与等价转换
-
该语句的执行逻辑是:从
tb_user
表中,找出所有 “年龄为 20 岁、21 岁、22 岁或 23 岁” 的用户,返回这些用户的完整信息。 -
等价于使用
OR
连接的多条件查询:sql
SELECT * FROM tb_user WHERE age=20 OR age=21 OR age=22 OR age=23;
但IN
的写法更简洁,尤其当目标值数量较多时(如 10 个以上),可显著减少代码冗余,提高可读性。
3. 业务场景与使用注意
-
典型场景:适用于需要筛选 “年龄属于特定几个离散值” 的用户,例如:
-
统计公司中 20-23 岁的年轻员工数量;
-
筛选某平台中这几个年龄段的用户参与针对性活动(如校园招聘宣传)。
-
-
注意事项:
-
IN
括号内的值必须与age
字段的类型一致(此处age
为数值型,直接写数字;若为字符串型需加单引号,如IN('20','21')
)。 -
若括号内包含
NULL
,IN
不会匹配NULL
值(需用IS NULL
单独判断)。 -
当值列表过长时(如超过 1000 个),可能影响查询性能,建议改用
JOIN
关联表查询。
-
二、SELECT * FROM tb_user WHERE sex='男' AND age BETWEEN 20 and 40 AND name LIKE '___'
1. 语法结构拆解
-
SELECT *
:查询所有字段,返回符合条件的用户完整信息。 -
FROM tb_user
:数据来源为tb_user
表。 -
WHERE
子句包含三个并列条件,用AND
连接,表示 “同时满足”:-
sex='男'
:sex
字段值为 “男”(字符串需用单引号包裹,区分大小写取决于数据库配置)。 -
age BETWEEN 20 and 40
:age
字段值在 20 到 40 之间,包含 20 和 40(等价于age >=20 AND age <=40
)。 -
name LIKE '___'
:name
字段值为 3 个字符(_
是通配符,匹配单个任意字符,三个_
严格匹配 3 个字符长度)。
-
2. 执行逻辑与条件优先级
-
执行逻辑:从
tb_user
表中,筛选出 “性别为男、年龄 20-40 岁(含)、姓名为 3 个字” 的用户,返回其所有信息。 -
条件优先级:
AND
连接的多个条件无优先级差异,按顺序依次判断,只有全部满足时才会被选中。例如:-
若某用户性别为男、年龄 30 岁,但姓名是 2 个字(如 “张三”),会被
name LIKE '___'
排除; -
若姓名是 3 个字、年龄 35 岁,但性别为女,会被
sex='男'
排除。
-
3. 业务场景与细节说明
-
典型场景:用于精准定位符合多重条件的用户,例如:
-
企业 HR 筛选 “3 字姓名、20-40 岁男性员工” 参加特定培训;
-
电商平台针对 “3 字姓名的中青年男性用户” 推送相关商品。
-
-
细节说明:
-
BETWEEN ... AND ...
的边界值包含关系:若用户年龄刚好为 20 或 40,会被包含在内(如需排除边界,需用age >20 AND age <40
)。 -
LIKE '___'
的字符匹配规则:仅匹配长度为 3 的字符串,如 “张三丰”“李四军” 会被选中,而 “张小三”(4 字)、“王二”(2 字)会被排除。对于中文姓名,每个汉字占 1 个字符位置,符合中文命名习惯。 -
字符串大小写:若数据库 collation 为区分大小写(如
utf8_bin
),'男'
与'男'
(全角 / 半角差异)会被视为不同值,需确保条件值与表中数据格式一致。
-
三、SELECT sex, COUNT(*) FROM tb_user where age<60 GROUP BY sex
1. 语法结构拆解
-
SELECT sex, COUNT(*)
:查询结果包含两列,sex
(性别)和COUNT(*)
(统计数量)。COUNT(*)
是聚合函数,用于计算每组的记录条数。 -
FROM tb_user
:数据来源为tb_user
表。 -
WHERE age<60
:筛选条件,仅处理 “年龄小于 60 岁” 的记录(排除 60 岁及以上的用户)。 -
GROUP BY sex
:分组条件,将筛选后的记录按sex
字段分组(通常分为 “男”“女” 两组,若存在其他性别值则对应分组)。
2. 执行逻辑与分组统计原理
-
执行逻辑:
-
先通过
WHERE age<60
筛选出所有年龄小于 60 岁的用户; -
将这些用户按
sex
字段分组(如 “男” 一组,“女” 一组); -
对每个分组使用
COUNT(*)
计算该组的记录数,最终返回 “性别 + 对应人数” 的统计结果。
-
-
示例结果(假设数据):
sex
COUNT(*)
男
120
女
80
表示 “年龄小于 60 岁的用户中,男性 120 人,女性 80 人”。
3. 业务场景与聚合函数说明
-
典型场景:用于数据统计分析,例如:
-
企业统计 “非退休年龄(<60 岁)员工的性别分布”;
-
平台分析 “60 岁以下用户的性别比例”,辅助产品定位。
-
-
聚合函数与分组规则:
-
COUNT(*)
:统计组内所有记录的数量(包括NULL
值字段的记录);若需排除NULL
,可使用COUNT(字段名)
(如COUNT(id)
,统计非NULL
的id
数量)。 -
GROUP BY
的核心规则:SELECT
后除聚合函数外的字段,必须出现在GROUP BY
中(否则会报错或返回不可预期的结果)。此处sex
在GROUP BY
中,符合规则。 -
若需对分组结果再次筛选,需用
HAVING
(而非WHERE
),例如 “统计性别分组中人数超过 100 的组”:sql
SELECT sex, COUNT(*) FROM tb_user WHERE age<60 GROUP BY sex HAVING COUNT(*)>100;
-
四、SELECT name, age FROM tb_user WHERE age<=35 ORDER BY age, entry_time DESC
1. 语法结构拆解
-
SELECT name, age
:仅查询name
(姓名)和age
(年龄)两个字段,减少不必要的数据传输。 -
FROM tb_user
:数据来源为tb_user
表。 -
WHERE age<=35
:筛选条件,仅处理 “年龄小于等于 35 岁” 的用户。 -
ORDER BY age, entry_time DESC
:排序条件,age
为第一排序字段(默认升序ASC
),entry_time
(入职时间)为第二排序字段(DESC
表示降序)。
2. 执行逻辑与排序规则
-
执行逻辑:
-
筛选出所有年龄≤35 岁的用户;
-
先按
age
升序排序(年龄从小到大); -
对于年龄相同的用户,再按
entry_time
降序排序(入职时间从晚到早); -
最终返回这些用户的
name
和age
字段。
-
-
示例排序结果(假设数据):
name
age
entry_time
张三
25
2023-05-01
(25 岁中入职最晚)
李四
25
2023-04-15
(25 岁中入职较早)
王五
30
2022-12-01
(30 岁中入职最晚)
可见,25 岁用户排在 30 岁之前(
age
升序),同年龄中后入职的排在前(entry_time
降序)。
3. 业务场景与排序细节
-
典型场景:用于按特定维度排序展示数据,例如:
-
企业 HR 查看 “35 岁及以下员工的姓名和年龄”,按年龄从小到大排列,同年龄者晚入职的优先展示(便于关注新员工);
-
教育平台展示 “35 岁以下学员” 的基本信息,按年龄排序便于分析年轻用户分布。
-
-
排序细节:
-
多字段排序:
ORDER BY
后可跟多个字段,优先级从左到右依次降低(先按第一个字段排,相同再按第二个,以此类推)。 -
升序与降序:默认
ASC
(升序),可省略;DESC
(降序)需显式指定。例如ORDER BY age DESC, entry_time
表示 “先按年龄从大到小,同年龄按入职时间从小到大”。 -
NULL
值处理:若entry_time
存在NULL
(未填写入职时间),NULL
会被视为最小值,在DESC
排序中会排在最后(所有有值的记录之后)。
-
五、SELECT * FROM tb_user WHERE sex='男' AND age BETWEEN 20 and 40 ORDER BY age, entry_time LIMIT 0,5
1. 语法结构拆解
-
SELECT *
:查询所有字段,返回符合条件的用户完整信息。 -
FROM tb_user
:数据来源为tb_user
表。 -
WHERE sex='男' AND age BETWEEN 20 and 40
:筛选条件,“性别为男且年龄 20-40 岁(含)”。 -
ORDER BY age, entry_time
:排序条件,先按age
升序(默认),同年龄按entry_time
升序(默认,入职时间从早到晚)。 -
LIMIT 0,5
:限制返回结果,0
表示起始位置(从第 1 条开始,索引从 0 起),5
表示返回 5 条记录。
2. 执行逻辑与限制返回原理
-
执行逻辑:
-
筛选出 “男性、20-40 岁” 的用户;
-
按 “年龄从小到大,同年龄入职时间从早到晚” 排序;
-
从排序后的结果中,取前 5 条记录返回。
-
-
示例结果:若符合条件的用户有 20 人,排序后取前 5 条,即年龄最小的 5 人(若年龄相同,取入职最早的)。
3. 业务场景与LIMIT
用法
-
典型场景:用于分页查询或取 “Top N” 数据,例如:
-
企业筛选 “20-40 岁男性员工”,按年龄排序后取前 5 人参加项目;
-
电商平台展示 “符合条件的前 5 名用户” 信息,用于列表页第一页展示。
-
-
LIMIT
用法细节:-
语法格式:
LIMIT 起始索引, 记录数
,起始索引从 0 开始(LIMIT 0,5
等价于LIMIT 5
)。 -
分页应用:若需查询第 2 页(每页 5 条),可写
LIMIT 5,5
(从第 6 条开始,取 5 条)。 -
与
ORDER BY
的配合:LIMIT
必须放在ORDER BY
之后,否则会先截取数据再排序,导致结果错误(如先取 5 条再排序,可能漏掉实际应排在前面的记录)。 -
性能优化:对于大表查询,
LIMIT
配合ORDER BY
时,建议在排序字段上建立索引(如age
和entry_time
的联合索引),提高查询速度。
-
总结
这 5 条语句覆盖了 SQL 中条件筛选(WHERE
)、离散值匹配(IN
)、范围查询(BETWEEN
)、模糊匹配(LIKE
)、分组统计(GROUP BY
+ 聚合函数)、排序(ORDER BY
)、结果限制(LIMIT
)等核心操作,是数据查询与分析的基础工具。
每条语句的设计都遵循 “先筛选、再处理(分组 / 排序)、最后返回结果” 的逻辑,且语法顺序严格对应执行流程(WHERE
→GROUP BY
→ORDER BY
→LIMIT
)。实际使用时,需根据表结构、数据分布及业务需求调整字段名和条件,同时注意索引优化以提升查询效率。理解这些语句的原理,有助于构建更复杂的查询(如多表关联、子查询),应对更灵活的数据分析场景。
总结:
本文解析了5条MySQL查询语句,涵盖常见数据查询需求:1)查询指定年龄段的员工信息;2)筛选符合多重条件的员工(性别、年龄范围、姓名长度);3)按性别统计60岁以下员工数量;4)查询35岁以下员工并按年龄和入职时间排序;5)获取20-40岁男性员工前5条记录并排序。每条语句详细解析了语法结构、执行逻辑、业务场景和使用注意事项,重点说明了IN、BETWEEN、LIKE等运算符以及GROUP BY、ORDER BY、LIMIT等关键字的用法规则,为数据库查询操作提供了实用指导。