数据库脚本
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. 微信小程序分页显示

    <view class="tabNav"> <view wx:for="{{navTab}}" wx:key="index" ...

  2. ROS手动编写消息发布器和订阅器topic demo(C++)

    1.首先创建 package cd ~/catkin_ws/src catkin_create_pkg topic_demo roscpp rospy std_msgs 2. 编写 msg 文件 cd ...

  3. Jetbrain全栈最新激活方法(2019年及之前所有新老版本)

    随着2019版的到来,之前的永久激活教程也不生效了,所以今天为大家带来一种新的永久激活方式. 1.下载新版破解补丁 破解补丁传送门提取码:3e8j 点击传送门下载补丁文件 jetbrains-agen ...

  4. Ubuntu 源 (ros)

    deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse deb http://archive. ...

  5. ShardingSphere Hint模式 SpringBoot + Mybatis

    ShardingSphere Hint模式不需要对sql进行解析,就可以进行数据库或者表的路由.下面贴一下代码,关于SpringBoot + Mybatis + ShardingSphere怎样结合. ...

  6. Java 面向对象(八)

    常用类之String String字符串类 什么是字符串?就是把多个字符,串连一起. String字符串的本质 其实是一个char[]数组 /**该值用于字符存储.*/ private final c ...

  7. legend3---20、加东西之前要保证没有,删东西之前要保证有,无论前端后端

    legend3---20.加东西之前要保证没有,删东西之前要保证有,无论前端后端 一.总结 一句话总结: 加东西之前要保证没有,删东西之前要保证有,无论前端后端 这是很好的编程习惯,可以避免很多错误, ...

  8. legend3---19、要更多的从服务器端控制元素的显示和隐藏,而不要是页面端

    legend3---19.要更多的从服务器端控制元素的显示和隐藏,而不要是页面端 一.总结 一句话总结: 这样可以控制很多页面端的非法操作 1.html标签中data方式的数据,修改之后在标签上只显示 ...

  9. unittest 的用法

    一.discover方法 discover方法可以根据标准加载用例,并将结果返回给测试套件(suite),start_dir:待测试的目录,pattern:测试用例文件名的匹配规. 如: start_ ...

  10. 【Canvas】勾画调和级数Harmonic series 曲线 y=1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+....

    相关资料:https://baike.baidu.com/item/%E8%B0%83%E5%92%8C%E7%BA%A7%E6%95%B0/8019971?fr=aladdin 调和级数(英语:Ha ...