MySQL常用查询语句23种实用场景汇总
本文深入解析MySQL数据库开发中高频出现的23种典型查询场景。从基础的数值、字符串、日期等数据类型筛选出发,详细讲解利用通配符进行模糊匹配的逻辑;重点梳理了基于LIMIT的分页机制以及BETWEEN的时间范围查询;进一步涵盖了去重处理(DISTINCT)、空值判断及非空过滤;最后通过实例演示如何运用GROUP BY结合SUM、AVG等聚合函数实现单列、多列乃至多表维度的复杂数据统计与降序排列。
数值、字符串与日期的基础查询
在业务数据库中,获取特定类型的数据是最基础的操作。根据不同的字段属性,需采用不同的匹配策略。
第1步:查询数值型区间数据
目的:获取满足大小比较条件的记录。
操作:使用关系运算符对整型或浮点数字段进行筛选。支持的谓词包括 >, =, <, <>, !=, >=, <= 等。
SELECT * FROM tb_name WHERE sum > 100;
第2步:查询字符串匹配数据
目的:查找包含特定关键字或符合特定前缀/后缀模式的文本记录。
操作:使用 = 进行完全匹配,使用 LIKE 配合通配符进行模式匹配。其中 % 代表零个或多个任意字符。
-- 精确匹配
SELECT * FROM tb_stu WHERE sname = '小刘';
-- 前缀匹配:姓刘的人
SELECT * FROM tb_stu WHERE sname LIKE '刘%';
-- 后缀匹配:职业是程序员
SELECT * FROM tb_stu WHERE sname LIKE '%程序员';
-- 包含匹配:技能含PHP
SELECT * FROM tb_stu WHERE sname LIKE '%PHP%';
第3步:查询日期型数据
目的:按具体日期获取记录。
注意:不同数据库对日期的书写格式要求存在差异,以下以MySQL为例:
- MySQL: 使用单引号包裹标准日期格式
'YYYY-MM-DD'。 - Access: 使用井号包裹日期
#YYYY-MM-DD#。
-- MySQL写法
SELECT * FROM tb_name WHERE birthday = '2011-04-08';
第4步:查询逻辑布尔型数据
目的:根据标记位(如T/F)筛选状态。
SELECT * FROM tb_name WHERE type = 'T'
UNION ALL
SELECT * FROM tb_name WHERE type = 'F';
配合逻辑运算符 AND, OR, NOT 可构建复杂的判断条件。
变量传入与高级分页限制
在实际开发中,常需动态传递参数并控制返回结果集的大小。
第5步:利用变量查询条件数据
目的:在应用程序中根据用户输入生成SQL。
-- 数值型变量查询示例
SELECT * FROM tb_name WHERE id = '$_POST[text]';
-- 字符串模糊匹配变量示例
SELECT * FROM tb_name WHERE name LIKE '%$_POST[name]%';
风险提醒:上述代码仅为语法展示。实际生产环境中严禁直接将用户输入拼接至SQL字符串,必须使用预处理语句(Prepared Statements)以防止SQL注入攻击。
第6步:控制返回记录数量(Limit用法)
目的:实现分页显示或限制结果集大小。
语法:LIMIT offset, count,其中 offset 为起始偏移量(默认从0开始),count 为最大返回行数。
-- 获取前 N 条记录
SELECT * FROM tb_name LIMIT 0, $N;
-- 获取后 N 条记录(先按ID升序排列再取最后N个)
SELECT * FROM tb_stu ORDER BY id ASC LIMIT $n;
-- 从指定位置开始获取 N 条记录
SELECT * FROM tb_stu ORDER BY id ASC LIMIT $_POST[begin], $n;
时间范围、去重与非空筛选
第7步:查询指定时间段或范围数据
目的:筛选落在某一连续区间内的数据。
-- 查询年龄在0到18岁之间的人员
SELECT * FROM tb_stu WHERE age BETWEEN 0 AND 18;
注:BETWEEN ... AND ... 等同于 >= initial_value AND <= end_value。
第8步:去除重复记录
目的:在统计前去除冗余数据。
-- 仅显示不重复的字段值
SELECT DISTINCT 字段名 FROM 表名 WHERE 查询条件;
注意:DISTINCT 作用于后面的所有列组合。若只需针对单列去重且该列为主键,效果显著;若未加WHERE条件,则会对全表进行去重计算。
第9步:非空与空值查询
目的:筛选有效数据或缺失数据。
-- 查询地址不为空的记录
SELECT * FROM tb_name WHERE address <> '' ORDER BY addtime DESC;
-- 查询某字段为空(NULL)的记录
SELECT * FROM table_name WHERE column_name IS NULL;
-- 查询某字段为非空的记录
SELECT * FROM table_name WHERE column_name IS NOT NULL;
第10步:按月查询统计数据
目的:按年月日维度分析历史趋势。
利用内置函数提取日期分量:
YEAR(data): 返回年份MONTH(data): 返回月份DAY(data): 返回日期
-- 查询指定月份的记录
SELECT * FROM tb_stu WHERE MONTH(date) = '$_POST[date]' ORDER BY date;
数据排序与聚合统计核心逻辑
第11步:数据升降序排列
目的:调整输出顺序以便直观阅读。
-- 默认ASC升序
SELECT 字段名 FROM tb_stu WHERE 条件 ORDER BY 字段 ASC;
-- 显式DESC降序
SELECT 字段名 FROM tb_stu WHERE 条件 ORDER BY 字段 DESC;
支持多字段排序:ORDER BY 字段1 ASC, 字段2 DESC,先按字段1排序,若相同则按字段2排序。
第12步:统计结果的前N条记录
目的:找出某个指标(如总分)最高或最低的用户。
-- 计算总分并降序排列,取前N名
SELECT *, (yw+sx+wy) AS total
FROM tb_score
ORDER BY total DESC
LIMIT 0, $num;
第13步:单列或多列分组统计
目的:对数据进行归类汇总,常用于报表生成。
核心原则:GROUP BY 通常放在 ORDER BY 之前执行。
-- 单列分组:统计每个pid下的总金额
SELECT pid, SUM(price) AS sumprice
FROM tb_price
GROUP BY pid
ORDER BY sumprice DESC;
-- 多列运算统计:计算总价(单价*数量)
SELECT id, name, SUM(price * num) AS sumprice
FROM tb_price
GROUP BY pid
ORDER BY sumprice DESC;
第14步:多表联合分组统计
目的:跨表获取更丰富的维度信息进行统计。
-- 连接两表并按b表的type字段分组求平均价格
SELECT a.name, AVG(a.price), b.name, AVG(b.price)
FROM tb_demo058 AS a, tb_demo058_1 AS b
WHERE a.id = b.id
GROUP BY b.type;
第15步:处理重复记录的显示与计数
目的:查看表中哪些记录出现了多次及其频次。
虽然原文提供了部分片段,但完整逻辑应如下:
SELECT name, COUNT(*) as count_num
FROM tb_stu
GROUP BY name
HAVING count_num > 1;
逻辑组合与否定查询
通过逻辑运算符扩展查询边界,排除不需要关注的数据。
- NOT BETWEEN ... AND ...:查询不在起始值和终止值之间的数据。
- NOT IN:排除指定列表中的数据项。例如:查询不属于某个类别的产品。
以上就是MySQL常用查询语句23种实用场景的详细内容,更多关于SQL进阶技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













