【MySQL】内连接和外连接

news2024/9/30 23:33:22

内连接和外连接

  • 前言
  • 正式开始
    • 内连接
    • 外连接
      • 左外连接
      • 右外连接

在这里插入图片描述

前言

前一篇讲多表查询的时候讲过笛卡尔积,其实笛卡尔积就算一种连接,不过前一篇讲的时候并没有细说连接相关的内容,本篇就来详细说说表的连接有哪些。

本篇博客中主要用到的还是前一篇中的三张表:
在这里插入图片描述
雇员表emp:
在这里插入图片描述

部门表dept:
在这里插入图片描述
薪资等级表:
在这里插入图片描述

这三张表中没有明确指出外键和主键约束,但是是有外键和主键约束的样子的:
在这里插入图片描述
其中不同薪资对应不同的薪资等级。

这三张表就不细说了,等会用例子慢慢了解。

正式开始

内连接

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

说一下语法:

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

这里的连接条件能用and不断级联。

我前一篇中所讲的语法格式和这里的语法格式不太一样,我前一篇对两个表进行连接的时候是这样(假如说是对emp表和dept表进行连接,如果看不懂建议先看一下我前一篇博客:【MySQL】多表查询、子查询、自连接、合并查询详解,包含大量示例,包你会):
在这里插入图片描述

这里给没有看过我上一篇博客的同学简单解释一下:
在这里插入图片描述

如果是用刚刚的语法的话就是这样:
在这里插入图片描述

解释一下:
在这里插入图片描述

两种语法产生的效果都是一样的。不过更推荐用inner join这个语法,至于为什么等会就知道了。

来个例子:

题目>>显示SMITH的名字和部门名称

首先明确一点,SMITH的名字在emp表中:
在这里插入图片描述

但是部门名称在dept表中:
在这里插入图片描述

所以说这是一个多表查询的问题,需要对这两张表进行连接:
在这里插入图片描述
但是这里没有添加连接条件,就会导致产生一些无效的记录。

比如说SMITH对应记录有三条,每条都有着不同的部门,但是SMITH实际上是属于20号部门的,对应dept连接出来的表中10和30号部门的信息没有用。故要去掉这些无效信息。

而emp表和dept表中共同列属性为deptno,需要根据deptno来对两张表进行连接,那么这两张表的连接条件就是二者的deptno要相等:
在这里插入图片描述

这样得到的记录就都是有效的记录了。

再加上题目的条件:SMITH的名字和部门名称,那么就是名字必须位SMITH:
在这里插入图片描述
不过这里的where也可以换成and:
在这里插入图片描述
因为员工名为SMITH也可以算成是一个连接的条件,不过把它算成筛选条件在逻辑上更通畅,所以用where更好一点,更能体现出来过程性。

如果用where,表达的意思就是先用deptno作为链接条件来对这两张表进行连接,连接好之后再用where对ename进行筛选,筛选出来的就是SMITH。逻辑更加清晰。

而用前一篇中的方法的话就会变成这样:
在这里插入图片描述
用的是where将表结构筛选出来。

再挑出来响应的列,结果就是这样:
在这里插入图片描述

逻辑上就是用on作为连接条件,用where作为筛选条件,更加清晰。

外连接

外连接可分为两种,左外连接和右外连接。

左外连接

左外连接就是当两张表进行连接的时候左表所有的数据都要显示,就算右表对应行是没有数据的,也必须要将左表的所有数据显示出来,对应右表没有数据的行会显示为空。

上例子,不然看不懂,先创建两张表,一张学生表:
在这里插入图片描述

插入点数据:
在这里插入图片描述

然后再建一张成绩表:
在这里插入图片描述

插入点数据:
在这里插入图片描述

两张表中的数据并不是所有都能一一对应上的,stu中id为3、4的在exam中没有成绩,而exam中id为11的在stu中没有数据。

左外连接的语法:

select 列名 from 表名1 left join 表名2 on 连接条件 and 其他连接条件;

此时如果将stu放到表名1,exam放到表名2:
在这里插入图片描述
此时stu中3、4没有成绩的也会显示出来,右表中对应列的数据为空。

但如果用内连接就不会显示不完整的数据:
在这里插入图片描述

如果把exam放到表名1位置:
在这里插入图片描述

对应id为11的在stu中没有数据,但是还是会将其显示,右表没有数据的会显示为空。

所以左外连接即在左表必须显示全,右表根据筛选条件连接,如果条件不满足就会显示为空。

来个题目:

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

很简单,其实就是刚刚的示例:
在这里插入图片描述

右外连接

和左外连接同理。右表中的数据必须完全显示。

其实有了左外连接都不需要右外连接了,因为我们在写sql语句的时候完全可以调整两个表名字的位置,这样就能起到同样的效果。

语法:

select 列名 from 表名1 right join 表名2 where 连接条件1 and 连接条件2 ...;

演示一下:
在这里插入图片描述
以右表的exam为主。

再来:
在这里插入图片描述

效果都是一样的。我甚至感觉左外连接看起来更方便一点。

很简单,不细说了。

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

也是刚刚的示例:
在这里插入图片描述

再来一个开头给出的三张表的例子:

题目>>列出部门名称和这些部门的员工信息,同时列出没有员工的部门

其实三dept表有4个部门,但是有一个部门没有员工,这个在生活中也是有的,比如说一个公司某项业务规模还比较小,但是不妨碍开一个空部门,等以后业务扩大了之后再向这个空部门中添加员工。

在这里插入图片描述
看着不太方便,排个序:
在这里插入图片描述

这样看起来就好多了。

到此结束。。。

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

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

相关文章

WifiManager的getConnectionInfo被弃用了?快来使用ConnectivityManager获取更全的网络信息吧

前言 最近在使用flutter写桌面端的一个adb工具,可以使用adb命令无线连接设备,需要电脑和手机在同一局域网内,但是需要手机的ip地址。于是我想到写一个android桌面小组件,点一下就获取WiFi的ipv4地址并显示出来,先去找…

提升性能测试效率:JMeter中的用户自定义变量!

前言 在测试过程中,我们经常会碰到测试服务地址有改动的情况,为了方便,我们会把访问地址参数化,当访问地址变化了,我们只需要把参数对应的值改动一下就可以了。 一:添加配置元件-用户定义的变量&#xff…

P8599 [蓝桥杯 2013 省 B] 带分数(dfs+全排列+断点判断)

思路&#xff1a;1.深度枚举所有排列情况 2.设置为每个排列设置两个断点&#xff0c;分为三部分&#xff1a;a,b,c 3.转换为乘法判断条件&#xff0c;满足加一 代码如下&#xff1a;&#xff08;可用next_permutation全排列函数代替dfs&#xff09; #include<iostream>…

精通Nginx(18)-FastCGI/SCGI/uWSGI支持

最初用浏览器浏览的网页只能是静态html页面。随着社会发展,动态获取数据、操作数据需要变得日益强烈,CGI应运而生。CGI(Common Gateway Interface)公共网关接口,是外部扩展应用程序与静态Web服务器交互的一个标准接口。它可以使外部程序处理浏览器送来的表单数据并对此作出…

TypeScript 学习笔记 第三部分 贪吃蛇游戏

尚硅谷TypeScript教程&#xff08;李立超老师TS新课&#xff09; 1. 创建开发环境 创建工程&#xff0c;使用学习笔记的第二部分安装css部分 npm i -D less less-loader css-loader style-loader对css部分处理&#xff0c;能够运行在低版本浏览器 npm i -D postcss postcss…

数据结构与算法编程题14

设计一个算法&#xff0c;通过一趟遍历在单链表中确定值最大的结点。 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #define OK 1;typedef struct LNode {Elemtype data; //结点保存的数据struct LNode* next; //结构体指针…

每日一题 1410. HTML 实体解析器(中等,模拟)

模拟&#xff0c;没什么好说的 class Solution:def entityParser(self, text: str) -> str:entityMap {&quot;: ",&apos;: "",>: >,<: <,&frasl;: /,&amp;: &,}i 0n len(text)res []while i < n:isEntity Falseif …

【从入门到起飞】JavaSE—多线程(3)(生命周期,线程安全问题,同步方法)

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;生命周期&#x1f384;线程的安全问题&#…

opencv-Otsu‘s 二值化分割

Otsu’s 二值化是一种自适应的图像阈值选择方法&#xff0c;它通过最小化类内方差和最大化类间方差来确定一个最佳的阈值。该方法由日本学者大津展之&#xff08;Otsu&#xff09;于1979年提出&#xff0c;广泛用于图像分割。 该算法的核心在于前景与背景图像的类间方差最大 在…

PC8223(CC/CV控制)高耐压输入5V/3.4A同步降压电路内建补偿带恒流恒压输出

概述 PC8233&#xff08;替代CX8853&#xff09;是一款同步降压调节器,输出电流高达3.4A,操作范围从8V到32V的宽电源电压。内部补偿要求最低数量现成的标准外部组件。PC8233在CC&#xff08;恒定输出电流&#xff09;模式或CV&#xff08;恒定输出电压&#xff09;模式&#x…

HarmonyOS元服务开发实战—端云一体化开发

还记得我第一次接触arkui还是在22年的9月份&#xff0c;当时arkui还在一个比较初试的阶段。时隔一年再见方舟框架&#xff0c;它已经发生了令人瞩目的变化&#xff0c;不得不说华为方舟框架在更新迭代的速度已经遥遥领先。新的功能和性能优化让这个框架更加强大和灵活&#xff…

【实用】PPT没几页内存很大怎么解决

PPT页数很少但导出内存很大解决方法 1.打开ppt点击左上角 “文件”—“选项” 2.对话框选择 “常规与保存” &#xff08;1&#xff09;如果想要文件特别小时可 取消勾选 “将字体嵌入文件” &#xff08;2&#xff09;文件大小适中 可选择第一个选项 “仅最入文档中所用的字…

【SpringBoot篇】Spring_Task定时任务框架

文章目录 &#x1f339;概述&#x1f33a;应用场景&#x1f384;cron表达式&#x1f6f8;入门案例&#x1f38d;实际应用 &#x1f339;概述 Spring Task 是 Spring 框架提供的一种任务调度和异步处理的解决方案。可以按照约定的时间自动执行某个代码逻辑它可以帮助开发者在 S…

腾讯云 小程序 SDK对象存储 COS使用记录,原生小程序写法。

最近做了一个项目&#xff0c;需求是上传文档&#xff0c;文档类型多种&#xff0c;图片&#xff0c;视频&#xff0c;文件&#xff0c;doc,xls,zip,txt 等等,而且文档类型可能是大文件&#xff0c;可能得上百兆&#xff0c;甚至超过1G。 腾讯云文档地址&#xff1a;https://c…

Altium Designer学习笔记11

画一个LED的封装&#xff1a; 使用这个SMD5050的封装。 我们先看下这个芯片的功能说明&#xff1a; 5050贴片式发光二极管&#xff1a; XL-5050 是单线传输的三通道LED驱动控制芯片&#xff0c;采用的是单极性归零码协议。 数据再生模块的功能&#xff0c;自动将级联输出的数…

BootStrap【表格二、基础表单、被支持的控件、表单状态】(二)-全面详解(学习总结---从入门到深化)

目录 表格二 表单_基础表单 表单_被支持的控件 表单_表单状态 表格二 紧缩表格 通过添加 .table-condensed 类可以让表格更加紧凑&#xff0c;单元格中的内补&#xff08;padding&#xff09;均会减半 <table class"table table-condensed table-bordered"…

信创系列之大数据,分布式数据库产业链跟踪梳理笔记…

并购优塾 投行界的大叔&#xff0c;大叔界的投行 【产业链地图&#xff0c;版权、内容与免责声明】1&#xff09;版权&#xff1a;版权所有&#xff0c;违者必究&#xff0c;未经许可不得翻版、摘编、拷贝、复制、传播。2&#xff09;尊重原创&#xff1a;如有引用未标注来源…

数据结构与算法编程题15

设计一个算法&#xff0c;通过遍历一趟&#xff0c;将链表中所有结点的链接方向逆转&#xff0c;仍利用原表的存储空间。 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #define OK 1;typedef struct LNode {Elemtype data; …

Cypress-浏览器操作篇

Cypress-浏览器操作篇 页面的前进与后退 后退 cy.go(back); cy.go(-1);前进 cy.go(forward); cy.go(1);页面刷新 cy.reload() cy.reload(forceReload) cy.reload(options) cy.reload(forceReload, options)**options&#xff1a;**只有 timeout 和 log forceReload 是否…

普通平衡树

题意&#xff1a;略&#xff0c;题中较清晰。 用二叉查找树来存储数据&#xff0c;为了增加效率&#xff0c;尽量使左子树和右子树的深度差不超过一&#xff0c;这样可以时间控制在logn&#xff0c;效率比较高。 右旋和左旋&#xff0c;目的是为了维护二叉树的操作&#xff0…