MySQL DQL全面解析:从入门到精通

作者:渣渣盟日期:2026/8/27

在数据库的广阔天地中,MySQL 凭借其开源、高效、易用等特性,成为了众多开发者的首选。而在 MySQL 的众多功能中,数据查询语言(Data Query Language,简称 DQL)无疑是最为常用且强大的部分之一。通过 DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理。本文将深入探讨 MySQL DQL 的各个方面,帮助你全面掌握这一重要技能。

一、DQL 基础:SELECT 语句入门

DQL 的核心是 SELECT 语句,它的基本语法如下:

1SELECT column1, column2, ...
2FROM table_name;
3

其中,SELECT关键字指定要查询的列,FROM关键字指定数据来源的表。例如,假设有一个名为employees的表,包含employee_idfirst_namelast_namesalary等列,要查询所有员工的姓名和薪水,可以这样写:

1SELECT first_name, last_name, salary
2FROM employees;
3

如果要查询表中的所有列,可以使用通配符*

1SELECT *
2FROM employees;
3

不过,在实际应用中,尽量明确指定所需列,这样不仅可以提高查询效率,还能使代码更具可读性。

二、数据过滤:WHERE 子句的使用

在很多情况下,我们并不需要查询表中的所有数据,而是希望根据特定条件进行筛选。这时,就需要用到WHERE子句。WHERE子句用于在SELECT语句中添加条件,过滤出符合条件的行。其语法如下:

1SELECT column1, column2, ...
2
3FROM table_name
4
5WHERE condition;
6

condition是一个逻辑表达式,可以使用各种比较运算符(如=<><><=>=)、逻辑运算符(如ANDORNOT)以及其他函数和表达式。例如,要查询薪水大于 5000 的员工信息:

1SELECT *
2
3FROM employees
4
5WHERE salary > 5000;
6

要查询部门为 “销售部” 且薪水大于 8000 的员工:

1SELECT *
2
3FROM employees
4
5WHERE department = '销售部' AND salary > 8000;
6

WHERE子句还支持使用LIKE关键字进行模糊查询。LIKE通常与通配符一起使用,%表示任意字符序列(包括空字符序列),_表示任意单个字符。例如,要查询姓 “张” 的员工:

1SELECT *
2
3FROM employees
4
5WHERE first_name LIKE '张%';
6

查询名字中包含 “明” 字的员工:

1SELECT *
2
3FROM employees
4
5WHERE first_name LIKE '%明%';
6

三、结果排序:ORDER BY 子句

查询结果默认是无序的,但在实际应用中,我们常常需要对结果进行排序,以便更好地查看和分析数据。ORDER BY子句用于对查询结果进行排序,其语法如下:

1SELECT column1, column2, ...
2
3FROM table_name
4
5ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
6

ASC表示升序排列(默认),DESC表示降序排列。例如,要按照薪水从高到低查询员工信息:

1SELECT *
2
3FROM employees
4
5ORDER BY salary DESC;
6

如果要先按部门升序排序,在每个部门内再按薪水降序排序,可以这样写:

1SELECT *
2
3FROM employees
4
5ORDER BY department ASC, salary DESC;
6

四、聚合函数:统计数据的利器

聚合函数用于对一组数据进行计算,并返回一个单一的值。常见的聚合函数有COUNT(计数)、SUM(求和)、AVG(平均值)、MAX(最大值)和MIN(最小值)。这些函数在数据分析中非常有用。

  1. COUNT 函数:用于统计满足条件的行数。例如,要统计员工表中的员工总数:
1SELECT COUNT(*)
2
3FROM employees;
4

要统计薪水大于 6000 的员工人数:

1SELECT COUNT(*)
2
3FROM employees
4
5WHERE salary > 6000;
6
  1. SUM 函数:用于计算某一列的总和。例如,要计算所有员工的薪水总和:
1SELECT SUM(salary)
2
3FROM employees;
4
  1. AVG 函数:用于计算某一列的平均值。例如,要计算员工的平均薪水:
1SELECT AVG(salary)
2
3FROM employees;
4
  1. MAX 和 MIN 函数:分别用于获取某一列的最大值和最小值。例如,要获取最高薪水和最低薪水:
1SELECT MAX(salary), MIN(salary)
2
3FROM employees;
4

五、分组查询:GROUP BY 子句与 HAVING 子句

当我们需要对数据进行分组统计时,就需要用到GROUP BY子句。GROUP BY子句将查询结果按照指定的列进行分组,然后可以对每个组应用聚合函数。其语法如下:

1SELECT column1, aggregate_function(column2)
2
3FROM table_name
4
5GROUP BY column1;
6

例如,要按部门统计员工人数:

1SELECT department, COUNT(*)
2
3FROM employees
4
5GROUP BY department;
6

如果在分组后还需要对组进行过滤,就需要使用HAVING子句。HAVING子句的作用类似于WHERE子句,但WHERE子句用于对行进行过滤,而HAVING子句用于对组进行过滤。例如,要查询员工人数大于 5 的部门:

1SELECT department, COUNT(*)
2
3FROM employees
4
5GROUP BY department
6
7HAVING COUNT(*) > 5;
8

六、连接查询:整合多表数据

在实际的数据库应用中,数据往往分散在多个表中。连接查询允许我们从多个表中检索数据,并将它们组合在一起。常见的连接类型有内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN,MySQL 不直接支持,可通过LEFT JOINRIGHT JOIN联合实现)。

  1. 内连接(INNER JOIN):返回两个表中满足连接条件的所有行。其语法如下:
1SELECT column1, column2, ...
2
3FROM table1
4
5INNER JOIN table2
6
7ON table1.common_column = table2.common_column;
8

例如,假设有一个departments表,包含department_iddepartment_name列,要查询每个部门及其员工信息,可以使用内连接:

1SELECT employees.employee_id, employees.first_name, departments.department_name
2
3FROM employees
4
5INNER JOIN departments
6
7ON employees.department_id = departments.department_id;
8
  1. 左连接(LEFT JOIN):返回左表中的所有行以及右表中满足连接条件的行。如果右表中没有匹配的行,则结果集中相应列的值为NULL。语法如下:
1SELECT column1, column2, ...
2
3FROM table1
4
5LEFT JOIN table2
6
7ON table1.common_column = table2.common_column;
8

例如,要查询所有部门及其员工信息,即使某个部门没有员工,也要显示该部门信息,可以使用左连接:

1SELECT departments.department_name, employees.employee_id, employees.first_name
2
3FROM departments
4
5LEFT JOIN employees
6
7ON departments.department_id = employees.department_id;
8
  1. 右连接(RIGHT JOIN):与左连接相反,返回右表中的所有行以及左表中满足连接条件的行。语法如下:
1SELECT column1, column2, ...
2
3FROM table1
4
5RIGHT JOIN table2
6
7ON table1.common_column = table2.common_column;
8

在实际应用中,根据具体需求选择合适的连接类型非常重要,它直接影响到查询结果的准确性和完整性。

七、子查询:查询中的查询

子查询是指在一个查询语句中嵌套另一个查询语句。子查询可以嵌套在SELECTFROMWHERE等子句中,用于解决一些复杂的查询需求。例如,要查询薪水高于平均薪水的员工:

1SELECT *
2
3FROM employees
4
5WHERE salary > (SELECT AVG(salary) FROM employees);
6

在这个例子中,子查询(SELECT AVG(salary) FROM employees)先计算出平均薪水,然后主查询根据这个结果筛选出薪水高于平均薪水的员工。

子查询还可以用于多表关联的复杂查询场景。例如,假设有一个orders表记录订单信息,包含order_idcustomer_idorder_amount列,要查询购买金额最高的客户信息,可以这样写:

1SELECT *
2
3FROM customers
4
5WHERE customer_id = (SELECT customer_id
6
7                   FROM orders
8
9                   ORDER BY order_amount DESC
10
11                   LIMIT 1);
12

这里,子查询先找出购买金额最高的订单对应的客户 ID,然后主查询根据这个 ID 查询客户信息。

八、DQL 实战技巧与优化

  1. 使用索引:索引是提高查询性能的重要手段。在经常用于查询条件的列上创建索引,可以显著加快查询速度。例如,如果经常根据员工的employee_id进行查询,可以在employee_id列上创建索引:
1CREATE INDEX idx_employee_id ON employees(employee_id);
2

但要注意,索引并不是越多越好,过多的索引会增加数据插入、更新和删除的时间,因为数据库在更新数据时,还需要同时更新索引。

2. 避免全表扫描:尽量避免在查询中使用没有索引的列进行过滤条件,以免导致全表扫描。例如,如果employees表的email列没有索引,而查询语句为SELECT * FROM employees WHERE email = '``example@example.com``';,数据库就需要扫描整个表来查找匹配的行,这在数据量较大时会非常耗时。

3. 优化子查询:子查询虽然强大,但如果使用不当,可能会导致性能问题。在一些情况下,可以将子查询改写为连接查询,以提高性能。例如,前面提到的查询薪水高于平均薪水的员工的例子,也可以改写为连接查询:

1SELECT e1.*
2
3FROM employees e1
4
5JOIN (SELECT AVG(salary) AS avg_salary FROM employees) e2
6
7ON e1.salary > e2.avg_salary;
8
  1. 合理使用临时表和视图:在处理复杂查询时,可以考虑使用临时表和视图。临时表用于存储中间结果,在需要多次使用这些结果时,可以减少重复计算。视图则可以将复杂的查询封装起来,方便后续引用,同时也提高了数据的安全性和一致性。例如,创建一个视图来查询每个部门的员工人数和平均薪水:
1CREATE VIEW department_summary AS
2
3SELECT department, COUNT(*) AS employee\_count, AVG(salary) AS avg_salary
4
5FROM employees
6
7GROUP BY department;
8

之后,可以像查询普通表一样查询这个视图:

1SELECT * FROM department_summary;
2

九、总结

MySQL DQL 作为数据库查询的核心工具,具有丰富的功能和强大的表现力。通过本文的介绍,你已经了解了 DQL 的基础语法、常用子句、高级应用以及实战优化技巧。在实际应用中,不断练习和积累经验,根据具体的业务需求灵活运用这些知识,你将能够高效地从数据库中获取所需的数据,为数据分析、业务决策等提供有力支持。

希望本文能成为你学习 MySQL DQL 的得力助手,帮助你在数据库开发的道路上迈出坚实的步伐。如果你在学习过程中遇到问题,不要气馁,多查阅资料,多实践,相信你一定能够掌握这门重要的技能。


MySQL DQL全面解析:从入门到精通》 是转载文章,点击查看原文


相关推荐


我做了一个软著 Skill,可以一键生成申请材料
IvanCodes2026/8/19

Hello,大家好,我是Ivan。 大家做完一个项目以后,可能会遇到一个问题,需要申请软著。这时候,申请表、操作手册和代码材料就都需要重新整理一遍,很麻烦,浪费时间。 所以,我把这部分做成了一个软著 Skill,名字叫 software-certificate-skill。把项目交给它以后,它会读取项目里的代码、页面和接口,然后生成申请表信息、操作手册和代码材料。 skill已经开源了,github链接是 https://github.com/IvanCodesDev/software-c


鸿蒙应用开发:V1与V2版本数据持久化实战教程
程序员黑豆2026/8/6

这是一个使用鸿蒙技术开发的本地原生记账应用,非常适合大家用来练手。相关源码已上传至 Github,点击此处查看项目。欢迎大家交流、指正,也欢迎提交 PR。 一、引言 在鸿蒙应用开发中,数据持久化是构建完整应用体验的关键一环。无论是保存用户的登录状态、个人偏好,还是缓存应用的核心数据,都需要一套可靠且高效的持久化方案。随着HarmonyOS版本的演进,数据持久化能力也从V1版本进化到了V2版本,带来了更强大的功能和更灵活的使用方式。 本文将深入对比V1(PersistentStorage + A


上线一个人静态网站需要多少钱,难不难?
五阳2026/7/28

不难,有合法身份证就能办,只需要花费 10 元,就能发布一个网站。 但是有门槛,先说门槛,如果你的网站需要中国大陆访问,那么必须要域名备案,不同省份等待时间不同。不过最多两周,最少 1 周也能审核完成。 有人问域名不备案就访问不通吗?不是的,我在阿里云申请的域名还没来得及备案,据我观察,大约有 2-3 周时间内,是允许中国大陆用户访问的,但是三周以后如果你还没有备案,那么就会被封掉,但是海外用户还能访问。 这是上线一个网站最困难和煎熬的环节了。 注意:国内个人用户备案域名,只能备案个人博客用途,


Agentic RAG 入门:从固定检索到自主决策
copyer_xyf2026/7/20

普通 RAG 的思路很直接:用户提出问题,系统从知识库检索相关片段,再让大模型根据这些片段生成回答。 这条链路解决了一个重要问题:模型不必只依赖训练时记住的知识,而是可以在回答前读取企业文档、产品手册、业务数据等外部资料,再根据资料组织答案。 但传统 RAG 的执行流程通常是固定的。这里的“固定”,不是说每次召回的文档都相同,而是说无论用户问什么、检索结果质量如何,程序都会按照上图展示的同一条路径执行。它不会在运行过程中重新判断,也不会主动改变检索策略。 但是,这种固定流程会遇到几个实际问题:


AEO 答案引擎优化:从“被搜索”到“被引用”的 AI 营销下一站
A亨日记2026/7/11

一、AI 正在改写“搜索”的默认行为 过去二十年,用户打开百度、Google 的第一件事是输入关键词,然后在十条蓝色链接里选择。但今天,越来越多的人直接向 DeepSeek、豆包、Kimi、ChatGPT 提问,并期待得到一个“直接可用”的答案。 这意味着企业的营销目标正在发生根本转移: SEO 时代:争取搜索结果页的前十排名;GEO 时代:争取被生成式引擎在回答中主动引用;AIO 时代:用结构化数据与反馈闭环持续优化 AI 对企业的“认知”;AEO 时代:直接为答案引擎生产“可被引用的高置信度


解决方案十八-企业级发音评测技术使用
Liu202605172026/7/3

在人工智能与教育深度融合的今天,语音评测技术(Speech Evaluation)已成为语言学习、在线教育、智能客服等领域的核心基础设施。无论是英语四六级口语考试、普通话水平测试,还是儿童语言启蒙应用,都离不开稳定、精准的语音评测能力。 然而,对于许多前端开发者而言,语音评测似乎总隔着一层“黑盒”——如何从前端采集音频?如何与云端AI服务建立稳定连接?如何处理流式数据并实时展示评测结果?这些问题往往让人望而却步。 本文将带你从零开始,基于Vue.js和WebSocket协议,构建一个完整的语


Claude Code上手指南:安装、部署、接入大模型
小此方2026/6/25

◆ 博主名称: 晓此方-CSDN博客 大家好,欢迎来到晓此方的博客。 ⭐️现代AI系列个人专栏: 【别传】AI应用与开发 ⭐️ “当AI能力被内化,智能就不再是成本,而是生产力。”——李彦宏 概要&序論    Hello,大家好,我是此方。 本文将带大家从零开始,完整走通 Claude Code 的安装、配置与部署流程。 一,让你的 Claude Code 动起来 1.1 安装前置软件 1


K-Means 聚类的目标函数:簇内误差平方和
F_D_Z2026/6/16

1. 什么是 K-Means? K-Means 是一种无监督、迭代式的聚类算法: 给定数据集 {x₁, x₂, …, xₙ} 与预设簇数 K,算法把样本划分为 K 个不相交的簇 C₁, C₂, …, Cₖ,使得同一簇内样本尽可能相似,不同簇间样本尽可能远离。 核心思想: > “让簇内‘抱团’,让簇间‘疏远’。” 2. 目标函数 J:簇内误差平方和(WCSS) K-Means 用几何距离衡量相似性,目标函数 J 定义为: J=∑k=1K∑x∈Ck∥x−μk∥2 J = \sum_{k=1}^{K


STM32F4 TIM定时器HAL库源码完全解析
冉卓电子2026/6/9

一、前言    在STM32嵌入式开发中,TIM定时器是使用频率最高、功能最丰富的外设之一,几乎所有嵌入式项目都会用到定时中断、PWM输出、输入捕获、编码器解码等功能,而这些功能的底层支撑都是TIM外设。   很多开发者只会调用HAL库现成函数,却不懂底层实现逻辑,遇到定时器卡死、PWM波形异常、捕获数据不准、DMA传输失效等问题时无从排查。   本文基于STM32F4xx HAL库 tim.c 完整源码,保姆级拆解TIM定时器全套底层架构、功能模块、核心函数、回调机制与使用规范,带你从源


【GaussDB】会话里出现大量idle in transaction状态的问题排查
DarkAthena2026/6/1

【GaussDB】会话里出现大量idle in transaction状态的问题排查 背景 客户DBA给应用开发人员宣讲GaussDB数据库的idle in transaction会话的监控告警后,开发人员自查,发现在开发环境中存在大量的idle in transaction会话,一时恐慌,于是来找DBA帮忙排查是不是应用代码哪里写得有问题。 数据库内核版本是 506.0 SPC0500 集中式。 检查应用 应用软件使用的spring框架接mybaitis,连接使用基于DBCP修改的连

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读