【MySQL】内外连接

> 作者:დ旧言~

> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:了解MySQL的内外连接。

> 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!

> 专栏选自:带你玩转MySQL

> 望小伙伴们点赞👍收藏✨加关注哟💕💕

​​

一、前言

想必大家在学校也学习过MySQL,可能学的懵懵懂懂,这个板块我们从入门开始,从最新的安装MySQL到学习MySQL语句,一步一步开始,一切都是新的,新的板块新的开始,大家一起努力,一起进步!!!

主体

学习【MySQL】内外连接咱们按照下面的图解:

2.1内连接

概念:

内连接实际上就是利用 where 子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。

语法:

cpp 复制代码
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

举个栗子:****( 一张员工表和一张部门表**)**

显示SMITH的名字和部门名称:

方法一:使用前面的查询方式

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

cpp 复制代码
select ename,dname from emp,dept where emp.deptno=dept.deptno and ename='SMITH';

方法二:使用标准内连接查询

  • 将员工表和部门号放在from子句中并通过inner join关键字隔开。
  • 在on子句后指明内连接的条件为员工的部门号等于部门的部门号,保证筛选出来的数据是有意义的。
  • 在and之后指明筛选条件为员工的姓名为SMITH

2.2外连接

概念:

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接,右侧的表完全显示就是右外连接。

2.2.1左外连接

概念:

左外连接:返回左表中的所有行以及右表中与左表匹配的行。如果没有匹配的行,右表的列将显示为 NULL。

语法:

cpp 复制代码
select 字段名  from 表名1 left join 表名2 on 连接条件;

举个栗子:(先创建两张表,学生表和成绩表)

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

mysql> select * from stu;
+------+------+
| id   | name |
+------+------+
|    1 | jack |
|    2 | tom  |
|    3 | kity |
|    4 | nono |
+------+------+
4 rows in set (0.00 sec)

mysql> select * from exam;
+------+-------+
| id   | grade |
+------+-------+
|    1 |    56 |
|    2 |    76 |
|   11 |     8 |
+------+-------+
3 rows in set (0.00 sec)

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

这时我们可以在连接学生表和成绩表时将学生表放在左侧,那么就可以使用左外连接,这时如果左侧表中的某条记录根据连接条件没有找到匹配的右侧表中的记录,就会直接显示左侧表中的记录信息,而其对应的右侧表中的列信息将会用NULL值进行填充。

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

2.2.2右外连接

概念:

右外连接:与左外连接相反,返回右表中的所有行以及左表中与右表匹配的行。如果没有匹配的行,左表的列将显示为 NULL。

语法:

cpp 复制代码
select 字段 from 表名1 right join 表名2 on 连接条件;

举个栗子:

①查询所有的成绩,就算这个成绩没有学生与它对应,也要将学生成绩信息显示出来:

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

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

dept表左外连接emp表:

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

emp表右外连接dept表:

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

三、结束语

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

​​ 、

相关推荐
Dnelic-11 分钟前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
OpsEye21 分钟前
MySQL 8.0.40版本自动升级异常的预警提示
数据库·mysql·数据库升级
Ljw...21 分钟前
表的增删改查(MySQL)
数据库·后端·mysql·表的增删查改
Eastsea.Chen2 小时前
MTK Android12 user版本MtkLogger
android·framework
i道i8 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
Oak Zhang9 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
长亭外的少年10 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
久醉不在酒11 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
WindFutrue11 小时前
使用Mybatis向Mysql中的插入Point类型的数据全方位解析
数据库·mysql·mybatis
一只爱撸猫的程序猿12 小时前
一个简单的Linux 服务器性能优化案例
linux·mysql·nginx