滚雪球学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性能优化的核心------索引与优化。我们将深入探讨如何创建和管理索引,理解查询执行计划,并介绍常见的数据库优化策略。这些内容将帮助您提高数据库查询的效率,优化数据存储和检索的性能。敬请期待!

相关推荐
胡耀超41 分钟前
1.分页查询(后端)—— Vue3 + SpringCloud 5 + MyBatisPlus + MySQL 项目系列(基于 Zulu 11)
mysql·spring·spring cloud·mybatis·mybatisplus·zulu11
bug菌¹1 小时前
滚雪球学MySQL[9.1讲]:实践项目
数据库·mysql
YashanDB1 小时前
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
数据库·yashandb·崖山数据库·yashandb知识库
ljh5746491191 小时前
thinkphp8 redis队列
数据库·redis·github
im长街1 小时前
7.MySQL内置函数
mysql
OpenCSG1 小时前
OpenCSG DataFlow:锻造大模型智慧的炼金术,开启数据集Agentic新范式
数据库·人工智能·数据处理·agentic
程序人生5182 小时前
PostgreSQL分区表
数据库·postgresql·分区表
燕雀安知鸿鹄之志哉.3 小时前
玄机:第二章 日志分析-mysql应急响应
数据库·经验分享·mysql·安全·web安全·网络安全
Janusne4 小时前
高效修复MySQL数据库
数据库·mysql·phpmyadmin·dbf for mysql