MySQL DQL数据查询语言全解:从基础到高阶操作

Owen
Owen
发布时间:2026-10-16 | 5人浏览过
原创

本文深入解析MySQL数据查询语言(DQL)的核心语法,涵盖从基础SELECT、别名处理、去重,到高级的聚合函数、GROUP BY分组、HAVING过滤、LIMIT分页及REGEXP正则匹配。结合具体建表与插入数据的实战案例,厘清SQL语句书写顺序与执行顺序的逻辑关系,帮助开发者构建规范的查询思维,高效完成各类数据检索需求。

DQL核心概念与基础查询

DQL(Data Query Language)即数据查询语言,是SQL中应用最频繁的部分,主要用于从数据库表中提取数据。基础操作包括选择特定列、使用别名简化结果展示以及去除重复记录。

第1步:创建测试环境与基础SELECT

目的:建立标准化的测试数据表,用于后续所有查询示例。

操作:

  1. 创建并切换数据库:

    CREATE DATABASE IF NOT EXISTS mydb2;
    USE mydb2;
  2. 创建商品表 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)
    );
  3. 插入测试数据:

    INSERT INTO product(pid,pname,price,category_id)
    VALUES (null,'海尔洗衣机',5000,'c001'),
           (null,'海尔空调',3000,'c001'),
           (null,'格力空调',5000,'c001'),
           (null,'九阳电饭煲',5000,'c001');
  4. 执行基础查询:

    -- 查询所有字段
    SELECT * FROM product;
    -- 查询指定字段
    SELECT pname, price FROM product;

第2步:别名管理与数据去重

目的:优化查询输出格式并清理冗余数据。

操作:

  1. 使用别名(AS):可为表或列定义别名,便于理解。关键字 AS 可省略。

    -- 表别名
    SELECT * FROM product as p;
    -- 列别名(建议使用单引号包裹中文别名)
    SELECT pname AS '商品名', price AS '商品价格' FROM product;
  2. 去除重复值(DISTINCT):

    -- 去除某一列重复的价格
    SELECT DISTINCT price FROM product;
    -- 去除整行完全重复的记录
    SELECT DISTINCT * FROM product;
  3. 运算查询:在查询中直接进行算术运算,并赋予新别名。

    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的学习重点不在于死记硬背语法,而在于掌握书写顺序与执行顺序的差异,以及根据需求拆解问题的逻辑能力。

  1. 书写顺序:SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT。
  2. 执行顺序:FROM → WHERE → GROUP BY → COUNT/HAVING → SELECT → ORDER BY → LIMIT。
  3. 建议策略:遇到复杂查询时,先列出需要的表、条件、分组和排序规则,再按执行顺序组装SQL代码,最后再进行简写优化。

以上就是MySQL DQL数据查询语言操作的详细内容,更多关于MySQL SQL查询技巧的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表