MySQL中的关联查询:方式、区别及示例

MySQL中的关联查询:方式、区别及示例

在数据库操作中,我们常常需要从多个相关的表中获取数据,这就用到了关联查询。MySQL提供了多种关联查询方式,每种方式都有其特点和适用场景。下面我们就来详细探讨这些关联查询的使用方式、它们之间的区别,并结合示例进行讲解。

在这里插入图片描述

内连接(INNER JOIN)

内连接是最常见的关联查询方式之一,它会返回两个表中满足连接条件的所有行。也就是说,只有当两个表中的记录在连接条件上匹配时,才会出现在结果集中。

语法

SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;

示例

假设有两个表,students表存储学生信息,包含student_idstudent_name等字段;scores表存储学生的成绩信息,包含student_idsubjectscore等字段。我们要查询每个学生的姓名及其对应的数学成绩,就可以使用内连接:

SELECT students.student_name, scores.score
FROM students
INNER JOIN scores ON students.student_id = scores.student_id AND scores.subject = '数学';

在这个例子中,只有在students表和scores表中student_id相同且scores表中subject为“数学”的记录才会出现在结果集中。

左连接(LEFT JOIN)

左连接会返回左表(table1)中的所有行,以及右表(table2)中满足连接条件的行。如果右表中没有匹配的行,结果集中对应右表的列值将为NULL

语法

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;

示例

继续以上面的studentsscores表为例,如果我们要查询所有学生的姓名以及他们的数学成绩,包括那些没有数学成绩的学生(在成绩表中没有记录的学生),就可以使用左连接:

SELECT students.student_name, scores.score
FROM students
LEFT JOIN scores ON students.student_id = scores.student_id AND scores.subject = '数学';

这样,即使某个学生没有数学成绩记录,在结果集中也会出现该学生的姓名,而对应的成绩列为NULL

右连接(RIGHT JOIN)

右连接与左连接相反,它会返回右表(table2)中的所有行,以及左表(table1)中满足连接条件的行。如果左表中没有匹配的行,结果集中对应左表的列值将为NULL

语法

SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

示例

还是以这两个表为例,如果我们以scores表为基准,要查询所有数学成绩记录以及对应的学生姓名(即使该成绩记录可能对应一个不存在于students表中的虚拟学生,这种情况在实际中可能表示数据异常),就可以使用右连接:

SELECT students.student_name, scores.score
FROM students
RIGHT JOIN scores ON students.student_id = scores.student_id AND scores.subject = '数学';

此时,即使成绩记录对应的学生在students表中不存在,在结果集中也会出现该成绩记录,而对应的学生姓名列为NULL

全外连接(FULL OUTER JOIN)

全外连接会返回左表和右表中的所有行。当某一行在另一表中没有匹配行时,结果集中对应另一表的列值将为NULL。不过,MySQL本身并不直接支持FULL OUTER JOIN关键字,但可以通过LEFT JOINRIGHT JOIN的结果集UNION来模拟。

模拟语法

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

示例

同样以studentsscores表为例,模拟全外连接查询:

SELECT students.student_name, scores.score
FROM students
LEFT JOIN scores ON students.student_id = scores.student_id AND scores.subject = '数学'
UNION
SELECT students.student_name, scores.score
FROM students
RIGHT JOIN scores ON students.student_id = scores.student_id AND scores.subject = '数学';

这样,结果集将包含所有学生(无论是否有数学成绩记录)以及所有数学成绩记录(无论是否有对应的学生记录),对于不匹配的部分,相应列值为NULL

交叉连接(CROSS JOIN)

交叉连接也称为笛卡尔积连接,它会返回左表中每一行与右表中每一行的组合,结果集的行数是左表行数乘以右表行数。

语法

SELECT columns
FROM table1
CROSS JOIN table2;

示例

假设students表有3条记录,courses表有2条记录,执行交叉连接:

SELECT students.student_name, courses.course_name
FROM students
CROSS JOIN courses;

结果集将有3 * 2 = 6条记录,展示了每个学生与每门课程的所有可能组合。

关联查询方式的区别总结

  1. 内连接:只返回满足连接条件的行,结果集不包含任何一方表中不匹配的行。
  2. 左连接:以左表为基准,返回左表所有行,右表中匹配的行与之对应,不匹配的右表列为NULL
  3. 右连接:以右表为基准,返回右表所有行,左表中匹配的行与之对应,不匹配的左表列为NULL
  4. 全外连接:返回左右表所有行,不匹配的列为NULL,通过LEFT JOINRIGHT JOINUNION模拟。
  5. 交叉连接:返回左右表所有行的笛卡尔积组合,不考虑任何连接条件。

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

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

相关文章

软件卸载不干净?用“它”一键卸载!

前言: 今天我要向大家推荐一款适用于Windows系统的卸载工具,它是一款完全免费且开源的软件,使用体验极佳,绝对值得大家一试。 Bulk Crap Uninstalle 这款名为Bulk Crap Uninstaller的软件,相较于系统自带的卸载工具…

使用AI生成金融时间序列数据:解决股市场的数据稀缺问题并提升信噪比

“GENERATIVE MODELS FOR FINANCIAL TIME SERIES DATA: ENHANCING SIGNAL-TO-NOISE RATIO AND ADDRESSING DATA SCARCITY IN A-SHARE MARKET” 论文地址:https://arxiv.org/pdf/2501.00063 摘要 金融领域面临的数据稀缺与低信噪比问题,限制了深度学习在…

吴恩达深度学习——如何实现神经网络

来自吴恩达深度学习,仅为本人学习所用。 文章目录 神经网络的表示计算神经网络的输出激活函数tanh选择激活函数为什么需要非激活函数双层神经网络的梯度下降法 随机初始化 神经网络的表示 对于简单的Logistic回归,使用如下的计算图。 如果是多个神经元…

深入理解 Java 的并发容器

目录 一、为何需要并发容器 二、Java 中的主要并发容器 1. ConcurrentHashMap 2. CopyOnWriteArrayList 3. ConcurrentLinkedQueue 4. BlockingQueue及其实现类 三、并发容器的应用场景 1. 缓存系统 2. 任务队列 3. 数据共享与传递 四、使用并发容器的注意事项 1. …

MATLAB 如何避免复杂shp文件对inpolygon的影响

**任务描述:**当我想用inpolygon函数将属于非洲的pixel选出来时,发现因为周边小岛的影响,pixel选取有问题,如下图。 第一种解决办法: 首先将复杂shp文件查分成简单的shp文件,即将不相交的元素分离开 [QGIS…

埃氏算法C++实现: 快速输出质数( 素数 )

目录 1.简介 算法原理 算法特点 应用场景 2.一般求素数方法 3.埃氏算法求素数 3.1.无动态分配 3.2.有动态分配 1.简介 ‌埃氏算法(Eratosthenes Sieve)‌,全称为埃拉托斯特尼筛法,是一种由古希腊数学家埃拉托斯特尼在公元…

【机器学习】嘿马机器学习(科学计算库)第11篇:Pandas,学习目标【附代码文档】

本教程的知识点为:机器学习(常用科学计算库的使用)基础定位 机器学习概述 机器学习概述 1.5 机器学习算法分类 1 监督学习 机器学习概述 1.7 Azure机器学习模型搭建实验 Azure平台简介 Matplotlib 3.2 基础绘图功能 — 以折线图为例 1 完善原…

FFPlay命令全集合

FFPlay是以FFmpeg框架为基础,外加渲染音视频的库libSDL构建的媒体文件播放器。 ffplay工具下载并播放视频,可以辅助卡看流信息。 官网下载地址:http://ffmpeg.org/download.html#build-windows 下载build好的exe程序: 此处下载…

DNS未响应服务问题的解决(电脑连着网但浏览器访问不了网页)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

装饰器模式 - 装饰器模式的实现

引言 装饰器模式(Decorator Pattern)是设计模式中结构型模式的一种,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象增加新的行为。装饰器模式提供了一种灵活的替代方案,用于扩展对象的功能,而无需通过继承…

vue视频流播放,支持多种视频格式,如rmvb、mkv

先将视频转码为ts ffmpeg -i C:\test\3.rmvb -codec: copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls C:\test\a\output.m3u8 后端配置接口 import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import org.spring…

从 0 开始实现一个 SpringBoot + Vue 项目

从 0 开始实现一个 SpringBoot Vue 项目 从 0 开始实现一个 SpringBoot Vue 项目 软件和工具创建 SpringBoot 后端项目创建 MySQL 数据库配置文件实现增删改查接口 Model 层mapper 层service 层controller 层测试 实现项目功能接口 代码测试 创建 Vue 前端 安装 Node.js配置…

每日一题洛谷P1423 小玉在游泳c++

#include<iostream> using namespace std; int main() {double s;cin >> s;int n 0;double sum 0;double k 2;while (sum < s) {sum k;n;k * 0.98;}cout << n << endl;return 0; }

flutter跨端UI框架简介

flutter跨端UI框架简介 简介 Flutter是由Google开发的开源应用开发框架&#xff0c;主要用于构建高性能、跨平台的移动、Web和桌面应用程序。Flutter使用Dart语言&#xff0c;提供了一套丰富的Widgets&#xff0c;使开发者能够快速创建美观的用户界面。其最大特点是热重载功能…

java提取系统应用的日志中的sql获取表之间的关系

为了获取到对应的sql数据&#xff0c;分了三步骤 第一步&#xff0c;获取日志文件&#xff0c;解析日志文件中的查询sql&#xff0c;递归解析sql&#xff0c;获取表关系集合 递归解析sql&#xff0c;获取表与表之间的关系 输出得到的对应关联关系数据 第二步&#xff0c;根据获…

怎么创建一个能在线测试php的html5网页?

代码示例&#xff1a; 一、搭建服务器环境 首先&#xff0c;你需要在服务器上搭建 PHP 运行环境。如果你使用的是 Linux 服务器&#xff0c;可以使用 Apache 或 Nginx 作为 Web 服务器&#xff0c;并安装 PHP 解释器。对于 Windows 服务器&#xff0c;可以使用 WAMP&#xff08…

16_动态提示窗口_协程延时

创建动态提示窗口DynamicWnd.cs 编写代码 using UnityEngine; using UnityEngine.UI; //功能 : 动态窗口界面 public class DynamicWnd : WindowsRoot{public Animation tipsAni;public Text txtTips;protected override void InitWnd() {base.InitWnd();//在启动时先隐藏提示…

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设&#xff0c;原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中&#xff0c;使用的爱快路由器当作网关设备&#xff0c;所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构&#xff0c;但原有的SDWAN分支…

隐私保护+性能优化,RyTuneX 让你的电脑更快更安全

RyTuneX 是一款专为 Windows 10 和 11 用户量身打造的系统优化工具&#xff0c;采用先进的 WinUI 3 框架开发&#xff0c;以其现代化的设计风格和强大的功能集合脱颖而出。这款工具不仅界面简洁美观&#xff0c;还提供了多样化的系统优化选项&#xff0c;旨在帮助用户最大化设备…

java上传图片功能实现

1 MinIO核心概念 下面介绍MinIO中的几个核心概念&#xff0c;这些概念在所有的对象存储服务中也都是通用的。 对象&#xff08;Object&#xff09; 对象是实际的数据单元&#xff0c;例如我们上传的一个图片。 存储桶&#xff08;Bucket&#xff09; 存储桶是用于组织对象的命…