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 ...
随机推荐
- 重启hdfs集群的时候,报大量的gc问题。
问题现象: 2019-03-11 12:30:52,174 INFO org.apache.hadoop.util.JvmPauseMonitor: Detected pause in JVM or ...
- 2018-2019 20175234 实验三《敏捷开发与XP实践》实验报告
目录 2018-2019 20175234 实验三<敏捷开发与XP实践>实验报告 实验内容 实验中的问题 码云链接 参考资料 2018-2019 20175234 实验三<敏捷开发与 ...
- JavaScript中获取html元素常用手法和区分
对于许多前端开发项目来说,获取元素进行操作是必不可少的,例如tab标签,全屏切换,自动滚播等效果都需要通过获取节点元素来实现.下面我来总结下JavaScript最常用的4个Document对象中获取元 ...
- linux的常见目录
常见的目录和作用 目录名 目录名的作用 /bin/ 存放系统命令的目录,普通用户和root都使用,不过放在bin/命令下的单用户模式也可执行 /sbin/ 保存于系统环境相关的命令,只有root可以使 ...
- linux下 安装 ImageMagick 及其 php imagick扩展(转)
linux下 安装 ImageMagick 及其 php imagick扩展 PHP版本7.1.3 : ImageMagick版本 ImageMagick-7.0.8-3: PHP扩展imagick版 ...
- matlab图像灰度调整——imadjust函数的使用
在MATLAB中,通过函数imadjust()进行图像灰度的调整,该函数调用格式如下: J=imadjust( I ) 对图像I进行灰度调整 J=imadjust( I,[low_in;high_i ...
- Vue引入远程JS文件
问题 最近在使用 Vue 做东西,用到钉钉扫描登录的功能,这里需要引入远程的 js 文件,因为 Vue 的方式跟之前的不太一样,又不想把文件下载到本地应用,找了一下解决的方法,貌似都需要引入第三方的库 ...
- python操作excel实用脚本
import xlrd data = xlrd.open_workbook('/home/ppe/workspace/pythonwp/tianranqi_org.xls') table = data ...
- 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...
- spark简单文件配置
cd /usr/local/spark/spark-2.2.1-bin-hadoop2.7/conf cp slaves.template slaves cp spark-env.sh.templat ...