数据库概念学习的第08关:连接查询中几个核心概念和要点
引入连接查询的原因主要是因为查询结果中需要有不同表中的数据。当然,如果不嫌麻烦,不考虑性能问题,你也可以只用单表查询,多个查询反复执行后拼接数据,[发怒],但估计所有人都会被恶心到。 连接查询的本质就是多张表的拼接,通过from子句和where子句完成这项工作,我们看一个典型的连接查询:
如果在理解连接查询时,觉得思维混乱,不妨这么看待上述SQL语句:先将from后面的三张表广义笛卡尔积,得到一种超级大表(行数为三张表行数的乘积,列数为三张表的列数和),这张表只是列出了所有的可能,但大部分是不符合实际情况的;再根据where后面的条件,对这张表进行过滤即可(一般是通过外码进行关联筛选,以符合自然语义)。 注意,在连接查询中,如果存在多个表的同名字段,如上例中的sno存在于student表和sc表中,使用时,必须通过前缀标定来源于哪张表(即使我们知道这两个值是一样的,也需要标定,因为计算机并不清楚这个情况)。 另外,我们可以通过别名简化一些表名,上述SQL语句可以写成:
1、连接查询的不同写法 上述SQL语句也可以写出下面的形式:
这种写法把表和表之间的连接条件直接写到了表的后,更容易体现连接点。但是,两种写法在不同的场景下可能存在显著的性能差异,我们将在后续文章中讨论这种情况。 2、自身连接的用法要点 在有些场景中,我们需要将一张表看作多种表进行查询,例如,我们需要查询和学号为001的同学年龄相同的同学学号和姓名,SQL语句可以写成:
这种连接我们称之为自身连接,在编写语句时为表起好别名非常重要,上述查询中,把001号学生所在的表取名为s001(通过where后的条件,实际上只有一行数据);把全体学生命名为s_all。通过别名,撰写后面的where条件时,针对性就比较强数据库查询操作,写出来的SQL语句不容易错。 3、外连接的用法和要点 我们先看一个需求,查询计算机系所有学生的学号、姓名和数据库课程成绩(数据库课程号为db),我们写出来的SQL语句可能是这样的:
这个SQL有问题吗?严格来说,这是有问题的,因为这个语句中,如果某个计算机系的学生没有数据库课程的成绩,那么,他就不会出现在查询结果中。这是常规连接查询的能力限制,需要通过外连接来实现这个需求:
这个语句中的关键词 left outer join,即为外连接。这个连接的主体表为student,主体表的所有行都会出现在结果中,如果在非主体表中找不到对应的数据,则这一行的相关列值取NULL。也就是说,上述查询语句的结果中,如果某学生没有数据库课程的成绩,则其成绩列的值为NULL。 4、连接查询和集函数的组合应用 连接查询中出现集函数时,其逻辑和单表查询没有本质差别,我们可以将连接过程和求集函数过程看成两个过程,连接得到一张表,再在这张表中利用集函数计算相关结果。我们看一个例子:
这个SQL语句是求出所有计算机系的学生学号、姓名和平均分;对于没有任何成绩的学生,平均分为NULL。 因此,理解连接查询的主要知识点的情况下,和集函数配合使用完成需求,不需要额外的知识点储备。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |