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

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

全文目录:

    • 前言
    • 3. 高级SQL查询
      • 3.1 多表查询
        • 3.1.1 内连接(INNER JOIN)
        • 3.1.2 左连接(LEFT JOIN)
        • 3.1.3 右连接(RIGHT JOIN)
        • 3.1.4 全连接(FULL JOIN)
      • 3.2 子查询与嵌套查询
        • 3.2.1 子查询的基本用法
        • 3.2.2 相关子查询
      • 3.3 聚合函数与数据分组
        • 3.3.1 聚合函数
        • 3.3.2 数据分组(GROUP BY)
        • 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(客户表),我们可以使用内连接来查询每个订单的客户信息:

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值。例如,查询所有订单及其客户信息,即使某些订单没有对应的客户:

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)

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

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结合左连接和右连接来实现:

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:

SELECT order_id
FROM orders
WHERE total_amount > (SELECT AVG(total_amount) FROM orders);

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

3.2.2 相关子查询

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

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:统计记录数

    SELECT COUNT(*) FROM orders;
    
  • SUM:计算总和

    SELECT SUM(total_amount) FROM orders;
    
  • AVG:计算平均值

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

    SELECT MAX(total_amount), MIN(total_amount) FROM orders;
    
3.3.2 数据分组(GROUP BY)

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

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的客户:

SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 1000;

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

下期内容预告

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

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


http://www.kler.cn/news/324661.html

相关文章:

  • leetcode_015_三数之和解析
  • Python集成测试详解
  • 工业边缘计算网关和普通网关的区别-天拓四方
  • python基础语法--顺序结构
  • SpringCloud源码:客户端分析(一)- SpringBootApplication注解类加载流程
  • 工业缺陷检测——Windows 10本地部署AnomalyGPT工业缺陷检测大模型
  • naocs注册中心,配置管理,openfeign在idea中实现模块间的调用,getway的使用
  • Python爬虫bs4的基本使用
  • Android平台如何获取CPU占用率和电池电量信息
  • Unity 与虚幻引擎对比:两大游戏开发引擎的优劣分析
  • 【工具变量】无废城市试点DID数据集(2000-2023)
  • 【C++笔记】八、结构体 [ 4 ]
  • 六练习题笔记
  • C++启动其它进程的方式
  • 【运动控制】关于GPIO通用输入口的锁存功能
  • RTX 5090、5080规格完整曝光,来看来看
  • 一起搭WPF界面之界面切换绑定
  • 深度学习之开发环境(CUDA、Conda、Pytorch)准备(4)
  • 基于SSM茶叶科普管理系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解
  • PREDATOR: Registration of 3D Point Clouds with Low Overlap
  • DeepSS2GO——基于 CNN 的模型可以根据化学键预测蛋白质的功能
  • JPA + Thymeleaf 增删改查
  • 【Element-UI】实现el-drawer抽屉的左右拖拽宽度
  • ​美​团​一​面​-​2​
  • 《中国电子报》报道: 安宝特AR为产线作业者的“秘密武器
  • 一种用于常开型智能视觉感算系统的极速高精度模拟减法器
  • c++模拟真人鼠标轨迹算法
  • css实现自定义静态进度条-vue2
  • 【Elasticsearch】-dense_vector与hnsw的含义
  • idea 创建多模块项目