1、派生表

实质:就是特殊的子查询(将查询结果放在from后面)

含有一张Order表:

看下面的sql语句:

 select
orderid,orderdate,custid
from
(
select
orderid,orderdate,custid,ROW_NUMBER() over(order by orderid) as rownum--列明必须起别名
from [Sales.Orders]
) as t--表名必须起别名

需要注意的特殊之处:查询出来的表要起别名,子查询里面的字段名也要起别名

2、CTE(公共表的表达式)

1)语法规范:

 with use_country--定义的表名
as--上面的是 语法:
(
select country,companyname,custid
from [Sales.Customers]
where country='按时打算'
)
select * from use_country;--将查询语句 写在 子查询的后面

将查询语句放在最后。

下面看几个例子,具体解析一下:

业务逻辑:还是用上面的那张Order表,要求:查询出 每年的订单数量 大于10的 用户

1》普通的写法:

 select
custid,year(orderdate),COUNT(1) as '订单数量'
from [Sales.Orders]
group by YEAR(orderdate), custid
having COUNT(orderid)>10--having:对 group by 之后的 组函数 进行 筛选使用

2》使用派生表:

 select
custid,orderyear,orderNum
from
(
select
custid,orderyear,COUNT(*) as orderNum
from
(
select
custid, year(orderdate) as orderyear
from [Sales.Orders]
) as t1
group by orderyear,custid
) as t2
where orderNum>10

上面的 查询的层次只有两层,如果层次非常多的话,就会出现,看起来非常费劲了,所以使用CTE的方式更简洁

 with OrderYear
as
(
select
custid,YEAR(orderdate) as orderyear
from [Sales.Orders]
),
OrderGroupYear
as
(
select
custid,orderyear,COUNT(orderyear) as ordernum
from OrderYear
group by orderyear,custid
),
OrderNumThanTen
as
(
select
custid,orderyear,ordernum
from OrderGroupYear
where ordernum>10
)
select * from OrderNumThanTen;

2)CTE还可以多张表引用:(相当于c#里面的将重复的代码封装成一个方法)下面举例:

业务逻辑:查询出 每年 客户的数量,以及 前后两年之间客户数量的差量

--首先查询出每年叫客户的数量:

 select
year(orderdate),COUNT(distinct custid)--将 重复的 客户 要去掉
from [Sales.Orders]
group by YEAR(orderdate)

--然后使用派生表的方式实现:

 select
currtYearOrder.orderYear,currtYearOrder.custCount,prevYearOrder.orderYear,prevYearOrder.custCount,currtYearOrder.custCount-prevYearOrder.custCount
from
(
select
year(orderdate) as orderYear,COUNT(distinct custid) as custCount--将 重复的 客户 要去掉
from [Sales.Orders]
group by YEAR(orderdate)
) as currtYearOrder
left outer join
(
select
year(orderdate) as orderYear ,COUNT(distinct custid) as custCount--将 重复的 客户 要去掉
from [Sales.Orders]
group by YEAR(orderdate)
) as prevYearOrder
on currtYearOrder.orderYear=prevYearOrder.orderYear+1

--下面使用CTE的方式实现,就不用重复:

 with OrderYearCust
as
(
select
year(orderdate) as orderYear,COUNT(distinct custid) as custCount--将 重复的 客户 要去掉
from [Sales.Orders]
group by YEAR(orderdate)
)
select
curtYearOrder.orderYear,curtYearOrder.custCount,prevYearOrder.orderYear,prevYearOrder.custCount,curtYearOrder.custCount-prevYearOrder.custCount
from OrderYearCust as curtYearOrder left outer join OrderYearCust as prevYearOrder on curtYearOrder.orderYear=prevYearOrder.orderYear+1

3)CTE递归查询:(针对 树形节点 进行查询)

表的结果如下:

业务逻辑:需要查询出 mgrid 为 2 下面的 所有的子节点

 with diguiEmployee
as
(
--起点:最上层的 查询(只执行一次)
select
enpid,lastname,firstname,mgrid
from [HR.Employees]
where mgrid=6 union all --连接 起点:上层查询 和递归查询 --递归查询
select
e.enpid,e.lastname,e.firstname,e.mgrid
from [HR.Employees] as e inner join diguiEmployee as d
on e.mgrid=d.enpid
)
select enpid,lastname,firstname,mgrid from [HR.Employees] where enpid=6
union all --将查询的 结果 连接 起来
select * from diguiEmployee;

sql之表的表达式的更多相关文章

  1. SQL Server 表变量和临时表的区别

    SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...

  2. oracle SQL多表查询

    SQL多表查询 1.集合理论 1.1 什么是集合 具有某种特定性质的事物的总体. 集合的特性:无序性.互异性.确定性. 一个集合可以小到从一个表中取出一行中的一列.              1 ro ...

  3. ABAP 7.50 新特性 – Open SQL中的宿主表达式和其它表达式

    在长期的停滞后,Open SQL的发展终于从沉睡中醒来.从ABAP 7.40开始,SAP推进了某些关键的改变,以尽可能地包含SQL92中的特性,并提供与ABAP CDS中的DDL里面的SELECT一样 ...

  4. 09Microsoft SQL Server 表数据插入,更新,删除

    Microsoft SQL Server 表数据插入,更新,删除 向表中插入数据 INSERT INTO insert into tb1 values(0004,'张凤凤') insert into ...

  5. Oracle使用SQL传输表空间

    源环境:RHEL 6.4 + Oracle 11.2.0.4 目的环境:RHEL 6.4 + Oracle 11.2.0.4 DG双机 要求:使用SQL传输表空间DBS_D_JINGYU从源环境到目的 ...

  6. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  7. 在一个SQL Server表中的多个列找出最大值

    在一个SQL Server表中一行的多个列找出最大值 有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示 这里给出一个例子 IF (OBJECT_ID('tempdb..# ...

  8. SQL Server表分区的NULL值问题

    SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...

  9. sql一个表中两个字段合并求和

    sql一个表中两个字段,合并求和 SELECT SUM(字段a+'.'+字段b) as total  from TABLE

随机推荐

  1. 关于MapReduce单词统计的例子:

    要统计的文件的文件名为hello hello中的内容如下 hello you hello me 通过MapReduce程序统计出文件中的各个单词出现了几次.(两个单词之间通过tab键进行的分割) im ...

  2. sequence 作为序列插入值不是第一个

    CREATE SEQUENCE seq_test INCREMENT BY 1 START WITH 1 ; 创建表时 或执行  ALTER SYSTEM SET deferred_segment_c ...

  3. Delphi7使用ADO直接连接Excel读取数据

    我之前是连接成功的,现在不知道为什么怎样连都失败.最后才知道是Office版本的问题,office2007已经是基于xml的.和以前的不一样. Excel2003的连接字符串: 'Provider=M ...

  4. simple水平导航条

    话不多说,看代码: html部分 <body> <ul> <li><a href="#">Home</a></li ...

  5. 开始迈入Csharp的世界了

    以前没有学过, 有点兴奋,完全是新手啊. 今天是元宵情人节, 加油↖(^ω^)↗ 分享一些话:   一则拉封丹寓言名字叫寓言<两个朋友>:    一天夜里,一个朋友突然去找另一个朋友.被吵 ...

  6. 常用的sql标准建表语句

    使用指定数据库 use v4base 建一张表 /*************************************************************************** ...

  7. Asp.Net运行原理(=)

    浏览器与服务器之间的通信. 一般浏览器与服务器之间的底层是通过socket建立连接的. 当浏览器与服务器之间建立了socket连接之后,服务器就开始监听. 当浏览器与服务器之间建立了相互兼容的协议之后 ...

  8. JDBC之修改数据

    文件分布图: 在MySQL中设置表格: Books: package com.caiduping.entity; public class Books { private int id; // 图书名 ...

  9. (转)使用 Advanced Installer 打包 一键安装Web应用程序

      使用 Advanced Installer 打包 一键安装Web应用程序         安装预览: 资源下载: 示例安装包 操作流程: 1.新建Asp.net Application. 2.设置 ...

  10. (转)linux下jvm 参数调优

    1.基本概念. JAVA_MEM_OPTS=" -server -Xmx2g -Xms2g -Xmn512m -XX:PermSize=128m -Xss256k -XX:+DisableE ...