MySQL DQL查询语句详解:从基础到实战
本文深入解析MySQL DQL(数据查询语言)的核心语法与实战应用,涵盖简单查询、条件过滤、排序、聚合统计、分组筛选及分页等关键操作,旨在帮助开发者高效掌握SELECT语句,实现精准的数据检索与分析。
DQL简介与核心逻辑
DQL(Data Query Language)即数据查询语言,在MySQL中主要体现为 SELECT 语句。它是数据库中最常用的操作,用于从表中检索满足特定条件的数据。理解DQL的执行顺序至关重要,它决定了如何从原始数据中提取、过滤和展示最终结果。
第1步:理解SQL语法执行顺序
目的:明确查询语句各部分的逻辑执行先后,避免语法错误或逻辑误解。
说明:虽然我们在编写SQL时通常遵循“SELECT ... FROM ... WHERE ...”的顺序,但数据库引擎的实际处理逻辑略有不同。完整的查询结构通常包含以下关键字段:
SELECT:指定返回的列或计算表达式。可使用ALL(默认)返回所有行,或使用DISTINCT去除重复值。FROM:指定数据来源表,可支持多表连接(JOIN)并设置别名。WHERE:在分组前对行进行条件过滤。GROUP BY:将数据按指定列分组,以便进行聚合运算。HAVING:在分组后对分组结果进行条件筛选。ORDER BY:对最终结果集进行排序,支持升序(ASC)或降序(DESC)。LIMIT:限制返回的记录数量,常用于分页。
环境准备与数据初始化
为了演示后续的查询操作,我们需要先构建一个测试数据库及数据表。以下是创建数据库 test 和数据表 data 并插入示例数据的完整流程。
第2步:创建数据库与测试表
入口:MySQL命令行客户端或图形化管理工具(如Navicat、MySQL Workbench)。
操作:执行以下SQL脚本创建表结构并填充初始数据。
create database if not exists test;
use test;
create table if not exists data(
id tinyint primary key auto_increment,
price double NOT null,
name varchar(20) not null,
type varchar(20) not null
);
insert into data values
(null,900,'洗衣机','b'),
(null,1900,'冰箱','b'),
(null,2900,'空调','b'),
(null,3900,'电视','b'),
(null,150,'衣服','c'),
(null,180,'裤子','c'),
(null,200,'鞋子','c'),
(null,188,'洗面奶','a'),
(null,188,'洗发水','a'),
(null,199,'洗衣液','a'),
(null,88,'沐浴露','a'),
(null,5,'泡面','d'),
(null,15,'饼干','d'),
(null,30,'咖啡','d');
DQL核心操作详解
第3步:基础简单查询
目的:掌握基本的数据提取方式,包括全表查询、字段选择及别名使用。
操作:
- 查询所有字段:直接使用
select * from data; - 查询特定字段:如
select name,price from data; - 使用表别名:在复杂查询中简化代码,如
select d.name,d.price from data as d; - 去重查询:使用
DISTINCT排除重复值,例如select distinct price from data; - 表达式计算:可在查询中进行数学运算,如价格加100:
select name,price +100 newprice from data;
第4步:运算符的应用
目的:利用算术运算符对数据进行实时计算。
操作:以算术乘法为例,若需查询当前价格的1.5倍作为参考价:
select name,price *1.5 newprice from data;
第5步:条件查询(Where子句)
目的:根据特定条件筛选符合条件的行数据。
重要参数:常见的比较运算符包括 =, <>, >, < 等,以及逻辑运算符 AND, OR, NOT。
- 精确匹配:
select * from data where name='洗衣机'; - 范围查询: 使用
BETWEEN ... AND ...,如查询价格在200到1000之间的商品:select * from data where price between 200 and 1000; - 集合匹配: 使用
IN判断值是否在列表中,如select * from data where price in(188,900);,等价于使用OR连接多个条件。 - 模糊匹配: 使用
LIKE配合通配符。%代表任意多个字符,_代表单个字符。例如查询名称中包含“衣”的商品:select * from data where name like '%衣%'; - 空值判断: 必须使用
IS NULL或IS NOT NULL,不能使用= NULL。例:select * from data where id is null;
注:当NULL参与大小比较时,结果不确定,最大值和最小值均可能为NULL,需谨慎处理。
第6步:排序查询(Order By)
目的:对查询结果按照指定列进行升序或降序排列。
操作:
- 默认升序:
select * from data order by price; - 指定降序:
select * from data order by price desc; - 多字段排序:先按价格排序,价格相同时再按ID排序:
select * from data order by price,id;
第7步:聚合函数查询
目的:对一组数据进行统计计算,返回单个汇总值。
常用函数:
COUNT(*):统计总行数(包括NULL值);COUNT(id):统计指定非空列的行数。SUM():求和,如select sum(price) from data;MAX()/MIN():最大值/最小值,可同时查询多个字段的极值。AVG():平均值。
示例:查询类型为'c'的商品平均价格:select avg(price) from data where type='c';
第8步:分组查询(Group By)
目的:将数据按某一列或多列的值进行分组,常配合聚合函数使用。
操作:按商品类型(type)分组,统计每种类型的商品数量和总价:
select type,count(id) from data group by type; select type,sum(price) from data group by type;
第9步:分组后的条件筛选(Having)
目的:在分组完成后,对分组结果进行二次过滤。注意 HAVING 与 WHERE 的区别:WHERE 在分组前过滤行,HAVING 在分组后过滤组。
操作:查询商品数量为4种以上的类型,并按类型排序:
select type,count(id) count from data group by type having count=4 order by type;
第10步:分页查询(Limit)
目的:控制每次查询返回的记录数量,实现分页显示,减少服务器负载并提升前端加载速度。
语法:LIMIT [offset,] size。其中 offset 是起始索引(从0开始),size 是返回的记录数。
- 仅限制数量:
select * from data limit 5;(返回前5条) - 指定偏移量:从第4条记录开始(索引3),向后显示5条:
select * from data limit 3,5;
第11步:INSERT INTO SELECT 语句
目的:将一个查询的结果集直接插入到另一个表中,常用于数据备份或汇总统计。
操作:
1. 创建一个新表 data2 并拷贝 data 表的部分字段:
create table data2(name varchar(10),price double); insert into data2 select name,price from data;
2. 将分组统计结果存入 data3 表:
create table data3(type varchar(10),num int); insert into data3 select type,count(*) from data group by type order by count(*); select * from data3;
总结
DQL是MySQL数据操作的核心,熟练掌握SELECT语句的各个子句及其执行逻辑,能够显著提升数据检索效率。从简单的字段提取到复杂的分组统计与分页优化,合理运用这些技术可以满足绝大多数业务场景下的数据分析需求。
以上就是MySQL DQL查询操作的详细解析,更多关于MySQL数据库教程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













