SQLServer学习笔记系列7
一.写在前面的话
转眼又是周一,回想双休的日子,短暂而幸福,在阳光明媚的下午,可以自己做自己想做的任何事,惬意舒适,或读书,或运动,或音乐,当我们静下心来慢慢感受这些的时候,会突然发觉,原来生活是这么的幸福!有所求,有所感,就够啦!简简单单的生活其实就是最奢华的享受!忘记不开心的事,做自己生活的主导,摆脱烦恼,希望园子的朋友们,都能有一个好心情,不顺心的时候,出去走走,让情绪行走无边,放空自己!相信美好的事情终将发生!

二.视图
视图可以看作定义在SQL Server上的虚拟表.视图包含查询的一组结果集.常规视图本身并不存储实际的数据,而仅仅存储一个Select语句和所涉及表的metadata.利用视图,可以根据我们的需要,将多个表的数据进行组合,而且视图一旦建立,就一直存在,可以循环使用。
例如:假如我们要查找美国顾客的相关信息,那么就可以建立一个视图,每次只要查询美国顾客信息,只要根据视图名称查询就可以啦!同理,视图也需要先定义再查询。sql如下:
CREATE VIEW USA_cusomers
AS
(
SELECT * FROM
sales.customers
WHERE country='USA'
)
定义完成以后,执行sql,那么命令就创建完成,然后就可以利用sql查询语句来查询美国的顾客信息。
SELECT custid,country FROM dbo.USA_cusomers;
执行结果如图所示:

同时我们在sql的对象资源管理器中——》视图中可以看到,已经添加了名称为dbo.USA_cusomers的视图,那么可以循环利用这个视图进行查询。

如果想删除这个视图的话,可以利用sql语句drop进行操作:
DROP VIEW dbo.USA_cusomers;
三.集合运算
集合预算主用用于对查询的结果进行操作。合集(Union)、交集(Intersect)、差集(Except),跟数学中的集合运算一样。
(1)合集,将所查询的两个或者多个结果集进行合并进行展示。
例如:我们要查询顾客表(sales.customers)和雇员表(hr.employees)里面所有的国家信息,那么就需要先查询出顾客表里面的所有国家,然后查询雇员表里面的所有国家,将两个结果集进行合并。sql如下:
SELECT country
FROM Sales.Customers
UNION ALL
SELECT country
FROM hr.Employees;

注意此处用的是union all,那么假如使用union结果又是什么了?
SELECT country
FROM Sales.Customers
UNION
SELECT country
FROM hr.Employees;

可以看到使用union all与union之间进行合集以后,结果集是不同的,其实这就说明了一点:
union all 不去重,包含所有的结果。
union 去重,显示的是去重以后的结果集。所以上述结果集显示21条,是去重后的结果。
(2)交集,将所查询的两个或者多个结果集进行交集展示。其中包含两个结果集中相同的部分。
同样我们将顾客表(sales.customers)和雇员表(hr.employees)里面所有的国家信息进行交集处理,看哪些国家既有顾客也有雇员。sql如下:
SELECT country
FROM Sales.Customers
intersect
SELECT country
FROM hr.Employees;

其中需要注意的是:intersect求交集,也是去重后的结果。
(3)差集,将所查询的两个或者多个结果集进行差集合并,找出其中一个集合在另一个集合中不存在的结果集。
例如:我们找出雇员表(hr.employees)里面的员工所在国家在顾客表(sales.customers)里面不存在的部分,也就是找出有顾客没有雇员的国家有哪些。sql如下:
SELECT country
FROM Sales.Customers
EXCEPT
SELECT country
FROM hr.Employees;

四.透视(pivot)
所谓的透视,也就是表的转置,在数据库操作中,有些时候我们遇到需要实现“行转列”的需求,统计每一阶段或者每一季度,每一星期的数量,可能数据库中存的数据格式是一行一行的,那么我们需要用一列展示具体的统计情况,这时候就需要用到透视(pivot)。

在这里我们首先创建一张表dbo.orders,同时往表里面插入一些数据。
IF OBJECT_ID('dbo.orders','U') IS NOT NULL
DROP TABLE dbo.orders;
CREATE TABLE dbo.orders
(
orderid int NOT NULL PRIMARY KEY,
empid int NOT NULL,
custid int NOT NULL,
orderdate datetime,
qty int
);
INSERT INTO dbo.orders(orderid,empid,custid,orderdate,qty)
VALUES (,,,'',),
(,,,'',),
(,,,'',),
(,,,'',),
(,,,'',),
(,,,'',),
(,,,'',),
(,,,'',)
SELECT * FROM dbo.orders
查询表数据有:

现在假如有一个需求,要求出每位顾客所消费的金额,根据常规想法,我们可以根据顾客id进行分组,然后用聚合函数sum求和,sql语句如下:
SELECT empid,SUM(qty) AS N'顾客消费金额'
FROM dbo.orders
GROUP BY empid;

但是我们现在想将顾客消费金额变成一列,也就是行转列,该怎么考虑了,在这里我们先用传统的方式,用到case when,然后根据case when条件进行一次求和。sql语句如下:
SELECT empid,
SUM(CASE when empid= THEN qty end) AS N'2号顾客消费金额',
SUM(CASE when empid=3THEN qty end) AS N'3号顾客消费金额',
SUM(CASE when empid= THEN qty end) AS N'4号顾客消费金额',
SUM(CASE when empid= THEN qty end) AS N'5号顾客消费金额',
SUM(CASE when empid= THEN qty end) AS N'6号顾客消费金额'
FROM dbo.orders
GROUP BY empid;
其执行结果如图:

从执行结果图可以看出,已经将顾客ID转换到一行显示,每位顾客的消费在列中都可以看到。但是这里我们采取新的一种方式,显得更好用,那就是pivot方式。只不过pivot帮我们做了很多的转换工作而已,这里我们只关注pivot如何用。对于上面的需求,我们可以这样使用pivot:
SELECT empid,[],[],[],[],[]
FROM
(
--只返回pivot中用到的列
SELECT empid,qty,custid
FROM dbo.orders
) AS t
PIVOT (
SUM(t.qty) FOR t.custid IN ([],[],[],[],[])--做列名称
) AS P

希望各位大牛给出指导,不当之处虚心接受学习!谢谢!
SQLServer学习笔记系列7的更多相关文章
- SQLServer学习笔记系列3
一.写在前面的话 今天又是双休啦!生活依然再继续,当你停下来的时候,或许会突然显得不自在.有时候,看到一种东西,你会发现原来在这个社会上,优秀的人很多,默默 吃苦努力奋斗的人也多!星期五早上按时上班, ...
- SQLServer学习笔记系列2
一.写在前面的话 继上一次SQLServer学习笔记系列1http://www.cnblogs.com/liupeng61624/p/4354983.html以后,继续学习Sqlserver,一步一步 ...
- SQLServer学习笔记系列6
一.写在前面的话 时间是我们每个人都特别熟悉的,但是到底它是什么,用什么来衡量,可能很多人会愣在那里.时间可以见证一切,也可以消磨一切,那些过往的点点滴滴可思可忆.回想往年清明节过后,在家乡的晚上总能 ...
- SQLServer学习笔记系列5
一.写在前面的话 转眼又是一年清明节,话说“清明时节雨纷纷”,武汉的天气伴随着这个清明节下了一场暴雨,整个城市如海一样,朋友圈渗透着清明节武汉看海的节奏.今年又没有回老家祭祖,但是心里依然是怀念着那些 ...
- SQLServer学习笔记系列1
一.前言 一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流! 不当之处请斧正!在此感谢!这边就先从学习Sqlserver写起,自己本身对数 ...
- SQLServer学习笔记系列4
一.写在前面的话 好多天没有记录sql学习笔记了,要坚持下去,坚信每一点的进步都是为在积蓄力量.今天看到一幅图,特此分享出来. 通过这幅图,我看到的是每人站在自己的角度看问题,感受是不一样的,就如同学 ...
- SQLServer学习笔记系列12
一.写在前面的话 这个sql学习系列,今天准备告一段落,虽然短短的十几篇文章,深刻感受到将学习的东西记录下来,是需要一种坚持! 这些东西只有反复的学习吸收,最终沉淀下来的才是属于自己的知识.也是提醒自 ...
- SQLServer学习笔记系列11
一.写在前面的话 身体是革命的本钱,这句放在嘴边常说的话,还是拿出来一起共勉,提醒一起奋斗的同僚们,保证睡眠,注意身体!偶尔加个班,也许不曾感觉到身体发出的讯号,长期晚睡真心扛不住!自己也制定计划,敦 ...
- SQLServer学习笔记系列10
一.写在前面的话 生活的路很长,还是要坚持走下去,自己选择的生活,就该让这样的生活放射精彩!我不奢求现在的积累,在将来能够收获多少,至少在以后的日子里回忆起来,我不曾放弃过,我坚持过,我不后悔!最近跟 ...
- SQLServer学习笔记系列8
一.写在前面的话 最近一直在思考一个问题,什么才能让我们不显得浮躁,真正的静下心来,用心去感受,用心去回答每个人的问题,用心去帮助别人.现实的生活,往往让我们显得精疲力尽,然后我们仔细想过没用,其实支 ...
随机推荐
- Win10 设置外网多用户远程桌面连接
主要原理:利用路由器的虚拟服务器功能,将内网的Ip地址通过端口映射提供给外网,使得外网能够访问到目的主机. 1. 配置路由器上的虚拟服务器,假设目的主机内网的ip为192.168.1.100,则配置如 ...
- UNET学习笔记2 - 高级API(HLAPI)
高级API是在实时传输低级API基础上建立起来的,为多人游戏提供大量通用的组件.通过HLAPI开发者仅需少量的工作就可以搭建多人联网游戏. HLAPI 使用命名空间 UnityEngine.Netwo ...
- [转载]并发编程之Operation Queue和GCD
并发编程之Operation Queue http://www.cocoachina.com/applenews/devnews/2013/1210/7506.html 随着移动设备的更新换代,移动设 ...
- win下修改mysql默认的字符集以防止乱码出现
环境:win8.1+mysql5.6.11+xampp(v3.2.1) 默认的编码如下 查看方式: show variables like 'character%'; 结果: 从以上信息可知数据库的编 ...
- 【腾许Bugly干货分享】“HTTPS”安全在哪里?
背景 最近基于兴趣学学习了下 HTTPS 相关的知识,在此记录下学习心得. 在上网获取信息的过程中,我们接触最多的信息加密传输方式也莫过于 HTTPS 了.每当访问一个站点,浏览器的地址栏中出现绿色图 ...
- 谈谈final的作用
前言 一直想写写这个话题.代表公司也面试过一些求职者,每次面试我必问的两个问题之一就是“请你谈一谈对于final关键字的理解”.这是一个简单的小问题,但是不要小看它,通过对这个问题的回答以及一些简单的 ...
- 作业二--注册GitHub的过程
第一步:打开GitHub官网https://github.com/,在界面中输入账号名称.邮箱.密码,然后点击注册按钮. 第二步:注册完成后,选择Free免费账号完成初始设置. 第三步:验证邮箱,打开 ...
- 项目开发之使用 maven
本文将详述 maven 在软件项目中的使用.首先讲述 maven 的基本工作原理及环境的搭建.然后讲述开发及配置管理人员如何使用 maven,最后将介绍 maven 与 eclipse 集成使用. m ...
- Unity多单位战斗寻路问题的一种解决办法
Unity多单位战斗寻路问题的一种解决办法 Unity提供了NavMesh 导航组件 NavMesh是在实践中通用性最好的一种导航方式,但是Unity的实现并没有完全提供一个开放自由的API. 主 ...
- [算法][三轴、六轴、九轴传感器算法分析] 1、分享一个三轴加速计matlab动态可视化脚本
一.有啥用 这里用的是LIS3DH三轴加速计,输出为X.Y.Z轴的加速度,通过串口连接电脑,电脑里运行matlab脚本通过串口实时获取数据并做可视化显示. 这里虽然是针对LIS3DH的,其实稍作修改即 ...