【Mysql】内外连接

news2024/12/28 20:54:31

文章目录

  • **1.内连接**
  • **2.外连接**
      • **3.小结**

1.内连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询

select 字段 from1 inner join2 on 连接条件 and 其他条件;

案例:显示员工SMITH的名字和部门名称

SMITH的名字在员工表, 部门名称在部门表当中, 这里是多表查询

粗暴写法:将员工表和部门表做笛卡尔积,然后过滤非法数据,然后再进行条件筛选,显示我们想要的列

image-20221022111158622

聪明做法:在员工表当中把SMITH员工的名字和部门号查询出来,当成一张新表 ,然后和部门表做笛卡尔积, 然后根据 部门号要相同进行过滤非法数据 ,之后得到的就是SMITH员工在部门表的数据

image-20221022111350169


做法2:使用内连接, 把员工表和部门表做内连接

image-20221022120021463

这3种写法都可以,但是它们还是有一些区别:

  1. 最下面的写法是: 先生成两张表的笛卡尔积,然后再根据where后面的条件进行过滤.
  2. inner join ... on 条件则是根据on后面的条件emp.deptno=dept.deptno and ename='SMITH',在生成笛卡尔积时就进行过滤,不满足这些条件的元组不会生成笛卡尔积.
  3. 第一种写法 和第二种写法 它们的意义也不同,使用on的时候:是根据两个条件再生成笛卡尔积的时候就进行过滤非法数据, 改成where以后, inner join ... on 条件根据的条件则是先根据on后面的条件, emp.deptno=dept.deptno进行过滤生成笛卡尔积之后,然后再筛选where ename='SMITH'.

在使用内连接过滤笛卡尔集中非法数据的时候,我们是直接抛弃的,如果是左外连接,就不能直接抛弃,需要将右半部分置空并保留下来,反之右外连接

2.外连接

外连接就是为了显示出匹配不上的数据,从而确定哪些数据不满足条件

测试表:

--建两张表
create table stu(id int,name varchar(30));--学生表
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
create table exam(id int,grade int);--成绩表
insert into exam values(1,56),(2,76),(11,8);

image-20221022112544699

通过外键id来关联这两个表,因为没有加外键约束,所以exam表中存在一个id为11的学生,这个学生是非法的

如果单纯的进行内连接+条件过滤: 只有左表和右表匹配的信息,满足过滤条件才会显示出来

image-20221022114258397


(1)左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接,拿着左表的信息去右表筛选,满足的都要显示出来

左外连接和内连接几乎没有区别,唯一的区别就是,拿着左表的数据到右表进行拼接,如果匹配不上不会过滤右表数据而是置空显示

  • 当左边表和右边表没有匹配时,也会显示左边表的数据,右边表的数据显示为NULL
select 字段名 from 表名1 left join 表名2 on 连接条件;

案例: 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来

image-20221022112750369

需求:找到非法存在的学生

  • 左外连接以左表为主, 有成绩,但是右表当中学生id为空的就是非法的学生

err写法:

注意:不能使用and,如果使用and的话, exam.id = stu.id and stu.id is null,这样在生成笛卡尔积时就进行过滤,不满足这些条件的元组不会生成笛卡尔积 ,然而stu表当中并没有id为空的,所以不会有结果,右表都是空信息

image-20221022113340606

正确写法:

image-20221022113118780

使用where此时是先根据的条件则是先根据id相同进行过滤, 然后再根据stu表当中id为空进行筛选.

(2)右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接,

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

案例: 对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来

  • 拿着学生表在成绩表里面找, 找到了就拼接,没有找到就显示为NULL

image-20221022113900099

需求:如果想要找到没有参加考试的同学 -> 即在上面的查找数据当中找到成绩表当中没有成绩的同学

image-20221022114038731


案例:列出部门名称和这些部门的员工信息,同时列出没有员工的部门

要列出没有员工的部门 -> 以部门表为主表,在员工表里面找, 如果有员工就拼接,没有找到员工,那么这个部门保留,员工为NULL

image-20221022114706475

  • 使用右连接时,当左边表和右边表没有匹配时,也会显示右边表的数据:
  • 使用左连接时,当左边表和右边表没有匹配时,也会显示左边表的数据:

因为以部门表作为主表,所以如果部门表在左边,就写成左外连接, 否则写成右外连接

需求:如果想找到没有员工的部门: 在上面查找出来的数据中,找到员工表当中的员工编号是空的就是了

image-20221022114903221


3.小结

查询的时候,有大概率会涉及多张表,往往需要把多张表"合并"成一张表,所有查询的本质都是转化为一张表的查询

  • 自连接,from(子查询),内外连接,本质都是回答如何完成多张表的合并工作!!
  • 内连接:保留连接条件大家所共有的,左外连接:保留左侧表的全部信息,右外连接:保留右侧表的全部信息,

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

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

相关文章

IPWorks MQ C++ Edition

IPWorks MQ C Edition 在应用程序中轻松实现消息队列(MQ)通信协议。 IPWorks MQ旨在帮助您轻松实现流行的消息传递协议,以便在网络设备之间进行通信。支持许多常见的协议和服务,包括Azure Relay、AMQP、MQTT、STOMP等。 IPWorks MQ功能 完全符合MQTT版本…

普通物理光学:光栅

透射光栅 光栅常数 a:不透光部分的宽度b:透光部分的宽度dab:光栅常数N:缝数k:光谱的级数衍射图像:单缝衍射多缝干涉 光栅的每条狭缝,都将在接收屏幕上的同一位置,产生同样的单缝夫琅禾费衍射图样各条狭缝的衍射光再在接收屏幕上相…

【Vue脚手架项目的结构】

目录 1. 关于VUE Cli 2. 修改VUE Cli项目的端口号 3. Vue脚手架项目的结构 4. 关于标签 5. 关于路由配置 6. 关于视图组件 7. 应用Element UI 1. 关于VUE Cli VUE Cli:Vue脚手架 在Vue脚手架项目中,使用的是“单页面”的设计模式,也就…

CentOS Linux 的安装

CentOS Linux 的安装 作者:Grey 原文地址: 博客园:CentOS Linux 的安装 CSDN:CentOS Linux 的安装 说明 本安装说明是基于 Windows 10 下 VMware workstation 16 安装 Linux,Linux 版本是 CentOS 8,需…

IPWorks IoT Java Edition

IPWorks IoT Java Edition 在应用程序中轻松实现物联网(IoT)通信协议。 IPWorks IoT旨在帮助您轻松实现联网设备之间通信所需的IoT协议。支持许多常见协议,包括AMQP、MQTT、STOMP、CoAP等。它包括不依赖任何外部库的本地软件组件。 IPWorks物联网功能 在所有QoS级别…

新员工webpack打包后上传服务器页面空白

某天同事小白使用了webpack开发vue项目,在项目开发完成后,使用命令:npm run build对项目进行打包后发布服务器页面显示空白 排查后发现:webpack打包的时候引入js时使用的是绝对路径导致的 解决方案如下 修改webpack打包文件中的…

[附源码]JAVA毕业设计婚纱摄影管理(系统+LW)

[附源码]JAVA毕业设计婚纱摄影管理(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

【Redis-09】面试题之Redis数据结构与对象-RedisObject(下篇)

承接上篇【Redis-08】面试题之Redis数据结构与对象-RedisObject(上篇) 8. type-字符串string 8.1 字符串的三种encoding编码(int embstr raw) 如果保存的是整型,并且可以用long类型标识(-9223372036854…

《InnoDB引擎七》InnoDB关键特性-插入缓存

InnoDB 关键特性 InnoDB存储引擎的关键特性包括: Insert Buffer (插入缓冲)Double Write (两次写)Adaptive Hash Index (自适应哈希索引)Async IO (异步IO)Flush Neighbor Page (刷新领接页) 这些特性为InnoDB存储引擎带来了更好的性能以及更高的可靠性。 插入缓冲…

2023年湖北监理工程师考试时间、报名时间、报考条件是什么?

2023年湖北监理工程师考试时间、报名时间、报考条件是什么? 一、2023年湖北监理工程师考试时间: 参考往年的监理工程师考试时间,预计考试时间为5月份。 二、2023年湖北监理工程师报名时间: 2023年湖北监理工程师报名时间预计3月份…

单例模式【JavaEE初阶】

一、单例模式的概念 单例模式是一种常见的设计模式 。单例模式希望:有些对象,在一个程序中应该只有唯一一个实例,就可以使用单例模式 。换句话说,在单例模式下,对象的实例化被限制了,只能创建一个&#xff…

Mybatis源码解析(七):Mapper代理原理

Mybatis源码系列文章 手写源码(了解源码整体流程及重要组件) Mybatis源码解析(一):环境搭建 Mybatis源码解析(二):全局配置文件的解析 Mybatis源码解析(三):映射配置文件的解析 Mybatis源码解析(四):s…

使用R语言对S&P500股票指数进行ARIMA + GARCH交易策略

在本文中,我想向您展示如何应用S&P500股票市场指数的交易策略。最近我们被客户要求撰写关于交易策略的研究报告,包括一些图形和统计输出。 通过组合ARIMA GARCH模型,从长期来看,我们可以超过“买入并持有”方法。 相…

【MySQL基础】常用指令详解

如果看不清未来,就走好当下的路,做你此刻该去做的事。——《冰雪奇缘2》 目录 1、进入和退出mysql 1.1进入mysql 1.2退出mysql 2、查看mysql中有哪些数据库 2.2.创建数据库 3、使用数据库 3.1开始使用数据库 3.2展示数据库中的表 4、查看表中的…

跨境电商面临“寒冬”考验,如何转型升级入局新赛道(Starday)

近几年随着互联网和高新技术的飞速发展,加之疫情下各国海外贸易政策的管理,跨境贸易模式不断地创新升级,现今的跨境贸易模式已经从线下交易上升为线上交易,各种基于互联网商务网站的电子商务业务和网络公司开始不断地涌现&#xf…

WebDAV之葫芦儿•派盘+FolderSync

FolderSync 支持WebDAV方式连接葫芦儿派盘。 随着业务发展,文件数据增长,如文档更新、资料下载、拍照录像等。如何更好的管理这些资料,不出现丢失的问题就成为了一个很大的问题。也正是有了类似的需求,现在网络上出现了很多的文件同步备份软件。那么,文件同步备份软件哪…

Thread类的start()方法创建线程的底层分析

在Java中通过如下简单代码就可以创建一个新线程 Thread thread new Thread(new Runnable() {Overridepublic void run() {//do something} }); thread.start(); 在start()中又调用了start0(),它才是真正创建线程的方法。 public synchronized void start() {gro…

安全机制(security) - 加解密算法 - 对称加密 - 加解密模式

说明 大部分对称加密算法支持多种加密模式,每种模式的运算结果也不相同。加解密模式是分组加密算法通用的机制,不同算法可能支持相同的加密模式,不同算法支持的加密模式也可能不同。加密和解密需要使用相同的模式才能得到正确的结果。不同的…

CANOE功能介绍

1.CANoe主界面 当计算机安装完CANoe后,用户只需选择“开始”→“所有程序 ”→Vector CANoe 11.0→CANoe 11.0 系 统 菜 单 命 令 即 可 启 动CANoe。 为了快速熟悉CANoe的常用功能,我们可以打开Vector官方的自带例程,一边学习一边实践相关功…

超算/先进计算如何改变现如今对的生活

算力作为新一代的“石油”,与超算/先进计算有着不可分割的紧密联系。 通俗而言,算力泛指计算能力,即数据处理能力。算力大小代表数据处理能力的强弱。从远古的结绳计算到近代的机械式计算,再到现代的数字电子计算,特别…