【MySQL系列】表的内连接和外连接学习

「前言」文章内容大致是对MySQL表的内连接和外连接。

「归属专栏」MySQL

「主页链接」个人主页

「笔者」枫叶先生(fy)

目录

一、内连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,前面篇章学习的查询都是内连

接,也是在开发过程中使用的最多的连接查询

内连接语法如下:

sql 复制代码
SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;

说明:

  • 大写的表示关键字,[ ]中代表的是可选项
  • 内连接的条件通过连接条件指明,用户的其他筛选条件通过其他条件指明

显示SMITH的名字和部门名称

按照之前的做法就是,取员工表和部门表的笛卡尔积,在where子句中指明筛选条件为员工的部门号等于部门的部门号,筛选出每个员工匹配的部门信息,并指明员工姓名为SMITH

sql 复制代码
mysql> select ename, dname from emp, dept
    -> where emp.deptno = dept.deptno and ename='SMITH';

上述多表查询的方式本质就是内连接,下面使用标准的内连接SQL编写(写法不同而已):

  • 将员工表和部门号放在from子句中并通过inner join关键字隔开
  • on子句后指明内连接的条件为员工的部门号等于部门的部门号,保证筛选出来的数据是有意义的
  • and之后指明筛选条件为员工的姓名为SMITH
sql 复制代码
mysql> select ename, dname from emp inner join dept 
    -> on emp.deptno = dept.deptno and ename='SMITH';

二、外连接

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

2.1 左外连接

如果进行联合查询,左侧的表完全显示我们就说是左外连接,而右侧的数据不完全显示或者为NULL

语法如下:

sql 复制代码
SELECT ... FROM t1 LEFT JOIN t2 ON 连接条件 [LEFT JOIN t3 ON 连接条件] ... AND 其他条件;

说明:

  • 写的表示关键字,[ ]中代表的是可选项
  • 左外连接的条件通过连接条件指明,用户的其他筛选条件通过其他条件指明

例如,创建两张表

sql 复制代码
-- 建两张表
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);

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

题目要求将没有成绩的学生的个人信息也要显示出来,也就是说学生表当中的内容需要完全被显示出来。

如果在连接学生表和成绩表时将学生表放在左侧,那么就可以使用左外连接

如果左侧表中的某条记录根据连接条件没有找到匹配的右侧表中的记录,其对应的右侧表中的列信息将会用NULL值进行填充

sql 复制代码
mysql> select * from stu left join exam on stu.id=exam.id;

2.2 右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接,而左侧的数据不完全显示或者为NULL

语法如下:

sql 复制代码
SELECT ... FROM t1 RIGHT JOIN t2 ON 连接条件 [RIGHT JOIN t3 ON 连接条件] ... AND 其他条件;

说明:

  • 大写的表示关键字,[ ]中代表的是可选项
  • 右外连接的条件通过连接条件指明,用户的其他筛选条件通过其他条件指明

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

题目要求将没有学生与它对应的成绩信息也要显示出来,也就是成绩表当中的内容需要完全被显示出来

如果在连接学生表和成绩表时将成绩表放在右侧,那么就可以使用右外连接

右侧表中的某条记录根据连接条件没有找到匹配的左侧表中的记录,而其对应的左侧表中的信息将会用NULL值进行填充

sql 复制代码
mysql> select * from stu right join exam on stu.id=exam.id;

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

使用的是雇员信息的数据库

题目要求同时列出部门名和员工信息,因此需要将部门表和员工表连接起来

题目要求同时列出没有员工的部门,也就是部门表当中的内容需要完全被显示出来,如果在连接部门表和员工表时将部门表放在左侧,那么就可以使用左外连接

sql 复制代码
mysql> select dname, emp.* from dept left join emp on dept.deptno=emp.deptno;

也可以右外连接进行操作,右外连接就是显示完全右边的表,即部门表

sql 复制代码
mysql> select dname, emp.* from emp right join dept on dept.deptno=emp.deptno;

--------------------- END ----------------------

c 复制代码
「 作者 」 枫叶先生
「 更新 」 2023.8.26
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。
相关推荐
想摆烂的不会研究的研究生1 小时前
每日八股——Redis(1)
数据库·经验分享·redis·后端·缓存
码熔burning1 小时前
MySQL 8.0 新特性爆笑盘点:从青铜到王者的骚操作都在这儿了!(万字详解,建议收藏)
数据库·mysql
xiaolizi5674891 小时前
安卓远程安卓(通过frp与adb远程)完全免费
android·远程工作
阿杰100012 小时前
ADB(Android Debug Bridge)是 Android SDK 核心调试工具,通过电脑与 Android 设备(手机、平板、嵌入式设备等)建立通信,对设备进行控制、文件传输、命令等操作。
android·adb
猫头虎2 小时前
2025最新OpenEuler系统安装MySQL的详细教程
linux·服务器·数据库·sql·mysql·macos·openeuler
梨落秋霜2 小时前
Python入门篇【文件处理】
android·java·python
哈库纳玛塔塔2 小时前
放弃 MyBatis,拥抱新一代 Java 数据访问库
java·开发语言·数据库·mybatis·orm·dbvisitor
@LetsTGBot搜索引擎机器人3 小时前
2025 Telegram 最新免费社工库机器人(LetsTG可[特殊字符])搭建指南(含 Python 脚本)
数据库·搜索引擎·机器人·开源·全文检索·facebook·twitter
计算机毕设VX:Fegn08954 小时前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
冉冰学姐4 小时前
SSM校园排球联赛管理系统y513u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架应用·开题报告、