【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;

三、结束语

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

​​ 、

相关推荐
陌北v16 分钟前
为什么我从 MySQL 迁移到 PostgreSQL
数据库·mysql·postgresql
alexhilton1 小时前
务实的模块化:连接模块(wiring modules)的妙用
android·kotlin·android jetpack
ji_shuke2 小时前
opencv-mobile 和 ncnn-android 环境配置
android·前端·javascript·人工智能·opencv
就叫飞六吧3 小时前
mysql表字段反查表名脚本-筛选法-查表技巧
数据库·mysql
1.14(java)3 小时前
MySQL数据库操作全攻略
java·数据库·mysql
jmxwzy3 小时前
MySQL
数据库·mysql
sunnyday04264 小时前
Spring Boot 项目中使用 Dynamic Datasource 实现多数据源管理
android·spring boot·后端
幽络源小助理5 小时前
下载安装AndroidStudio配置Gradle运行第一个kotlin程序
android·开发语言·kotlin
inBuilder低代码平台5 小时前
浅谈安卓Webview从初级到高级应用
android·java·webview
豌豆学姐5 小时前
Sora2 短剧视频创作中如何保持人物一致性?角色创建接口教程
android·java·aigc·php·音视频·uniapp