MySQL_6 自连接和外连接

news2024/11/20 19:22:37

目录

一、自连接

        1.概述 : 

        2.语法 : 

        3.演示 : 

二、外连接 

        1.为什么需要外连接?

        2.外连接的定义 : 

        3.外连接的演示 : 

                1° 左外连接

                2° 右外连接

                3° 对部门表问题的解决


一、自连接

        1.概述 : 

        自连接是指在同一张表上的连接查询(将同一张看做两张表);自连接本质上就是特殊的多表查询。

        2.语法 : 

        SELECT column_1 [AS alias_1], column_2 [AS alias_2]...

                FROM table_1 表别名, table_2 表别名...

                WHERE connect_expression...;

        注意事项——

        可以根据需要对查询的字段起别名

        对表进行自连接时,必须对该表起两个别名,否则报错;对表起别名时不需要用到AS。

        3.演示 : 

                先来建一张职员表,如下——

CREATE TABLE IF NOT EXISTS `staff`(
	`sno` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
	`sname` VARCHAR(40) NOT NULL DEFAULT '',
	`ssex` CHAR(10),
	`ssalary` DECIMAL(8,2),
	`mgr` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

INSERT INTO `staff`(`sno`,`sname`,`ssex`,`ssalary`,`mgr`)
			VALUES
			(1000,'Cyan','male',15000,500),
			(1001,'Ice','male',17000,501),
			(1002,'Rain','female',20000,502),
			(1003,'Five','female',9900,503),
			(1004,'Rose','female',13500,504),
			(1005,'Wood','male',12700,505),
			(500,'爷1号','male',99999,0),
			(501,'爷2号','male',99999,0),
			(502,'爷3号','male',99999,0),
			(503,'爷4号','male',99999,0),
			(504,'爷5号','male',99999,0),
			(505,'爷6号','male',99999,0);

SELECT * FROM `staff`;

                现要求——
                查询职员编号,职员姓名,以及职员对应的的上级编号和上级姓名。如下:  

# 相当于把第一张表当作了下属表,第二张表当作了上级表(本质是同一张表)。
SELECT
	`demo_1`.`sno` AS 'sub_no',
	`demo_1`.`sname` AS 'sub_name',
	`demo_1`.`mgr` AS 'sup_no',
	`demo_2`.`sname` AS 'sup_name'
FROM
	`staff` `demo_1`,
	`staff` `demo_2` 
WHERE
	`demo_1`.mgr = `demo_2`.sno;
			


二、外连接 

        1.为什么需要外连接?

        多表查询中,通过WHILE子句的条件来对笛卡尔积的结果进行过滤;但是查询结果只会显示WHERE关联条件匹配成功的记录,而不显示匹配失败的记录

                举个栗子,当前有两张表分别是雇员表emp部门表dep,如下图所示 : 

                现要求——
                查询员工姓名,员工职位,员工部门号以及对应的部门名称,并且如果某个部门下没有员工,也要求显示出部门号和部门名称。

SELECT ename,ecareer,emp.deptno,dname
		FROM emp,dep
		WHERE emp.deptno = dep.dno;

                普通的多表查询无法满足我们的需求,因为官员表中没有出现40部门的员工,因此不满足WHERE子句的关联条件,无法显示40部门的部门号和部门名称,但40部门确实真实存在的,这便是多表查询的一个弊端。

        2.外连接的定义 : 

        外连接最常用的有两种,左外连接和右外连接。其中,左外连接表示连接后左侧的表会完全显示右外连接则表示连接后右侧的表会完全显示

        左外连接使用格式如下——

                SELECT column_1, column_2...column_n

                        FROM table_1 LEFT JOIN table_2

                        ON connect_expression;

        右外连接使用格式如下——

                SELECT column_1, column_2...column_n

                        FROM table_1 RIGHT JOIN table_2

                        ON connect_expression;

        注意事项——
        左外连接后,左表中没有的字段自动为NULL;右外连接后,右表中没有的字段自动为NULL。

        3.外连接的演示 : 

                1° 左外连接

                先来建两张表——学生表stus和成绩表scores。
                创建学生表stus的代码如下 : 

CREATE TABLE IF NOT EXISTS `stus`(
	`id` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
	`name` VARCHAR(32) NOT NULL DEFAULT '',
	`sex` CHAR(16) NOT NULL DEFAULT ''
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

INSERT INTO `stus`(`id`, `name`, `sex`)
		VALUES
		(1, 'Cyan', 'male'),
		(2, 'Five', 'female'),
		(3, 'Ice', 'male'),
		(4, 'Rain', 'female'),
		(5, 'Kaiyu', 'male');
		
SELECT * FROM `stus`;

                学生表stus效果如下 : 

                创建成绩表scores的代码如下 : 

CREATE TABLE IF NOT EXISTS `scores`(
	`id` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
	`score` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

INSERT INTO `scores`
		VALUES
		(1, 141),
		(2, 135),
		(5, 142),
		(7, 138),
		(10, 150);
		
SELECT * FROM `scores`;
		

                成绩表scores效果如下 :         

                现要求——
                查询学生的编号,姓名和成绩;并要求显示所有的学生,若该学生无成绩,则成绩一栏显示为空。

SELECT stus.id, `name`, score
		FROM stus LEFT JOIN scores
		ON stus.id = scores.id;

                2° 右外连接

                仍然操作学生表stus和成绩表scores,
                现要求——
                要求查询学生的编号,姓名,性别及成绩;并要求显示所有的成绩,若学生表中无对应的学生,则学生的相关信息显示为空。

SELECT stus.id, `name`, sex, score
		FROM stus RIGHT JOIN scores
		ON stus.id = scores.id;

                3° 对部门表问题的解决

                针对于“为什么需要外连接”中引出的关于显示所有部门的问题,现在可以通过左外连接和右外连接进行解决。
                需求如下——
                查询员工姓名,员工职位,员工部门号以及对应的部门名称,并且如果某个部门下没有员工,也要求显示出部门号和部门名称
                代码如下 : 

# 方式一 : 左外连接
SELECT ename,ecareer,emp.deptno,dname
		FROM dep LEFT JOIN emp
		ON dep.dno = emp.deptno;
		
# 方式二 : 右外连接
SELECT ename,ecareer,emp.deptno,dname
		FROM emp RIGHT JOIN dep
		ON emp.deptno = dep.dno;

        System.out.println("END------------------------------------------------------------------------------"); 

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

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

相关文章

R语言实践——rWCVP:按照物种的原生分布区清洗坐标点

rWCVP:按照物种的原生分布区清洗坐标点 加载库工作流(单个物种)1. 下载发现记录数据(rgbif)2. 发现记录的预备3. 获取原生区范围4. 清除非原生分布记录 加载库 library(rWCVP) library(rgbif) library(tidyverse) lib…

产品Backlog和需求管理

产品Backlog 产品backlog是一个按照价值排序的需求清单。为了达成产品目标,所有的需求都需要放到产品backlog中进行管理和规划。由产品负责人负责管理和维护。Leangoo为每一个里程碑建立了一个产品Backlog看板, 通过这个产品backlog看板来进行需求管理和规划。 里…

搭建服务器的主流中间件有哪些?如何在外网访问内网的服务?

计算机业内人士对于搭建服务器的中间件并不陌生,apache、tomcat、IIS、nginx 都是比较常用的搭建服务器的中间件,它们之间还是有一些区别差异的。今天就说说这些中间件之间有哪些区别,以及如何利用快解析实现内网主机应用让外网访问。 首先说…

大数据入门(六)- UCloud创建云服务器

一.注册UCloud账户 使用UCloud的服务,首先需要注册账户 账户注册非常简单,在UCloud网站首页(https://www.ucloud.cn/)右上角点击快速注册 二.创建VPC 1.注册成功后,选择全部产品 2.选择私有网络UVPC 3.区域选择华北…

uni-app开发小程序使用uni.chooseMedia选择图片,安卓手机无法选择图片

uni-app开发小程序时,使用uni.chooseMedia选择图片,苹果手机是正常的,安卓手机无法打开手机选择图片 问题复现解决方法!!我的反思与总结 问题复现 一、在小程序中,选择图片并上传,是一个很常见…

[Python报错] ImportError: cannot import name ‘timer’ from ‘timer’

[Python报错] ImportError: cannot import name ‘timer’ from ‘timer’ 前言 我最近遇到这个报错,卡了我好长时间去解决,我在互联网上找了很多资料,遗憾的是,我没找到有其他人遇到的类似的问题。所以在这里做一下记录。事实上…

两年外包,从4K涨到了15K....

我18年毕业于一个普通二本学校,电子信息工程学院,是一个很不出名的小本科。大学期间专业知识也没有去认真的学习,所以毕业的时候就随便找了一份工作,在一个外包公司做功能测试。 记得那时候薪资大概是4k左右,因为是以…

神经网络实验---人工神经网络(2)

本实验目的主要是掌握梯度下降法的优化算法;能够使用tf.keras构建Sequential模型,完成多分类任务。 1. 实验目的 ①掌握梯度下降法的优化算法; ②能够使用tf.keras构建Sequential模型,完成多分类任务。 2. 实验内容 ①下载MNIS…

架构设计之复用性概谈

作为开发人员,你对复用这个概念一定不陌生。在开发过程中,我们把系统中通用的代码逻辑抽取出来,变成公共方法或公共类,然后在多个地方调用,这就是最简单的技术上的复用。 但一开始,我们不会过多地考虑复用&…

迭代后首波实测!360智脑一键联网,代码超强,AI诈骗一眼看穿

360大模型(又)交卷了!作为国内首个能联网的大模型,360智脑给了我们怎样的惊喜?话不多说,新鲜出炉的第一手实测来了。 不得不说,自从GPT大模型混战开赛之后,教主周鸿祎可谓是存在感十…

易观分析:消费金融机构以APP为触点,创新消费场景,激发消费活力

易观:随着“用好消费金融、释放消费潜力”等金融支持扩内需的持续深入,消费金融APP活跃用户规模将保持稳健增长的态势,进而在拉动内需、促进消费升级、服务实体经济中扮演更重要的角色。 一、疫情防控较快平稳转段,激发消费市场活…

总结button,input type=“button“,input type=“text“中:[在value添加值] 和 [标签内添加值]的区别

1.如果是需要一个 普通文本框 <input></input>和<input type"text"></input>外观相同 都是 2.对比button,input type"button",input type"text"中&#xff1a;在value添加值 和 标签内 添加值 html中&#xff1a; &l…

第十三章 常用类(Math 类、Arrays 类、System类、Biglnteger 和BigDecimal 类、日期类)

一、Math 类&#xff08;P481&#xff09; Math类包含&#xff0c;用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根和三角函数 &#xff08;1&#xff09;abs&#xff1a;绝对值 &#xff08;2&#xff09;pow&#xff1a;求幂 double pow Math.pow(2, 4); /…

520 | ChatGPT会是一个完美情人吗?

A GENERATIVE AI EXPERIMENT 机器人能感受到爱吗&#xff1f;这个困扰了科学家们多年的未解之谜&#xff0c;如今随着ChatGPT的爆火再次回到人们的视线中。虽然我们尚未准备好为机器赋予情感&#xff0c;但机器已经可以借助生成式AI来帮助人类表达自己的情感。 自然情感表达 …

网络原理(七):http 协议(下)

上一章只是谈到了http 中的几个header属性&#xff1a; Host &#xff1a; 域名端口号Content-Length &#xff1a;表示 body 中的数据长度Content-type &#xff1a;表示 body 中的数据格式。User-Agent &#xff1a;表示浏览器/操作系统的属性。Referer &#xff1a; 表示这…

三年的功能测试,让我女朋友跑了,太难受了...

简单概括一下 先说一下自己的情况&#xff0c;普通本科&#xff0c;18年通过校招进入深圳某软件公司&#xff0c;干了3年多的功能测试&#xff0c;21年的那会&#xff0c;因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不…

Spring之DI(依赖注入)

依赖注入&#xff08;DI&#xff09;是一个过程&#xff0c;在这个过程中&#xff0c;对象仅通过构造函数参数、工厂方法的参数或在对象被实例化后通过属性设置来定义它们的依赖项&#xff08;即与该对象一起工作的其他对象&#xff09;。然后&#xff0c;容器在创建 bean 时注…

【网络】无线路由器和路由器的配置方法

目录 &#x1f352;常见的接入互联网方式 &#x1f353;WAN配置 &#x1f353;LAN口配置 &#x1f353;WLAN配置 &#x1f353;WLAN安全 &#x1f352;路由设备管理 &#x1f353;路由器内部组件 &#x1f353;Cisco路由器的启动过程 &#x1f353;基础命令 &#x1f34e;show …

【中间件漏洞】apache未知扩展名解析漏洞、addhandler导致的解析漏洞、换行解析漏洞(CVE-2017-15715)

目录 apache未知扩展名解析漏洞 漏洞复现 防范建议 AddHandler导致的解析漏洞 防范建议 Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09; 漏洞复现 防范建议 apache未知扩展名解析漏洞 Apache默认一个文件可以有多个以点分割的后缀&#xff0c;当最右边的后缀…

C#入门:编写运行第一个C#程序Helloworld

参考链接&#xff1a; C#入门学习-希里安 下载安装Visual Studio&#xff0c;创建项目 在官网下载安装Professional 2022即可. https://visualstudio.microsoft.com/zh-hans/ 下载时选择C#、.Net框架等支持&#xff0c;安装后运行&#xff0c;新建模板选择 Visual C#、Windo…