多表联合查询
前面我们了解了简单查询,已经基本能对单表进行条件筛选查询了,接下来我们来拓展一下查询表命令,通过查询进阶的一系列操作来完成联合查询。下面我们就来具体了解一下
9.5 链接查询
链接查询,就是将两张表或者多张表联合起来进行查询,通常这种查询叫链接查询
一般链接方式有以下三种:
- 交叉链接
- 自然链接
- 外链接
我们来一个一个看
9.5.1 交叉链接
这里需要注意以下几点:
- 将表中的每一行,分别和其他表中的每一行,组成一个新的行
- 新表中的行数是两个行数的相乘,列表是两张表的列数相加,这种数据被称为笛卡尔积表
我们先来看格式
格式:
select * from 表名1,表名2
看上去好像不是很明白,那我们就通过例子来简单讲解一下
例:
现在有两个表,courses,coc两个表,表中数据如下
(上图为courses表中数据)
(上图为coc表中数据)
我们来通过交叉链接来看看效果,代码如下
select * from courses,coc
可以看到,有很多记录,且记录远超出两表记录之和!这是因为交叉链接所得到的记录是两表所得记录的乘积,字段为两表字段相加。因此会出现大量的数据。这种链接所得到的记录非常齐全,但缺点是该记录中存在大量无用的数据 ,因此通常不建议使用。
9.5.2 自然链接
上述我们发现,交叉链接有非常多的冗余数据,因此,我们可以通过在交叉链接基础上加条件,即可得到自然链接。我们可以通过自然连接的结果来降低数据的冗余度,可以更好地查询数据。
我们先来看格式
格式:
select *from 表名1,表名2, where 表名1.字段名1=表名2.字段名2
我们来实操一下看下以下结果
例:
还是以上表courses,coc两个表为例,我们通过两个表中个共同出现的字段courseid来进行自然链接。代码格式如下:
select *from courses,coc where coursesid.course=coc.courseid
我们来看结果
我们发现对比之前的结果,在这个表中结果少了很多,而且因为都是通过courseid进行链接,所以数据正确性也是比较客观的,另外该链接方法还可实现双表链接之外的多表链接,下面我们就通过例题具体来看一看
还是上述两个表,在这基础上我们再加一个表students,表中数据如下
我们对这三个表进行多表连接,连接格式如下
select *from courses,coc,students where courses.courseid=coc.courseid and students.classid=coc.ClassID
我们来看结果
可以看到,三个表中的数据都在结果中,因此可行。但我们同时也发现了一个问题,名字太长了,我们一个代码框都装不下,笔者打起来也怪累的(虽然复制的是上面的例子修改了一下)那么问题来了。我们可不可以去给他稍微优化一下让自己没有那么累呢?当然!!这里我们在下一个区块做一个小小的拓展。
9.5.2 小拓展(字段别名及表别名)
这是个啥玩意呢,简单来说,就是我们在内存中改一下表名或字段名,让长度很长的表名或字段名在临时运行的代码中变得简洁些,方便进行输入和检查。
老规矩,我们先看格式:
- 修改字段名格式
select 字段名 from 表名 as 新名字 ...
- 修改表别名的格式
select 字段名 as 新名字 from 表名 ...
我们还是举例来看
给上面的三表链接查询稍稍修改一下我们来看代码
select *from courses as c,coc as co,students as s where c.courseid=co.courseid and s.classid=co.ClassID
(好像还是有些长0..0)
我们看看原来的代码
select *from courses,coc,students where courses.courseid=coc.courseid and students.classid=coc.ClassID
有些尴尬,这里我们知道as可以简写就可以了,可能是笔者没有考虑到位,既然写上了就了解一下吧
9.5.3 左外链接及右外链接
自然链接数据是看上去蛮全面的,但他同时也存在一个问题,数据不是很全面,容易导致数据丢失。因此,我们也可以使用左外右外链接进行双表链接查询,但左外,右外连接同时也有一个缺点:左外,右外链接只能进行双表链接。这里在连接时需要注意,老规矩,我们还是先看格式
格式
- 左外连接
select * from 左表 left join 右表 on 左表.字段=右表.字段
- 右外连接
select * from 左表 right join 右表 on 左表.字段=右表.字段
看格式我们可以看出来,欸!好像这两个差的不是很多,那左外链接,右外链接的区别是什么呢?
左外链接右外链接的区别
左外链接,就是以左侧表名为主表,通过某一共同或相似字段进行链接,链接结果显示主表的全部记录,而右边作为次要表,主要是看左侧表的链接字段是否有内容,如果有内容,则进行显示,如果没有内容则进行屏蔽处理。
右外链接与左外链接的性质相反,右外链接是以右表为主表,显示结果以右表为准,右表的数据会全部出现,左表中的数据以右表中的数据为依托,有就显示,没有就显示为空。
接下来我们开始举例
(因为左外右外只是方向不同,因此我们在作举例时仅仅以左外链接为例,右外链接与左外链接同理,仅仅是方向不同。)话不多说,我们开始举例:
现在有两个表,tb001表及tb002表,表中数据如下
(上图为tb001数据)
(上图为tb002表中的数据)
我们以tb002为主表,对上述两个表通过classid进行链接
select * from tb002 left join tb001 on tb002.id=tb001.id
可以看到,只显示一条记录,那是因为以tb002为主键,tb002只有一条记录,所以仅仅只显示这一条记录,我们反方向来一下,以tb001为主表来看一下结果
select * from tb002 right join tb001 on tb002.id=tb001.id
可以看到,全都显示出来了,但是我们会发现tb002大多数数据为空数据,因为tb002只有一条记录,其他对应的记录查询不到,因此大部分记录为空记录!!!
这里需要注意一下,因为一些读者未知的原因,导致原本要通过左右链接的数据会变成自然链接,命令和输出结果如下,如果哪位大佬知道如何解决麻烦评论区告知一下0..0
student表数据
9.5.4 子查询
这个命令是在查询中,一个语句可能无法完成我们的目的,这个时候就要在查询命令里面再加一个查询语句用来达到我们的目的。命令格式如下
select 字段名,子查询字段名 from 表名 where 子查询字段名=(select语句)
我们来举个例子
现有teacher表,表中数据如下图
用子查询查询年龄最大的名称和年龄
select name,age from teachers where age=(select max(age) from teachers)
看结果
ok,完成!!
以上就是我们本期的内容了,因笔者资历尚浅,很多东西自己也没搞明白,因此文章中必然有很多错误和不足,还请大家多多指出,感谢各位的观看0v0