数据库脚本
USE [Test]
GO
/****** Object: Table [dbo].[Class] Script Date: 2017/6/29 13:17:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Class](
[ClassID] [int] NULL,
[ClassName] [nvarchar]() NULL
) ON [PRIMARY] GO
/****** Object: Table [dbo].[Student] Script Date: 2017/6/29 13:17:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Student](
[StuID] [int] NOT NULL,
[StuName] [nvarchar]() NULL,
[StuAge] [int] NULL,
[ClassID] [int] NULL
) ON [PRIMARY] GO
INSERT [dbo].[Class] ([ClassID], [ClassName]) VALUES (, N'班级1')
GO
INSERT [dbo].[Class] ([ClassID], [ClassName]) VALUES (, N'班级2')
GO
INSERT [dbo].[Class] ([ClassID], [ClassName]) VALUES (, N'班级3')
GO
INSERT [dbo].[Class] ([ClassID], [ClassName]) VALUES (, N'班级4')
GO
INSERT [dbo].[Class] ([ClassID], [ClassName]) VALUES (, N'班级5')
GO
INSERT [dbo].[Class] ([ClassID], [ClassName]) VALUES (, N'班级2')
GO
INSERT [dbo].[Student] ([StuID], [StuName], [StuAge], [ClassID]) VALUES (, N'张三', , )
GO
INSERT [dbo].[Student] ([StuID], [StuName], [StuAge], [ClassID]) VALUES (, N'李四', , )
GO
INSERT [dbo].[Student] ([StuID], [StuName], [StuAge], [ClassID]) VALUES (, N'王五', , )
GO
INSERT [dbo].[Student] ([StuID], [StuName], [StuAge], [ClassID]) VALUES (, N'啦啦', , )
GO
INSERT [dbo].[Student] ([StuID], [StuName], [StuAge], [ClassID]) VALUES (, N'王五2', , )
GO
INSERT [dbo].[Student] ([StuID], [StuName], [StuAge], [ClassID]) VALUES (, N'王五3', , )
GO
INSERT [dbo].[Student] ([StuID], [StuName], [StuAge], [ClassID]) VALUES (, N'王五3', , )
GO

一、排序

  排序的可以产生序号,所以都可以分页查询

1、row_number() over(order by 字段)

SELECT *,ROW_NUMBER() OVER ( ORDER BY s.StuAge) FROM Student AS s
    王五
王五2
王五3
王五3
李四
张三
啦啦

2、row_number() over(PARTITION BY 字段order by 字段)      over中可以分区在编号

SELECT *,ROW_NUMBER() OVER ( PARTITION BY s.ClassID ORDER BY s.StuAge) FROM Student AS s
    李四
张三
王五
王五2
王五3
王五3
啦啦
3、DENSE_RANK()出现  并列排序 (序号连续)
--DENSE_RANK()
SELECT *,DENSE_RANK() OVER ( ORDER BY s.StuAge DESC) FROM Student AS s
    啦啦
张三
李四
王五
王五2
王五3
王五3
4、RANK()   出现并列排序(序号不连续)
--rank()
SELECT *,RANK() OVER (ORDER BY s.StuAge ) FROM Student AS s
    王五
王五2
王五3
王五3
李四
张三
啦啦
5、NTILE(INT)     要把查询得到的结果平均分为几组
--NTILE 要把查询得到的结果平均分为几组,总数/组数=每组数量
--如果每组数量部位整数 则在第一组多加行 少的话在最后一组减
SELECT *,NTILE() OVER (ORDER BY s.StuAge DESC) FROM Student AS s
    啦啦
张三
李四
王五
王五2
王五3
王五3

二、结果集合并

1、UNION

--UNION  去除两个表中重复的行
SELECT * FROM Student AS s UNION SELECT * FROM Student
    张三
李四
王五
啦啦
王五2
王五3

2、UNION ALL

--UNION ALL  完全合并,不去除两个表中重复的行
SELECT * FROM Student AS s UNION ALL SELECT * FROM Student
    张三
李四
王五
啦啦
王五2
王五3
王五3
张三
李四
王五
啦啦
王五2
王五3
王五3

 三、GROUP BY产生高级汇总结果

https://msdn.microsoft.com/zh-cn/library/ms175939(v=sql.90).aspx

小计  合计

1、WITH CUBE(英文多维数据集)     生成的结果集显示了所选列中值的所有组合的聚合。

正常分组

select
s.ClassID,s.StuAge,COUNT()
FROM Class AS c
inner JOIN Student AS s
ON s.ClassID = c.ClassID GROUP BY s.ClassID,s.StuAge
ClassID    StuAge    (无列名)

with cube 汇总

--只是在基于GROUP BY 子句创建和汇总分组的可能的组合上有一定差别,CUBE将返回的更多
--的可能组合。如果在GROUP BY子句中有N个列或者是有N个表达式的话,SQLSERVER在结果集
--上会返回2的N-1次幂个可能组合。
select
s.ClassID,s.StuAge,COUNT()
FROM Class AS c
inner JOIN Student AS s
ON s.ClassID = c.ClassID GROUP BY s.ClassID,s.StuAge WITH CUBE
ClassID    StuAge    (无列名)

NULL                   

NULL              
      
NULL       
NULL   NULL   
  NULL   
  NULL   
    select
s.ClassID,s.StuAge,COUNT()
FROM Class AS c
inner JOIN Student AS s
ON s.ClassID = c.ClassID GROUP BY CUBE( s.ClassID,s.StuAge)
ClassID    StuAge    (无列名)

NULL        

NULL        

NULL
NULL NULL
NULL
NULL
    select
s.ClassID,s.StuAge,COUNT()
FROM Class AS c
inner JOIN Student AS s
ON s.ClassID = c.ClassID GROUP BY CUBE( s.ClassID),s.StuAge
ClassID    StuAge    (无列名)

NULL        

NULL        

NULL        

2、WITH ROLLUP(英文汇总)  生成的结果集显示了所选列中值的某一层次结构的聚合

https://msdn.microsoft.com/zh-cn/library/ms189305(v=sql.90).aspx

ROLLUP就是将GROUP BY后面的第一列名称求总和,而其他列并不要求而CUBE则会将每一个列名称都求总和 
select
s.ClassID,s.StuAge,COUNT()
FROM Class AS c
inner JOIN Student AS s
ON s.ClassID = c.ClassID GROUP BY s.StuAge,s.ClassID WITH ROLLUP
ClassID    StuAge    (无列名)

NULL        

NULL        

NULL
NULL NULL
select
s.ClassID,s.StuAge,COUNT()
FROM Class AS c
inner JOIN Student AS s
ON s.ClassID = c.ClassID GROUP BY s.ClassID,s.StuAge WITH ROLLUP
ClassID    StuAge    (无列名)

      NULL      

    NULL
NULL NULL

四、GROUPING SETS和GROUPING函数

1、GROUPING SETS可以简化大量的UNION

  插叙:

SQL统计函数

https://docs.microsoft.com/zh-cn/sql/t-sql/functions/aggregate-functions-transact-sql

  使用union合并

SELECT c.ClassName,NULL,COUNT()
FROM Class AS c INNER JOIN Student AS s ON s.ClassID = c.ClassID GROUP BY c.ClassName
UNION
SELECT NULL,s.StuAge,COUNT()
FROM Class AS c INNER JOIN Student AS s ON s.ClassID = c.ClassID GROUP BY s.StuAge
ClassName    (无列名)    (无列名)
NULL
NULL
NULL
班级1 NULL
班级2 NULL

  对应执行计划

  使用grouping sets(列明,表达式,(列名1,列名2...))       可以是列名  表达式,多个组合。

SELECT c.ClassName,s.StuAge,COUNT()
FROM Class AS c INNER JOIN Student AS s ON s.ClassID = c.ClassID GROUP BY GROUPING SETS(s.StuAge,c.ClassName)
ClassName    StuAge    (无列名)
班级1 NULL
班级2 NULL
NULL
NULL
NULL

GROUPING SETS不仅仅只是语法糖.而是从执行原理上做出了改变.(可以查看这两者的执行计划,第二次表扫描增多,第一次少,但是前面就行union操作。)

2、grouping sets和grouping 联合使用

grouping(列名或者表达式)  grouping(列名1,列名2...)  返回 0   1,必须和group by一起使用。参数必须在GROUPBY里面的

MSDN:Is a column or an expression that contains a column in a GROUP BY clause.

SELECT CASE    WHEN GROUPING(c.ClassName)= THEN c.ClassName ELSE '空' end as ClassName,s.StuAge,COUNT()
FROM Class AS c INNER JOIN Student AS s ON s.ClassID = c.ClassID GROUP BY GROUPING SETS(s.StuAge,c.ClassName)
ClassName    StuAge    (无列名)
班级1 NULL
班级2 NULL
空   
空   
空   

3、GROUPING_ID

    GROUPING_ID (<column_expression> [ ,...n ])  也可以是组合(根据groupingsets 里面的组合),作用:计算分组等级

  SELECT s.StuAge,s.ClassID,COUNT(),grouping_id(s.StuAge,s.ClassID) AS c FROM Student AS s GROUP BY cube(s.StuAge,s.ClassID) ORDER BY  c
StuAge    ClassID    (无列名)    c

    NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL NULL
  SELECT s.StuAge,s.ClassID,COUNT(),grouping_id(s.StuAge) AS c FROM Student AS s GROUP BY cube(s.StuAge,s.ClassID) ORDER BY  c
StuAge    ClassID    (无列名)    c

    NULL
NULL
NULL
NULL NULL
NULL NULL
NULL
NULL
SELECT CASE    WHEN GROUPING(c.ClassName)= THEN c.ClassName ELSE '空' end as ClassName,s.StuAge,COUNT(),grouping_id(s.StuAge,c.ClassName)
FROM Class AS c INNER JOIN Student AS s ON s.ClassID = c.ClassID GROUP BY GROUPING SETS(s.StuAge,c.ClassName)
ClassName    StuAge    (无列名)    (无列名)
班级1 NULL
班级2 NULL


SELECT CASE    WHEN GROUPING(c.ClassName)= THEN c.ClassName ELSE '空' end as ClassName,s.StuAge,COUNT(),grouping_id(s.StuAge)
FROM Class AS c INNER JOIN Student AS s ON s.ClassID = c.ClassID GROUP BY GROUPING SETS(s.StuAge,c.ClassName)
ClassName    StuAge    (无列名)    (无列名)
班级1 NULL
班级2 NULL


只有一个分组等级

SELECT s.StuAge,s.ClassID,COUNT(),grouping_id(s.StuAge) AS c FROM Student AS s GROUP BY s.StuAge,s.ClassID ORDER BY  c

    SELECT s.StuAge,s.ClassID,COUNT(),grouping_id(s.StuAge,s.ClassID) AS c FROM Student AS s GROUP BY s.StuAge,s.ClassID ORDER BY  c

两个sql结果一样

StuAge    ClassID    (无列名)    c

思考:group 里面分组,

单一条件分组,group by 列1,列2

多项分组,例如 group by  grouping sets(列1,列2,(列3,列4)),GROUP BY cube(s.StuAge,s.ClassID)

五、WITH AS   公用表表达式(CTE)(common table expression)    也叫做子查询部分

MSDN详解:https://docs.microsoft.com/zh-cn/sql/t-sql/queries/with-common-table-expression-transact-sql  (还是这帮老外厉害)

http://wudataoge.blog.163.com/blog/static/80073886200961652022389/

1、语法格式

[ WITH <common_table_expression> [ ,n ] ] 
<common_table_expression>::= 
        expression_name [ ( column_name [ ,n ] ) ] 
    AS 
        ( CTE_query_definition )

如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将
WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS
短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。

 2、用法

DECLARE @cname NVARCHAR(),@cclass NVARCHAR()
SET @cname='%名%';
SET @cclass='%班级%';
WITH stu AS (SELECT * FROM Student AS s WHERE s.StuName LIKE @cname),
claa AS (SELECT * FROM Class AS c WHERE c.ClassName LIKE @cclass)
SELECT * FROM stu st INNER JOIN claa AS s ON st.ClassID =s.ClassID
--下面一句不能执行
SELECT * FROM claa
StuID    StuName    StuAge    ClassID    ClassID    ClassName
名字8 班级1

3、递归

数据库脚本

USE [Test]
GO
/****** Object: Table [dbo].[Deparment] Script Date: 2017/6/30 11:23:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Deparment](
[ID] [int] NULL,
[PID] [int] NULL,
[Name] [nvarchar]() NULL
) ON [PRIMARY] GO
INSERT [dbo].[Deparment] ([ID], [PID], [Name]) VALUES (, NULL, N'永赢基金')
GO
INSERT [dbo].[Deparment] ([ID], [PID], [Name]) VALUES (, , N'人力资源')
GO
INSERT [dbo].[Deparment] ([ID], [PID], [Name]) VALUES (, , N'财务部')
GO
INSERT [dbo].[Deparment] ([ID], [PID], [Name]) VALUES (, , N'人力主管')
GO
INSERT [dbo].[Deparment] ([ID], [PID], [Name]) VALUES (, , N'人力员工')
GO
INSERT [dbo].[Deparment] ([ID], [PID], [Name]) VALUES (, , N'人力大员工')
GO
INSERT [dbo].[Deparment] ([ID], [PID], [Name]) VALUES (, , N'人力小员工')
GO
INSERT [dbo].[Deparment] ([ID], [PID], [Name]) VALUES (, , N'监察稽核部')
GO

递归语句

WITH dep AS (SELECT *,0 AS DepLeavel FROM Deparment WHERE ID=1
UNION ALL

SELECT d.*,dtemp.DepLeavel+1 FROM dep AS dtemp INNER JOIN Deparment AS d ON d.PID=dtemp.ID
)
SELECT * FROM dep AS d OPTION (MAXRECURSION 3)

ID    PID    Name    DepLeavel
NULL 永赢基金
人力资源
财务部
监察稽核部
人力主管
人力员工
人力大员工
人力小员工

SQL常用语句简单的更多相关文章

  1. 【数据库】 SQL 常用语句

    [数据库] SQL 常用语句 1.批量导入 INSERT INTO Table2(field1,field2,...) SELECT value1,value2,... FROMTable1 要求目标 ...

  2. 【数据库】 SQL 常用语句之系统语法

    [数据库] SQL 常用语句之系统语法 1. 获取取数据库服务器上所有数据库的名字 SELECT name FROM master.dbo.sysdatabases 2. 获取取数据库服务器上所有非系 ...

  3. SQL常用语句之数据库的创建、删除以及属性的修改-篇幅1

    本篇文章主要总结了SQL Server 语句的使用和一些基础知识,因为目前我也正在学习,所以总结一下. 要使用数据库语句,首先就要知道数据库对象的结构: 通常情况下,如果不会引起混淆,可以直接使用对象 ...

  4. SQL常用语句整理

    有次笔试最后一页的三个数据库连接查询,没有写出来,被考官暗讽了下.现在想来,实习初,确实很LOW.现公司刚入职的时候,负责过ETL方面,所以和数据库打了不少交道,五十行的联合查询.上百行的存储过程很常 ...

  5. mysql sql常用语句大全

    SQL执行一次INSERT INTO查询,插入多行记录 insert into test.person(number,name,birthday) values(5,'cxx5',now()),(6, ...

  6. sql常用语句--转载

    一.基础 .说明:创建数据库 CREATE DATABASE database-name .说明:删除数据库 drop database dbname .说明:备份sql server --- 创建 ...

  7. SQL常用语句,随时用随时更新

    更多详细说明文档查询 http://www.postgres.cn/docs/9.5/infoschema-columns.html 1.1通过表名查询表的属性 SELECT * FROM sys.s ...

  8. SQL常用语句(二)

    --语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据 --数 ...

  9. ORACLE数据库 常用命令和Sql常用语句

    ORACLE 账号相关 如何获取表及权限 1.COPY表空间backup scottexp登录管理员账号system2.创建用户 create user han identified(认证) by m ...

随机推荐

  1. jquery实现图片切换

    <div> <img class="imgclick" src="img/pic1.png" /> </div> <s ...

  2. Web前端-JavaScript基础教程下

    Web前端-JavaScript基础教程下 <script>有6个属性: async对外部脚本有效,可以用来异步操作,下载东西,不妨碍其他操作. charset为src属性指定字符集. d ...

  3. ROS理解参数服务器param demo

    param 是一个字典,存储一些变量 param_demo.cpp #include<ros/ros.h> int main(int argc, char **argv){ ros::in ...

  4. mui Picker DtPicker 固定内容以及变动内容Picker 不同情况下的应用 提高效率

    目的是: 保证不同的Picker只创建一次,多次创建Picker系统不会自己销毁,X掉一个之后后面可能会出现下一个. 保证实现需求的情况下,优化代码,提高效率. 1.如果picker中的内容为定值 v ...

  5. Docker Dockerfile 定制镜像

    使用 Dockerfile 定制镜像  镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么无法重复的问题 ...

  6. Mininet系列实验(一):Mininet使用源码安装

    1 实验目的 掌握Mininet使用源码安装的方法. 2 实验原理 Mininet 是一个轻量级软件定义网络和测试平台:它采用轻量级的虚拟化技术使一个单一的系统看起来像一个完整的网络运行相关的内核系统 ...

  7. Send me - PLANETSHAKERS

      Send me i will go 送我,我会去 send me i will go 送我,我会 to this city, to this nations 为这城市 为这国家 and to th ...

  8. Linux中split大文件分割和cat合并文件

    当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而不得不重新传输.这种情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件. 1.分割 ...

  9. 环境初始化 Build and Install the Apache Thrift IDL Compiler Install the Platform Development Tools

    Apache Thrift - Centos 6.5 Install http://thrift.apache.org/docs/install/centos Building Apache Thri ...

  10. android: Canvas的drawArc()方法的几个误区

    绘制圆环很多时候会用到Canvas的drawArc方法, drawArc()方法的说明很简单: public void drawArc (RectF oval, float startAngle, f ...