设为首页 收藏本站
查看: 927|回复: 0

[经验分享] SQL Server-简单查询示例(十一)

[复制链接]

尚未签到

发表于 2017-7-12 19:59:19 | 显示全部楼层 |阅读模式
前言
  本节我们讲讲一些简单查询语句示例以及需要注意的地方,简短的内容,深入的理解,Always to review the basics。

EOMONTH
  在SQL Server 2012的教程示例中,对于Sales.Orders表的查询,需要返回每月最后一天的订单。我们普遍的查询如下



USE TSQL2012
GO
SELECT orderid, orderdate, custid, empid
FROM Sales.Orders
WHERE orderdate = DATEADD(MONTH, DATEDIFF(MONTH, '19991231', orderdate), '19991231')
DSC0000.png

  但是在SQL Server 2012出现了新的函数直接返回每个月最后一天的订单,通过EOMONTH函数即可,将



WHERE orderdate = DATEADD(MONTH, DATEDIFF(MONTH, '19991231', orderdate), '19991231')
  替换为



SELECT orderid, orderdate, custid, empid
FROM Sales.Orders
WHERE orderdate = EOMONTH(orderdate)
  如上简单而粗暴。

HAVING AND WHERE
  我们利用Sales.OrderDetails表来查询总价(qty*unitprice)大于10000的订单,且按照总价排序。



USE TSQL2012
GO
SELECT orderid,SUM(unitprice *qty) AS TotalValue
FROM Sales.OrderDetails
GROUP BY orderid
HAVING SUM(unitprice *qty) > 10000
ORDER BY TotalValue DESC
DSC0001.png

  通过此例我们来说说WHERE和HAVING的区别,下面的示例是等同的



SELECT orderid
FROM Sales.OrderDetails
WHERE orderid >10357
GROUP BY orderid
SELECT orderid
FROM Sales.OrderDetails
GROUP BY orderid
HAVING orderid >10357
  但是利用聚合函数时能等同吗?



SELECT orderid
FROM Sales.OrderDetails
WHERE  COUNT(qty * unitprice) >10000
GROUP BY orderid
SELECT orderid
FROM Sales.OrderDetails
GROUP BY orderid
HAVING COUNT(qty * unitprice) >10000
DSC0002.png

  二者的区别我们总结一下:
  (1)WHERE能够用在UPDATE、DELETE、SELECT语句中,而HAVING只能用在SELECT语句中。
  (2)WHERE过滤行在GROUP BY之前,而HAVING过滤行在GROUP BY之后。
  (3)WHERE不能用在聚合函数中,除非该聚合函数位于HAVING子句或选择列表所包含的子查询中。
  说了这么多,关于WHERE和HAVING的区别,其实WHERE的应用场景更多,我们归根结底一句话来概括的HAVING的用法即可。
  HAVING仅仅在SELECT语句中对组(GROUP BY)或者聚合函数(AGGREGATE)进行过滤

INSERT  TOP分析
  当将查询出的数据插入到表中,我们其实有两种解决方案。
  方案一



INSERT INTO TABLE …
SELECT TOP (N) Cols…
FROM Table
  方案二



INSERT TOP(N) INTO TABLE …
SELECT Cols…
FROM Table
  方案一是需要查询几条就插入几条,方案二则是查询所有我们需要插入几条数据,接下来我们来看看二者不同以及二者性能问题,创建查询表并插入数据。



CREATE TABLE TestValue(ID INT)
INSERT INTO TestValue (ID)
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
  需要插入的两个表



USE TSQL2012
GO
CREATE TABLE InsertTestValue (ID INT)
CREATE TABLE InsertTestValue1 (ID INT)
  方案一的插入



INSERT INTO InsertTestValue (ID)
SELECT TOP (2) ID
FROM TestValue
ORDER BY ID DESC
GO
  方案二的插入



INSERT TOP (2) INTO InsertTestValue1 (ID)
SELECT ID
FROM TestValue
ORDER BY ID DESC
GO
  接下来查询方案一和方案二的数据



SELECT *
FROM InsertTestValue
GO
SELECT *
FROM InsertTestValue1
GO
DSC0003.png

  我们对方案一和方案二插入数据之前我们对查询的数据是进行了降序,此时我们能够很明显的看到方案一中的查询数据确确实实是降序,而方案二则忽略了降序,这是个很有意思的地方,至此我们看到了二者的不同。

二者性能比较
  在插入数据时我们对其进行开销分析如下:
DSC0004.png

  到这里我们能够知道利用INSET TOP (N)比INSERT … SELECT TOP (N)性能更好,同时INSERT TOP(N)会对查询出的数据排序进行忽略。至此我们可以得出如下结论
  结论:INSERT TOP (N)比INSERT … SELECT TOP (N)插入数据性能更好。

COUNT(DISTINCT) AND COUNT(ALL)
  关于DISTINCT就不用多讲,此关键字过滤重复针对的是所有列数据一致才过滤而不是针对于单列数据一致才过滤,我们看看COUNT(DISTINCT)和COUNT(ALL)查询出的数据是一致还是不一致呢?我们首先创建测试表



CREATE TABLE TestData
(
Id INT NOT NULL IDENTITY PRIMARY KEY,
NAME VARCHAR(max) NULL
);
  插入如下测试数据
DSC0005.png

  接下来我们进行如下查询



USE TSQL2012
GO
SELECT COUNT(NAME) AS COUNT_NAME
FROM dbo.TestData
SELECT COUNT(ALL NAME) AS COUNT_ALLNAME
FROM dbo.TestData
SELECT COUNT(DISTINCT NAME) AS COUNT_DISTINCTNAME
FROM dbo.TestData
DSC0006.png

  此时我们能够很清楚的看到COUNT(colName)和COUNT(ALL colName)的结果是一样的,其实COUNT(ALL colName)是默认的选项且包括所有非空值,换句话说ALL根本不需要我们去显示指定。

总结
  本节我们简单讲了简单查询语句以及需要注意的地方,关于简单查询和基础概念我们到此结束,下一节我们开始进入表连接,接下来的内容将越来越有意思,简短的内容,深入的理解,我们下节再会。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393289-1-1.html 上篇帖子: SQL Server 存储中间结果集 下篇帖子: SQL SERVER分区具体例子详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表