前言
本節(jié)我們講講一些簡(jiǎn)單查詢語(yǔ)句示例以及需要注意的地方,簡(jiǎn)短的內(nèi)容,深入的理解。
EOMONTH
在SQL Server 2012的教程示例中,對(duì)于Sales.Orders表的查詢,需要返回每月最后一天的訂單。我們普遍的查詢?nèi)缦?/p>
USE TSQL2012 GO SELECT orderid, orderdate, custid, empid FROM Sales.Orders WHERE orderdate = DATEADD(MONTH, DATEDIFF(MONTH, '19991231', orderdate), '19991231')
但是在SQL Server 2012出現(xiàn)了新的函數(shù)直接返回每個(gè)月最后一天的訂單,通過(guò)EOMONTH函數(shù)即可,將
WHERE orderdate = DATEADD(MONTH, DATEDIFF(MONTH, '19991231', orderdate), '19991231')
替換為
SELECT orderid, orderdate, custid, empid FROM Sales.Orders WHERE orderdate = EOMONTH(orderdate)
如上簡(jiǎn)單而粗暴。
HAVING AND WHERE
我們利用Sales.OrderDetails表來(lái)查詢總價(jià)(qty*unitprice)大于10000的訂單,且按照總價(jià)排序。
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
通過(guò)此例我們來(lái)說(shuō)說(shuō)WHERE和HAVING的區(qū)別,下面的示例是等同的
SELECT orderid FROM Sales.OrderDetails WHERE orderid >10357 GROUP BY orderid SELECT orderid FROM Sales.OrderDetails GROUP BY orderid HAVING orderid >10357
但是利用聚合函數(shù)時(shí)能等同嗎?
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
二者的區(qū)別我們總結(jié)一下:
(1)WHERE能夠用在UPDATE、DELETE、SELECT語(yǔ)句中,而HAVING只能用在SELECT語(yǔ)句中。
(2)WHERE過(guò)濾行在GROUP BY之前,而HAVING過(guò)濾行在GROUP BY之后。
(3)WHERE不能用在聚合函數(shù)中,除非該聚合函數(shù)位于HAVING子句或選擇列表所包含的子查詢中。
說(shuō)了這么多,關(guān)于WHERE和HAVING的區(qū)別,其實(shí)WHERE的應(yīng)用場(chǎng)景更多,我們歸根結(jié)底一句話來(lái)概括的HAVING的用法即可。
HAVING僅僅在SELECT語(yǔ)句中對(duì)組(GROUP BY)或者聚合函數(shù)(AGGREGATE)進(jìn)行過(guò)濾
INSERT TOP分析
當(dāng)將查詢出的數(shù)據(jù)插入到表中,我們其實(shí)有兩種解決方案。
方案一
NSERT INTO TABLE … SELECT TOP (N) Cols… FROM Table
方案二
INSERT TOP(N) INTO TABLE … SELECT Cols… FROM Table
方案一是需要查詢幾條就插入幾條,方案二則是查詢所有我們需要插入幾條數(shù)據(jù),接下來(lái)我們來(lái)看看二者不同以及二者性能問(wèn)題,創(chuàng)建查詢表并插入數(shù)據(jù)。
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
需要插入的兩個(gè)表
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
接下來(lái)查詢方案一和方案二的數(shù)據(jù)
SELECT * FROM InsertTestValue GO SELECT * FROM InsertTestValue1 GO
我們對(duì)方案一和方案二插入數(shù)據(jù)之前我們對(duì)查詢的數(shù)據(jù)是進(jìn)行了降序,此時(shí)我們能夠很明顯的看到方案一中的查詢數(shù)據(jù)確確實(shí)實(shí)是降序,而方案二則忽略了降序,這是個(gè)很有意思的地方,至此我們看到了二者的不同。
二者性能比較
在插入數(shù)據(jù)時(shí)我們對(duì)其進(jìn)行開銷分析如下:
到這里我們能夠知道利用INSET TOP (N)比INSERT … SELECT TOP (N)性能更好,同時(shí)SELECT TOP(N)會(huì)對(duì)查詢出的數(shù)據(jù)排序進(jìn)行忽略。至此我們可以得出如下結(jié)論
結(jié)論:INSERT TOP (N)比INSERT … SELECT TOP (N)插入數(shù)據(jù)性能更好。
COUNT(DISTINCT) AND COUNT(ALL)
關(guān)于DISTINCT就不用多講,此關(guān)鍵字過(guò)濾重復(fù)針對(duì)的是所有列數(shù)據(jù)一致才過(guò)濾而不是針對(duì)于單列數(shù)據(jù)一致才過(guò)濾,我們看看COUNT(DISTINCT)和COUNT(ALL)查詢出的數(shù)據(jù)是一致還是不一致呢?我們首先創(chuàng)建測(cè)試表
CREATE TABLE TestData ( Id INT NOT NULL IDENTITY PRIMARY KEY, NAME VARCHAR(max) NULL );
插入如下測(cè)試數(shù)據(jù)
接下來(lái)我們進(jìn)行如下查詢
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
此時(shí)我們能夠很清楚的看到COUNT(colName)和COUNT(ALL colName)的結(jié)果是一樣的,其實(shí)COUNT(ALL colName)是默認(rèn)的選項(xiàng)且包括所有非空值,換句話說(shuō)ALL根本不需要我們?nèi)ブ付ā?/p>
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,同時(shí)也希望多多支持腳本之家!
標(biāo)簽:來(lái)賓 東營(yíng) 文山 黃山 大同 濱州 池州 新鄉(xiāng)
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL Server簡(jiǎn)單查詢示例匯總》,本文關(guān)鍵詞 SQL,Server,簡(jiǎn)單,查詢,示例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。