MySQL DQL数据查询语言全解:从基础到高阶操作
本文深入解析MySQL数据查询语言(DQL)的核心语法,涵盖从基础SELECT、别名处理、去重,到高级的聚合函数、GROUP BY分组、HAVING过滤、LIMIT分页及REGEXP正则匹配。结合具体建表与插入数据的实战案例,厘清SQL语句书写顺序与执行顺序的逻辑关系,帮助开发者构建规范的查询思维,高效完成各类数据检索需求。
DQL核心概念与基础查询
DQL(Data Query Language)即数据查询语言,是SQL中应用最频繁的部分,主要用于从数据库表中提取数据。基础操作包括选择特定列、使用别名简化结果展示以及去除重复记录。
第1步:创建测试环境与基础SELECT
目的:建立标准化的测试数据表,用于后续所有查询示例。
操作:
-
创建并切换数据库:
CREATE DATABASE IF NOT EXISTS mydb2; USE mydb2; -
创建商品表
product,包含ID、名称、价格及分类ID:CREATE TABLE IF NOT EXISTS product( pid int PRIMARY KEY auto_increment, pname varchar(20) not null, price double, category_id varchar(20) ); -
插入测试数据:
INSERT INTO product(pid,pname,price,category_id) VALUES (null,'海尔洗衣机',5000,'c001'), (null,'海尔空调',3000,'c001'), (null,'格力空调',5000,'c001'), (null,'九阳电饭煲',5000,'c001'); -
执行基础查询:
-- 查询所有字段 SELECT * FROM product; -- 查询指定字段 SELECT pname, price FROM product;
第2步:别名管理与数据去重
目的:优化查询输出格式并清理冗余数据。
操作:
-
使用别名(AS):可为表或列定义别名,便于理解。关键字
AS可省略。-- 表别名 SELECT * FROM product as p; -- 列别名(建议使用单引号包裹中文别名) SELECT pname AS '商品名', price AS '商品价格' FROM product; -
去除重复值(DISTINCT):
-- 去除某一列重复的价格 SELECT DISTINCT price FROM product; -- 去除整行完全重复的记录 SELECT DISTINCT * FROM product; -
运算查询:在查询中直接进行算术运算,并赋予新别名。
SELECT pname, price + 10 AS now_price FROM product;
条件筛选与运算符应用
DQL的强大之处在于通过 WHERE 子句对数据进行精确过滤。需熟练掌握比较运算符、逻辑运算符及模糊匹配。
第3步:常用比较与逻辑筛选
目的:根据特定条件缩小查询范围。
操作:
-- 相等判断
SELECT * FROM product WHERE pname = '海尔洗衣机';
-- 不等于判断(<> 或 !=)
SELECT * FROM product WHERE price <> 3000;
-- 范围判断(闭区间)
SELECT * FROM product WHERE price BETWEEN 3000 AND 5000;
-- 集合判断
SELECT * FROM product WHERE price IN(3000, 4000);
-- NULL值判断(不能使用=NULL)
SELECT * FROM product WHERE category_id IS NOT NULL;
第4步:模糊查询与字符串模式
目的:使用 LIKE 进行部分字符匹配。
%:代表任意长度的任意字符。_:代表单个任意字符。
操作:
-- 以“洗衣机”结尾
SELECT * FROM product WHERE pname LIKE '%洗衣机';
-- “洗衣机”前必须有两个字符
SELECT * FROM product WHERE pname LIKE '__洗衣机%';
-- 第二个字母不是A(否定写法)
SELECT ename FROM emp WHERE ename NOT LIKE '_A%';
数据排序与聚合统计
当需要查看有序数据或进行统计分析时,ORDER BY 和聚合函数是必不可少的工具。
第5步:多字段排序
目的:按优先级对结果集进行升序(ASC)或降序(DESC)排列。
操作:
-- 默认升序
SELECT * FROM product ORDER BY price;
-- 降序排序
SELECT * FROM product ORDER BY price DESC;
-- 多字段排序:先按价格降序,价格相同则按名称升序
SELECT * FROM product ORDER BY price DESC, pname ASC;
第6步:聚合函数统计
目的:对列数据进行汇总计算,忽略 NULL 值。
常见函数:COUNT(), SUM(), AVG(), MAX(), MIN()。
操作:
-- 统计总行数(推荐统计主键或*)
SELECT COUNT(pid) FROM product;
-- 统计价格总和
SELECT SUM(price) FROM product;
-- 注意:聚合函数通常与 GROUP BY 配合使用
-- 查询价格大于3000的商品数量
SELECT COUNT(pid) FROM product WHERE price > 3000;
分组统计与Having筛选
GROUP BY 将数据划分为组,HAVING 用于对分组后的结果进行二次筛选,两者结合是实现复杂报表的关键。
第7步:分组与后处理筛选
目的:按类别统计数量,并筛选出满足条件的类别。
逻辑顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。
操作:
-- 1. 统计各分类的商品个数
SELECT category_id, COUNT(pid) FROM product GROUP BY category_id;
-- 2. 筛选出商品数大于等于3的分类
SELECT category_id, COUNT(pid) FROM product
GROUP BY category_id
HAVING COUNT(pid) >= 3;
注意:WHERE 无法直接作用于聚合函数的结果,必须使用 HAVING。
分页查询与跨表数据导入
第8步:LIMIT分页控制
目的:限制返回的结果集大小,用于前端分页显示。
参数说明:LIMIT offset, length。offset 为起始索引(从0开始),length 为返回条数。
-- 取前5条
SELECT * FROM product LIMIT 5; -- 等价于 LIMIT 0, 5
-- 从第3条开始(索引2),取2条
SELECT * FROM product LIMIT 3, 2;
第9步:跨表数据导入(INSERT INTO ... SELECT)
目的:将一个查询结果直接存入另一张已存在的表中。
-- 1. 创建目标表
CREATE TABLE product2(pname VARCHAR(20), price DOUBLE);
-- 2. 将product表中c001类商品导入product2
INSERT INTO product2(pname, price)
SELECT pname, price FROM product WHERE category_id = 'c001';
-- 3. 结构化统计导入
CREATE TABLE product3(category_id VARCHAR(20), product_count INT);
INSERT INTO product3
SELECT category_id, COUNT(*) FROM product GROUP BY category_id;
复杂逻辑实战与正则表达式
第10步:复杂条件与聚合练习
以下示例演示如何在实际业务场景中组合上述知识点。
学生成绩分析示例:
-- 1. 计算总分(不同列相加)
SELECT name, (chinese+english+math) AS total_score FROM student;
-- 2. 筛选总分大于200的学生(注意:WHERE中不能用别名total_score)
SELECT *, (chinese+english+math) AS total_score
FROM student
WHERE (chinese+english+math) > 200;
-- 3. 姓李且数学成绩非89-91分的学生
SELECT name, math FROM student
WHERE name LIKE '李%' AND math NOT IN(89, 90, 91);
员工薪资分析示例:
-- 1. 查询姓名第二位不是'A'且薪水大于1000的员工,按年薪降序
-- IFNULL(comm, 0) 处理奖金可能为NULL的情况
SELECT * FROM emp
WHERE ename NOT LIKE '_A%' && sal > 1000
ORDER BY 12 * sal + IFNULL(comm, 0) DESC;
-- 2. 各部门平均薪水与最高薪水的联合查询
SELECT deptno, AVG(sal) AS avg_sal, MAX(sal) AS max_sal
FROM emp GROUP BY deptno;
-- 3. 多字段分组:每个部门每个岗位的最高薪
SELECT deptno, job, MAX(sal) FROM emp GROUP BY deptno, job;
第11步:正则表达式查询(REGEXP)
当通配符无法满足复杂模式匹配时,可使用 MySQL 的 REGEXP 关键字。
常见符号含义:
^:开头;$:结尾。.:除换行符外的任意单个字符。[...]:集合内的任一字符;[^...]:非集合字符。*:0次或多次;+:1次或多次;?:0次或1次。{n}/{n,}/{n,m}:指定次数范围。
操作示例:
-- 匹配以“海”开头的商品名
SELECT * FROM product WHERE pname REGEXP '^海';
-- 匹配包含0个或多个'a'的模式
SELECT 'stab' REGEXP '.ta*b'; -- 匹配
SELECT 'stb' REGEXP '.ta*b'; -- 匹配
-- 精确次数匹配:u出现恰好4次
SELECT 'auuuuc' REGEXP 'au{4}c';
总结:SQL思维养成
DQL的学习重点不在于死记硬背语法,而在于掌握书写顺序与执行顺序的差异,以及根据需求拆解问题的逻辑能力。
- 书写顺序:SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT。
- 执行顺序:FROM → WHERE → GROUP BY → COUNT/HAVING → SELECT → ORDER BY → LIMIT。
- 建议策略:遇到复杂查询时,先列出需要的表、条件、分组和排序规则,再按执行顺序组装SQL代码,最后再进行简写优化。
以上就是MySQL DQL数据查询语言操作的详细内容,更多关于MySQL SQL查询技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













