• SQL Server中内连接和外连接的区别


    SQL Server中内连接和外连接的区别
     

    假设一个数据库中有两张表,一张是学生表StudentInfo,一张是班级表ClassInfo,两张表之间用ClassId字段进行关联。

    如果用内连接,正常的写法是这样的:

    Select StudentInfo.*,ClassInfo.* from StudentInfo join ClassInfo on StudentInfo.ClassId=ClassInfo.ClassId

    用这种写法不会出现笛卡尔积,但是内连接是允许省略连接条件的,也就是可以省略掉on后面的内容,所以如果写成这样:

    Select StudentInfo.*,ClassInfo.* from StudentInfo,ClassInfo

    也是可以通过编译的,但是这样一来就产生了一个笛卡尔积(关于笛卡尔积的内容见文章最后注解)。

    但是因为怕产生笛卡尔积而拒绝使用内链接是不正确的,只要不省略掉连接条件,是不会产生笛卡尔积的。

    具体采用内连接还是外连接要看具体问题的需要。内连接的特性是只显示符合连接条件的记录,以刚才的语句为例,查询结果只显示学生表和班级表中ClassId相等的记录。举例来说,如果有条学生记录的ClassId字段为空,那么用内链接将不会显示这条学生记录,因为在班级表里面是找不到对应的ClassId的。

    而外连接就不一样,以左外连接为例(右外连接类似),它除了显示符合连接条件的记录以外,还会显示所有左表中的记录(右外连接就是所有右表中的记录)。还是以刚才的例子说明,如果学生表中有条学生记录的ClassId字段为空,用学生表左外连接班级表,那么是会显示这条学生记录的。

    所以如果要求只显示已有分班的学生记录,那么就应该用内连接查询;如果要求查询所有学生记录,那么就应该采用外连接查询。

    笛卡尔积:
    假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。

  • 相关阅读:
    挖掘经典:几乎被人遗忘的HTML七种用法
    TechEd 2010 微软技术大会 12月1日3日 北京国家会议中心
    PostSharp摘要
    实现Asp.net Forms身份验证的操作步骤详解
    DTO,DMO,DPO
    CodeSmith和PowerDesigner的安装和数据库创建二
    ASP.NET 2.0 Membership
    C# IEnumerable<T>、IEnumerator<T>、List<T>、ArrayList、[]数组各各的区别
    [转]ActiveWriter集成到VS.NET的NHibernate(ActiveRecord)对象可视化设计工具
    当一个程序员面临太多选择的时候
  • 原文地址:https://www.cnblogs.com/bicabo/p/1436321.html
Copyright © 2020-2023  润新知