【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
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。
相关推荐
阿蒙Amon1 小时前
C# Linq to SQL:数据库编程的解决方案
数据库·c#·linq
花花鱼5 小时前
android studio 设置让开发更加的方便,比如可以查看变量的类型,参数的名称等等
android·ide·android studio
互联网搬砖老肖5 小时前
运维打铁: MongoDB 数据库集群搭建与管理
运维·数据库·mongodb
典学长编程6 小时前
数据库Oracle从入门到精通!第四天(并发、锁、视图)
数据库·oracle
alexhilton6 小时前
为什么你的App总是忘记所有事情
android·kotlin·android jetpack
积跬步,慕至千里6 小时前
clickhouse数据库表和doris数据库表迁移starrocks数据库时建表注意事项总结
数据库·clickhouse
极限实验室7 小时前
搭建持久化的 INFINI Console 与 Easysearch 容器环境
数据库
星辰离彬7 小时前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化
白仑色7 小时前
Oracle PL/SQL 编程基础详解(从块结构到游标操作)
数据库·oracle·数据库开发·存储过程·plsql编程
程序猿小D9 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的个人财务管理系统,推荐!
java·数据库·mysql·spring·毕业论文·ssm框架·个人财务管理系统