联接分类

  • 内部联接(典型的联接运算,使用类似于 = 或 <> 的比较运算符)。内部联接包括同等联接和自然联接。
    内部联接通过比较相等的值的字段(被连接的表所共同拥有的),将匹配的行作为结果集(即将两个表都满足条件的记录作为结果集)。
  • A:内连接是SQLServer默认的连接方式,可以把INNER JOIN简写成JOIN
  • B:连接的条件中不要指定空值,因为空值和其他值都不会相等
  • 外部联接 外部联接可以是左向外部联接、右向外部联接或完整外部联接。
  • 外部联接会返回 FROM 子句中提到的至少一个表或视图中的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左外部联接引用的左表中的所有行,以及通过右外部联接引用的右表中的所有行。在完全外部联接中,将返回两个表的所有行。
  • (1)左外联接 :返回左表的所有满足where或 having指定条件的所有记录,右表中没有匹配的记录时补充为NULL。
  • LEFT JOIN 等价于 LEFT OUTER JOIN。
  • (2)右外联接:返回右表中所有满足where或 having指定条件的所有记录,左表中没有匹配的记录时补充为NULL。
  • RIGHT JOIN 或 RIGHT OUTER JOIN
    左外连接和右外联接是互为反向联接,左外连接和右外联接中表的顺序不能交换位置,否则改变连接方向。
  • (3)全联接:返回左表和右表的所有满足条件的记录(即结果集为左外联接和右外联接的并集)。
  • FULL JOIN 等价于 FULL OUTER JOIN
    (4)交叉联接: 返两个表的笛卡尔积(左表中的每一行都与右表的所有行进行组合)。(结果集的记录条数为两个表记录数之积)。
         CROSS JOIN
  • 联接的限制

  • (1)可以在 FROM 或 WHERE 子句中指定内部联接;但只能在 FROM 子句中指定外部联接。

    (2)联接条件与 WHERE 和 HAVING 搜索条件相结合,用于控制从 FROM 子句所引用的基表中选定的行。

    (3)在 FROM 子句中指定联接条件有助于将这些联接条件与 WHERE 子句中可能指定的其他任何搜索条件分开, SQL-92 FROM 子句联接语法如下:

    FROM first_table join_type second_table [ON (join_condition)]

    join_type 指定要执行的联接类型:内部联接、外部联接或交叉联接。join_condition 定义用于对每一对联接行进行求值的谓词。

    (4)联接条件中的列不必具有相同的数据类型和相同的数据类型,但数据类型必须兼容(即可以隐式转换)。如果数据类型不兼容则必须进行显式转换。

  • (5)不能在 ntexttextimage 列上直接联接表。但可以使用 SUBSTRING 在 ntexttextimage 列上间接联接表
  • (6)内联接中 任何一个表中满足条件 有NULL的记录都不会返回(联接表的列中的空值(如果有)互相不匹配,如果其中一个联接表的列中出现空值,只能通过外部联接返回这些空值)
  • 下例来自 MSDN
table1                          table2
a           b                   c            d
-------     ------              -------      ------1        one                 NULL         twoNULL      three                    4        four4      join4

将列 a 中的值与列 c 中的值进行比较的联接不能获得包含 NULL 值的列的匹配结果:

SELECT *
FROM table1 t1 JOIN table2 t2ON t1.a = t2.c
ORDER BY t1.a

而是只返回列 a 和列 c 中值为 4 的一行:

a           b      c           d
----------- ------ ----------- ------
4           join4  4           four   (1 row(s) affected)

另外,从基表返回的空值与从外部联接返回的空值很难区分开。例如,下面的 SELECT 语句对这两个表进行左向外部联接:

SELECT *
FROM table1 t1 LEFT OUTER JOIN table2 t2ON t1.a = t2.c
ORDER BY t1.a

下面是结果集:

a           b      c           d
----------- ------ ----------- ------
NULL        three  NULL        NULL
1           one    NULL        NULL
4           join4  4           four   

SQL Server 处理联接的逻辑顺序:

查询引擎会从多种可行的方法中选择最有效的方法来处理联接,各种联接的实际执行过程会采用多种不同的优化方式,但是逻辑顺序均为:

  • 应用 FROM 子句中的联接条件。
  • 应用 WHERE 子句中的联接条件和搜索条件。
  • 应用 HAVING 子句中的搜索条件。
    • 举例 来自MSDN

    左外部联接。 包括所有商品

    USE AdventureWorks;
    GO

    SELECT p.Name, pr.ProductReviewID

    FROM Production.Product p

    LEFT OUTER JOIN Production.ProductReview pr

    ON p.ProductID = pr.ProductID

    不管是否与 ProductReview 表的 ProductID 列相匹配,LEFT OUTER JOIN 都会在结果中包括 Product 表的所有行。请注意,对于结果中没有匹配的产品审核 ID 的产品,行的 ProductReviewID 列中则包含一个空值。

    右外部联接: 要在结果中包括所有销售人员,不论是否为他们分配了区域

    USE AdventureWorks;
    GO

    SELECT st.Name AS Territory, sp.SalesPersonID

    FROM Sales.SalesTerritory st

    RIGHT OUTER JOIN Sales.SalesPerson sp

    ON st.TerritoryID = sp.TerritoryID ;

    全外联接 以下查询只返回没有匹配销售订单的产品以及没有匹配产品的销售订单(虽然本例中所有销售订单都有匹配的产品)。

    USE AdventureWorks;
    GO
    -- The OUTER keyword following the FULL keyword is optional.
    SELECT p.Name, sod.SalesOrderID
    FROM Production.Product p
    FULL OUTER JOIN Sales.SalesOrderDetail sod
    ON p.ProductID = sod.ProductID
    WHERE p.ProductID IS NULL
    OR sod.ProductID IS NULL
    ORDER BY p.Name ;

SQL联接查询  总结相关推荐

  1. sql联接查询_SQL联接

    sql联接查询 SQL Joins combine two or more tables together based on the corresponding common column among ...

  2. SQL Sever联接查询

    联接查询:是有一个笛卡尔乘积运算再加一个选取运算构成的查询. 首先用笛卡尔乘积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起. ...

  3. sql语句查询过慢的原因分析

    有时候你在使用sql语句查询数据库,sql语句写得好正确,但则发现执行查询的时候很慢呢?数据量也不是太大,你知道其中的原因吗?本文给大家讲解一下sql查询过慢的48种原因分析,请阅读. 1.没有索引或 ...

  4. ibatis中多表联接查询

     目前,我在做项目的时候,用到了spring + struts2 +ibatis 框架.平时用到的都是一张简单的表,来进行数据的增.删.改.查.而现在突然需要用到其它的一张表,或多张表进行联接查询 ...

  5. 2008技术内幕:T-SQL语言基础 联接查询摘记

    续 2008技术内幕:T-SQL语言基础 单表查询摘记 第三章 联接查询 Microsoft SQL Server 2008 支持四种表运算符 join(ANSI标准).apply(T-SQL扩展). ...

  6. oracle数据库多表联查并排序,oracle数据库之多表联接查询(一)

    --此文章可以作为sql脚本直接运行 /* 建表以及插入相关数据,为后面的查询做准备工作 */ --建学生信息表 create table studentinfo( stuid  int  prima ...

  7. ef 多个左联接查询_.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记...

    2.4.5 EF Core -- 查询 关联数据加载 客户端与服务端运算 跟踪与不跟踪 复杂查询运算 原生 SQL 查询 全局查询筛选器 关联数据加载 学员和助教都在项目分组中,调整模型,删除 Ass ...

  8. SQL Server SQL高级查询语句小结(转)

    --select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 select disti ...

  9. SQL——联接分类和本质

    目录 1.嵌套循环联接 2.合并联接 3.哈希联接 联接(Join)是将两个表合并为一个表的操作.SOL的联接分为外联接.内联接和交叉联接.本文将主要通过查询执行计划的角度从本质上讲解联接. 1.嵌套 ...

  10. 【T-SQL基础】02.联接查询

    概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...

最新文章

  1. java minor gc_Java Minor发布计划再次进行了调整
  2. gitlab 修改HTTP连接方式中的IP和端口
  3. 【插件介绍】Lombok
  4. 返回结果的HTTP状态码——《图解http》第四章
  5. tensorflow prelu的实现细节
  6. vrep中接近开关与激光雷达
  7. 基于FCM算法的聚类算法
  8. 基于臻图ZTMAP 3DGIS平台打造线上线下融合的智慧展览中心
  9. python redis教程_Python与Redis的连接教程
  10. C++校内模拟赛-06水题
  11. CAR路里大学堂-汽车测试培训(CANOE)
  12. 小程序实现圆点边框 解决 dotted不兼容 小程序圆点边框兼容问题 如何在小程序实现兼容的圆点边框
  13. 颜色大全:颜色名称和颜色值。色板、色板对照表1
  14. 自动光学变焦USB摄像头模组微光全彩夜视18倍USB摄像机机芯参数
  15. openGL增强表面细节----高度贴图
  16. 足球比赛数据分析系统
  17. hadoop-集群及组件
  18. JavaWeb项目中使用到的过滤器
  19. 全靠我啃烂了这份2021最新面试题!吊打面试官
  20. 技术学习:Python(11)|操作PDF

热门文章

  1. 家政服务APP小程序开发功能详解
  2. matlab pdf 转txt,pdf转中文txt - osc_xgk2otgu的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. tensorflow实现猫狗分类器(三)Inception V3迁移学习
  4. goconvey学习笔记:测试工具
  5. 蓝牙耳机哪个品牌音质好?300到400的蓝牙耳机推荐
  6. Linux系统对于实施人员的价值
  7. 李克华 云计算高级群: 292870151 195907286 交流:Hadoop、NoSQL、分布式、lucene、solr、nutch kafka入门:简介、使用场景、设计原理、主要配置及集群搭
  8. 设计模式 代理模式 js java 代码实现代理类
  9. HDU5709 Claris Loves Painting
  10. 柔宇发布“手写神器”柔记樱雪白特别版,支持7国语言手写识别