数据库脚本
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. QoS in RoCE

    QoS in RoCE 首页分类标签留言关于订阅2018-03-22 | 分类 Network  | 标签 RDMA  RoCE  ECN  PFC Overview TCP/IP协议栈满足不了现代I ...

  2. 在 Arch 上Yaourt 使用这些替代品

    1. aurman aurman 是最好的 AUR 助手之一,也能胜任 Yaourt 替代品的地位.它有非常类似于 pacman 的语法,可以支持所有的 pacman 操作.你可以搜索 AUR.解决包 ...

  3. Spring源代码分析:PropertiesLoaderSupport

    概述 Spring PropertiesLoaderSupport是一个抽象基类,它抽象了从不同渠道加载属性的通用逻辑,以及这些属性应用优先级上的一些考虑.它所提供的这些功能主要供实现子类使用.Spr ...

  4. numpy模块-渐入佳境

    1.多维数组降为一维: numpy中的ravel().flatten().squeeze()的用法与区别 2. axis的理解 Python之NumPy(axis=0/1/2...)的透彻理解——通过 ...

  5. java Calendar 小时值得到24进制格式

    Calendar cal = Calendar.getInstance(); cal.get(Calendar.HOUR_OF_DAY)

  6. java内存空间简述

    JVM的内存空间: 1. 寄存器 (Registers):最快的保存区域,位于处理器内部,由编译器分配.主要作用是记录当前线程所执行的字节码的行号.字节码解释器工作时就是通过改变当前线程的程序计数器选 ...

  7. Ubuntu下GDB调试器的使用

    gdb调试器时一款GNU组织开发.发布的UNIX/Linux环境下的程序调试工具,没有图形界面,但功能强大. GDB使用流程: 先编写一个测试文件gdbTest.c 保存后用gcc对文件进行编译,需要 ...

  8. ELK 二进制安装并收集nginx日志

    对于日志来说,最常见的需求就是收集.存储.查询.展示,开源社区正好有相对应的开源项目:logstash(收集).elasticsearch(存储+搜索).kibana(展示),我们将这三个组合起来的技 ...

  9. 【转载】 迁移学习(Transfer learning),多任务学习(Multitask learning)和端到端学习(End-to-end deep learning)

    --------------------- 作者:bestrivern 来源:CSDN 原文:https://blog.csdn.net/bestrivern/article/details/8700 ...

  10. React——嵌入已有项目 && jsx

    Add React to a Website React has been designed from the start for gradual adoption, and you can use ...