SQL 知识量:22 - 44 - 129
通过一个例子来展示联结的方法。例如:查询学生信息及选课信息,按照学生姓名排序。
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子句十分重要,因为它确保了各表关系匹配正确与否。在上面的例子中,如果去掉where子句,结果会有360条!因为查询出的行数是三个表行数的积(10*3*12=360),也就是笛卡尔积的行数。
以上示例中的联结实际上称为内联结,也就是等值联结,它基于表之间关系的相等测试。对于其格式,还有一种更为规范的写法:
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推荐这种写法,这样也更容易分辨出是内联结。
SQL不限制一条select语句可以联结的表的数目,但是实际上许多的DBMS都有限制,主要的原因是性能上的考虑。因为,DBMS在运行时关联指定的每个表,这种操作非常消耗系统资源,联结的表越多,性能下降越厉害。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6