【MySQL】表的连接和复合查询

news2024/12/24 8:53:42

在这里插入图片描述

欢迎来到Cefler的博客😁
🕌博客主页:折纸花满衣
🏠个人专栏:MySQL

在这里插入图片描述


目录

  • 👉🏻连接JOIN
  • 👉🏻子查询
  • 👉🏻合并查询

👉🏻连接JOIN

在MySQL中,连接(JOIN)是用于从两个或多个表中检索相关行的强大工具。通过使用JOIN,你可以基于这些表之间的某些相关列之间的关系来组合这些表的行。以下是关于JOIN的详细解释和示例:

🌍 1. INNER JOIN(内连接)

INNER JOIN返回两个表中满足连接条件的所有行。只有在两个表中都存在匹配的行时,这些行才会出现在结果集中。

示例
假设我们有两个表:customersorders。我们想找出所有下过订单的客户及其订单详情。

SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

在这个示例中,我们基于customer_id列将customers表和orders表连接在一起。结果集将包含所有下过订单的客户及其对应的订单ID和订单日期。

🌍 2. LEFT JOIN(左连接)

LEFT JOIN从左表中选择所有的行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则结果中右表的部分将包含NULL值。

示例
假设我们想要列出所有客户,无论他们是否下过订单。

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

在这个示例中,结果集将包含customers表中的所有客户。对于下过订单的客户,order_idorder_date列将包含相应的值;对于没有下过订单的客户,这些列将包含NULL值。

🌍 3. RIGHT JOIN(右连接)

RIGHT JOIN与LEFT JOIN相反,它从右表中选择所有的行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则结果中左表的部分将包含NULL值。

注意:在实际应用中,RIGHT JOIN的使用相对较少,因为你可以通过调整表的顺序和使用LEFT JOIN来达到相同的效果。

🌍4. FULL JOIN(全连接)

FULL JOIN返回左表和右表中满足连接条件的所有行。如果某一边没有匹配的行,则结果中对应的一边将包含NULL值。但是,MySQL本身不支持FULL JOIN。不过,你可以通过组合LEFT JOIN和UNION来达到相同的效果。

示例(模拟FULL JOIN):

SELECT * FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id

UNION

SELECT * FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id
WHERE customers.customer_id IS NULL;

🌍 5. 交叉连接(CROSS JOIN)

CROSS JOIN返回左表中的每一行与右表中的每一行的组合,也称为笛卡尔积。这通常不是一个常用的连接类型,但在某些情况下可能很有用。

示例

SELECT * FROM customers
CROSS JOIN orders;

🌍 注意事项:

  • 在使用JOIN时,确保连接条件正确,以避免返回错误或意外的结果。
  • 当连接多个表时,为了简化查询和提高可读性,可以为表指定别名。
  • 在涉及大量数据的查询中,注意性能优化。使用索引、调整查询逻辑和避免不必要的JOIN操作可以帮助提高性能。
  • 使用EXPLAIN命令来分析查询的执行计划,以便进行性能调优。

👉🏻子查询

🌍1. 子查询在SELECT子句中使用

子查询可以在SELECT子句中使用,以从其他表中检索值,并将其用作外部查询的一部分。

示例:假设我们有两个表:customers(包含客户信息)和orders(包含订单信息)。我们想要列出每个客户的订单总数。

SELECT customer_name, 
       (SELECT COUNT(*) FROM orders WHERE orders.customer_id = customers.customer_id) AS order_count
FROM customers;

在这个示例中,子查询对于每个customers表中的客户都会执行一次,以计算其订单数量。

🌍2. 子查询在FROM子句中使用(内联视图或派生表)

示例:查找每个客户的订单总数。

SELECT c.customer_name, co.order_count
FROM customers c
JOIN (
    SELECT customer_id, COUNT(*) AS order_count
    FROM orders
    GROUP BY customer_id
) AS co ON c.customer_id = co.customer_id;

在这个示例中,内部子查询(派生表)首先计算每个客户的订单数,并将其作为临时结果集co。然后,外部查询将customers表与这个临时结果集连接,以检索每个客户的名称和订单总数。

🌍 3. 子查询在WHERE子句中使用

示例:查找价格高于平均价格的产品。

SELECT product_name, price
FROM products
WHERE price > (
    SELECT AVG(price)
    FROM products
);

在这个示例中,内部子查询计算产品的平均价格。然后,外部查询选择价格高于平均价格的产品。

注意事项:

  • 子查询可以返回单个值、一行值、一列值或一个表的结果集。
  • 子查询的性能可能因数据量和查询的复杂性而异。优化器会尝试有效地执行子查询,但有时可能需要手动调整查询以提高性能。
  • 使用子查询时,确保连接条件和外层查询的WHERE条件逻辑清晰,以避免不必要的计算或错误的结果。
  • 在某些情况下,可以使用JOIN代替子查询,以提高查询的性能和可读性。但是,子查询在某些场景中(如聚合函数和条件语句中)仍然非常有用。

👉🏻合并查询

UNIONUNION ALL 是 SQL 中用于合并两个或多个 SELECT 语句结果集的操作符。这两个操作符的主要区别在于它们如何处理重复的行。

🌍 UNION

UNION 操作符用于合并两个或多个 SELECT 语句的结果集,但不包括重复的行。也就是说,它会从所有 SELECT 语句的结果集中删除重复的行,然后返回唯一的行

语法

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

注意

  1. 所有的 SELECT 语句必须具有相同的列数。
  2. 这些列也必须具有相似的数据类型。
  3. 列的顺序必须相同。

示例

假设有两个表 employees1employees2,它们都有 nameage 列。如果我们想要获取两个表中所有不重复的员工名称,可以使用 UNION

SELECT name FROM employees1
UNION
SELECT name FROM employees2;

🌍 UNION ALL

UNION ALL 操作符与 UNION 类似,但它会返回所有行,包括重复的行。也就是说,它不会删除任何重复的行。

语法

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

示例

使用与上面相同的 employees1employees2 表,如果我们想要获取两个表中所有的员工名称(包括重复的名称),可以使用 UNION ALL

SELECT name FROM employees1
UNION ALL
SELECT name FROM employees2;

🌍 性能考虑

由于 UNION 需要删除重复的行,所以它的性能通常比 UNION ALL 差。如果你知道结果集中不会有重复的行,或者你想要包括重复的行,那么使用 UNION ALL 会更加高效。

🌍 其他注意事项

  • 在使用 UNIONUNION ALL 时,你可以对每个 SELECT 语句使用 ORDER BY 子句,但只能有一个 ORDER BY 子句,并且它必须位于最后一个 SELECT 语句之后。如果你想要对整个结果集进行排序,而不是对每个 SELECT 语句的结果集进行排序,那么你应该这样做。
  • 如果你想要对每个 SELECT 语句的结果集进行排序,并在合并后保留这些排序,那么你需要使用其他方法,如子查询或临时表。

如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1717549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法】位运算算法——消失的两个数字(困难)

题解:消失的两个数字(位运算算法) 目录 1.题目2.题解3.示例代码如下4.总结 1.题目 题目链接:LINK 2.题解 本题要求时间复杂度O(N),空间复杂度O(1),分别否了我们 排序遍历 和 哈希数组 的想法。想要在规定时间/空间复杂度内完成本题,需要借…

辅导男朋友转算法岗第1天|tokenizer

文章目录 LLM训练流程LLM中的tokenizersBPEWordPieceUnigramSentencePiece(使用BBPE或Unigram) LLM训练流程 【大语言模型LLM基础之Tokenizer完全介绍-哔哩哔哩】 https://b23.tv/2kdTKxf LLM中的tokenizers 三种不同分词粒度的Tokenizers word-based…

python 获取网页乱码怎么解决

在使用python爬取网页时,经常会遇到乱码问题,一旦遇到乱码问题,就很难得到有用的信息。本人遇到乱码问题,一般有以下几个方式: 1、查看网页源码中的head标签,找到编码方式,例如: 可…

【UML用户指南】-02-UML基本元素的介绍(二)

1、语法和语义规则 命名——为事物、关系和图起的名字; 范围——使名字具有特定含义的语境; 可见性——这些名字如何让其他成分看见和使用; 完整性——事物如何正确、一致地相互联系; 执行——运行或模拟一个动态模型意味着什…

安卓 Flutter Channel 源码解析

Flutter 官方提供三种 Platform 与 Dart 端消息通信方式,他们分别是 MethodChannel 、 BasicMessageChannel 、 EventChannel MethodChanel :用于传递方法调用, MethodCallHandler 最终必须在 UI 线程通过 result. success(x) 方法返回…

【深度学习】YOLOv10实战:20行代码将笔记本摄像头改装成目标检测监控

目录 一、引言 二、YOLOv10视觉目标检测—原理概述 2.1 什么是YOLO 2.2 YOLO的网络结构 三、YOLOv10视觉目标检测—训练推理 3.1 YOLOv10安装 3.1.1 克隆项目 3.1.2 创建conda环境 3.1.3 下载并编译依赖 3.2 YOLOv10模型推理 3.2.1 模型下载 3.2.2 WebUI推理 …

成功解决“ImportError: cannot import name ‘mapping‘ from ‘collections‘”错误的全面指南

成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 一、引言 在Python编程中,当我们尝试从某个模块中导入某个名称时&…

上弦外媒新闻发稿:2024年度国外主流新闻媒体和海外媒体软文分发平台有哪些?

2024年度主流海外媒体新闻发稿和海外媒体软文分发平台有很多,下面是一些常见的和广受认可的平台: 主流新闻媒体 CNN - 美国知名新闻网络,覆盖广泛的国际新闻。BBC - 英国广播公司,提供全球新闻和深入报道。纽约时报 - 美国主流报…

UnityAPI学习之 事件函数(生命周期函数)的整体调用流程及细节

事件函数(生命周期函数)的整体调用流程 Reset() 这个函数会在用户首次添加该组件时或单击 Reset 按钮时被调用,且只在编辑器生效,可用于保存默认值 示例: using System.Collections; using System.Collections.Generic; using UnityEngine;public cla…

Docker中布置Jenkins实现Android项目的自动化构建

因项目需要,要在服务器上使用Jenkins完成Android项目的自动化构建,但服务器上登录的账户没有管理员权限,无法用sudo命令,因此需要把相应环境布置在docker中。 环境搭建 docker容器相关命令 创建容器 docker create -it contai…

Android Handler机制使用及全面解析

前言 我是真的不想写这篇总结,说实话,关于Handler,全面且优秀的文章多的很。 但是这东西吧,还是想以自己的方式再去细看一下它的原理,实现源码,它的各种机制,在App中使用到的地方。 这样或许…

【深度揭秘GPT-4o】:全面解析新一代AI技术的突破与优势

目录 ​编辑 1.版本对比:从GPT-3到GPT-4,再到GPT-4o的飞跃 1.1 模型规模的扩展 1.2 训练数据的更新 1.3 算法优化与效率提升 1.4 案例分析 2.技术能力:GPT-4o的核心优势 2.1 卓越的自然语言理解 2.1.1 上下文理解能力 2.1.2 语义分…

地质灾害位移应急监测站

地质灾害位移应急监测站是一种专门用于地质灾害预警和应急响应的设施,它能够实时监测和分析山体、建筑物、管道等的位移变化情况。以下是关于地质灾害位移应急监测站的详细介绍: 主要组成部分 传感器:安装于需要监测的位置,用于…

chap4 simple neural network

全连接神经网络 问题描述 利用numpy和pytorch搭建全连接神经网络。使用numpy实现此练习需要自己手动求导,而pytorch具有自动求导机制。 我们首先先手动算一下反向传播的过程,使用的模型和初始化权重、偏差和训练用的输入和输出值如下: 我…

鹤城杯 2021 流量分析

看分组也知道考http流量 是布尔盲注 过滤器筛选http流量 将流量包过滤分离 http tshark -r timu.pcapng -Y "http" -T json > 1.json这个时候取 http.request.uri 进一步分离 http.request.uri字段是我们需要的数据 tshark -r timu.pcapng -Y "http&quo…

MFC 模态对话框的实现原理

参考自MFC 模态对话框的实现原理 - 西昆仑 - OSCHINA - 中文开源技术交流社区 1. 模态对话框 在涉及 GUI 程序开发的过程中,常常有模态对话框以及非模态对话框的概念 模态对话框:在模态对话框活动期间,父窗口是无法进行消息响应&#xff0…

The book

Deep Learning for Coders with Fastai and PyTorch: AI Applications Without a PhD is the book that forms the basis for this course. We recommend reading the book as you complete the course. There’s a few ways to read the book – you can buy it as a paper bo…

到无穷大和更远,用分形更好

文章目录 一、说明二、分形到底是什么?三、更多更深刻的四、引进无穷小会产生什么样的怪事?五、希尔伯特曲线六、还有什么有趣的要补充的吗? 一、说明 ​​​​​​​数学领域有太多有趣的领域,领域我特别感兴趣。这是一个奇妙的…

【PostgreSQL17新特性之-冗余IS [NOT] NULL限定符的处理优化】

在执行一个带有IS NOT NULL或者NOT NULL的SQL的时候,通常会对表的每一行,都会进行检查以确保列为空/不为空,这是符合常理的。 但是如果本身这个列上有非空(NOT NULL)约束,再次检查就会浪费资源。甚至有时候…

经验分享:如何搭建一个有效的知识库管理系统

打开知乎,发现很多朋友在问如何搭建一个有效的知识库管理系统,所以今天LookLook同学就来跟大家分享一下我是怎么搭建一个既实用又高效的知识库管理系统的。 一、明确需求,定位清晰 首先,你得想清楚你要搭建的知识库管理系统是用来…