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

MySQL ——多表连接查询

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

内连接: 假设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 是更常见和合适的选择。

相关文章:

MySQL ——多表连接查询

一、(左、右和全)连接概念 内连接: 假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来。A和B两张表没有主付之分,两张表是平等的。 关键字:inner join on 语句&#xf…...

前沿技术 --> 待定

一、可会可不会 1.1如何优雅的编写技术文档 网址: 如何优雅的编写技术文档? - YouTube...

Linux定时python脚本(crontab版本)

1.0 使用Linux系统命令 crontab 自带的定时命令2.0 crontab的使用 2.1 添加定时任务 crontab -e2.2 查看定时任务的完成情况 2.2.1 查看日志 tail -f /var/log/syslog | grep CRON 2.2.2 任务执行情况 grep CRON /var/log/syslog 2.3 定时任务的规则 每隔一分钟执行一次…...

修改 Ubuntu .cache 和 pip cache 默认路径

修改 Ubuntu .cache 和 pip cache 默认路径 非常不建议修改 .cache 默认路径,除非你知道修改后的影响。 执行下面命令进行修改, vi /root/.bashrc--- 追加 export XDG_CACHE_HOME/u01/.cache export PIP_CACHE_DIR/u01/.cache ---完结!...

【Java SE】Lambda表达式

目录 ♫什么是Lambda表达式 ♫Lambda表达式的语法 ♫函数式接口 ♫Lambda表达式的使用 ♫变量捕获 ♫ Lambda表达式在集合中的使用 ♪Collection的foreach(): ♪List的sort(): ♪Map的foreach() ♫什么是Lambda表达式 Lambda 表达式是 Java SE 8中一个…...

Kafka-UI

有多款kafka管理应用,目前选择的是github上star最多的UI for Apache Kafka。 关于 To run UI for Apache Kafka, you can use either a pre-built Docker image or build it (or a jar file) yourself. UI for Apache Kafka is a versatile, fast, and lightweight…...

Unity 制作登录功能02-创建和链接数据库(SQlite)

国际惯例:先看效果 1.SQlite是一种嵌入型数据库 在Unity开发游戏时使用SQLite有多种原因,以下是其中一些主要原因: 嵌入式数据库:SQLite是一个嵌入式数据库引擎,这意味着它不需要单独的服务器进程。这使得使用SQLite非…...

算法 岛屿数量-(递归回溯)

牛客网 BM57. 二维矩阵,值为1表示岛屿,0表示海洋,求海洋中岛屿数量。 解题思路: 遍历二维数组,值为1增加岛屿数量记数,同时对此位置进行单独递归遍历上下左右4个方向,将数组坐标范围内同时值为1的元素置…...

安卓恶意应用识别(番外篇)(Python并行(多线程or多进程)执行cmd)

前言 本人为了批量反编译,不得不涉及到批量执行,之前没有彻底理解有关于多线程的概念和python方法,现在只能一步一步尝试,并且实践,写本文以记录。 1. 进程与线程 1.1 什么是进程? 1.1.1 概念 进程是一…...

基于大语言模型扬长避短架构服务

秘诀: 扬泛化之长, 避时延之短...

初识网络编程

一、概述 地球村:亦称世界村,是通过电子媒介将世界紧密联系起来的形象表达,是信息网络时代的集中体现 TCP和UDP: TCP:打电话 -->连接 -->接了 -->通话 UDP:发送完即可 -->接收 计算机网络&a…...

轻松使用androidstudio交叉编译libredwg库

对于安卓或嵌入式开发者而言,交叉编译是再熟悉不过的操作了,可是对于一些刚入门或初级开发者经常会遇到这样的问题:如何交叉编译C++库来生成安卓下的so库呢? 最近有一些粉丝找到我求救,那么我最近刚好有空大致研究了下,帮他们成功编译了其中一个libredwg的C++库,这篇文章…...

【C++杂货铺】一颗具有搜索功能的二叉树

文章目录 一、二叉搜索树概念二、二叉搜索树的操作2.1 二叉搜索树的查找2.2 二叉搜索树的插入2.3 二叉搜索树的删除 三、二叉搜索树的实现3.1 BinarySearchTreeNode(结点类)3.2 BinarySearchTree(二叉搜索树类)3.2.1 框架3.2.2 in…...

uni-app使用vue3,在元素或组件实例上添加ref,用this.$refs显示undefined

项目中引用了一个UI组件库&#xff0c;在表单上添加了ref属性&#xff0c;方便提交时验证。触发提交方法时显示不存在这个方法或this.$refs为undefined。 <u--form labelPosition"left" :model"userInfo" :rules"rules" ref"loginForm&…...

蜂蜜配送销售商城小程序的作用是什么

蜂蜜是农产品中重要的一个类目&#xff0c;其受众之广市场需求量大&#xff0c;但由于非人人必需品&#xff0c;因此传统线下门店经营也面临着痛点&#xff0c;线上入驻平台也有很多限制难以打造自有品牌&#xff0c;无法管理销售商品及会员、营销等&#xff0c;缺少自营渠道&a…...

大数据Flink(八十四):SQL语法的DML:窗口聚合

文章目录 SQL语法的DML:窗口聚合 一、滚动窗口(TUMBLE)...

系统集成|第十八章(笔记)

目录 第十八章 安全管理18.1 信息安全管理18.2 信息系统安全18.3 物理安全管理18.4 人员安全管理18.5 应用该系统安全管理18.6 信息安全等级保护18.7 拓展 上篇&#xff1a;第十七章、变更管理 下篇&#xff1a;第十九章、风险管理 第十八章 安全管理 18.1 信息安全管理 信息安…...

480万商品,如何架构商品治理平台?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿高薪&#xff0c;完成架构的升级&#xff0c;进入架构师赛道&#xff0c;打开薪酬天花板。 最近有小伙伴拿到了一线互联网企业如京东、网易、微博、阿里、汽车之家、极兔、有赞、希音、百度、滴滴的架…...

【C++入门指南】C如何过渡到C++?祖师爷究竟对C++做了什么?

【C入门指南】C如何过渡到C&#xff1f;祖师爷究竟对C做了什么&#xff1f; 前言一、命名空间1.1 命名空间的定义1.2 命名空间使用 二、C输入、输出2.1 std命名空间的使用惯例 三、缺省参数3.1 缺省参数的定义3.2 缺省参数分类 四、函数重载4.1 函数重载概念4.2 C支持函数重载的…...

简易磁盘自动监控服务

本文旨在利用crontab定时任务(脚本请参考附件)来监控单个服务节点上所有磁盘使用情况&#xff0c;一旦超过既定阈值则会通过邮件形式告警相关利益人及时介入处理。 1. 开启SMTP服务 为了能够成功接收告警信息&#xff0c;需要邮件接收客户都安开启SMTP服务。简要流程请参考下…...

CLIP Prompt Tuning实战指南:如何用少量样本优化多模态模型性能

最近在做一个多模态内容理解的项目&#xff0c;用到了CLIP模型。大家都知道CLIP很强大&#xff0c;但真到了要让它适应我们自己的业务数据时&#xff0c;传统全量微调&#xff08;Full Fine-tuning&#xff09;那套方法就有点让人头疼了——动辄几十GB的显存需求&#xff0c;还…...

【笔试真题】- 小红书-2026.03.25-第二套

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 小红书-2026.03.25-第二套 题目一:A先生的用户数据整理 把每条记录的三个字段按类型识别出来即可:带小数点的是经验值,全小写字符串是用户名,剩下的整数就…...

RTX 4090D深度学习镜像效果展示:PyTorch 2.8实测Wan2.2-T2V高清视频生成

RTX 4090D深度学习镜像效果展示&#xff1a;PyTorch 2.8实测Wan2.2-T2V高清视频生成 1. 开箱即用的专业级深度学习环境 当拿到这台搭载RTX 4090D显卡的工作站时&#xff0c;我首先被它的硬件配置震撼了。24GB显存加上120GB内存的组合&#xff0c;在本地运行大型视频生成模型不…...

你的模型评估做对了吗?深入解读泰勒图里的R、RMSE和STD(以sklearn预测为例)

你的模型评估做对了吗&#xff1f;深入解读泰勒图里的R、RMSE和STD&#xff08;以sklearn预测为例&#xff09; 泰勒图作为模型评估的经典可视化工具&#xff0c;表面上只是几个点和线的组合&#xff0c;实则暗藏玄机。许多开发者在使用泰勒图时&#xff0c;常常陷入"距离…...

【英一】考研英语一历年真题及答案解析PDF电子版(1980-2025年)

【英一】考研英语一历年真题及答案解析PDF电子版&#xff08;1980-2025年&#xff09;考试时间 2026年全国硕士研究生招生考试定于12月20日-21日进行。小编整理了提供1980-2025年考研英语一完整真题集&#xff0c;含权威答案解析。PDF高清版本支持直接打印&#xff0c;便于考生…...

DanKoe 视频笔记:生产力提升:专注工作的力量 [特殊字符]

在本节课中&#xff0c;我们将要学习如何通过每天仅 4 小时的专注工作&#xff0c;来显著改变你的生活轨迹。我们将探讨注意力的价值、识别高回报机会的方法&#xff0c;并掌握一套进入并保持深度专注状态的实用技巧。 能够有意识地引导你的注意力&#xff0c;不仅能节省时间&a…...

Qwen3-ASR-1.7B在C++项目中的集成与应用

Qwen3-ASR-1.7B在C项目中的集成与应用 1. 环境准备与快速部署 要在C项目中集成Qwen3-ASR-1.7B语音识别功能&#xff0c;首先需要准备好开发环境。这个模型虽然功能强大&#xff0c;但部署起来并不复杂&#xff0c;只需要几个简单的步骤。 系统要求&#xff1a; 操作系统&am…...

SEO_网站排名不上去?试试这几个SEO解决办法

SEO&#xff1a;网站排名不上去&#xff1f;试试这几个SEO解决办法 如果你发现自己的网站在百度上的排名一直不上去&#xff0c;你可能正面临着一场SEO战争。SEO&#xff0c;全称搜索引擎优化&#xff0c;是提高网站在搜索引擎结果中排名的关键技术。本文将为你详细探讨一些常见…...

开发环境神器:OpenClaw+GLM-4.7-Flash自动补全错误日志解决方案

开发环境神器&#xff1a;OpenClawGLM-4.7-Flash自动补全错误日志解决方案 1. 为什么需要日志自动诊断系统 作为一个长期与开发环境打交道的程序员&#xff0c;我每天要面对数百行日志输出。最头疼的场景莫过于&#xff1a;当你在IDE中调试时&#xff0c;突然蹦出一段晦涩的错…...

屏幕水印是什么?有啥用?如何设置屏幕水印?「干货图文教程」

屏幕水印是什么&#xff1f;屏幕水印&#xff0c;就是在电脑屏幕上显示的文字、图案或标志&#xff0c;就像在纸上盖章一样&#xff0c;但它出现在你的屏幕上。它可以帮助你在处理敏感信息时&#xff0c;增加一层额外的安全保护。屏幕水印有啥用&#xff1f;屏幕水印在企业信息…...