对于上面的查询语句,如果将on后面限制条件由等于改为大于:
则结果从第一步的笛卡尔积中筛选出那些ClassID大于StudentClassID的子集:
虽然上面连接后的表并没有什么实际意义,但这里仅仅作为DEMO使用:-)
关系演算上面笛卡尔积的概念是关系代数中的概念,而我在前一篇文章中提到还有关系演算的查询方法.上面的关系代数是分布理解的,上面的语句推导过程是这样的:“对表Student和Class进行内连接,匹配所有ClassID和StudentClassID相等行,选择所有的列” 而关系演算法,更多关注的是我想要什么,比如说上面同样查询,用关系演算法思考的方式是“给我找到所有学生的信息,包括他们的班级信息,班级ID,学生ID,学生姓名” 用关系演算法的SQL查询语句如下:
当然,查询后返回的结果是不会变的:
外连接假设还是上面两个表,学生和班级.我在学生中添加一个名为Eric的学生,但出于某种原因忘了填写它的班级ID: 当我想执行这样一条查询:给我取得所有学生的姓名和他们所属的班级: SELECT s.StudentName,c.ClassName FROM [fordemo].[dbo].[Student] s inner join [fordemo].[dbo].[Class] c on s.StudentClassID=c.ClassID
结果如下图:
可以看到,这个查询“丢失”了Eric.. 这时就需要用到外连接,外连接可以使连接表的一方,或者双方不必遵守on后面的连接限制条件.这里把上面的查询语句中的inner join改为left outer join: SELECT s.StudentName,c.ClassName FROM [fordemo].[dbo].[Student] s left outer join [fordemo].[dbo].[Class] c on s.StudentClassID=c.ClassID
结果如下: Eric又重新出现. 右外连接右外连接和左外连接的概念是相同的,只是顺序不同,对于上面查询语句,也可以改成: SELECT s.StudentName,c.ClassName FROM [fordemo].[dbo].[Class] c right outer join [fordemo].[dbo].[Student] s on s.StudentClassID=c.ClassID
效果和上面使用了左外连接的效果是一样的.
全外连接全外连接是将左边和右边表每行都至少输出一次,用关键字”full outer join”进行连接,可以看作是左外连接和右外连接的结合. (责任编辑:admin) |