SQL常用语句简单
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常用语句简单的更多相关文章
- 【数据库】 SQL 常用语句
[数据库] SQL 常用语句 1.批量导入 INSERT INTO Table2(field1,field2,...) SELECT value1,value2,... FROMTable1 要求目标 ...
- 【数据库】 SQL 常用语句之系统语法
[数据库] SQL 常用语句之系统语法 1. 获取取数据库服务器上所有数据库的名字 SELECT name FROM master.dbo.sysdatabases 2. 获取取数据库服务器上所有非系 ...
- SQL常用语句之数据库的创建、删除以及属性的修改-篇幅1
本篇文章主要总结了SQL Server 语句的使用和一些基础知识,因为目前我也正在学习,所以总结一下. 要使用数据库语句,首先就要知道数据库对象的结构: 通常情况下,如果不会引起混淆,可以直接使用对象 ...
- SQL常用语句整理
有次笔试最后一页的三个数据库连接查询,没有写出来,被考官暗讽了下.现在想来,实习初,确实很LOW.现公司刚入职的时候,负责过ETL方面,所以和数据库打了不少交道,五十行的联合查询.上百行的存储过程很常 ...
- mysql sql常用语句大全
SQL执行一次INSERT INTO查询,插入多行记录 insert into test.person(number,name,birthday) values(5,'cxx5',now()),(6, ...
- sql常用语句--转载
一.基础 .说明:创建数据库 CREATE DATABASE database-name .说明:删除数据库 drop database dbname .说明:备份sql server --- 创建 ...
- SQL常用语句,随时用随时更新
更多详细说明文档查询 http://www.postgres.cn/docs/9.5/infoschema-columns.html 1.1通过表名查询表的属性 SELECT * FROM sys.s ...
- SQL常用语句(二)
--语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据 --数 ...
- ORACLE数据库 常用命令和Sql常用语句
ORACLE 账号相关 如何获取表及权限 1.COPY表空间backup scottexp登录管理员账号system2.创建用户 create user han identified(认证) by m ...
随机推荐
- 微信小程序分页显示
<view class="tabNav"> <view wx:for="{{navTab}}" wx:key="index" ...
- ROS手动编写消息发布器和订阅器topic demo(C++)
1.首先创建 package cd ~/catkin_ws/src catkin_create_pkg topic_demo roscpp rospy std_msgs 2. 编写 msg 文件 cd ...
- Jetbrain全栈最新激活方法(2019年及之前所有新老版本)
随着2019版的到来,之前的永久激活教程也不生效了,所以今天为大家带来一种新的永久激活方式. 1.下载新版破解补丁 破解补丁传送门提取码:3e8j 点击传送门下载补丁文件 jetbrains-agen ...
- Ubuntu 源 (ros)
deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse deb http://archive. ...
- ShardingSphere Hint模式 SpringBoot + Mybatis
ShardingSphere Hint模式不需要对sql进行解析,就可以进行数据库或者表的路由.下面贴一下代码,关于SpringBoot + Mybatis + ShardingSphere怎样结合. ...
- Java 面向对象(八)
常用类之String String字符串类 什么是字符串?就是把多个字符,串连一起. String字符串的本质 其实是一个char[]数组 /**该值用于字符存储.*/ private final c ...
- legend3---20、加东西之前要保证没有,删东西之前要保证有,无论前端后端
legend3---20.加东西之前要保证没有,删东西之前要保证有,无论前端后端 一.总结 一句话总结: 加东西之前要保证没有,删东西之前要保证有,无论前端后端 这是很好的编程习惯,可以避免很多错误, ...
- legend3---19、要更多的从服务器端控制元素的显示和隐藏,而不要是页面端
legend3---19.要更多的从服务器端控制元素的显示和隐藏,而不要是页面端 一.总结 一句话总结: 这样可以控制很多页面端的非法操作 1.html标签中data方式的数据,修改之后在标签上只显示 ...
- unittest 的用法
一.discover方法 discover方法可以根据标准加载用例,并将结果返回给测试套件(suite),start_dir:待测试的目录,pattern:测试用例文件名的匹配规. 如: start_ ...
- 【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 ...