SQL查询入门(中篇) |
本文标签:SQL查询入门 引言 在前篇文章中(SQL查询入门(上篇),我对数据库查询的基本概念以及单表查询做了详细的解释,本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查询的不同思路 。 多表连接简介 在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只有一个表,而如果大多查询只涉及到一个表的,那么那个表也往往低于第三范式,存在大量冗余和异常 。 因此,连接(Join)就是一种把多个表连接成一个表的重要手段. 比如简单两个表连接学生表(Student)和班级(Class)表,如图: ![]() ![]() 进行连接后如图: 笛卡尔积 在实际应用中,笛卡尔积本身大多没有什么实际用处,只有在两个表连接时加上限制条件,才会有实际意义,下面看内连接 内连接 对于开篇中的两个表,假使查询语句如下: 复制代码 代码如下: SELECT * FROM [Class] c inner join [Student] s on c.ClassID=s.StudentClassID 可以将上面查询语句进行分部理解,首先先将Class表和Student表进行交叉连接,生成如下表: ![]() 然后通过on后面的限制条件,只选择那些StudentClassID和ClassID相等的列(上图中划了绿色的部分),最终,得到选择后的表的子集 当然,内连接on后面的限制条件不仅仅是等号,还可以使用比较运算符,包括了>(大于)、>=(大于或等于)、<=(小于或等于)、<(小于)、!>(不大于)、!<(不小于)和<>(不等于) 。当然,限制条件所涉及的两个列的数据类型必须匹配. 复制代码 代码如下: SELECT * FROM [Class] c inner join [Student] s on c.ClassID>s.StudentClassID 则结果从第一步的笛卡尔积中筛选出那些ClassID大于StudentClassID的子集: 虽然上面连接后的表并没有什么实际意义,但这里仅仅作为DEMO使用:-) 复制代码 代码如下: SELECT * FROM [Class] c , [Student] s where c.ClassID=s.StudentClassID 当然,查询后返回的结果是不会变的: ![]() 外连接 假设还是上面两个表,学生和班级.我在学生中添加一个名为Eric的学生,但出于某种原因忘了填写它的班级ID: ![]() ![]() 当我想执行这样一条查询:给我取得所有学生的姓名和他们所属的班级: |