• 有神论跟无神论的差别在哪你都不知道,还要扯啥呢。 2019-05-19
  • 央行就“金融改革与发展”答记者问 2019-05-10
  • 图书馆·情报与文献学 2019-05-10
  • 以专业认证推进落实管办评分离改革 2019-05-07
  • 投诉可以反投诉的,中国人人平等的。 2019-05-06
  • 寻找三秦非遗:二月二,大荔县阿寿村药王庙会赛花馍 2019-05-06
  • 计划不是产生在交换基础上的计划。 2019-05-05
  • 凤凰公映礼之《闪光少女》 2019-05-04
  • [中国新闻]韩朝军方商定重启陆海军事通信渠道 2019-05-02
  • 庆祝中国人民解放军建军90周年大会在京隆重举行 2019-05-02
  • 昌发展:母基金优势可利于构建一体化产业服务链条 2019-05-01
  • 第523期:土鸡蛋VS洋鸡蛋,哪个好?怎样挑? 2019-04-29
  • 十九大代表、海口市公安局琼山分局飞鹰大队大队长冯晖:把十九大精神讲清楚、讲明白 2019-04-25
  • 即使中美贸易归零,中国也不会屈服美国的大棒政策 2019-04-25
  • 沪上台企搭建创业平台 助力两岸青年文创交流 2019-04-24
  • 神奇公式秒杀全国11选5 www.bjux.net T-SQL基?。ǘ┲亓檠?/p>

    1. 神奇公式秒杀全国11选5>
    2. 博客>
    3. 正文

    T-SQL基?。ǘ┲亓檠?

    雪飞鸿 2018-11-14 22:27:12 浏览697 评论0

    摘要: 在上篇博文中介绍了T-SQL查询的基础知识,本篇主要介绍稍微复杂的查询形式。 表运算符 表运算符的作用是把为其提供的表作为输入,经过逻辑查询处理,返回一个表结果。SQL Server支持四个表运算符:JOIN、APPLY、PIVOT、UNPIVOT,其中JOIN是标准SQL中的运算符,APPLY、PIVOT和UNPIVOT是T-SQL的扩展。

    在上篇博文中介绍了T-SQL查询的基础知识,本篇主要介绍稍微复杂的查询形式。

    表运算符

    表运算符的作用是把为其提供的表作为输入,经过逻辑查询处理,返回一个表结果。SQL Server支持四个表运算符:JOIN、APPLY、PIVOT、UNPIVOT,其中JOIN是标准SQL中的运算符,APPLY、PIVOT和UNPIVOT是T-SQL的扩展。

    JOIN:联接查询时使用

    APPLY:用于FROM子句中,分为CROSS APPLYOUTER APPLY两种形式

    PIVOT:用于行转列

    UNPIVOT:用于列传行

    联接查询

    联接查询分为外联接、内联接、交叉联接,三者的区别在于如何应用逻辑查询处理阶段:

    • 交叉联接仅应用一个阶段——笛卡尔乘积;
    • 内联接应用两个阶段——笛卡尔乘积和基于谓词ON的筛??;
    • 外联结应用三个极端——笛卡尔乘积,基于谓词ON的筛选,添加外部行;

    内部行 & 外部行

    内部行指的是基于谓词ON与另一侧匹配的行,外部行则是未匹配的行,外部行用NULL进行填充。内联接结果集仅保留内部行,外联接结果集返回内部行和外部行。

    笛卡尔乘积

    将一个输入表的每一行与另一个表的所有行匹配,即,如果一张表有m行a列,另一张表n行b列,笛卡尔乘积后得到的表有m*n行,a+b列。由此可以看出,对于数据量较大的表进行关联的话,会得到一张数据量更大的表,会有可能造成内存溢出的。

    以下是网络上关于笛卡尔乘积的解释:

    在数学中,两个集合X和Y的笛卡儿积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。假设集合A=a, b,集合B=0, 1, 2,则两个集合的笛卡尔积为(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。A表示所有声母的集合,B表示所有韵母的集合,那么A和B的笛卡尔积就为所有可能的汉字全拼。

    举例如下:

    USE WJChi;
    
    SELECT * FROM dbo.UserInfo;
    SELECT * FROM dbo.UAddress;
    
    SELECT * 
    FROM dbo.UserInfo 
    CROSS JOIN dbo.UAddress;

    得到结果集如下:

    交叉联接

    SQL中使用CROSS JOIN语句进行交叉联接查询,在逻辑处理上,交叉联接是最为简单的联接类型,它只获取表的笛卡尔乘积。

    交叉联接两种写法:

    USE WJChi;
    
    -- 使用CROSS JOIN,推荐使用这种方式
    SELECT * 
    FROM dbo.UserInfo 
    CROSS JOIN dbo.UAddress;
    
    -- 不使用CROSS JOIN
    SELECT * 
    FROM dbo.UserInfo,dbo.UAddress;

    内联接

    SQL中使用INNER JOIN...ON...语句进行内联接查询,INNER关键字可选。内联接的逻辑处理分为两步:

    • 生成笛卡尔乘积
    • 根据谓词ON对笛卡尔乘积进行筛选

    与交叉联接一样,内联接有两种写法:

    USE WJChi;
    
    -- 使用JOIN,推荐使用这种方式
    SELECT * 
    FROM dbo.UAddress
    JOIN dbo.UserInfo 
    ON UserInfo.UAddressId = UAddress.Id;
    
    -- 不使用JOIN,与交叉联接类似,但比交叉联接多了WHERE条件
    SELECT * 
    FROM dbo.UAddress,dbo.UserInfo 
    WHERE UserInfo.UAddressId = UAddress.Id;

    外联接

    外联接分为左外联接:LEFT OUT JOIN、右外联接:RIGHT OUT JOIN和全联接:FULL OUT JOIN,其中,OUT关键字是可选的。相比于交叉联接和内联接,外联接则最为复杂。外联接逻辑处理分为三步:

    1. 获取表的笛卡尔乘积
    2. 根据谓词ON对笛卡尔乘积进行筛选
    3. 添加外部行数据到结果集中
    LEFT JOIN & RIGHT JOIN

    LEFT JOIN获取的结果集中保留了左表(LEFT JOIN左侧的表)中的所有数据,及右表中满足筛选条件的数据。右表中不满足筛选条件的空行(外部行)则用NULL值填充。

    RIGHT JOINLEFT JOIN作用相反。

    示例代码如下,表UserInfo中有4条数据,表UAddress中有三条数据:

    USE WJChi;
    
    SELECT * 
    FROM dbo.UAddress
    LEFT JOIN dbo.UserInfo 
    ON UserInfo.UAddressId = UAddress.Id;
    
    SELECT * 
    FROM dbo.UAddress
    RIGHT JOIN dbo.UserInfo 
    ON UserInfo.UAddressId = UAddress.Id;

    查询结果如下:

    FULL JOIN

    FULL JOIN的结果是取LEFT JOINRIGHT JOIN查询结果集的并集

    USE WJChi;
    
    SELECT * 
    FROM dbo.UAddress
    FULL JOIN dbo.UserInfo 
    ON UserInfo.UAddressId = UAddress.Id;

    查询结果如下:

    ON & WHERE

    前面说到:内联接结果集仅保留内部行,外联接结果集返回内部行和外部行?;痪浠八?,外联接中ON子句的作用是进行表之间关联,如果外联接需要对结果集做进一步的筛选的话不能使用ON...AND...语句,而要使用WHERE条件。示例如下:

    USE WJChi;
    
    -- 内联接使用ON...AND...筛选数据
    SELECT * 
    FROM dbo.UserInfo AS UI
    JOIN dbo.UAddress AS UA
    ON UA.Id = UI.UAddressId 
    -- 获取Name为xfh的数据
    AND UI.Name='xfh';
    
    -- 外联接使用ON...AND...筛选数据
    SELECT * 
    FROM dbo.UserInfo AS UI
    LEFT JOIN dbo.UAddress AS UA
    ON UA.Id = UI.UAddressId 
    -- 获取Name为xfh的数据,无效
    AND UI.Name='xfh';
    
    -- 外联接使用WHERE对结果集进行筛选
    SELECT * 
    FROM dbo.UserInfo AS UI
    LEFT JOIN dbo.UAddress AS UA
    ON UA.Id = UI.UAddressId 
    WHERE UI.Name='xfh';
    

    输出结果如下:

    复合联接

    复合联接是指谓词涉及表中多个字段的联接,即,关联条件使用ON...AND...的形式。

    自联接

    同一张表的多个实例之间相互联接,称为自联接。所有基本联接类型(内联接、外联接、交叉联接)支持。

    USE WJChi;
    
    SELECT * 
    FROM dbo.UserInfo AS U1 
    CROSS JOIN dbo.UserInfo AS U2;

    自联接中要为表名指定别名,否则结果集中的列名都将不明确。

    相等联接 & 不等联接

    当联接条件使用相等运算符时称为相等联接,否则称为不等联接:

    USE WJChi;
    
    -- 相等联接
    SELECT * 
    FROM dbo.UAddress
    FULL JOIN dbo.UserInfo 
    ON UserInfo.UAddressId = UAddress.Id;
    
    -- 不等联接
    SELECT * 
    FROM dbo.UAddress
    FULL JOIN dbo.UserInfo 
    ON UserInfo.UAddressId <> UAddress.Id;

    多联接查询

    超过两张表进行关联查询即为多联接查询。通常,当SQL中出现多个表运算符时,从左到右进行逻辑处理,前一个联接的结果会作为下一个联接的左侧输入。SQL Server也常常出于优化查询的目的,在实际处理查询过程中对联接进行重新排序,但这不会影响到处理结果集的正确性。

    :warning:不建议超过三张表进行关联,过多的表关联会使SQL变得复杂,难以维护且影响性能

    小结

    过多的表联接会让SQL逻辑变得复杂,对查询性能产生负面影响,且难以维护。

    SQL(任何代码)的书写应将语义清晰作为第一追求,而不是为了“炫技”写一些别人难以理解的代码。

    StackOverflow中扣出的一张图片,可以概述外联接和内联接查询:

    推荐阅读

    T-SQL基?。ㄒ唬┲虻ゲ檠?/a>

    What is the difference between “INNER JOIN” and “OUTER JOIN”?

    【云栖快讯】阿里巴巴小程序繁星计划,20亿补贴第一弹云应用立即开通购买,限量从速!  详情请点击

    网友评论

  • 有神论跟无神论的差别在哪你都不知道,还要扯啥呢。 2019-05-19
  • 央行就“金融改革与发展”答记者问 2019-05-10
  • 图书馆·情报与文献学 2019-05-10
  • 以专业认证推进落实管办评分离改革 2019-05-07
  • 投诉可以反投诉的,中国人人平等的。 2019-05-06
  • 寻找三秦非遗:二月二,大荔县阿寿村药王庙会赛花馍 2019-05-06
  • 计划不是产生在交换基础上的计划。 2019-05-05
  • 凤凰公映礼之《闪光少女》 2019-05-04
  • [中国新闻]韩朝军方商定重启陆海军事通信渠道 2019-05-02
  • 庆祝中国人民解放军建军90周年大会在京隆重举行 2019-05-02
  • 昌发展:母基金优势可利于构建一体化产业服务链条 2019-05-01
  • 第523期:土鸡蛋VS洋鸡蛋,哪个好?怎样挑? 2019-04-29
  • 十九大代表、海口市公安局琼山分局飞鹰大队大队长冯晖:把十九大精神讲清楚、讲明白 2019-04-25
  • 即使中美贸易归零,中国也不会屈服美国的大棒政策 2019-04-25
  • 沪上台企搭建创业平台 助力两岸青年文创交流 2019-04-24
  • 福建福彩网 新时时彩保号法 穿越火线刮刮乐视频 12生肖时时彩方法 山东时时彩网11选5 福利彩票开奖日期 湖南彩票中奖新闻 五分彩走势app 福建31选7开奖结果 老k德州扑克 pk10买9码杀一码好方法 1680100澳洲幸运5 特区七星彩票论坛 江西多乐彩今天开奖啦 幸运农场开奖直播 四川金7乐开奖工具走势图