连接查询知识点

为什么我们需要学习表连接查询?

 

首先,仍然对应之前的2张表student和subject

那么,如果我需要显示科目名称,分数,以及学生姓名的话,科目名称和分数属于表subject,学生姓名属于表student,在没有学习表连接查询之前,我们只能用子查询来解决这个问题

但是,相关子查询的性能不高,如果我们类似下面的查询,很简单就能达到同样的效果

我们可以发现现在from后面是2张表,分别取了别名以便后面方便于引用。象这样一次性查询不同的表里的不同列称之为表连接查询

注意,表的别名是可选的,但是,当2张表的引用条件列名字相同时,必须为2张表取别名并通过别名引用,同时养成一个好的习惯:在多表连接查询的时候通过表名或者表别名去引用列名,这样做相当于明确告诉数据库引擎当前列来自于哪张表,能够略微提高性能

 

 

表连接主要有3种形式,分别为内连接,外连接以及交叉连接,我们主要应用和学习前2

 

 

 

内连接:

 

[inner] join 

Inner可有可无

 

实际上,之前的例子就是用的内连接,也叫相等连接,另外一种内连接的方式自然连接NATURAL JOIN的语法某些DBMS不支持并且使用不灵活因此不需要掌握

 

左外连接:

Left [outer] join

Outer可用可不用

 

 

 

看起来结果和之前的内连接没有任何区别。现在让我们添加2个学生

 

 

 

 

即这2个学生没有参加任何考试,现在我们用student表去左外连接subject表执行同样的查询

 

我们发现,将没有参加考试的学生也查出来了,也就是姓名这列将student表中的数据都查询出来了,不管有没有在subject中针对学号匹配的值。即不管有没有参加考试,只要在student表中存在,都显示出来。

 

现在让我们交换连接的位置

 

现在的结果正常了

我们可以总结,左外连接其实就是将查询列里属于左表的列的所有值都查询出来,剩下的查询列中属于右表的列的值要显示哪些取决于2张表的连接条件(join左边为左表,右边为右表)

比如我们上面查询列为科目,分数,姓名

如果现在我们用student表去左连接subject表,那么student表为左表,subject表为右表。

要查询的姓名属于左表student,因此不管这个学生姓名的学号在subject表中有没有对应的值,即不管这个学生有没有参加考试,最后的结果里都会显示所有学生的姓名。而科目和分数属于subject右表,那么显示哪些数据取决于根据stu.s_id = sub.stu_id这个连接查询的条件。即科目和成绩对应的学号在student左表中是否存在,存在才显示,否则显示空值。

相应的右连接也是一样的道理,只不过换个方向而已

 

右外连接

Right [outer] join

针对之前的student表左外连接subject表,我们换成用右外连接,想要达到同样的效果,只需要换个方向而已

即student左外连接subject 改为 subject右外连接student

 

 

 

 

全外连接:full [outer] join,不管连接条件,直接将2表的所有数据查询出来,当查询的某张表的结果在另外一张表中如果根据连接条件找不到匹配的值时,则返回空值
posted @ 2009-07-31 11:20  小开的一天  阅读(474)  评论(0编辑  收藏  举报