SQL

SQL 知识量:22 - 44 - 129

12.2 应用联结><

创建联结- 12.2.1 -

通过一个例子来展示联结的方法。例如:查询学生信息及选课信息,按照学生姓名排序。

select student.*,lesson.name 
from student,lesson,course 
where student.id=course.id_student and lesson.id=course.id_lesson 
order by student.name;

结果:

+----+-------+-----+--------+---------+
| id | name  | age | sex    | name    |
+----+-------+-----+--------+---------+
|  3 | Bob   |  11 | male   | English |
|  2 | Jame  |  12 | male   | Natural |
|  2 | Jame  |  12 | male   | Maths   |
|  5 | Jen   |  11 | female | English |
|  5 | Jen   |  11 | female | Natural |
|  4 | Robot |  10 | male   | Natural |
|  4 | Robot |  10 | male   | Maths   |
|  4 | Robot |  10 | male   | English |
|  1 | Susan |  11 | female | Maths   |
|  1 | Susan |  11 | female | English |
|  6 | Toney |  10 | male   | Natural |
|  6 | Toney |  10 | male   | Maths   |
+----+-------+-----+--------+---------+

如上所示,要联结多个表,只需要将它们并列于from之后,关键是要设置where子句,确保它们之间的关联关系必须给出,否则,查询结果会成为笛卡尔积。

注意:使用联结时最好总是使用完全限定列名,以避免混淆。

重要的where子句- 12.2.2 -

前面已经说过,在联结中,where子句十分重要,因为它确保了各表关系匹配正确与否。在上面的例子中,如果去掉where子句,结果会有360条!因为查询出的行数是三个表行数的积(10*3*12=360),也就是笛卡尔积的行数。

内联结- 12.2.3 -

以上示例中的联结实际上称为内联结,也就是等值联结,它基于表之间关系的相等测试。对于其格式,还有一种更为规范的写法:

select student.*,lesson.name 
from student 
inner join lesson 
inner join course 
on student.id=course.id_student and lesson.id=course.id_lesson 
order by student.name;

inner join表示内联结后面这个表,on则用于设置约束关系,以替代where子句。这样查询的结果是一样的。ANSI SQL推荐这种写法,这样也更容易分辨出是内联结。

联结多个表- 12.2.4 -

SQL不限制一条select语句可以联结的表的数目,但是实际上许多的DBMS都有限制,主要的原因是性能上的考虑。因为,DBMS在运行时关联指定的每个表,这种操作非常消耗系统资源,联结的表越多,性能下降越厉害。