加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

数据库概念学习的第08关:连接查询中几个核心概念和要点

发布时间:2023-01-05 05:06:43 所属栏目:MySql教程 来源:转载
导读: 引入连接查询的原因主要是因为查询结果中需要有不同表中的数据。当然,如果不嫌麻烦,不考虑性能问题,你也可以只用单表查询,多个查询反复执行后拼接数据,[发怒],但估计所有人都会被恶心

引入连接查询的原因主要是因为查询结果中需要有不同表中的数据。当然,如果不嫌麻烦,不考虑性能问题,你也可以只用单表查询,多个查询反复执行后拼接数据,[发怒],但估计所有人都会被恶心到。

连接查询的本质就是多张表的拼接,通过from子句和where子句完成这项工作,我们看一个典型的连接查询:

select student.sno , sname , cname , grade
from student , sc , course
where student.sno = sc.sno
? ?and course.cno = sc.cno
   and sdept = '计算机系'

如果在理解连接查询时,觉得思维混乱,不妨这么看待上述SQL语句:先将from后面的三张表广义笛卡尔积,得到一种超级大表(行数为三张表行数的乘积,列数为三张表的列数和),这张表只是列出了所有的可能,但大部分是不符合实际情况的;再根据where后面的条件,对这张表进行过滤即可(一般是通过外码进行关联筛选,以符合自然语义)。

注意,在连接查询中,如果存在多个表的同名字段,如上例中的sno存在于student表和sc表中,使用时,必须通过前缀标定来源于哪张表(即使我们知道这两个值是一样的,也需要标定,因为计算机并不清楚这个情况)。

另外,我们可以通过别名简化一些表名,上述SQL语句可以写成:

select s.sno , sname , cname , grade
from student s , sc , course c
where s.sno = sc.sno
? ?and c.cno = sc.cno
   and sdept = '计算机系'

1、连接查询的不同写法

上述SQL语句也可以写出下面的形式:

select sname,cname,grade

from sc left join student 
          on (student.sno = sc.sno)
       left join course 
          on (course.cno = course.cno)
where  sdept = '计算机系'

这种写法把表和表之间的连接条件直接写到了表的后,更容易体现连接点。但是,两种写法在不同的场景下可能存在显著的性能差异,我们将在后续文章中讨论这种情况。

2、自身连接的用法要点

在有些场景中,我们需要将一张表看作多种表进行查询,例如,我们需要查询和学号为001的同学年龄相同的同学学号和姓名,SQL语句可以写成:

select s_all.sno, s_all.sname
from student s001, student s_all
where s001.sno = '001'
? ?and s001.sage? = s_all.sage

这种连接我们称之为自身连接,在编写语句时为表起好别名非常重要,上述查询中,把001号学生所在的表取名为s001(通过where后的条件,实际上只有一行数据);把全体学生命名为s_all。通过别名,撰写后面的where条件时,针对性就比较强数据库查询操作,写出来的SQL语句不容易错。

3、外连接的用法和要点

我们先看一个需求,查询计算机系所有学生的学号、姓名和数据库课程成绩(数据库课程号为db),我们写出来的SQL语句可能是这样的:

select sno,sname,grade
from student , sc
where student.sno = sc.sno?

? ?and student.sdept = '计算机系'
? ?and sc.cno? = 'db'

这个SQL有问题吗?严格来说,这是有问题的,因为这个语句中,如果某个计算机系的学生没有数据库课程的成绩,那么,他就不会出现在查询结果中。这是常规连接查询的能力限制,需要通过外连接来实现这个需求:

select sno,sname,grade
from student left outer join sc on?
? ? ? ?(sc.sno = student.sno 
         and sc.cno = 'db')
where sdept = '计算机系'

这个语句中的关键词 left outer join,即为外连接。这个连接的主体表为student,主体表的所有行都会出现在结果中,如果在非主体表中找不到对应的数据,则这一行的相关列值取NULL。也就是说,上述查询语句的结果中,如果某学生没有数据库课程的成绩,则其成绩列的值为NULL。

4、连接查询和集函数的组合应用

连接查询中出现集函数时,其逻辑和单表查询没有本质差别,我们可以将连接过程和求集函数过程看成两个过程,连接得到一张表,再在这张表中利用集函数计算相关结果。我们看一个例子:

select sno,sname,avg(grade)
from student s left outer join sc
? ? ? ? ? on (s.sno = sc.sno)
where sdept = '计算机系'
group by sno,sname

这个SQL语句是求出所有计算机系的学生学号、姓名和平均分;对于没有任何成绩的学生,平均分为NULL。

因此,理解连接查询的主要知识点的情况下,和集函数配合使用完成需求,不需要额外的知识点储备。

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!