【MySQL】表的内连接和外连接

【MySQL】表的内连接和外连接

文章目录

表的连接分为内连接和外连接

1. 内连接

内连接实际上就是利用where子句对两张表的笛卡儿积进行筛选(即我们之前加的过滤条件,过滤掉无意义的数据),即内连接 = 笛卡尔积 + 过滤条件
所以我们前面两篇文章中学到的某些查询就是内连接,这也是在开发过程中使用的最多的连接查询。

语法:

select 字段 from 表1innerjoin 表2on 连接条件 and 其他条件; 

来看一个

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

用之前的写法:

员工姓名在emp表中,部门名称在dept表中,所以要从两表的笛卡尔积中筛选
select ename,dname from emp,dept where emp.deptno=dept.deptno and ename='SMITH';

如果用标准的内连接写法:

那就应该是这样的
select ename,dname from emp inner join dept on dept.deptno=emp.deptno and ename='SMITH';

总结一下笛卡尔积和内连接的区别:

在这里插入图片描述

2. 外连接

外连接分为左外连接和右外连接

2.1 左外连接

在连接查询中:

左外连接返回即左表中的所有行,即使右表中没有匹配的行,右表的列会用 NULL 填充。

语法:

select 字段名 from 表名1leftjoin 表名2on 连接条件 

下面来看一个案例:
先建两张表,插入一些数据

createtable stu (id int, name varchar(30));-- 学生表insertinto stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');createtable exam (id int, grade int);-- 成绩表insertinto exam values(1,56),(2,76),(11,8);
在这里插入图片描述


观察一下这两张表会发现:学生表中有四名学生,成绩表中有三名学生的成绩。但是不是学生表中每个学生都有成绩,且不是成绩表中的每个学生都出现在学生表中。
之所以这样设计,就是为了大家更好的理解左外连接和右外连接。
下面看具体的例子

案例

查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
怎么做呢?

准备工作

如果大家学习过数据库系统概论的话,肯定是知道左外连接和右外连接是什么的。
那这里就结合着课本上的理论进行一个讲解:
前面我们讲了内连接,内连接 = 笛卡尔积 + 过滤条件。
比如我们前面的例子中

连接条件是两表的deptno属性是相等的(在数据库系统概论中这叫做等值连接,在等值连接的基础上把重复的列去掉叫做自然连接)
但是有些情况下,一张表的某个属性值在另一张表中可能找不到相等的值,比如我们刚才新建的表中

stu表中id值3,4和exam表中id值11。两张表都有id这个属性,但是这几个值在另一张表中找不到相等的值。
这时候如果我们对两表进行等值连接(内连接的一种,把过滤条件限定为两表的某个属性列相等)

那么那些不能存在相等的属性值的记录就会被舍弃,这些被舍弃的记录在数据库系统概论中被称为“悬浮元组”

什么是外连接,什么是左/右外连接

然后就可以引出外连接的概念了:

如果把悬浮元组也保留在结果中,其它属性填上空置,那么这种连接就叫做外连接。
如果只保留左表中的悬浮元组,那就叫左外连接
如果只保留右表中的悬浮元组,那就叫右外连接

所以,对于上面两张表,外连接的结果应该是这样的

在这里插入图片描述

那么左外连接就应该是这样:


只保留左表的悬浮元组嘛
那这个结果是啥啊,回看上面的题目:
查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
所以左外连接的结果不就是题目想要的嘛。
学生id为3,4的两名学生没有成绩,但是也把信息也是出来了。

那我们来试一下,对这两张表进行左外连接(语法上面介绍过了)


没有问题,和我们分析的一模一样,所以这个案例题目的答案就是
select * from stu left join exam on stu.id=exam.id;

2.2 右外连接

下面再看右外连接,就很简单了,概念上面已经介绍过了

如果只保留右表中的悬浮元组,那就叫右外连接。
即返回右表中的所有行,即使左表中没有匹配的行,左表的列会用 NULL 填充。

语法:

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

案例:把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来

在这里插入图片描述
现在看到这个题目,相信大家就能直接反应出来要用外连接(当然左表和右表对应的顺序如果调换,那左外连接和右外连接也要调换,还按上面的左右顺序,那这就应该用右外连接)
select*from stu rightjoin exam on stu.id=exam.id;
在这里插入图片描述

2.3 练习

回到之前的三张测试表:
列出部门名称和这些部门的员工信息,同时列出没有员工的部门

在这里插入图片描述

分析一下:

首先这些信息涉及两个表,所以要进行笛卡尔积,然后肯定要过滤掉无意义的信息(这其实就是内连接)。
但是这样的话我们知道回丢弃掉那些不存在等值属性的记录(悬浮元组)。
要保留他们,就要进行外连接。根据左右表的顺序选择合适的外连接方法(左 or 右)

下面来看这道题的场景

先看一下这两张表

会发现40号部门是没有员工的,如果内连接(笛卡尔积+过滤条件——两表的deptno相等)
那么dept表中的40号部门所在的记录则为悬空元组,会被舍弃。但是题目要求要列出没有员工的部门,所以要报了40号部门,那么就应该用外连接
左表右表的顺序不同,这里可以有两种写法
select dept.dname,dept.deptno,emp.* from dept left join emp on dept.deptno=emp.deptno;

如果调换两表的左右顺序,那就用右外连接

结果一样

Read more

IDEA转战TREA AI IDE : springboot+maven+vue项目配置

IDEA转战TREA AI IDE : springboot+maven+vue项目配置

一、trea下载安装 Trae官方网址: https://www.trae.com.cn/ Trae官方文档:https://docs.trae.com.cn/docs/what-is-trae?_lang=zh w3cschool: https://www.w3cschool.cn/traedocs/ai-settings.html 安装这里省略,正常安装即可。 ⚠️这里需要注意,trea有两个版本,一个是国内的版本trea CN,一个国外的版本trea,国外版本需要魔法才能正常使用。 二、插件介绍(后端) 由于是轻量工程,所有很多功能不是软件本身就有的功能,需要我们自己来安装插件来支持我们需要的功能。 1、Extension Pack for Java 如果是java后端工程,建议优先安装这个插件。 Extension Pack for

By Ne0inhk
Flutter 三方库 clean_network 的鸿蒙化适配指南 - 掌握高度解耦的网络层封装技术、助力鸿蒙应用构建具备异常自愈与类型安全能力的整洁架构通讯体系

Flutter 三方库 clean_network 的鸿蒙化适配指南 - 掌握高度解耦的网络层封装技术、助力鸿蒙应用构建具备异常自愈与类型安全能力的整洁架构通讯体系

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 clean_network 的鸿蒙化适配指南 - 掌握高度解耦的网络层封装技术、助力鸿蒙应用构建具备异常自愈与类型安全能力的整洁架构通讯体系 前言 在 OpenHarmony 鸿蒙应用应对“多来源数据合并、复杂的鉴权刷新逻辑、全球化异常拦截”的工程实战中,传统的网络请求封装往往容易演变成“万能类”黑洞。如何实现网络层与业务逻辑的彻底解耦?如何让每一个 API 请求都具备标准化的成功与错误闭环(Either Pattern)?clean_network 作为一个专门为“整洁架构(Clean Architecture)”量身定制的网络增强库,旨在为鸿蒙开发者提供一套高性能、高标准且可单元测试的通讯骨架。本文将详述其在鸿蒙端的实战技法。 一、原原理分析 / 概念介绍 1.1 基础原理 clean_network 的核心逻辑是 基于

By Ne0inhk
Flutter 三方库 ethereum 鸿蒙分布式区块链数字资产上链钱包适配突破:接通 JSON-RPC 加密管线深入打通智能合约闭环实现高价值数字加密交互-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 ethereum 鸿蒙分布式区块链数字资产上链钱包适配突破:接通 JSON-RPC 加密管线深入打通智能合约闭环实现高价值数字加密交互-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 ethereum 鸿蒙分布式区块链数字资产上链钱包适配突破:接通 JSON-RPC 加密管线深入打通智能合约闭环实现高价值数字加密交互无缝穿透 随着 Web3 技术与移动端的深度融合,支持区块链交互的应用日益增多。ethereum 库专注于以太坊(Ethereum)协议的底层通讯,为开发者提供了便捷的 Web3 集成方案。本文将详细介绍该库在 OpenHarmony 上的适配要点与实战指南。 前言 以太坊是目前最活跃的智能合约平台。在鸿蒙操作系统这个创新的万物智联生态中,支持以太坊交互可以为鸿蒙应用带来去中心化身份(DID)、数字资产(NFT)以及去中心化金融(DeFi)等前沿能力。本文将带你实现在鸿蒙端极速调起智能合约并查询链上数据。 一、原理解析 1.1 基础概念 ethereum 库封装了标准的以太坊 JSON-RPC 协议。在鸿蒙端,它利用 HTTP 请求与以太坊节点(

By Ne0inhk
基于Spring AI和Claude构建企业智能客服系统:从架构到实践的完整指南

基于Spring AI和Claude构建企业智能客服系统:从架构到实践的完整指南

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[[email protected]] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? * 专栏导航: 码农阿豪系列专栏导航 面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️ Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻 Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡 全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀 目录 * 基于Spring AI和Claude构建企业智能客服系统:从架构到实践的完整指南 * 为什么选择Spring AI + Claude的技术组合? * Spring AI:企业级AI应用的理想选择 * Claude:强大的对话AI能力 * 系统架构设计 * 整体架构概览

By Ne0inhk