[置顶] 机房收费系统之多表连接查询

锲子:

    接触过数据库的同学都知道,为了避免数据冗杂问题、操作异常等问题的出现,我们再设计数据库时往往将数据分表存储。例如将一个学生的基本信息存放在一个表中,同时将该名同学的成绩信息存储在另一个表中。这种做法很好的解决了数据冗杂的问题,但是如果我们想要查看任意学号同学的基本信息和成绩就需要将这两个表连接起来进行查询。下面我们就介绍一下两表以及两表以上的多表连接查询。

概述:

    连接查询可以分为两种情况:1、无连接规则连接(也成交叉连接查询),这种连接查询不设置连接规则即不设置WHERE子句进行查询;2、有连接规则连接查询即设置WHERE子句进行查询。

无连接规则连接:

    这种连接方式,不设置任何条件即进行多表连接。这样做的结果就是得到一个多表的笛卡尔乘积。实用性不是很好。无规则连接(交叉连接)有两种表示方法:1、使用逗号连接表名;2、使用 CROSS JOIN 连接表名。

举例:

                          实验用表1:

[置顶] 机房收费系统之多表连接查询_第1张图片




















                             实验用表2:

[置顶] 机房收费系统之多表连接查询_第2张图片




















代码(使用逗号连接两表):

<span style="font-family:KaiTi_GB2312;font-size:24px;">SELECT *
FROM Employee_Info AS E,Wage_Info AS W</span>

                                 结果:

[置顶] 机房收费系统之多表连接查询_第3张图片

代码(使用 CROSS JOIN 连接两表):

[置顶] 机房收费系统之多表连接查询_第4张图片

有链接规则连接:

代码书写技巧:

    在进行多表连接查询语句的书写时,我们常常需要编写大量的代码。为了简化写法,有两种参考方法供大家选择使用,即使用表别名简化查询语句和使用INNER JOIN分解查询语句。

使用表别名简化查询语句:

    当表名比较长时,我们可以通过定义该表的别名来减少代码的书写量:

代码:

<span style="font-family:KaiTi_GB2312;font-size:24px;">select * 
from Employee_Info as E</span>
    这样,我们就将表“Employee_Info”的别名定义为了“E”,在接下来的代码编写时我们就可以使用“E”来代替“Employee_Info”了。此外,表的别名是自连接查询顺利进行的必要前提。

使用INNER JOIN分解查询语句:

    至于使用INNER JOIN来分解复杂的查询语句,从而提高其可读性和可维护性这一技巧,我们通过例子来感受INNER JOIN的魅力。
原查询语句:
<span style="font-family:KaiTi_GB2312;font-size:24px;">select  stu_info.sno,stu_info.sname,course.cname,score.usually,score.exam
from stu_info,score,course
where stu_info.sname='张三'
and   stu_info.sno=score.sno
and   score.cno=course.cno</span>
使用INNER JOIN进行分解后:
<span style="font-family:KaiTi_GB2312;font-size:24px;">select stu_info.sno,stu_info.sname,course.cname,score.usually,score.exam
from score
inner join stu_info
on   stu_info.sno=score.sno
inner join course
on   score.cno=course.cno
</span>
    比较分析后,我们不难发现:使用INNER JOIN后,各表之间有无连接以及通过哪个字段进行连接的情形一目了然。代码的可读性和可维护性无疑提高了很多。
    PS:需要注意的是,在使用INNER JOIN时,关键字FROM后面的表需要时在整个连接过程中起中枢作用的表名。本例中的中枢作用表为表score,因为表score和表stu_info以及表course都有连接。

高级连接查询:

    个人认为除了没有连接规则的连接,其他所有连接都可以称之为高级连接(或有连接规则的连接查询)。包括自连接查询、内连接查询、左外连接查询、右外连接查询以及全外查询。

自连接查询:

    自连接就是表的自身和自身进行连接。自连接中的对象不再是表而是表内的字段了。如果大家还是有点茫然,那么就看看下面的例子吧。

实验用表:

[置顶] 机房收费系统之多表连接查询_第5张图片
    命题:
    假设你不知道实验用表中张三的性别,请你写出可以查询和张三性别相同的所有职工的信息。
    参考代码:
<span style="font-family:KaiTi_GB2312;font-size:24px;">select sex
from Employee_Info 
where EmployeeName ='张三'
</span>
                              结果:
[置顶] 机房收费系统之多表连接查询_第6张图片
    从图中我们可以知道张三的性别是“男”
    下面查询性别为“男”的所有职工信息,代码:
<span style="font-family:KaiTi_GB2312;font-size:24px;">select *
from Employee_Info 
where Sex ='男'
</span>
                     运行结果(最终):
[置顶] 机房收费系统之多表连接查询_第7张图片
     一个查询需要我们分两步进行,未免有点麻烦,我们试试下面的代码:
<span style="font-family:KaiTi_GB2312;font-size:24px;">select E2.*
from Employee_Info as E1,Employee_Info as E2
where E1.Sex =E2.Sex 
and E1.EmployeeName ='张三'</span>
                            运行结果:
[置顶] 机房收费系统之多表连接查询_第8张图片
    大家可以思考下代码第一行中的“E2”和代码第四行中的“E1”这两者的意义,给大家一个方向:笛卡尔乘积。(欢迎大家进行交流)

内连接查询:

    内连接查询主要包括等值连接、自然连接和不等值连接。关于这三者的关系,大家可以参考下表进行思考:
等值连接、自然连接和不等值连接的比较

符号 字段是否重复
等值连接 = 可重复
自然连接 = 不可重复
不等值连接 除=之外

左外连接查询:

    左外连接的规则是将左外连接符(LEFT OUTER JOIN)左侧表的所有记录显示在结果集中,对于左外连接符右边表中没有匹配的记录用“NULL”进行填充。详情请看下面例子。

                         实验用表(左1右2):
                                  [置顶] 机房收费系统之多表连接查询_第9张图片                                                [置顶] 机房收费系统之多表连接查询_第10张图片
    (从图中可以看出左表比右表多了一行EmployeeNo=0009的记录)
                                    代码:
<span style="font-family:KaiTi_GB2312;font-size:24px;">select *
from Employee_Info as t1
left outer join Wage_Info as t2
on t1.EmployeeNo=t2.EmployeeNo</span>

                         运行结果:
[置顶] 机房收费系统之多表连接查询_第11张图片

右外连接查询:

    右外连接查询和左外连接查询的代码基本一致,只不过右外连接中的关键字换成了“RIGHT OUTER JOIN”。具体的实践大家可以自己动手实验一下。我在这里就不在详细描述了。

全外连接:

    全外连接相当于左外连接和右外连接的集合吧。其中的关键字是”FULL OUTER JOIN“,大家尽情的实验吧。

总结:

    多表连接查询的内容还有很多,我在这里只是介绍了其中关于表内连接和表间连接的几种查询方法的简单应用。具体的实战还需要我们不断的去练习,希望和大家一起努力。如有不恰之处,敬请小伙伴们的雅正~~~~
感谢您的宝贵时间,谢谢~~~~

你可能感兴趣的:(sql,代码,总结,语言,vb)