当前位置: 首页 > news >正文

MySQL-DQL数据查询语句深度解析与实战指南

MySQL-DQL数据查询语句深度解析与实战指南

    • 一、DQL概述
      • 1.1 DQL的定义与作用
      • 1.2 DQL与其他SQL语言的关系
    • 二、`SELECT`基础语法详解
      • 2.1 基本查询结构
      • 2.2 示例演示
    • 三、数据筛选与条件查询
      • 3.1 比较运算符
      • 3.2 逻辑运算符
      • 3.3 范围查询
      • 3.4 模糊查询
    • 四、数据分组与聚合
      • 4.1 聚合函数
      • 4.2 `GROUP BY`子句
      • 4.3 `HAVING`子句
    • 五、多表查询与连接操作
      • 5.1 内连接(`INNER JOIN`)
      • 5.2 左连接(`LEFT JOIN`)
      • 5.3 右连接(`RIGHT JOIN`)
      • 5.4 全连接(`FULL JOIN`)
    • 六、子查询与嵌套查询
      • 6.1 子查询基础
      • 6.2 子查询类型
      • 6.3 示例演示
    • 七、DQL性能优化
      • 7.1 索引优化
      • 7.2 查询语句优化
      • 7.3 执行计划分析
    • 八、DQL实战案例
      • 8.1 电商数据分析
      • 8.2 员工信息管理

数据查询语言(Data Query Language,简称DQL)是MySQL中获取、分析和处理数据的核心工具,DQL以 SELECT语句为核心,能够实现从简单的数据检索到复杂的多表关联分析、数据聚合与筛选等操作。本文我将系统全面地剖析MySQL中DQL语句的语法、功能、特性以及实战应用,带你全面掌握数据查询的核心技术。

一、DQL概述

1.1 DQL的定义与作用

DQL是SQL语言中用于从数据库中检索数据的部分,它专注于数据的读取与筛选,不涉及数据的插入、更新或删除操作(这些由DML语句负责)。通过DQL,开发者可以从一个或多个表中提取符合特定条件的数据,对数据进行排序、分组、聚合等处理,从而为业务逻辑提供数据支持,也能帮助数据分析人员挖掘数据背后的价值。

1.2 DQL与其他SQL语言的关系

  • 与DML的区别:DQL负责数据查询,DML负责数据的增删改操作。例如,SELECT是DQL的核心语句,而INSERTUPDATEDELETE属于DML语句。
  • 与DDL的区别:DDL用于定义和管理数据库对象结构,如创建、修改、删除数据库、表、索引等;DQL则是在已有的数据库结构基础上进行数据的查询操作 。

二、SELECT基础语法详解

2.1 基本查询结构

SELECT语句的基础语法结构如下:

SELECT [DISTINCT] column1, column2, ...
FROM table_name
[WHERE condition]
[GROUP BY column1, column2, ...]
[HAVING condition]
[ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...]
[LIMIT offset, count];

各子句作用如下:

  • SELECT:指定要查询的列,DISTINCT关键字用于去除重复行。
  • FROM:指定数据来源的表。
  • WHERE:筛选符合条件的行,条件可以是比较运算符(=, <, >等)、逻辑运算符(AND, OR, NOT)等。
  • GROUP BY:根据指定列对数据进行分组,常与聚合函数结合使用。
  • HAVING:对分组后的结果进行筛选,作用于GROUP BY之后。
  • ORDER BY:对查询结果进行排序,ASC为升序(默认),DESC为降序。
  • LIMIT:限制返回结果的行数,offset表示偏移量,count表示返回的行数。

2.2 示例演示

查询employees表中所有员工的姓名和工资

SELECT first_name, last_name, salary
FROM employees;

查询products表中价格大于100的产品名称和价格

SELECT product_name, price
FROM products
WHERE price > 100;

查询orders表中每个客户的订单数量,并按订单数量降序排列

SELECT customer_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id
ORDER BY order_count DESC;

三、数据筛选与条件查询

3.1 比较运算符

常用的比较运算符包括:

  • 等于=
  • 不等于!=<>
  • 大于>
  • 小于<
  • 大于等于>=
  • 小于等于<=

示例:查询students表中年龄大于等于18岁的学生信息

SELECT *
FROM students
WHERE age >= 18;

3.2 逻辑运算符

逻辑运算符用于组合多个条件:

  • AND
  • OR
  • NOT

示例:查询customers表中居住在“北京”且消费金额大于5000的客户,或者居住在“上海”的客户

SELECT *
FROM customers
WHERE (city = '北京' AND total_spent > 5000) OR city = '上海';

3.3 范围查询

  • BETWEEN:用于查询在某个范围内的值,包含边界值。
  • IN:用于查询在指定列表中的值。

示例:查询orders表中订单日期在2023 - 01 - 01到2023 - 12 - 31之间的订单信息

SELECT *
FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';

查询employees表中部门ID为1、3、5的员工信息

SELECT *
FROM employees
WHERE department_id IN (1, 3, 5);

3.4 模糊查询

  • LIKE:用于模糊匹配,配合通配符使用。
    • %:匹配任意字符(包括空字符)。
    • _:匹配单个字符。

示例:查询customers表中姓名以“张”开头的客户

SELECT *
FROM customers
WHERE customer_name LIKE '张%';

查询products表中产品名称包含“手机”的产品

SELECT *
FROM products
WHERE product_name LIKE '%手机%';

四、数据分组与聚合

4.1 聚合函数

聚合函数用于对一组数据进行计算,常见的聚合函数包括:

  • COUNT():统计行数。
  • SUM():计算总和。
  • AVG():计算平均值。
  • MIN():获取最小值。
  • MAX():获取最大值。

示例:查询orders表中的订单总数、总销售额、平均订单金额

SELECT COUNT(order_id) AS order_count,SUM(total_amount) AS total_sales,AVG(total_amount) AS average_amount
FROM orders;

4.2 GROUP BY子句

GROUP BY子句用于将数据按照指定的列进行分组,以便对每个分组进行聚合计算。

示例:查询orders表中每个客户的订单数量和总消费金额

SELECT customer_id,COUNT(order_id) AS order_count,SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id;

4.3 HAVING子句

HAVING子句用于对GROUP BY分组后的结果进行筛选,与WHERE子句的区别在于WHERE作用于分组前,HAVING作用于分组后。

示例:查询orders表中订单数量大于5的客户及其订单数量

SELECT customer_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id
HAVING order_count > 5;

五、多表查询与连接操作

5.1 内连接(INNER JOIN

内连接返回两个表中满足连接条件的行,是最常用的连接方式。

示例:查询employees表和departments表中员工及其所属部门信息

SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;

5.2 左连接(LEFT JOIN

左连接返回左表中的所有行,以及右表中满足连接条件的行,若右表无匹配行,则用NULL填充。

示例:查询customers表和orders表中所有客户及其订单信息(包括无订单的客户)

SELECT c.customer_id, c.customer_name, o.order_id
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id;

5.3 右连接(RIGHT JOIN

右连接与左连接相反,返回右表中的所有行,以及左表中满足连接条件的行,若左表无匹配行,则用NULL填充。

示例:查询products表和orders_items表中所有订单商品信息(包括未被订购的商品)

SELECT p.product_id, p.product_name, oi.order_item_id
FROM products p
RIGHT JOIN orders_items oi ON p.product_id = oi.product_id;

5.4 全连接(FULL JOIN

MySQL本身不直接支持FULL JOIN,但可以通过UNION组合左连接和右连接来实现类似效果。

示例

SELECT *
FROM table1
LEFT JOIN table2 ON table1.key = table2.key
UNION
SELECT *
FROM table1
RIGHT JOIN table2 ON table1.key = table2.key;

六、子查询与嵌套查询

6.1 子查询基础

子查询是指在一个查询语句中嵌套另一个查询语句,子查询通常用于提供条件判断的依据。

示例:查询employees表中工资高于公司平均工资的员工

SELECT *
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

6.2 子查询类型

  • 标量子查询:返回单一值,常用于条件判断。
  • 列子查询:返回一列数据,常用于INANYALL等运算符。
  • 行子查询:返回一行数据。
  • 表子查询:返回一个结果集,可作为临时表使用。

6.3 示例演示

列子查询:查询orders表中与订单金额最高的订单同客户的其他订单

SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_idFROM ordersWHERE total_amount = (SELECT MAX(total_amount) FROM orders));

表子查询:查询customers表中消费金额排名前10的客户信息

SELECT *
FROM (SELECT *FROM customersORDER BY total_spent DESCLIMIT 10) AS top_customers;

七、DQL性能优化

7.1 索引优化

  • 合理创建索引:对经常用于WHEREJOINORDER BY的列添加索引,如CREATE INDEX idx_column ON table_name (column);
  • 避免冗余索引:过多的索引会影响数据插入、更新性能,定期检查并删除不必要的索引。

7.2 查询语句优化

  • 减少*的使用:明确指定需要查询的列,避免返回不必要的数据。
  • 优化连接操作:合理选择连接类型,减少笛卡尔积的产生;确保连接条件字段上有索引。
  • 避免子查询嵌套过深:尽量将子查询转换为连接查询,降低查询复杂度。

7.3 执行计划分析

使用EXPLAIN关键字分析查询执行计划,了解MySQL如何执行查询,从而针对性地进行优化。例如:

EXPLAIN SELECT *
FROM employees
WHERE department_id = 1;

通过分析EXPLAIN结果中的typekeyrows等字段,判断查询是否使用了索引,以及预计扫描的行数等信息。

八、DQL实战案例

8.1 电商数据分析

需求:统计每个月的订单总数、总销售额,并按月份降序排列。

SELECT YEAR(order_date) AS order_year,MONTH(order_date) AS order_month,COUNT(order_id) AS order_count,SUM(total_amount) AS total_sales
FROM orders
GROUP BY order_year, order_month
ORDER BY order_year DESC, order_month DESC;

8.2 员工信息管理

需求:查询每个部门中工资最高的员工信息。

SELECT d.department_name, e.employee_name, e.salary
FROM employees e
JOIN (SELECT department_id, MAX(salary) AS max_salaryFROM employeesGROUP BY department_id) AS sub
ON e.department_id = sub.department_id AND e.salary = sub.max_salary
JOIN departments d ON e.department_id = d.department_id;

若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ

http://www.xdnf.cn/news/1030411.html

相关文章:

  • 使用docker中的ollama
  • Python实战应用-Python操作MySQL数据库
  • 雪豹速清APP:高效清理,畅享流畅手机体验
  • python打卡day53@浙大疏锦行
  • DAY 53 对抗生成网络
  • 操作系统知识(1)
  • 造轮子系列:从0到1打造生产级HTTP客户端,优雅封装OkHttp/HttpClient,支持异步、重试与文件操作
  • 自定义表单右侧属性使用v-bind绑定渲染
  • 知识点|MVC模式(Model–view–controller)
  • 中英双配毕业祝福(毕业季快乐!)
  • MRI中的“髓鞘探测器”:T1w/T2w比值揭秘
  • 【面板数据】A股上市公司注册地所在地数据集(1991-2023年)
  • securecrt里如何把会话管理器固定在会话的左侧?
  • 北航自由指令驱动的多模态导航最新研究:OctoNav:开启通用智能体具身导航
  • SageAttention2原理和计算过程
  • 开机不用输入密码,修改注册表
  • 【设计模式】UML类图与工厂模式
  • C++中 using 命名别名和命名别名模板的用法
  • 寻找区域中的面积和中心点
  • ChatNT-用于DNA、RNA和蛋白质任务的多模态对话代理-文献精读143
  • P3740 [HAOI2014] 贴海报 题解
  • AUTOSAR图解==>AUTOSAR_TPS_SafetyExtensions
  • xss注入遇到转义,html编码绕过了解一哈
  • frp搭建踩坑....
  • 2025软件测试面试题汇总(接口测试篇)
  • 鸿蒙的@State
  • 跳出多重循环
  • Power BI Streaming dataset - 模拟监测水库的水位情况
  • 【2025 CVPR-Backbone】Building Vision Models upon Heat Conduction
  • 57、原生组件注入-【源码分析】DispatcherServlet注入原理