sqlserver中cross apply与outer apply用法

sqlserver中cross apply与outer apply用法apply有两种形式:crossapply和outerapply先看看语法:  <left_table_expression>{cross|outer}apply<right_table_expression>再让我们了解一下apply运算涉及的两个步骤:A1:把右表表达式(<right_table_expression>)应用…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

apply有两种形式: cross apply 和 outer apply

先看看语法:

  <left_table_expression>  {cross|outer} apply <right_table_expression>

再让我们了解一下apply运算涉及的两个步骤:

  1. A1:把右表表达式(<right_table_expression>)应用到左表(<left_table_expression>)输入的行;
  2. A2:添加外部行;

  使用apply就像是先计算左输入,让后为左输入中的每一行计算一次右输入。(这一句很重要,可能会不理解,但要先记住,后面会有详细的说明

最后结合以上两个步骤说明cross apply和outer apply的区别:

  cross apply和outer apply 总是包含步骤A1,只有outer apply包含步骤A2,如果cross apply左行应用右表表达式时返回空积,则不返回该行。而outer apply返回改行,并且改行的右表表达式的属性为null。

看到上面的解释或步骤大家可能还是一头的雾水,不知所云。下面用例子来说明:

先建表一([dbo].[Customers]  字段说明:customerid — 消费者id , city — 所在城市):

 

复制代码

复制代码

CREATE TABLE [dbo].[Customers](
    [customerid] [char](5) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [city] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [customerid] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

Jetbrains全家桶1年46,售后保障稳定

复制代码

复制代码

 

向表一插入数据:

insert into dbo.Customers values('FISSA','Madrid');
insert into dbo.Customers values('FRNDO','Madrid');
insert into dbo.Customers values('KRLOS','Madrid');
insert into dbo.Customers values('MRPHS','Zion');

查询所插入的数据:

select * from dbo.Customers

结果如图:

sqlserver中cross apply与outer apply用法

再建表二([dbo].[Orders]  字段说明:orderid — 订单id  , customerid — 消费者id):

复制代码

复制代码

CREATE TABLE [dbo].[Orders](
    [orderid] [int] NOT NULL,
    [customerid] [char](5) COLLATE Chinese_PRC_CI_AS NULL,
PRIMARY KEY CLUSTERED 
(
    [orderid] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

复制代码

复制代码

向表二插入数据:

复制代码

复制代码

insert into dbo.Orders values(1,'FRNDO');
insert into dbo.Orders values(2,'FRNDO');
insert into dbo.Orders values(3,'KRLOS');
insert into dbo.Orders values(4,'KRLOS');
insert into dbo.Orders values(5,'KRLOS');
insert into dbo.Orders values(6,'MRPHS');
insert into dbo.Orders values(7,null);

复制代码

复制代码

查询插入的数据:

select * from dbo.orders

结果如图:

sqlserver中cross apply与outer apply用法

例子:题目:得到每个消费者最新的两个订单:

用cross apply

sql:

复制代码

复制代码

select *
from dbo.Customers as C
 cross apply
    (select top 2 *
     from dbo.Orders as O
     where C.customerid=O.customerid
     order by orderid desc) as CA

复制代码

复制代码

结果如图:

sqlserver中cross apply与outer apply用法

过程分析:

  它是先得出左表【dbo.Customers】里的数据,然后把此数据一条一条的放入右表表式中,分别得出结果集,最后把结果集整合到一起就是最终的返回结果集了(T1的数据 像for循环一样 一条一条的进入到T2中 然后返回一个集合  最后把所有的集合整合到一块  就是最终的结果),最后我们再理解一下上面让记着的话(使用apply就像是先计算左输入,让后为左输入中的每一行计算一次右输入)是不是有所明白了。

实验:用outer apply 试试看看的到的结果:

sql语句:

复制代码

复制代码

select *
from dbo.Customers as C
 outer apply
    (select top 2 *
     from dbo.Orders as O
     where C.customerid=O.customerid
     order by orderid desc) as CA

复制代码

复制代码

结果如图:

sqlserver中cross apply与outer apply用法

结果分析:

  发现outer apply得到的结果比cross多了一行,我们结合上面所写的区别(cross apply和outer apply 总是包含步骤A1,只有outer apply包含步骤A2,如果cross apply左行应用右表表达式时返回空积,则不返回该行。而outer apply返回改行,并且改行的右表表达式的属性为null)就会知道了。

 

 

回到目录

Sql学习第四天——SQL 关于with cube ,with rollup 和 grouping

关于with cube ,with rollup 和 grouping

通过查看sql 2005的帮助文档找到了CUBE 和 ROLLUP 之间的具体区别

  1. CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
  2. ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。

再看看对grouping的解释:

  当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1;当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0。

仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相关联的选择列表中才允许分组。

当看到以上的解释肯定非常的模糊,不知所云和不知道该怎样用,下面通过实例操作来体验一下:

先建表(dbo.PeopleInfo):

复制代码

复制代码

CREATE TABLE [dbo].[PeopleInfo](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
    [numb] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [phone] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
    [FenShu] [int] NULL
) ON [PRIMARY]

复制代码

复制代码

向表插入数据:

复制代码

insert into peopleinfo([name],numb,phone,fenshu) values ('李欢','3223','1365255',80)
insert into peopleinfo([name],numb,phone,fenshu) values ('李欢','322123','1',90)
insert into peopleinfo([name],numb,phone,fenshu) values ('李名','3213112352','13152',56)
insert into peopleinfo([name],numb,phone,fenshu) values ('李名','32132312','13342563',60)
insert into peopleinfo([name],numb,phone,fenshu) values ('王华','3223','1365255',80)

复制代码

查询出插入的全部数据:

select * from dbo.PeopleInfo

结果如图:

sqlserver中cross apply与outer apply用法

操作一:先试试:1, 查询所有数据;2,用group by 查询所有数据;3,用with cube。这三种情况的比较

SQL语句如下:

复制代码

select * from dbo.PeopleInfo                                                        --1, 查询所有数据;

select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb             --2,用group by 查询所有数据;

select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with cube   --3,用with cube。这三种情况的比较

复制代码

结果如图:

sqlserver中cross apply与outer apply用法

结果分析:

  用第三种(用with cube)为什么会多出来有null的字段值呢?通过分析图上的值得组合会发现是怎么回事儿了,以第三条数据(李欢,null,170)为例:它只是把姓名是【李欢】的分为了一组,而没有考虑【numb】,所以有多出来了第三条数据,也说明了170是怎么来的。其他的也是这样。再回顾一下帮助文档的解释:CUBE 生成的结果集显示了所选列中值的所有组合的聚合, 发现明了了许多。

操作二:1,用with cube;2,用with rollup 这两种情况的比较

SQL语句如下:

select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with cube    --用with cube。

select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with rollup  --用with rollup。

结果如图:

sqlserver中cross apply与outer apply用法

结果分析:

  为什么with cube 比 with rollup多出来一部分呢?原来它没有显示,以【numb】分组而不考虑【name】的数据情况。再回顾一下帮助文档的解释:ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合,那这个【某一层次】又是以什么为标准的呢?我的猜想是:距离group up最近的字段必须考虑在分组内。

证明猜想实例:

操作:用两个group up 交换字段位置的sql语句和一个在group up 后面增加一个字段的sql语句进行比较:

SQL语句如下:

 

复制代码

select [name],numb from dbo.PeopleInfo group by [name],numb with rollup

select [name],numb from dbo.PeopleInfo group by numb,[name] with rollup

select [name],numb,phone from dbo.PeopleInfo group by [name],numb,phone with rollup

复制代码

 

结果如图:

sqlserver中cross apply与outer apply用法sqlserver中cross apply与outer apply用法

通过结果图的比较发现猜想是正确的。

—————————————————grouping————————————————-

现在来看看grouping的实例:

SQL语句看看与with rollup的结合(与with cube的结合是一样的):

select [name],numb,grouping(numb) from dbo.PeopleInfo group by [name],numb with rollup

结果如图:

sqlserver中cross apply与outer apply用法

结果分析:

  结合帮助文档的解释:当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1;当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0。  很容易理解再此就不多解释了。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234627.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • linux降内核版本_linux内核降级

    linux降内核版本_linux内核降级1,实验环境:Vmware12.5.1,Ubuntu16.0464位,Linux3.16.1(高版本无法启动qemu)Busybox1.20.2,u-boot-2016.09.tar.bz22.整体流程说明安装交叉编译工具链安装qemu模拟器编译arm架构u-boot用u-boot测试qemu是否正常启动(至此为第二次实验需要完成的内容)编译arm架构内核Qemu运行内核制作文件系统…

  • gpl和lgpl区别_nh拿下pgc开门红

    gpl和lgpl区别_nh拿下pgc开门红GPL我们很熟悉的Linux就是采用了GPL。GPL协议和BSD,ApacheLicence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开

  • typescript 接口_接口是什么

    typescript 接口_接口是什么介绍TypeScript的核心原则之一是对值所具有的结构进行类型检查。我们使用接口(Interfaces)来定义对象的类型。接口是对象的状态(属性)和行为(方法)的抽象(描述)接口初探声明接口

  • Oracle存储过程总结(一、基本应用)

    Oracle存储过程总结(一、基本应用)

  • 设备树中ranges属性理解[通俗易懂]

    设备树中ranges属性理解[通俗易懂]作者彭东林pengdonglin137@163.com文章来源http://www.cnblogs.com/pengdonglin137/p/7401049.html正文一、设备树下面是我们将要实验的设备树的例子:/{#address-cells=&lt;1&gt;;#size-cells=&lt;1&g…

  • Laravel5.5+ 区分前后端用户登录

    Laravel5.5+ 区分前后端用户登录

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号