【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
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。
相关推荐
Jelena技术达人29 分钟前
微店关键词搜索接口(micro.item_search)返回数据测试指南
开发语言·数据库·python
Excuse_lighttime39 分钟前
MYSQL视图
数据库·sql·mysql
sp42a1 小时前
Install PostgreSQL with pgvector
数据库·postgresql·pgvector
XU磊2601 小时前
《Java SQL 操作指南:深入理解 Statement 用法与优化》
java·数据库·sql
大数据追光猿1 小时前
【大模型技术】怎么用agent和prompt工程实现用户的要求?
数据库·microsoft·prompt
阿猹在路上2 小时前
如何在androidstudio开发环境中查看sqlite数据库(按新版本Android Studio Giraffe提供详细步骤和操作说明,附截图,代码)
数据库
苏婳6662 小时前
雷电模拟器连接Android Studio步骤
android·android studio
Foolforuuu2 小时前
为什么会出现redis数据库?redis是什么?
数据库·redis·缓存
syy敬礼2 小时前
数据库技术
数据库
Kaede62 小时前
如何在宝塔mysql修改掉3306端口
linux·服务器·数据库·mysql