首先自连接和自身连接其实是一回事,一般简称为"自连接"。它是指某一张表,自己跟自己连接。由于表自身跟自身连接,被联接的表名称相同,很容易产生歧义,数据库引擎往往搞不清楚哪一方表是哪一方表或哪一个字段来自哪一方表。那怎么办呢? 其实我们分别为被连接的同一张表取不同的表别名就可以实现自连接啦。
例如下列语句通过自连接检索出每个班级年纪最年轻的同学资料:
select a.* from students a where
not exists (select 1 from students b
where b.class=a.class and b.dob>a.dob);
自连接跟多表连接本质上是一样的,只是用起多个表别名的办法将一张表变成虚拟的多张表进行连接而已,但是因为自己跟自己连接它会产生一些特殊的输出效应。例如上述自连接语句就可以不使用max或min函数的情况下筛选出极值,因为两张记录完全相同的表,只有一张表的极值不大于或不小于另一张表的所有记录。
再说一下自然连接。在关系数据库中,连接有多种类型,例如内连接、外连接、自然连接等,前两种须要指定连接方式和连接条件,而自然连接则不指定连接方式和连接条件。
自然连接由于不指定连接方式与条件,系统会将所有可能出现的记录组合都列出来,也就是按笛卡尔乘积算法组合输出记录行集,这样连接后的结果集总行数将可能会大幅增加,这也许不是我们所期望的。因此,一般来讲自然连接通常用途不大,但是存在即为合理,在一些特殊情况下还是可被利用的,例如需要将一组无关联的序列数加入到记录集里等,当然具体细节得小心处理,这里不再赘述。
下面列出一个自然连接的sql写法供参考:
1) select a.*,b.* from a,b;
此例为自然连接,没有指定连接方式和连接条件。
作为比较下面提供几个非自然连接的sql语句供参考:
2) select a.* from a inner join b on a.id=b.id;
此例为内连接,指定为内连接方式及连接条件。
3) select a.* from a,b where a.id=b.id;
此例为未指定连接方式的内连接。它等效于例2)。根据经验这种内连接方式运行效率要较inner join高。
4) select a.* from a left join b on a.id=b.id;
此例为外连接。
温馨提示:答案为网友推荐,仅供参考