0


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

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

「归属专栏」MySQL

「主页链接」个人主页

「笔者」枫叶先生(fy)

MySQL

目录

一、内连接

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

内连接语法如下:

SELECT...FROM t1 INNERJOIN t2 ON 连接条件 [INNERJOIN t3 ON 连接条件]...AND 其他条件;

说明:

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

显示SMITH的名字和部门名称

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

mysql>select ename, dname from emp, dept
    ->where emp.deptno = dept.deptno and ename='SMITH';

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

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

在这里插入图片描述

二、外连接

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

2.1 左外连接

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

语法如下:

SELECT...FROM t1 LEFTJOIN t2 ON 连接条件 [LEFTJOIN t3 ON 连接条件]...AND 其他条件;

说明:

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

例如,创建两张表

-- 建两张表createtable stu (id int, name varchar(30));-- 学生表insertinto stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');createtable exam (id int, grade int);-- 成绩表insertinto exam values(1,56),(2,76),(11,8);

在这里插入图片描述

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

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

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

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

mysql>select*from stu leftjoin exam on stu.id=exam.id;

在这里插入图片描述

2.2 右外连接

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

语法如下:

SELECT...FROM t1 RIGHTJOIN t2 ON 连接条件 [RIGHTJOIN t3 ON 连接条件]...AND 其他条件;

说明:

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

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

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

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

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

mysql>select*from stu rightjoin exam on stu.id=exam.id;

在这里插入图片描述

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

使用的是雇员信息的数据库
在这里插入图片描述

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

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

mysql>select dname, emp.*from dept leftjoin emp on dept.deptno=emp.deptno;

在这里插入图片描述
也可以右外连接进行操作,右外连接就是显示完全右边的表,即部门表

mysql>select dname, emp.*from emp rightjoin dept on dept.deptno=emp.deptno;

在这里插入图片描述
--------------------- END ----------------------

「 作者 」 枫叶先生
「 更新 」 2023.8.26
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。
标签: mysql android 数据库

本文转载自: https://blog.csdn.net/m0_64280701/article/details/132502524
版权归原作者 枫叶先生 所有, 如有侵权,请联系我们删除。

“【MySQL系列】表的内连接和外连接学习”的评论:

还没有评论