MySQL ——多表连接查询

news2024/10/6 16:18:54

一、(左、右和全)连接概念

内连接: 假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来。A和B两张表没有主付之分,两张表是平等的。


关键字:inner join on
语句:select * from a_table a inner join b_table b on a.a_id = b.b_id;

说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

左连接(左外连接,表示左边的这张表是主表): 假设A和B表进行连接,使用外连接的话,A,B两张表中有一张主表,一张副表,主要查询主表中数据,捎带着查询副表。当副表中数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。外连接主要特点: 主表中的数据无条件全部查询出来。

关键字:left join on / left outer join on
语句:select * from a_table a left join b_table b on a.a_id = b.b_id;

说明:left join 是left outer join的简写,称是左外连接,是外连接中的一种。
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

右连接(右外连接,表示右边的这张表是主表


关键字:right join on / right outer join on
语句:select * from a_table a right outer join b_table b on a.a_id = b.b_id;
说明:right join是right outer join的简写,全称是右外连接,是外连接中的一种。
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。

全连接(全外连接)MySQL目前不支持此种方式,可以用其他方式替代解决。


全外连接:左表和右表都不做限制,所有记录都显示,两表不足地方用null 填充,也就是:
左外连接=左表全部记录+相关联结果    ;右外连接=右表全部记录+相关联结果

综上:

  • 内连接:只返回两个表中匹配的行,即两个表中连接字段相等的行。
  • 全连接:返回两个表中所有的行,无论是否有匹配的行。如果某个表中没有匹配的行,对应的结果集中该表的部分会使用NULL填充。

二、连表查询SQL实例

问题:根据下列的三张表,求出总分最高的学生。

-- create
CREATE TABLE course(
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE student (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE score(
id INTEGER PRIMARY KEY,
course_id INTEGER NOT NULL,
student_id INTEGER NOT NULL,
score INTEGER NOT NULL
);

INSERT INTO course VALUES(1, "语文"), (2, "数学"), (3, "外语");
INSERT INTO student VALUES(1, "小张"), (2, "小王"), (3, "小马");
INSERT INTO score VALUES(1, 1, 1, 80), (2, 2, 1, 90), (3, 3, 1, 70);
INSERT INTO score VALUES(4, 1, 2, 70), (5, 2, 2, 90), (6, 3, 2, 80);
INSERT INTO score VALUES(7, 1, 3, 80), (8, 2, 3, 60), (9, 3, 3, 70);

SELECT *FROM course;
SELECT *FROM student;
SELECT *FROM score;

       当然这里面包含两种情况,到底是单科总分最高,还是所有科总分加起来最高,如果面试官没有讲清楚,还是先别急于回答,或者把这两个情况都分析一遍:

①、求所有科目总分最高的学生

SELECT s.name, t.total_score 
FROM student s 
RIGHT JOIN 
    (SELECT student_id, SUM(score) AS total_score 
    FROM score 
    GROUP BY student_id 
    HAVING SUM(score) = (
        SELECT SUM(score) 
        FROM score 
        GROUP BY student_id 
        ORDER BY SUM(score) DESC 
        LIMIT 1)
     ) t ON s.id = t.student_id;

具体SQL的解释如下:

这个查询的目的是找到总成绩排名第一的学生,并返回该学生的姓名和总成绩。

  1. 子查询 t:首先,我们执行一个子查询来计算每个学生的总成绩。

    子查询从 score 表中获取每个学生的学生 ID (student_id) 和对应的成绩总和 (SUM(score) AS total_score)。使用 GROUP BY student_id 对成绩进行分组,以便计算每个学生的总成绩。然后,通过 HAVING SUM(score) = (SELECT SUM(score) FROM score GROUP BY student_id ORDER BY SUM(score) DESC LIMIT 1) 这一行筛选出总成绩最高的学生,确保只选择总成绩等于所有学生中最高总成绩的学生。

  2. 主查询:在主查询中,我们使用 RIGHT JOIN 将学生表 (student) 和子查询 t 关联起来。这样,我们可以获取到总成绩最高的学生以及他们的总成绩。通过 ON s.id = t.student_id 来建立关联条件,确保学生 ID 匹配。

  3. 结果过滤:在最终结果中,我们选择了学生的姓名 (s.name) 和对应的总成绩 (t.total_score)。

②、求单科科目总分最高的学生

SELECT s.name, c.name , s2.max_score FROM score s1
RIGHT JOIN 
    (SELECT MAX(score) max_score, course_id 
    FROM score 
    GROUP BY course_id) s2
ON s1.course_id = s2.course_id AND s1.score = s2.max_score
LEFT JOIN course c ON c.id = s1.course_id
LEFT JOIN student s ON s1.student_id = s.id

具体SQL的解释如下:

  • SELECT s.name, c.name AS course_name, s2.max_score: 这部分定义了要选择的列。s.name 表示学生的姓名,c.name AS course_name 表示课程的名称(使用别名 course_name),s2.max_score 表示最高分数。
  • FROM score s1: 这表示从 score 表中查询数据,并为其创建别名 s1
  • (SELECT MAX(score) max_score, course_id FROM score GROUP BY course_id) s2: 这是一个子查询,它计算每门课程的最高分,并将结果存储在 s2 中。它选择了每个课程的最高分数(使用别名 max_score)和课程ID。

  • RIGHT JOIN: 这是一个右连接,将 s1 和 s2 进行连接。它基于课程ID和最高分数匹配。
  • ON s1.course_id = s2.course_id AND s1.score = s2.max_score: 这是连接条件,用于将 s1 和 s2 进行连接,使得课程ID和最高分数相匹配。
  • JOIN student s ON s1.student_id = s.id: 这是一个内连接,将 s1 和 student 表连接起来。它基于学生ID匹配 (可以展示出 学生的姓名)。
  • LEFT JOIN course c ON c.id = s1.course_id: 这是一个左连接,将 s1 和 course 表连接起来。它基于课程ID匹配(可以展示出 课程的名称)。
  • 最后的查询结果将包含学生的姓名、课程名称和最高分。

        如果将原来的 LEFT JOIN 连接操作更改为 RIGHT JOIN,则结果中将显示右表(即子查询 s2)的所有记录,而左表(即 score s1)在右表中没有匹配的记录将被包含为 NULL 值。具体来说,右连接(RIGHT JOIN)会返回右表中满足连接条件的记录,并且左表中不满足连接条件或没有匹配的记录将被包含为 NULL 值。

        在这种情况下,由于 s2 是一个子查询,它计算了每门课程的最高分,并且只包含具有最高分的信息,所以使用 RIGHT JOIN 可能不会得到预期的结果。因为右表中的记录数量较少,而左表中的记录数量较多。

        如果我们想要获取所有的学生姓名和对应课程的最高分,并将它们与课程名称进行匹配,那么使用 LEFT JOIN 是更常见和合适的选择。

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

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

相关文章

更好用的的MybatisPlus:MybatisFlex(上)

更好用的的MybatisPlus:MybatisFlex(上) 前言 Mybatis 是我们常用的一个 ORM 框架,而 MybatisPlus (以下简称 MP) 则是对 Mybatis 进行了一层封装,便捷了我们的开发工作,但是由于其…

进程管理--进程调度基本概念

进程调度 进程调度的核心代码实现参考 kernel/sched/ 目录文件,主要包含以下几个部分: 调度算法:Linux 中实现了多种不同的进程调度算法,如 CFS(Completely Fair Scheduler)、O(1) 调度算法、实时调度算法…

RocketMQ Dashboard说解

RocketMQ Dashboard 是 RocketMQ 的管控利器,为用户提供客户端和应用程序的各种事件、性能的统计信息,支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。 介绍​ 功能概览​ 面板功能运维修改nameserver 地址; 选用 VIPChannel驾驶舱查看 …

python编程:加速计算机,优化性能的关键一步——清理临时文件夹Temp

引言: 随着时间的推移,您可能会注意到计算机的性能开始变慢。这可能是由于许多因素导致的,其中一个常见的问题是临时文件的积累。临时文件是由操作系统和应用程序生成的临时性文件,它们在使用后往往被遗忘或忽视。在本篇博客中&am…

[移动通讯]【Carrier Aggregation-4】【LTE-6】

前言: 这里主要介绍一下CA 技术里面,物理层主要工作。 参考: 载波聚合(CA) 目录: 1: CA 总体分析流程 2: CA 物理层 一 CA 总体分析流程 二 CA物理层 2.1 载波聚合LOG分析的相关包…

基于微信小程序的英语互助小程序设计与实现(亮点:小组制打卡、模拟考试答题、错题本、学习论坛)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

如何看待中小企业实现数字化转型难的问题?_光点科技

随着科技的飞速发展和市场的竞争日益激烈,传统制造型企业不得不迎头赶上数字化时代的步伐,以保持竞争力并实现可持续增长。数字化转型已成为企业生存和成功的必经之路,但对于那些长期依赖传统方法的企业来说,这个过程可能会充满挑…

积加ERP与金蝶云星空对接集成日期范围报告查询打通销售出库新增

积加ERP与金蝶云星空对接集成日期范围报告查询打通销售出库新增 对接源平台:积加ERP 积加创始人及核心产品技术团队,深耕于跨境电商技术领域十余年,深刻领悟卖家在Amazon业务运营各环节的核心诉求,结合多年技术管理经验,全面考虑中…

18年互联网老兵:技术人如何快速成长?!

见字如面,我是军哥。 先问你几个问题。 你是不是每天996,但技术能力还是没有提高? 你是不是明明很努力却进步缓慢? 你是不是在同一家公司干了三年,感觉自己就有三年工作经验了? 你是不是明明知道想要什么&a…

【调度算法】进程调度算法、内存页面置换算法、LRU算法、LFU算法、磁盘调度算法等重点知识汇总

目录 进程调度算法 内存页面置换算法 LRU算法实现 LFU算法实现 磁盘调度算法 进程调度算法 当 CPU 空闲时,操作系统就选择内存中的某个「就绪状态」的进程,并给其分配 CPU。 什么时候会发生 CPU 调度呢?通常有以下情况: 当…

数字孪生燃气可视化系统的九问九答

关键词:数字孪生燃气、智慧燃气、数字孪生燃气系统、智慧燃气平台、智慧燃气场站 谈谈数字孪生燃气系统? 数字孪生燃气是将数字孪生技术应用于燃气运营中,与燃气系统物理实体、数据中心、信息系统等相结合,从而完成辅助管网设计…

想要在手机上查看三维模型、正射影像、激光点云?快来试试这款app

「四维轻云」是一款轻量化的地理空间数据管理云平台,支持地理空间数据的在线管理、编辑及分享。平台有项目管理、场景搭建、发布分享、素材库等功能模块,支持多用户在线协作管理,实现了轻量化、便捷化的空间数据应用。 很多行业用户想要在手…

Observability:使用 OpenTelemetry 自动检测 Java 应用程序

作者:David Hope 在快节奏的软件开发领域,特别是在云原生领域,DevOps 和 SRE 团队日益成为应用程序稳定性和增长的重要合作伙伴。 DevOps 工程师不断优化软件交付,而 SRE 团队则充当应用程序可靠性、可扩展性和顶级性能的管理者。…

linux使用操作[2]

文章目录 版权声明网络传输ping命令wget命令curl命令端口linux端口端口命令和工具 进程管理查看进程关闭进程 主机状态top命令内容详解磁盘信息监控 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相…

视频转码软件 EditReady mac中文版介绍

EditReady for Mac是一款专业高效的视频转码器,拥有快速,强大的特点,可以调整视频大小,对视频进行旋转,重新定时等功能,对于需要的朋友,还可以查看和编辑元数据,EditReady Mac中文版…

Ubuntu 安装 Docker 的详细步骤

文章目录 简介1.更新2.安装必要的软件包2.1 基于阿里源 3.验证 Docker 安装是否成功4.安装后的一些常规设置及常用的命令4.1 启动 Docker4.2 Docker 在系统启动时自动运行4.3 运行一个 Hello World 镜像4.4 查看docker运行状态 欢迎来到这篇关于在 Ubuntu 上安装 Docker 的教程…

【数据库——MySQL】(10)视图和索引

目录 1. 视图1.1 创建视图1.2 查询视图 2. 索引2.1 索引的分类2.2 索引的建立 参考书籍 1. 视图 1.1 创建视图 基础语法: CREATE [OR REPLACE] VIEW 视图名[(列名表)]ASSELECT语句[WITH CHECK OPTION]说明: 在默认情况下,将在当前数据库创…

WRF高精度气象模拟技术及在地学领域中的实践应用

随着生态文明建设和“碳中和”战略的持续推进,我国及全球气候变化及应对是政府、科学界及商业界关注的焦点。气候是多个领域(生态、水资源、风资源及碳中和等问题)的主要驱动因素,合理认知气候变化有利于解释生态环境变化机理及过…

一个案例熟悉使用pytorch

文章目录 1. 完整模型的训练套路1.2 导入必要的包1.3 准备数据集1.3.1 使用公开数据集:1.3.2 获取训练集、测试集长度:1.3.3 利用 DataLoader来加载数据集 1.4 搭建神经网络1.4.1 测试搭建的模型1.4.2 创建用于训练的模型 1.5 定义损失函数和优化器1.6 使…

Open3D点云处理简明教程

推荐:用 NSDT编辑器 快速搭建可编程3D场景 这是“激光雷达入门”文章的延续。 在这篇文章中,我们将查看用于处理点云的 python 库和 Open3D 数据结构,执行可视化并操作点云数据,以便进行后续的分析处理。 如果你需要快速预览3D点…