多表查询是我们呢在实际生活开发中所使用的最为广泛的一个内容,也是我们在sql学习中较为进阶的一个内容,我们这部分需要着重来看下。
那么首先我们先要明白我们日常中的多表查询的表结构关系钟存在的联系,一共有三种,分别为
一对多(多对一):例如员工表和部门表,一张表为员工信息表,一张表为部门信息表
多对多:学生与课程的关系,学生可以选择多个课程,课程也可以有多个学生来上
一对一:最简单的对应关系
那如何进行,多表查询操作呢, 我们现在就来给大家演示一下,首先我们对于emp和dept两张表进行一个联合查询,输入:
SELECT
*
FROM
emp,dept
我们可以查看到总共有102条数据, 但是我们可以看到我们所有查到的数据会将emp中的数据和dept的数据全部都匹配了出来,产生了笛卡尔积的情况,那我们在查看表的时候,就需要我们消除无效的笛卡尔积,这时候我们就需要将我们的表中字段链接起来,那就会用到我们得找到他们中的对应关系,并且连接起来
那么我们这两张表中可以看到我们对应关系是emp表的dept_id字段与dept表的id字段相关联,那我们在编写代码时,就可以加上一些限制条件,如:
SELECT
*
FROM
emp,dept
WHERE
emp.dept_id = dept.id
这样,运行后我们的数据就只有16条,对应到了每个人的数据之上了
那这样就引出了我们多表查询的分类,多表查询我们分为一下几类
连接查询
内连接:相当于查询A,B交集部分数据
外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
自连接:当前表与自身的连接查询,自连接必须使用表别名
子查询
那首先我们先来介绍内连接,内连接又详细分为两类:隐式内连接和显式内连接
那我们用一个实际的需求来学习下这两种连接方式,当我们需要查找每一个员工的姓名以及关联的部门名称,首先使用隐式内连接:
SELECT
emp.name,
dept.name
FROM
emp,dept
WHERE
emp.dept_id = dept.id
这样就实现了我们的需求,那要是用显式内连接呢,我们输入的是
SELECT
emp.name,
dept.name
FROM
emp inner join dept
on
emp.dept_id = dept.id
这样运行后显示的效果是一样的,那我们从这两个例子可以看出对比隐式内连接是将两张表连接的语句为inner join ,查询条件跟在on之后,而显示内连接用‘,’连接两张表,查询条件为where,但是他们产生的效果其实是相同的
讲解完了内连接,接下来我们开始学习外连接,外连接又分为两种,一种是左外连接,一种是右外连接,那我们来看看这两种连接的使用方法
那我们现在同样开始根据需求来查询我们所需要的值,首先我们需要查询emp表中的所有数据以及对应的部门信息
由于我们的emp表中,id为17的员工没有关联的部门数据,所以如果用内连接是无法查看的,这时候我们需要用到我们的左外连接,这时候需要我们输入
SELECT
e.*,d.name
FROM
emp e LEFT JOIN dept d
on
e.dept_id = d.id
这时候我们就查看到了所有的数据并且,没有对应的17号员工也被查了出来
那接下来如果我们需要查询dept表的数据和对应员工的信息,我们就需要使用到右外连接了,这时候我们需要输入
SELECT
d.*,e.*
FROM
emp e RIGHT outer JOIN dept d
ON
e.dept_id=d.id
可以看到我们不仅查到了部门内所有员工的信息,也查询到了没有员工的部门的信息
其中左外链接和右外连接如果想要交换使用,只需要将两张表的顺序对调即可
指的是单张表自己自行链接的语句,我么同样也根据我们的需求来看我们的实现。
我们现在有一张员工表,员工名称与自己领导并没有对应,但是对应到了领导的ID,如下图所示
目前我们需要查询员工及其所属领导的名字,这里就涉及到了我们的自连接,我们输入:
SELECT
a.name,b.name
FROM
emp a,emp b
WHERE
a.managerid=b.id
这样的话我们就查到了我们所有人对应的领导名称了,我们可以看到我们在这张表中,单张表引用多次,这里值得注意的地方就是我们的自连接一定要给我们的表起一个别名,不然系统会无法识别具体是哪张表。
那接下来我们用下一个需求来强化下我们的学习成果
目前我们需要查询所有员工及其领导的名字,如果员工没有领导也需要查询出来,那我们可以输入以下代码
SELECT
a.name '员工' , b.name '领导'
FROM
emp a LEFT JOIN emp b
ON
a.managerid = b.id
运行后我们便得到了全部的信息
联合查询就是将多次查询的结果连接起来组成一个新的查询结果集
比如我们需要查询薪资低于5000的员工和年龄大于50岁的员工,我们就可以使用联合查询的方式进行查询,我们输入
SELECT * FROM emp WHERE salary< 5000
UNION ALL
SELECT * FROM emp WHERE age > 50
我们查询到的结果如下,会将两个需求一次性都查询出来 ,但同时我们也发现鹿杖客在这里出现了两次,那遇到这种情况,我们可以将union all 改为union 运行后即可去掉这个重复项了
但是我们联合查询有几个重点注意事项
1,对于联合查询,多张表的列数及字段类型均需要保持一致
2,union all会直接合并两列数据,union则会去重后合并,大家需要注意下两者区别
到这里我们sql中基础查询的语句基本上已经学习完毕了,大家有空的时候可以多练习我们数据的提取以及应用到日常生活中, 这样可以更快地学习我们的sql知识