目录
自连接一般出现在关系表只有一张的情况下。虽然我们现在只有一张表,但是里面包含了员工及管理员的相关字段。我们都知道就算是管理员也是公司里面的员工,因此也就不需要再做分表处理。我们的表如下:
现在我们要对其进行处理,使得表格的左边两列是员工id,员工名,右边两列为管理员id,管理员姓名,可以如下写我们的SQL语句:
- -- 一张集员工与管理员的表里面的自连接
- SELECT t1.`emp_id`,t1.`emp_name`,t2.`emp_id`,t2.`emp_name`
- FROM employee AS t1,employee AS t2
- WHERE t1.`manager_id`=t2.emp_id
- ORDER BY t1.`emp_id`,t2.`emp_id`;
经过自连接后我们可以看到在表中的员工对应的管理员名也一起显示了出来,方便了我们的查看。 接下来我们去认识一个与自连接不同的概念---自然连接
自然连接这四个字乍一看会和自连接有点象,但是我们需要知道的是:
自连接发生在一张表内,而自然连接是发生在两张及两张以上的多表之间的连接。
我们可以使用natural关键字来使用自然连接,自然连接可以自动查询两张表中所有形同的字段,然后进行等值连接,如下,我们的学生表有57条记录,并且学生表里面的sch_id字段与学校表里面的sch_id字段相同
因此我们可以使用自然连接来进行连接两张表,并查询出来54条数据记录:
select stu_id,stu_name,sch_name from 20student natural join school;
上面的SQL语句也可以使用我们的where过滤条件或使用on来得到相同的结果集:
on
SELECT stu_id,stu_name,sch_name FROM 20student JOIN school ON 20student.`sch_id`=school.`sch_id`;
where
SELECT stu_id,stu_name,sch_name FROM 20student,school where 20student.`sch_id`=school.`sch_id`;
上面两条语句和自然连接的效果都是一样的:
自然连接推荐使用于两张有且仅有一条是相同字段的表里面。因为如果当我们的表之间有多条相同的字段时,我们对表进行连接的时候依据的字段可能会有所不同,而如果我们在这种多条字段相同的表之间使用自然连接的话,它会 将所有的相同的字段进行等值连接,这样子就不够灵活了。
但是如果表与表之间相同的字段只有一个的话,使用自然连接会让我们少写几个单词。
using关键字要比自然连接好一些,它可以让用户去指定两张表之间连接的字段,可能大家会有疑问,我们使用where关键字和on的时候不也是可以让用户去指定表之间连接的字段吗,这个using关键字的特别之处又在哪里呢?其实using的使用效果是和where及on关键字一样的,也是指定表匹配的字段,但是如果我们使用using关键字的话可以少写几个英文单词,SQL语句要更加短一些,如下:
SELECT stu_id,stu_name,sch_name FROM 20student JOIN school USING(sch_id);
查找出来的数据与我们之前使用的自然连接,where或on关键字过滤的结果集相同。而且单词的写入也是比使用where或on关键字时要少。
虽然using关键字使用两张表都有的字段进行匹配能够方便我们少写单词,但是很少有人用,我们只需要了解并且当看到using关键字的使用时能够知道是拿来做什么的就行。