联合查询

目录

1、笛卡尔积

2、联合查询

2.1、内连接

2.2、外连接


1、笛卡尔积

笛卡尔积:

笛卡尔积是让两个表通过排列组合的方式,得到的一个更大的表。笛卡尔积的列数,是这两个表的列数相加,笛卡尔积的行数,是这两个表的行数相乘

观察发现,其中有一些数据,是无意义的数据,上图中,当表1的id和表2的student_ID相等时,才是有意义的数据

笛卡尔积,是简单无脑的排列组合,把所有可能的情况都穷举了一遍,包含一些合法的数据也包含非法的无意义的数据。进行多表查询的时候,就需要把有意义的数据筛选出来,无意义的数据过滤掉

2、联合查询

设计数据时把表进行拆分,为了消除表中的字段的依赖关系,比如部分函数依赖,传递依赖。这时会导致一条SQL查出来的数据,对于业务来说是不完整的,我们就可以使用联合查询把关系中的数据全部查出来,在一个数据行中显示详细信息

create table class(class_id bigint primary key auto_increment, name varchar(50)
);
create table student (id bigint primary key auto_increment,name varchar(50) not null,class_id bigint
);
insert into class (name) values ('1班'), ('2班'), ('3班');
insert into student (name, class_id) values('张三',1), ('李四',1), ('王五',2), ('赵六',3);

 

联合查询时MYSQL是如何执行的?

1. 取多张表的笛卡尔积

语法:

select * from 表名,表名;

两张表取笛卡尔积之后,有些数据是无效数据

2. 通过连接条件过滤掉无效数据
两个表之间是有主外键关系的,只需要判断两个表中主外键字段是否相等即可

select * from student, class where student.class_id = class.class_id;

3. 能过指定列查询,来精减结果集
查询列表中通过 表名.列名 的方式指定要查询字段

select student.id, student.name, class.name from student, class
where student.class_id = class.class_id;

通过给表名起别名的方式来简化SQL语句(建议使用这种方式)

总结:

联合查询也叫表连接查询
1. 首先确定哪几张表要参与查询
2. 根据表与表之间的主外键关系,确定过滤条件
3. 精减查询字段,得到想要的结果

2.1、内连接

上述联合查询的过程就是内连接

语法:

第一个是标准的内连接的写法,其中 inner 可以省略

第二个就是上述联合查询的案例

上述的几种写法,选一个合适的就行,一般 where 这种用得更多

案例: 

DROP TABLE IF EXISTS `score`;
DROP TABLE IF EXISTS `student`;
DROP TABLE IF EXISTS `class`;
DROP TABLE IF EXISTS `course`;-- ----------------------------
-- Table structure for class
-- ----------------------------CREATE TABLE `class`  (`class_id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,PRIMARY KEY (`class_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES (1, '计算机系2019级1班');
INSERT INTO `class` VALUES (2, '中文系2019级3班');
INSERT INTO `class` VALUES (3, '自动化2019级5班');-- ----------------------------
-- Table structure for course
-- ----------------------------CREATE TABLE `course`  (`course_id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,PRIMARY KEY (`course_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (1, 'Java');
INSERT INTO `course` VALUES (2, '中国传统文化');
INSERT INTO `course` VALUES (3, '计算机原理');
INSERT INTO `course` VALUES (4, '语文');
INSERT INTO `course` VALUES (5, '高阶数学');
INSERT INTO `course` VALUES (6, '英文');-- ----------------------------
-- Table structure for student
-- ----------------------------CREATE TABLE `student`  (`student_id` bigint NOT NULL AUTO_INCREMENT,`sn` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`mail` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`class_id` bigint NULL DEFAULT NULL,PRIMARY KEY (`student_id`) USING BTREE,UNIQUE INDEX `sn`(`sn` ASC) USING BTREE,INDEX `class_id`(`class_id` ASC) USING BTREE,CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`class_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '09982', '黑旋风李逵', 'xuanfeng@qq.com', 1);
INSERT INTO `student` VALUES (2, '00835', '菩提老祖', NULL, 1);
INSERT INTO `student` VALUES (3, '00391', '白素贞', NULL, 1);
INSERT INTO `student` VALUES (4, '00031', '许仙', 'xuxian@qq.com', 1);
INSERT INTO `student` VALUES (5, '00054', '不想毕业', NULL, 1);
INSERT INTO `student` VALUES (6, '51234', '好好说话', 'say@qq.com', 2);
INSERT INTO `student` VALUES (7, '83223', 'tellme', NULL, 2);
INSERT INTO `student` VALUES (8, '09527', '老外学中文', 'foreigner@qq.com', 2);-- ----------------------------
-- Table structure for score
-- ----------------------------CREATE TABLE `score`  (`score_id` bigint NOT NULL AUTO_INCREMENT,`student_id` bigint NULL DEFAULT NULL,`course_id` bigint NULL DEFAULT NULL,`score` decimal(5, 2) NULL DEFAULT NULL,PRIMARY KEY (`score_id`) USING BTREE,INDEX `student_id`(`student_id` ASC) USING BTREE,INDEX `course_id`(`course_id` ASC) USING BTREE,CONSTRAINT `score_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`) ON DELETE RESTRICT ON UPDATE RESTRICT,CONSTRAINT `score_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `course` (`course_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES (1, 1, 1, 70.50);
INSERT INTO `score` VALUES (2, 1, 3, 98.50);
INSERT INTO `score` VALUES (3, 1, 5, 33.00);
INSERT INTO `score` VALUES (4, 1, 6, 98.00);
INSERT INTO `score` VALUES (5, 2, 1, 60.00);
INSERT INTO `score` VALUES (6, 2, 5, 59.50);
INSERT INTO `score` VALUES (7, 3, 1, 33.00);
INSERT INTO `score` VALUES (8, 3, 3, 68.00);
INSERT INTO `score` VALUES (9, 3, 5, 99.00);
INSERT INTO `score` VALUES (10, 4, 1, 67.00);
INSERT INTO `score` VALUES (11, 4, 3, 23.00);
INSERT INTO `score` VALUES (12, 4, 5, 56.00);
INSERT INTO `score` VALUES (13, 4, 6, 72.00);
INSERT INTO `score` VALUES (14, 5, 1, 81.00);
INSERT INTO `score` VALUES (15, 5, 5, 37.00);
INSERT INTO `score` VALUES (16, 6, 2, 56.00);
INSERT INTO `score` VALUES (17, 6, 4, 43.00);
INSERT INTO `score` VALUES (18, 6, 6, 79.00);
INSERT INTO `score` VALUES (19, 7, 2, 80.00);
INSERT INTO `score` VALUES (20, 7, 6, 92.00);

 

(1)查询 “许仙” 同学的 成绩

select student.name, score.score from student, score where
student.student_id = score.student_id and student.name = '许仙';

五个步骤:

1. 确定查询中涉及到哪些表
2. 对目标表取笛卡尔积
3. 确定连接条件
4. 确定对整个结果集的过滤条件
5. 精减查询字段

(2)查询所有同学的总成绩,及同学的个人信息

1. 确定要参与查询的表是 学生表成绩表

总成绩要用分组查询 group by,搭配聚合函数 sum()

3. 确定两张表之间关联关系
student.student_id = score.student_id

4. 按学生的ld进行分组,并在查询列表中,使用聚合函数sum(分数),计算总分

5. 在查询列表中精减和确定要查询的列

selectst.student_id,stu.name,sum(sc.score) as 总分
fromstudent st, score sc where st.student_id = sc.student_id
group bysc.student_id

(3)查询所有同学的每门课的成绩,及同学的个人信息

1. 确定要参与查询的表
学生表、成绩表、课程表

2.3. 取笛卡尔积、确定表与表之间的连接条件(可以通过表结果查看连接条件)

student.student_id = score.student_id

course.course_id = score.course_id

4. 确定查询的过滤条件where

不需要

5. 精减查询字段

使用 join on 的方式进行查询:

2.2、外连接

外连接分为左外连接、右外连接和全外连接三种类型,MySQL不⽀持全外连接。
• 左外连接:返回左表的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则结果集中对应字段会显示为NULL。
• 右外连接:与左外连接相反,返回右表的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则结果集中对应字段会显示为NULL。
• 全外连接:结合了左外连接和右外连接的特点,返回左右表中的所有记录。如果某⼀边表中没有匹配的记录,则结果集中对应字段会显示为NULL。

以下图两张表为例:

使用内连接时没有4班的数据

使用右外连接,会以 join 右边的表为基准,这个表中的数据会全部显示出来。左边的表没有与之匹配的记录全部用NULL去填充

在student表中插入一个class表中没有的数据,使用左外连接


再用回之前的案例:

“ 老外学中文” 在学生表中存在,在成绩表中不存在


查询哪位同学没有考试成绩
1. 在同学表中有记录
2. 在分数表中没有该同学对应的记录

select * from student st left join score sc on st.student_id = sc.student_id;

进一步筛选:

select * from student st left join score sc on st.student_id = sc.student_id where sc.score_id is null;

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

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

相关文章

【HTML5学习笔记2】html标签(下)

1表格标签 1.1表格作用 显示数据 1.2基本语法 <table><tr> 一行<td>单元格1</td></tr> </table> 1.3表头单元格标签 表头单元格会加粗并且居中 <table><tr> 一行<th>单元格1</th></tr> </table&g…

window 显示驱动开发-分页视频内存资源

与 Microsoft Windows 2000 显示驱动程序模型不同&#xff0c;Windows Vista 显示驱动程序模型允许创建比可用物理视频内存总量更多的视频内存资源&#xff0c;然后根据需要分页进出视频内存。 换句话说&#xff0c;并非所有视频内存资源都同时位于视频内存中。 GPU 的管道中可…

《C 语言指针高级指南:字符、数组、函数指针的进阶攻略》

目录 一. 字符指针变量 二. 数组指针变量 三. 二维数组传参 3.1 二维数组的本质 3.2 访问方式与地址计算 3.3 二维数组的传参方式 3.4 深入解析 *(*(arri)j) 与 arr[i][j] 的等价性 四. 函数指针变量 4.1 函数指针变量的创建 4.2 函数指针变量的使用 4.3 两段"…

Unity:场景管理系统 —— SceneManagement 模块

目录 &#x1f3ac; 什么是 Scene&#xff08;场景&#xff09;&#xff1f; Unity 项目中的 Scene 通常负责什么&#xff1f; &#x1f30d; 一个 Scene 包含哪些元素&#xff1f; Scene 的切换与管理 &#x1f4c1; 如何创建与管理 Scenes&#xff1f; 什么是Scene Man…

内容中台重构企业知识管理路径

智能元数据驱动知识治理 现代企业知识管理的核心挑战在于海量非结构化数据的有效治理。通过智能元数据分类引擎&#xff0c;系统可自动识别文档属性并生成多维标签体系&#xff0c;例如将技术手册按产品版本、功能模块、适用场景进行动态标注。这种动态元数据框架不仅支持跨部…

Vue3:脚手架

工程环境配置 1.安装nodejs 这里我已经安装过了&#xff0c;只需要打开链接Node.js — Run JavaScript Everywhere直接下载nodejs&#xff0c;安装直接一直下一步下一步 安装完成之后我们来使用电脑的命令行窗口检查一下版本 查看npm源 这里npm源的地址是淘宝的源&#xff0…

悦数图数据库一体机发布,让复杂关联计算开箱即用

在金融风控、政务治理、能源监测等关键领域&#xff0c;复杂数据关联分析已成为业务决策的核心需求。然而&#xff0c;信创场景的特殊性——全栈自主可控、海量实时计算、系统高可用性——对传统技术架构提出了近乎苛刻的要求。悦数图数据库一体机应运而生&#xff0c;以软硬协…

收放卷“材料停机减速距离“计算FC(算法公式+ST源代码+C++代码)

PLC运动控制基础系列之梯形速度曲线 PLC运动控制基础系列之梯形速度曲线_三菱运动控制模块梯形加减速-CSDN博客文章浏览阅读3.2k次,点赞3次,收藏7次。本文是关于PLC运动控制的基础教程,重点介绍了梯形速度曲线的概念、计算和应用。讨论了梯形加减速在启动和停止阶段的作用,…

Centos7系统(最小化安装)安装zabbix7版本详细文章、nginx源代码配置、php源代码、mysql-yum安装

zabbix官网链接下载zabbix源代码安装包 选择zabbix版本&#xff08;此文章使用zabbix7.0版本&#xff09; 安装之前由于是最小化安装centos7安装一些开发环境和工具包 文章使用国内阿里源 cd /etc/yum.repos.d/;curl -O https://mirrors.aliyun.com/repo/epel-7.repo;curl -…

描述性统计图表

一、核心图表类型与用途 1、直方图(Histogram) (1)定义:用连续矩形表示数据分布,横轴为数据区间,纵轴为频数或频率。 (2)用途:展示数据分布形态(对称、偏态)、识别离群值。 (3)适用场景:分析连续型变量的分布特征,如收入分布、考试成绩分布。 2、箱线图(Box P…

ThinkPad X250电池换电池芯(理论技术储备)

参考&#xff1a;笔记本电池换电芯的经验与心得分享 - 经典ThinkPad专区 - 专门网 换电池芯&#xff0c;需要克服以下问题&#xff1a; 1 拆电池。由于是超声波焊接&#xff0c;拆解比较费力&#xff0c;如果暴力撬&#xff0c;有可能导致电池壳变形... 2 替换电池芯的时候如…

Java(基础) day01 初识Java

目录 一、运行Java程序 二、基本数据类型 1、整数类型 ​编辑2、浮点型 3、字符型 4、布尔类型 一、运行Java程序 Java是一门半编译型、半解释型语言。先通过javac编译程序把xxx.java源文件进行编译&#xff0c;编译后生成的.class文件是由字节码组成的平台无关、面向JVM的文…

【美团】Java后端一面复盘|网络+线程+MySQL+Redis+设计模式+手撕算法

&#x1f4cd; 面试公司&#xff1a;美团 &#x1f3af; 面试岗位&#xff1a;Java后端开发工程师 &#x1f4de; 面试形式&#xff1a;电话面试 &#x1f552; 面试时长&#xff1a;约 50 分钟 &#x1f501; 面试轮次&#xff1a;第一轮技术面 ✨ 面试整体节奏&#xff1a; …

Go语言八股文之Mysql锁详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

实战案例:采集 51job 企业招聘信息

本文将带你从零开始&#xff0c;借助 Feapder 快速搭建一个企业级招聘信息数据管道。在“基础概念”部分&#xff0c;我们先了解什么是数据管道和 Feapder&#xff1b;“生动比喻”用日常场景帮助你快速理解爬虫组件&#xff1b;“技术场景”介绍本项目中如何使用代理等采集策略…

GMT之Bash语言使用

GMT的操作有自己的逻辑和“命令”&#xff0c;但GMT是可以用Bash语言控制的&#xff0c;所以常常以.sh为后缀写GMT程序。 GMT程序运行步骤如下&#xff1a; 采用cd &#xff0c;定位到指定文件夹&#xff1b;以sh ***.sh运行GMT&#xff0c;得到结果。 另外&#xff0c;遇到…

整合Redis

整合Redis 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>org.apache.commons</groupId><art…

Vue3——Watch侦听器

目录 手动指定监听对象 侦听ref对象 侦听ref对象中的某个属性 reactive写法 watchEffect 自动侦听 多源侦听 一次性侦听器 watch 是⼀个⽤于观察和响应Vue响应式系统中数据变化的⽅法。它允许你指定⼀个数据源&#xff08;可以是 响应式引⽤、计算属性、组件的属性等&#xf…

1、数据结构与算法(Python版-啃书)-绪论

1.1 计算机问题求解 一般而言&#xff0c;人们需要的不是解决一个具体问题的程序&#xff0c;而是解决一类问题的程序。 对于求平方根这样的简单问题&#xff0c;人们希望的也不是专用于求某个数(例如2)的平方根的函数&#xff0c;而是能求任何数的平方根的函数。 用计算机解…

微信小程序之将轮播图设计为组件

在components文件夹上点右键&#xff0c;新建component&#xff0c;命名为swiper 然后将我们之前的代码都拷贝到对应文件中&#xff0c; 然后我们的页面要引用这个组件&#xff0c; 在pages\index\index.json中引入&#xff1a; { "usingComponents": {"van…