滚雪球学MySQL[3.1讲]: 高级SQL查询

全文目录:

    • 前言
    • [3. 高级SQL查询](#3. 高级SQL查询)
      • [3.1 多表查询](#3.1 多表查询)
        • [3.1.1 内连接(INNER JOIN)](#3.1.1 内连接(INNER JOIN))
        • [3.1.2 左连接(LEFT JOIN)](#3.1.2 左连接(LEFT JOIN))
        • [3.1.3 右连接(RIGHT JOIN)](#3.1.3 右连接(RIGHT JOIN))
        • [3.1.4 全连接(FULL JOIN)](#3.1.4 全连接(FULL JOIN))
      • [3.2 子查询与嵌套查询](#3.2 子查询与嵌套查询)
        • [3.2.1 子查询的基本用法](#3.2.1 子查询的基本用法)
        • [3.2.2 相关子查询](#3.2.2 相关子查询)
      • [3.3 聚合函数与数据分组](#3.3 聚合函数与数据分组)
        • [3.3.1 聚合函数](#3.3.1 聚合函数)
        • [3.3.2 数据分组(GROUP BY)](#3.3.2 数据分组(GROUP BY))
        • [3.3.3 HAVING子句](#3.3.3 HAVING子句)
    • 下期内容预告

前言

在上一期的文章中,我们深入探讨了MySQL的基础SQL操作,包括如何创建和删除数据库与表,进行数据的插入、查询、更新与删除操作,以及使用WHEREORDER BYLIMIT对查询结果进行过滤与排序。这些基础操作构成了我们与数据库交互的根基,使得我们能够在MySQL数据库中存储和检索数据。

然而,随着数据规模的增大和业务逻辑的复杂化,简单的SQL操作已不能满足我们的需求。我们常常需要从多个表中提取相关数据,或者在一个查询中计算汇总结果。这时候,高级SQL查询就显得尤为重要。本期文章将详细介绍MySQL中的高级SQL查询,包括多表查询、子查询、聚合函数及数据分组等内容,帮助您掌握更为复杂的数据库操作技巧。

3. 高级SQL查询

3.1 多表查询

在现实世界的应用中,数据往往分布在多个表中。为了从这些表中提取有意义的信息,我们需要使用多表查询。MySQL提供了多种方式来实现多表查询,其中最常用的就是连接查询

3.1.1 内连接(INNER JOIN)

内连接是最常见的一种多表查询方式。它返回两个表中匹配的记录。假设我们有两个表:orders(订单表)和customers(客户表),我们可以使用内连接来查询每个订单的客户信息:

sql 复制代码
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;

在这个查询中,INNER JOINorders表与customers表通过customer_id字段连接起来,只返回两个表中匹配的记录。

3.1.2 左连接(LEFT JOIN)

左连接返回左表中的所有记录,即使右表中没有匹配的记录。对于那些右表中没有匹配记录的行,结果集中对应的右表列将包含NULL值。例如,查询所有订单及其客户信息,即使某些订单没有对应的客户:

sql 复制代码
SELECT orders.order_id, customers.customer_name
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;

此查询将返回orders表中的所有订单记录,即使某些订单没有对应的客户信息。

3.1.3 右连接(RIGHT JOIN)

右连接与左连接相反,它返回右表中的所有记录,即使左表中没有匹配的记录。例如,查询所有客户及其订单信息,即使某些客户没有下过订单:

sql 复制代码
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;

此查询将返回customers表中的所有客户记录,即使某些客户没有下过订单。

3.1.4 全连接(FULL JOIN)

全连接返回两个表中的所有记录,左表和右表中没有匹配的部分将会显示NULL。然而,MySQL并不直接支持FULL JOIN,可以通过UNION结合左连接和右连接来实现:

sql 复制代码
SELECT orders.order_id, customers.customer_name
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id
UNION
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;

此查询将返回两个表中的所有记录,无论它们是否匹配。

3.2 子查询与嵌套查询

子查询是指在一个SQL语句中嵌套另一个SQL查询,用于满足更复杂的数据获取需求。子查询可以出现在SELECTINSERTUPDATEDELETE语句的WHEREFROMHAVING子句中。

3.2.1 子查询的基本用法

假设我们要查找那些订单总额大于平均订单总额的订单ID:

sql 复制代码
SELECT order_id
FROM orders
WHERE total_amount > (SELECT AVG(total_amount) FROM orders);

在这个查询中,子查询(SELECT AVG(total_amount) FROM orders)返回订单的平均总额,主查询则筛选出总额大于此平均值的订单。

3.2.2 相关子查询

相关子查询是指子查询依赖于主查询中的某些值,每次执行子查询时都使用主查询中的值。例如,查找每个客户的最新订单:

sql 复制代码
SELECT customer_name, order_id
FROM customers c
WHERE order_id = (SELECT MAX(order_id) FROM orders o WHERE o.customer_id = c.customer_id);

在这个查询中,子查询使用了主查询中的customer_id,每次执行子查询时,都会使用当前客户的customer_id

3.3 聚合函数与数据分组

在处理大量数据时,常常需要对数据进行统计和汇总。MySQL提供了多种聚合函数,如COUNTSUMAVGMAXMIN,这些函数可以与GROUP BY子句结合使用,对数据进行分组处理。

3.3.1 聚合函数

以下是常用聚合函数的示例:

  • COUNT:统计记录数

    sql 复制代码
    SELECT COUNT(*) FROM orders;
  • SUM:计算总和

    sql 复制代码
    SELECT SUM(total_amount) FROM orders;
  • AVG:计算平均值

    sql 复制代码
    SELECT AVG(total_amount) FROM orders;
  • MAX /MIN:找出最大值和最小值

    sql 复制代码
    SELECT MAX(total_amount), MIN(total_amount) FROM orders;
3.3.2 数据分组(GROUP BY)

GROUP BY子句用于将结果集按一个或多个字段分组,然后对每个组应用聚合函数。例如,按客户分组,计算每个客户的订单总额:

sql 复制代码
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id;

此查询按customer_id分组,并计算每个客户的总支出金额。

3.3.3 HAVING子句

HAVING子句通常与GROUP BY一起使用,用于筛选分组后的结果。例如,筛选出订单总额超过1000的客户:

sql 复制代码
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 1000;

在这个查询中,HAVING子句用于筛选出订单总额超过1000的客户。

下期内容预告

通过本期文章,您已经掌握了MySQL中的高级SQL查询,包括如何执行多表查询、使用子查询获取复杂数据,以及通过聚合函数和数据分组来处理和分析大量数据。这些高级查询技术将在您开发和优化数据库应用程序时发挥关键作用。

在下一期内容中,我们将进入MySQL性能优化的核心------索引与优化。我们将深入探讨如何创建和管理索引,理解查询执行计划,并介绍常见的数据库优化策略。这些内容将帮助您提高数据库查询的效率,优化数据存储和检索的性能。敬请期待!

相关推荐
尘浮生26 分钟前
Java项目实战II基于微信小程序的南宁周边乡村游平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·微信小程序·小程序·maven
东阳马生架构4 小时前
MySQL底层概述—1.InnoDB内存结构
java·数据库·mysql
standxy5 小时前
通过轻易云平台实现聚水潭数据高效集成到MySQL的技术方案
android·数据库·mysql
itwangyang5205 小时前
2025 - 科研神器 - 批量处理 PDF、SVG、PNG 和 JPG 文件,将它们转换为彩色 TIFF 文件,并保存到指定的 tiff 文件夹中
数据库·pdf
痞老板A小安装C46 小时前
redis的大key和热key问题解决方案
数据库·redis·bootstrap
feilieren6 小时前
DataGrip 连接 Redis、TongRDS
数据库·redis·缓存
苹果酱05676 小时前
windows安装redis, 修改自启动的redis服务的密码
java·开发语言·spring boot·mysql·中间件
液态不合群6 小时前
Redis中常见的数据类型及其应用场景
数据库·redis·wpf
Allen Bright6 小时前
Jedis存储一个-以String的形式的对象到Redis
数据库·redis·缓存
Allen Bright7 小时前
Jedis存储一个以byte[]的形式的对象到Redis
数据库·redis·缓存