【MySQL探索之旅】多表查询

在这里插入图片描述

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!

文章目录

  • 1. 多表查询的概念
    • 1.1 笛卡尔积
  • 2. 连接查询
    • 2.1 内连接
    • 2.2 外连接
      • 2.2.1 左外连接
      • 2.2.2 右外连接
    • 2.3 自连接
  • 3. 子查询
    • 3.1 单行子查询
    • 3.2 多行子查询
  • 4. 联合查询

1. 多表查询的概念

多表查询就是对多表查询我们需要的数据. 通过笛卡尔积进行查询

1.1 笛卡尔积

百度百科:

笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。

image-20240416153106532

案例:

image-20240416153733369

笛卡尔积就是得到了一个更大的表. 列数就是原来两个表列数的之和. 行数就是原来两个表行数之乘.

【注意】:笛卡尔积是全排列的过程,在尝试穷举所有的可能性,自然就会产生一些不符合实际情况的数据

上述案例就有一部分为无效数据/无意义的数据

初始化数据:

create table student(id int, name varchar(20), classId int);
inset into student values (1,'张三',1);
insert into student values (2,'李四',2);
insert into student values (3,'赵五',3);
insert into student values (4,'赵六',4);

create table class(classId int, className varchar(20));
insert into class values (1,'计算机科学1班');
insert into class values (2,'软件工程1班');
insert into class values (3,'人工智能1班');
insert into class values (5,'信息安全1班');

2. 连接查询

2.1 内连接

语法:

-- 显示内连接
select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 and 其他条件;
-- 隐式内连接
select 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;

案例1:

-- 查询张三的信息
select * from student, class where student.classId = class.classId and name = '张三';
-- 或者
select * from student inner join class on student.classId = class.classId and name = '张三';

运行结果:

image-20240416160146712

案例2:

-- 查询所有有班级的学生的信息
select * from student inner join class on student.classId = class.classId;
-- 或者
select * from student, class where student.classId = class.classId;

运行结果:

image-20240416160536306

2.2 外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完
全显示我们就说是右外连接。

2.2.1 左外连接

image-20240416162417809

语法:

select 字段名 from 表名1 left join 表名2 on 连接条件;

案例:

-- 查询所有同学的信息,没有班级也要显示
select * from student left join class on student.classId = class.classId;

运行结果:

image-20240416161201950

2.2.2 右外连接

image-20240416162556727

语法:

select 字段名 from 表名1 right join 表名2 on 连接条件;

案例:

-- 查询所有班级的信息,没有学生的班级也要显示
select * from student right join class on student.classId = class.classId;

运行结果:

image-20240416161341743

2.3 自连接

自连接是指在同一张表连接自身进行查询。

自连接将行与行之间的关系, 转换为列于列的关系

测试表:

image-20240418203459272

案例: 查询成绩表中的 Java 成绩大于 C语言成绩的同学

image-20240418202430781

为什么直接自连接报错呢? 如何报错的呢? 通过别名的方式来进行自连接

image-20240418202732384

添加连接条件

select * from sore as s1,sore as s2 where s1.name = s2.name and s1.className ='Java' and s2.className = 'C语言' and s1.sore > s2.sore;

运行结果:

image-20240418203408939

3. 子查询

子查询是指嵌入在其他 SQL 语句中的 select语句,也叫嵌套查询

这种写法实际开发中需要慎重使用, 这种写法违背了编程基本的思想原则(化繁为简), 如果是合并之后的 SQL 命令仍然非常简单直观的话, 使用子查询也是可以的.

3.1 单行子查询

单行子查询: 返回一行记录的子查询

案例: 查询张三同学的同班同学

image-20240418204738020

上诉两条 SQL 命令就可以转化为一条命令

select name from student where classId = (select classId from student where name = '张三') and name != '张三';

运行结果:

image-20240418204911546

3.2 多行子查询

多行子查询:返回多行记录的子查询

案例: 查询学习 计算机基础 或者 Python同学的课程信息

在这里插入图片描述

上诉两条 SQL 命令就可以转化为一条命令

select * from sore where name in (select name from sore where className = '计算机基础' or className = 'Python');

运行结果:

在这里插入图片描述

4. 联合查询

在实际应用中,为了合并多个 select 的执行结果,可以使用集合操作符 unionunion all。使用unionunion all时,前后查询的结果集中,字段需要一致。

  • union : 该操作符用于取得两个结果集的并集. 当使用该操作符时,会自动去掉结果集中的重复行。

    案例: 查询成绩小于90 或者 课程为 Java 的信息

    select * from sore where sore < 90 or className = 'Java';
    select * from sore where sore < 90 union select * from sore where className = 'Java';
    

    运行结果:
    在这里插入图片描述

  • union all : 该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

    案例: 查询成绩小于90 或者 课程为 Java 的信息

    select * from sore where sore < 90 union all select * from sore where className = 'Java';
    

    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CCF PTA 2023年5月C++富有的大壮

【问题描述】 给在一个神秘的国度&#xff0c;有一种多拿多得的疯狂游戏&#xff0c;某日大壮去参赛&#xff0c;在规定区域内里面有 N(N≤100) 堆金币&#xff0c;第i堆金币的总重量和总价值分别是mi,vi(1≤ mi,vi≤100)。大壮有一个承重量为T(T≤1000) 的背包&#xff0c;但…

Mac下XDebug安装

文章目录 1、下载对应的版本2、编译XDebug3、配置XDebug4、配置PhpStormDebug一下 前置工作 Mac下安装HomebrewMac下brew安装php7.4 1、下载对应的版本 首先按照支持的版本和兼容性来下载对应的版本&#xff0c;此表列出了仍支持哪些 Xdebug 版本&#xff0c;以及哪些版本可用…

vue框架中的组件通信

vue框架中的组件通信 一.组件通信关系二.父子通信1.props 校验2.prop & data、单向数据流 二.非父子通信-event bus 事件总线三.非父子通信 (拓展) - provide & inject四.v-model简化父子通信代码五. .sync修饰符 一.组件通信关系 组件关系分类&#xff1a; 1.父子关系…

2024接口自动化测试高频面试题【建议收藏】

一、json和字典的区别&#xff1f; json就是一个文本、字符串&#xff1b;有固定的格式&#xff0c;格式长的像python字典和列表的组合&#xff1b;以key-value的键值对形式来保存数据&#xff0c;结构清晰&#xff0c;。可以说是目前互联网项目开发中最常用的一种数据交互格式…

文件I/O基础-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

本章将介绍Linux应用编程中最基础的知识&#xff0c;即文件I/O&#xff08;Input/Output&#xff09;。文件I/O指的是对文件进行读写操作&#xff0c;在Linux系统中一切皆文件&#xff0c;这是Linux系统设计的核心理念&#xff0c;因此文件I/O操作既是基础又是最重要的部分。本…

【webrtc】m114自己实现的PrioritizedPacketQueue及优先级处理

G:\CDN\WEBRTC-DEV\libwebrtc_build\src\modules\pacing\prioritized_packet_queue.h跟m98不同 :webrtc】m98 RoundRobinPacketQueue的优先级处理,m114直接使用taskqueue顺序处理了。甚至自己实现了优先级队列感觉简化了实现,更为清晰 易读,但是去掉了码率低就优先的逻辑。1…

浮杯式轴向柱塞泵(浮杯泵)应用前景较好 但目前产业化规模小

浮杯式轴向柱塞泵&#xff08;浮杯泵&#xff09;应用前景较好 但目前产业化规模小 浮杯式轴向柱塞泵简称浮杯泵&#xff0c;是利用缸体与柱塞间的相对运动改变腔体容积完成吸排油的一类柱塞泵。浮杯泵是基于浮杯原理开发出来的&#xff0c;浮杯原理是继斜盘式和斜轴式之后一种…

Java反序列化-CC4-2-5-7链分析

环境搭建 在之前环境原有代码的基础上&#xff0c;添加这一段代码 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.0</version></dependency>CC4链分析 CC4可…

C语言 | Leetcode C语言题解之第44题通配符匹配

题目&#xff1a; 题解&#xff1a; bool allStars(char* str, int left, int right) {for (int i left; i < right; i) {if (str[i] ! *) {return false;}}return true; } bool charMatch(char u, char v) { return u v || v ?; };bool isMatch(char* s, char* p) {in…

【探索Linux】P.32(自定义协议)

阅读导航 引言一、自定义协议概念二、自定义协议需要注意的事项三、自定义协议示例(跨网络计算器协议)✅协议代码&#xff08;Protocol.hpp&#xff09;1. 计算器协议简单介绍2. 序列化部分3. 反序列化部分4. 请求和响应数据结构5. 使用自定义协议 四、总结温馨提示 引言 在上…

iOS - 多线程-GCD

文章目录 iOS - 多线程-GCD1. 常见多线程方案2. GCD2.1 GCD的常见函数GCD中有2个用来执行任务的函数 2.2 GCD的队列2.2.1 GCD的队列可以分为2大类型 2.3 容易混淆的术语2.4.1 有4个术语比较容易混淆&#xff1a;同步、异步、并发、串行 2.4 各种队列的执行效果 3. 死锁3.1 死锁…

了解BACnet的对象模型 (三)

文章目录 前言18个对象BACnet 对象的属性设备对象&#xff08;Device&#xff09;的属性输入输出值对象类型及其属性 在代码中的表达Device对象的属性模拟输入对象的属性 小结 前言 在楼宇自控网络中&#xff0c;各种设备之间要进行数据交换&#xff0c;为了能够实现设备的互操…

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(四)、设计实现

本次实验&#xff08;一&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天大学】实验&#xff1a;时序逻辑设计——三色灯开关&#xff08;一&#xff09;、实验指导书 本次实验&#xff08;二&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天…

【Yolov系列】Yolov5学习(一)补充1.1:自适应锚框计算

1、Yolov5的网络结构 Yolov5中使用的Coco数据集输入图片的尺寸为640*640&#xff0c;但是训练过程的输入尺寸并不唯一&#xff0c;Yolov5可以采用Mosaic增强技术把4张图片的部分组成了一张尺寸一定的输入图片。如果需要使用预训练权重&#xff0c;最好将输入图片尺寸调整到与作…

表达式求值(后缀表达式)(数据结构)

一、概念 算术表达式是由操作数&#xff08;运算数&#xff09;、运算符&#xff08;操作符&#xff09;、和界线符&#xff08;括号&#xff09;三部分组成&#xff0c;在计算机中进行算术表达式的计算是通过堆栈来实现的。 二后缀表达式的逻辑和实现方式&#xff08;逆波兰…

CST电磁仿真软件波导端口和离散端口的设置流程【教程解读】

置波导端口 通过波导端口馈电! Simulation > Sources and Loads > Waveguide Port 假设Waveguide Port是无限长的波导上给定的Mode&#xff0c;用来激励电磁场。相比离散端口(Discrete Port)&#xff0c;波导端口可以提供很好的模式匹配&#xff0c;因此能提供更高的精…

Android Material Design学习笔记

Material Design控件学习记录 Toolbar 新建一个工程后&#xff0c;在res/values/themes.xml文件里 <resources xmlns:tools"http://schemas.android.com/tools"><!-- Base application theme. --><style name"Theme.MaterialTest" paren…

Python的round与Excel的round不一样?

Python四舍五入怎么做 round()奇进偶舍round函数既不是“四舍五入”的原则&#xff0c;也不是“四舍六入无成双”的原则。 decimal round() 偶然发现python的round函数和excel的round函数对某些数据的处理结果不一致。有看到博主提到是奇进偶舍的方法&#xff0c;但经过验证和…

深度学习与神经网络入门

前言 人工智能&#xff08;AI&#xff09;与机器学习&#xff08;ML&#xff09;与深度学习&#xff08;DL&#xff09;的关系&#xff1a; DL包含于ML&#xff0c;ML包含于AI。 即深度学习是机器学习一部分&#xff0c;机器学习又是人工智能的一个分支。 那么深度学习到底有…

关系型数据库的相关概念

表、记录、字段 表 一个实体集相当于一个表记录 一个实体相当于一个记录&#xff0c;在表中表表现为一行数据字段 一个字段相当于数据库表中的列 表的关联关系 一对一(一对一的表可以合并成一张表)一对多多对多 必须创建第三张表&#xff0c;该表通常称为联接表&#xff0c…