1. 公共表达式CTE

公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。
如下面的例子,可以递归把组织名放到一起。

其实CTE的作用就相当于子查询

2.窗口函数、分区函数

窗口函数和聚集函数一样都是对定义的行集(组)进行聚集,但是不像聚集一样只返回一个值,窗口函数可以为每个组返回多个值,执行聚集的行组是窗口(因此称为‘窗口函数’)。窗口函数是在聚集函数的基础上加了一个 over(),所有的聚集函数都可以利用这种方式转换成窗口函数。窗口函数是最后才执行的,在order by 之前,where和group
by之后

Partition By分区子句:可以根据partition by子句定义行的分区或组,以完成聚集,如果使用空括号,那么整个结果集就是分区,窗口函数将对它进行聚集计算,可以把Partition By看成是移动的Group By,可以用Partition By对定义的行组计算聚集(当遇到新的组时复位),并返回每个值(每个组中的成员),而不是用一个组表示表中这个值的所有实例。

窗口函数除了用于聚集函数sum,count,avg等之外,还有row_number(计算行数),rank(排名),lead()
,lag()前移后移 在日常工作中使用也很大;

3.FOR XML Path

这个在sql server中的作用主要是把行数据转列。在mysql中有group_concat,DB2中有listagg,而sql server中没有,所以用for xml path

如下,我要取得年月,直接查询是这样的

当我在后面加上了for xml path 后就得到了一行的结果:

用字符串处理函数去掉前面的第一个逗号,就可以得到一个可用的字符串,用于存储过程之类的;

4.PIVOT 和UNPIVOT 行列转换函数

PIVOT:行转列,下面的代码实现的是,选择orderid为71774和71780的两个产品作为列名,以productID作为行,得到汇总数据

UNPIVOT 列转行
贴一个官方教程的例子:

--Create the table and insert values as portrayed in the previous example.
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
    Emp3 int, Emp4 int, Emp5 int);
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4);
INSERT INTO pvt VALUES (2,4,1,5,5,5);
INSERT INTO pvt VALUES (3,4,3,5,4,4);
INSERT INTO pvt VALUES (4,4,2,5,5,4);
INSERT INTO pvt VALUES (5,5,1,5,5,5);
GO
--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM
   (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
   FROM pvt) p
UNPIVOT
   (Orders FOR Employee IN
      (Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;
GO

运行结果:

5.Merge 的应用  主要用于更新数据,贴一个我写的存储

--Create the table and insert values as portrayed in the previous example.
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
    Emp3 int, Emp4 int, Emp5 int);
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4);
INSERT INTO pvt VALUES (2,4,1,5,5,5);
INSERT INTO pvt VALUES (3,4,3,5,4,4);
INSERT INTO pvt VALUES (4,4,2,5,5,4);
INSERT INTO pvt VALUES (5,5,1,5,5,5);
GO
--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM
   (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
   FROM pvt) p
UNPIVOT
   (Orders FOR Employee IN
      (Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;
GO

6.动态sql

 文本拼接语句  缺点:1.容易被注入,被黑 最好不用 
2.容易报错,如西安的拼音 xi'an

-- 实例1
DECLARE @sql NVARCHAR(1000)
SET @sql='select * from '+'[SalesLT].[Customer]'
PRINT @sql
--EXEC(@sql)
EXECUTE(@sql)
-- 实例2
DECLARE @sql NVARCHAR(1000),@i NVARCHAR(50)  
--SET @i=100
SET @sql=N'select getdate()'
SET @sql=@sql+';select @i'
--EXECUTE(@sql)
DECLARE @we NVARCHAR(50)='xi''an'
EXEC sys.sp_executesql @sql,N'@i NVARCHAR(50)',@we             -- 变量必须是unixcode 字符传入
  -- 可以传入参数
-- 实例3 可计算
DECLARE @sql NVARCHAR(1000),@i INT,@j int
--SET @i=100
SET @sql=N'select getdate()'
SET @sql=@sql+';select @i+@j'
--EXECUTE(@sql)
SET @i=500
SET @j=1
EXEC sys.sp_executesql @sql,N'@i INT,@j int',@i,@j

7.ON条件 在使用left jion时,on和where条件的区别如下:
on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉

举个例子:

先创建t1,t2两个表

CREATE TABLE t1 (
a CHAR(1)
)
INSERT INTO t1 VALUES('A'),('B'),('C')
CREATE TABLE t2 (
a CHAR(1)
)
INSERT INTO t2 VALUES('B'),('C'),('D')

以下是限制left join 左边的表的结果,可以看到上面的才是我们想要的结果

以下是限制t2的结果,可以发现把条件放在on后面才是我们想要的结果

8.Except 和Intersect

比较两个查询的结果,返回非重复值。
EXCEPT 从左查询中返回右查询没有找到的所有非重复值。
INTERSECT 返回 INTERSECT 操作数左右两边的两个查询都返回的所有非重复值,即二者交集。

还是用刚刚的表,t1中是ABC,t2中是BCD

那么EXCEPT返回的是A

INTERSECT返回的是BC

SQL server高级语法的更多相关文章

  1. 15 个经常使用的 SQL Server 高级语法

    1.case-end (详细的值) case后面有值,相当于c#中的switch case 注意:case后必须有条件,而且when后面必须是值不能为条件. -----------------case ...

  2. SQL server存储过程语法及实例(转)

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...

  3. Sql Server 基础语法

    来自:http://www.cnblogs.com/AaronYang/archive/2012/04/24/2468093.html Sql Server 基础语法 -- 查看数据表 select  ...

  4. SQL SERVER常用语法记录

    用于记录SQL SERVER常用语法,以及内置函数. 以下语句包含: WITH 临时表语法 ROW_NUMBER()内置函数,我一般主要是用来分页.针对于查出来的所有数据做一个数字排序 分页的BETW ...

  5. SQL Server高级内容之case语法函数

    1.Case函数的用法  (1)使用类似:switch-case与if-else if. (2)语法: case [字段] when 表达式 then 显示数据 when 表达式 then 显示数据 ...

  6. SQL SERVER常用语法汇总

    阅读目录 一.SQL分类 二.基础语句 三.sql技巧 四.(MS SQL Server)SQL语句导入导出大全 回到目录 一.SQL分类 DDL—数据定义语言(CREATE,ALTER,DROP,D ...

  7. SQL SERVER With语法[转]

    今天在论坛上看到一个举例,关于sql server 的示例.1/25/50/100美分,多少种可能拼凑成2美元. 看了其中第一条语法,放在SQL SERVER中测试,发现真的列举出所有组合成2美元的方 ...

  8. SQL Server 事务语法

    事务全部是关于原子性的.原子性的概念是指可以把一些事情当做一个单元来看待.从数据库的角度看,它是指应全部执行或全部都不执行的一条或多条语句的最小组合. 为了理解事务的概念,需要能够定义非常明确的边界. ...

  9. 数往知来 SQL SERVER 基本语法<七>

    sqlserver学习_01 启动数据库 开始->cmd->进入控制台    sqlcmd->-S .\sqlexpress    1> 如果出现表示数据库"sqle ...

随机推荐

  1. Python - 模块(二)

    目录 Python - 模块(二) re re下面的方法 logging os Python - 模块(二) re re模块提供了正则表达式的相关操作 主要字符介绍: . 通配符,除了换行符之外的任意 ...

  2. 第一节:初识pandas之Series(上)

    Series线性的数据结构, 也是一个一维数组. 声明:本人Python小白,以下代码只是个人学习的过程,仅仅记录一下学习的点点滴滴,若有错误,还望指正. (注:该代码均在jupyter notebo ...

  3. 3.2.1 for循环与while循环的基本语法

    不停地重复一件事情,时间久了会非常无聊,然后大脑就会由于疲劳而容易入睡. 重复性的劳动会使人疲劳,而计算机不会,只要代码写得正确,计算机就会孜孜不倦地重复工作.在Python中主要有两种形式的循环结构 ...

  4. 《你说对就队》第八次团队作业:Alpha冲刺 第五天

    <你说对就队>第八次团队作业:Alpha冲刺 第五天 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 <你说对就队> ...

  5. 【郑轻邀请赛 G】密室逃脱

    [题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2133 [题意] [题解] 考虑每一个二进制数的最高位->第i位; 肯定是1(这 ...

  6. Entity Framework Connection String不保留密码的方法

    添加Entity Data Model的时候,到最后一步,有两个radio box: 如果选择include sensitive data,虽然很方便,但是在web.config或者app.confi ...

  7. [bzoj1878][SDOI2009]HH的项链_树状数组

    HH的项链 bzoj-1878 SDOI-2009 题目大意:给定一个n个数的序列,m次查询.查询区间数的种类个数. 注释:$1\le n \le 5\cdot 10^4$,$1\le m\le 2\ ...

  8. Linux下统计某个目录的文件个数(转)

    1.统计某文件夹下文件个数,不包括子文件夹 比如:统计/home下.jpeg文件的个数 ls -l "/home" | grep ".jpeg" | wc -l ...

  9. ExtJs--06--Ext.WindowGroup相关方法简单使用

    Ext.onReady(function(){ //用windowGroup对象去操作多个window窗体 var winG = new Ext.WindowGroup(); for (var i = ...

  10. silverlight学习笔记——新手对silverlight的认识(1)

    这几天在搞silverlight.虽然silverlight没有前途,但始终是微软的一门技术,界面基本上与WPF共通,用一下也无妨. 学习过程并没有我原先想得那么容易,有些地方捣鼓了很久.究其原因,是 ...