接触过数据库的同学都知道,为了避免数据冗杂问题、操作异常等问题的出现,我们再设计数据库时往往将数据分表存储。例如将一个学生的基本信息存放在一个表中,同时将该名同学的成绩信息存储在另一个表中。这种做法很好的解决了数据冗杂的问题,但是如果我们想要查看任意学号同学的基本信息和成绩就需要将这两个表连接起来进行查询。下面我们就介绍一下两表以及两表以上的多表连接查询。
举例:
实验用表1:
实验用表2:
代码(使用逗号连接两表):
<span style="font-family:KaiTi_GB2312;font-size:24px;">SELECT * FROM Employee_Info AS E,Wage_Info AS W</span>
结果:
代码(使用 CROSS JOIN 连接两表):
代码书写技巧:
在进行多表连接查询语句的书写时,我们常常需要编写大量的代码。为了简化写法,有两种参考方法供大家选择使用,即使用表别名简化查询语句和使用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分解查询语句:
<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>
<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后,各表之间有无连接以及通过哪个字段进行连接的情形一目了然。代码的可读性和可维护性无疑提高了很多。
个人认为除了没有连接规则的连接,其他所有连接都可以称之为高级连接(或有连接规则的连接查询)。包括自连接查询、内连接查询、左外连接查询、右外连接查询以及全外查询。
自连接就是表的自身和自身进行连接。自连接中的对象不再是表而是表内的字段了。如果大家还是有点茫然,那么就看看下面的例子吧。
实验用表:
<span style="font-family:KaiTi_GB2312;font-size:24px;">select sex from Employee_Info where EmployeeName ='张三' </span>结果:
<span style="font-family:KaiTi_GB2312;font-size:24px;">select * from Employee_Info where Sex ='男' </span>运行结果(最终):
<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>运行结果:
符号 | 字段是否重复 | |
等值连接 | = | 可重复 |
自然连接 | = | 不可重复 |
不等值连接 | 除=之外 |
左外连接的规则是将左外连接符(LEFT OUTER JOIN)左侧表的所有记录显示在结果集中,对于左外连接符右边表中没有匹配的记录用“NULL”进行填充。详情请看下面例子。
<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>