MySQL_6 自连接和外连接

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: MySQL 第六节 表的自连接和外连接 内容分享。

目录

一、自连接

       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.演示 :

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

CREATETABLE IF NOT EXISTS `staff`(  `sno` MEDIUMINTUNSIGNEDNOTNULL DEFAULT 0,  `sname` VARCHAR(40)NOTNULL DEFAULT '',  `ssex` CHAR(10),  `ssalary` DECIMAL(8,2),  `mgr` MEDIUMINTUNSIGNEDNOTNULL DEFAULT 0) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;INSERTINTO `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`;

image.gif

image.png

image.gif编辑

              现要求——

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

# 相当于把第一张表当作了下属表,第二张表当作了上级表(本质是同一张表)。
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;

image.gif

image.png

image.gif编辑


二、外连接

       1.为什么需要外连接?

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

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

image.png

image.png

               现要求——

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

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

image.gif

image.png

image.gif编辑

               显然,普通的多表查询无法满足我们的需求。这是因为雇员表中没有出现40部门的员工,因此不满足WHERE子句的关联条件,而多表查询只会显示匹配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的代码如下 :

CREATETABLE IF NOT EXISTS `stus`(  `id` MEDIUMINTUNSIGNEDNOTNULL DEFAULT 0,  `name` VARCHAR(32)NOTNULL DEFAULT '',  `sex` CHAR(16)NOTNULL DEFAULT '') CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;INSERTINTO `stus`(`id`, `name`, `sex`)VALUES(1,'Cyan','male'),(2,'Five','female'),(3,'Ice','male'),(4,'Rain','female'),(5,'Kaiyu','male');SELECT*FROM `stus`;

image.gif

               学生表stus效果如下 :

image.png

image.gif编辑

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

CREATETABLE IF NOT EXISTS `scores`(  `id` MEDIUMINTUNSIGNEDNOTNULL DEFAULT 0,  `score` MEDIUMINTUNSIGNEDNOTNULL DEFAULT 0) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;INSERTINTO `scores`
VALUES(1,141),(2,135),(5,142),(7,138),(10,150);SELECT*FROM `scores`;

image.gif

              成绩表scores效果如下 :        

image.png

image.gif编辑

              现要求——

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

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

image.gif

image.png

image.gif编辑

               2° 右外连接

               仍然操作学生表stus和成绩表scores,

               现要求——

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

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

image.gif

image.png

image.gif编辑

               3° 对部门表问题的解决

               针对于“为什么需要外连接”中引出的关于显示所有部门的问题,现在可以通过左外连接和右外连接进行解决。

               需求如下——

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

               代码如下 :

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

image.gif

image.png


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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10天前
|
SQL 关系型数据库 MySQL
【Go语言专栏】使用Go语言连接MySQL数据库
【4月更文挑战第30天】本文介绍了如何使用Go语言连接和操作MySQL数据库,包括选择`go-sql-driver/mysql`驱动、安装导入、建立连接、执行SQL查询、插入/更新/删除操作、事务处理以及性能优化和最佳实践。通过示例代码,展示了连接数据库、使用连接池、事务管理和性能调优的方法,帮助开发者构建高效、稳定的Web应用。
|
15天前
|
存储 关系型数据库 MySQL
SpringSecurity_连接mysql(初出茅庐)
SpringSecurity_连接mysql(初出茅庐)
20 0
|
23小时前
|
存储 算法 关系型数据库
MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀
MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀
|
8天前
|
SQL 数据可视化 关系型数据库
【MySQL-11】多表查询全解-【多表关系/内外自连接/子查询/多表查询案例链接】(可cv代码&案例演示)
【MySQL-11】多表查询全解-【多表关系/内外自连接/子查询/多表查询案例链接】(可cv代码&案例演示)
|
10天前
|
关系型数据库 MySQL Java
datagrip连接mysql报错: No appropriate protocol (protocol is disabled or cipher suites are inappropriate
datagrip连接mysql报错: No appropriate protocol (protocol is disabled or cipher suites are inappropriate
|
10天前
|
关系型数据库 MySQL PHP
【PHP 开发专栏】PHP 连接 MySQL 数据库的方法
【4月更文挑战第30天】本文介绍了 PHP 连接 MySQL 的两种主要方法:mysqli 和 PDO 扩展,包括连接、查询和处理结果的基本步骤。还讨论了连接参数设置、常见问题及解决方法,如连接失败、权限和字符集问题。此外,提到了高级技巧如使用连接池和缓存连接信息以优化性能。最后,通过实际案例分析了在用户登录系统和数据管理中的应用。
|
10天前
|
SQL 关系型数据库 MySQL
使用Python的pymysql库连接MySQL,执行CRUD操作
使用Python的pymysql库连接MySQL,执行CRUD操作:安装pymysql,然后连接(host='localhost',user='root',password='yourpassword',database='yourdatabase'),创建游标。查询数据示例:`SELECT * FROM yourtable`;插入数据:`INSERT INTO yourtable...`;更新数据:`UPDATE yourtable SET...`;删除数据:`DELETE FROM yourtable WHERE...`。
25 0
|
11天前
|
DataWorks NoSQL 关系型数据库
DataWorks操作报错合集之在使用 DataWorks 进行 MongoDB 同步时遇到了连通性测试失败,实例配置和 MongoDB 白名单配置均正确,且同 VPC 下 MySQL 可以成功连接并同步,但 MongoDB 却无法完成同样的操作如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
28 1
|
11天前
|
弹性计算 关系型数据库 MySQL
检测MySQL 数据库连接数量
【4月更文挑战第29天】
8 0
|
11天前
|
Java 关系型数据库 MySQL
Java基础教程(20)-Java连接mysql数据库CURD
【4月更文挑战第19天】MySQL是流行的关系型数据库管理系统,支持SQL语法。在IDEA中加载jar包到项目类路径:右击项目,选择“Open Module Settings”,添加库文件。使用JDBC连接MySQL,首先下载JDBC驱动,然后通过`Class.forName()`加载驱动,`DriverManager.getConnection()`建立连接。执行CRUD操作,例如创建表、插入数据和查询,使用`Statement`或`PreparedStatement`,并确保正确关闭数据库资源。