zoukankan      html  css  js  c++  java
  • SQL联接查询

    1、内联接(inner join)。

    内联接,显示连接表都有的记录,并按最多记录子表显示最终结果。

    1 select * from table1 a
    2 inner join table2 b on a.Id = b.Id
    3 where a.field...

    2、外联接(outer join)。

    外联接,又分为左联接(left join)和右联接(right join),显示主表所有记录,而子没有相关记录部分返回‘NULL’。outer join默认为左联接。

    1 select * from table1 a
    2 left join table2 b on a.Id = b.Id   --显示table1的所有记录,table2不存在记录部分返回NULL
    3 
    4 select * from table1 a
    5 right join table2 b on a.Id = b.Id --显示table2的所有记录,table1不存在记录部分返回NULL 

    如果我们把两表的所有记录都显示出来,以查看哪些表不存在记录,可以使用完整外部联接(full outer join)。

    1 select * from table1 a
    2 full outer join table2 b on a.Id = b.Id --返回两表的所有记录,两表互不存在的记录部分返回Null 

    联接类型

    保留数据行

    A left outer join B

    all A rows

    A right outer join B

    all B rows

    A full outer join B

    all A and B rows

    3、交叉联接(Cross join)。

    返回两个表的笛卡尔积(M * N 行记录)。效率低下,使用范围小。

    1 select * from table1
    2 cross join table2

    4、表值内联(Cross apply)。

    其实跟inner join差不多,只不过联接部分是function返回值的集合。

     1 CREATE FUNCTION dbo.fn_Apply(@sID int)
     2 RETURNS @Apply TABLE (cName nvarchar(50), major nvarchar(50))
     3 AS
     4 BEGIN
     5   INSERT @Apply SELECT cName, major FROM Apply where [sID] = @sID
     6   RETURN    
     7 END
     8  
     9 ---- Student cross apply function fn_Apply.
    10 SELECT Student.sName, Student.GPA, Student.sizeHS,
    11 cName, major 
    12 FROM Student CROSS APPLY dbo.fn_Apply([sID])

    5、表值外联(Outer apply)。

    跟outer join差不多,跟cross apply差不多。

    1 SELECT Student.sName, Student.GPA, Student.sizeHS,
    2 cName, major 
    3 FROM Student OUTER APPLY dbo.fn_Apply([sID])

     

  • 相关阅读:
    redis配置引发的问题
    String类的split()方法
    修改mysql编码配置文件不生效
    mysql性能优化小知识点
    limit使用
    mysql执行顺序
    记录一个不知名的错误
    子数组最大和及下标
    maven项目中不能加载java目录下的配置文件
    判断树是否为搜索树
  • 原文地址:https://www.cnblogs.com/Jinnchu/p/2668246.html
Copyright © 2011-2022 走看看