SQL Server簡單查詢示例匯總
前言
本節(jié)我們講講一些簡單查詢語句示例以及需要注意的地方,簡短的內(nèi)容,深入的理解。
EOMONTH
在SQL Server 2012的教程示例中,對于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ù)直接返回每個月最后一天的訂單,通過EOMONTH函數(shù)即可,將
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

通過此例我們來說說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ù)時能等同嗎?
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語句中,而HAVING只能用在SELECT語句中。
(2)WHERE過濾行在GROUP BY之前,而HAVING過濾行在GROUP BY之后。
(3)WHERE不能用在聚合函數(shù)中,除非該聚合函數(shù)位于HAVING子句或選擇列表所包含的子查詢中。
說了這么多,關(guān)于WHERE和HAVING的區(qū)別,其實WHERE的應(yīng)用場景更多,我們歸根結(jié)底一句話來概括的HAVING的用法即可。
HAVING僅僅在SELECT語句中對組(GROUP BY)或者聚合函數(shù)(AGGREGATE)進行過濾
INSERT TOP分析
當將查詢出的數(shù)據(jù)插入到表中,我們其實有兩種解決方案。
方案一
NSERT INTO TABLE … SELECT TOP (N) Cols… FROM Table
方案二
INSERT TOP(N) INTO TABLE … SELECT Cols… FROM Table
方案一是需要查詢幾條就插入幾條,方案二則是查詢所有我們需要插入幾條數(shù)據(jù),接下來我們來看看二者不同以及二者性能問題,創(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
需要插入的兩個表
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
接下來查詢方案一和方案二的數(shù)據(jù)
SELECT * FROM InsertTestValue GO SELECT * FROM InsertTestValue1 GO

我們對方案一和方案二插入數(shù)據(jù)之前我們對查詢的數(shù)據(jù)是進行了降序,此時我們能夠很明顯的看到方案一中的查詢數(shù)據(jù)確確實實是降序,而方案二則忽略了降序,這是個很有意思的地方,至此我們看到了二者的不同。
二者性能比較
在插入數(shù)據(jù)時我們對其進行開銷分析如下:

到這里我們能夠知道利用INSET TOP (N)比INSERT … SELECT TOP (N)性能更好,同時SELECT TOP(N)會對查詢出的數(shù)據(jù)排序進行忽略。至此我們可以得出如下結(jié)論
結(jié)論:INSERT TOP (N)比INSERT … SELECT TOP (N)插入數(shù)據(jù)性能更好。
COUNT(DISTINCT) AND COUNT(ALL)
關(guān)于DISTINCT就不用多講,此關(guān)鍵字過濾重復(fù)針對的是所有列數(shù)據(jù)一致才過濾而不是針對于單列數(shù)據(jù)一致才過濾,我們看看COUNT(DISTINCT)和COUNT(ALL)查詢出的數(shù)據(jù)是一致還是不一致呢?我們首先創(chuàng)建測試表
CREATE TABLE TestData ( Id INT NOT NULL IDENTITY PRIMARY KEY, NAME VARCHAR(max) NULL );
插入如下測試數(shù)據(jù)

接下來我們進行如下查詢
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

此時我們能夠很清楚的看到COUNT(colName)和COUNT(ALL colName)的結(jié)果是一樣的,其實COUNT(ALL colName)是默認的選項且包括所有非空值,換句話說ALL根本不需要我們?nèi)ブ付ā?/p>
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時也希望多多支持腳本之家!
- 詳解SQL Server的簡單查詢語句
- SqlServer查詢和Kill進程死鎖的語句
- SQLSERVER分頁查詢關(guān)于使用Top方式和row_number()解析函數(shù)的不同
- SQL Server 2016 查詢存儲性能優(yōu)化小結(jié)
- SqlServer使用 case when 解決多條件模糊查詢問題
- 使用SqlServer CTE遞歸查詢處理樹、圖和層次結(jié)構(gòu)
- 在sqlserver中如何使用CTE解決復(fù)雜查詢問題
- 在SQL SERVER中查詢數(shù)據(jù)庫中第幾條至第幾條之間的數(shù)據(jù)SQL語句寫法
- SQL Server查詢前N條記錄的常用方法小結(jié)
- 詳解sqlserver查詢表索引
- SQL Server數(shù)據(jù)庫按百分比查詢出表中的記錄數(shù)
相關(guān)文章
sql中 order by 和 group by的區(qū)別
這篇文章主要介紹了sql中 order by 和 group by的區(qū)別的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-11-11
在SQLserver數(shù)據(jù)庫之間進行傳表和傳數(shù)據(jù)的圖文教程
這篇文章主要介紹了在SQLserver數(shù)據(jù)庫之間進行傳表和傳數(shù)據(jù)的圖文教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
sqlserver只有MDF文件恢復(fù)數(shù)據(jù)庫的方法
因為只有mdf文件,想恢復(fù)數(shù)據(jù)庫,大家可以用下面的代碼先測試2008-10-10
圖解SSIS批量導(dǎo)入Excel文件的實現(xiàn)方法
本篇文章是對SSIS批量導(dǎo)入Excel文件的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下2013-06-06
SQL Server 數(shù)據(jù)庫索引其索引的小技巧
關(guān)于索引的常識:影響到數(shù)據(jù)庫性能的最大因素就是索引。由于該問題的復(fù)雜性,我只可能簡單的談?wù)勥@個問題,不過關(guān)于這方面的問題,目前有好幾本不錯的書籍可供你參閱。我在這里只討論兩種SQL Server索引,即clustered索引和nonclustered索引2012-06-06
SQL Server 2008 清空刪除日志文件(瞬間縮小日志到幾M)
sql 在使用中每次查詢都會生成日志,但是如果你長久不去清理,可能整個硬都堆滿哦,筆者就遇到這樣的情況,直接網(wǎng)站后臺都進不去了。下面我們一起來學習一下如何清理這個日志吧2018-10-10
大容量csv快速內(nèi)導(dǎo)入sqlserver的解決方法(推薦)
最近遇到這樣的問題:導(dǎo)入csv 數(shù)據(jù),并對導(dǎo)入的數(shù)據(jù)增加一個新的列date datetime,下面通過本文給大家分享大容量csv快速內(nèi)導(dǎo)入sqlserver的解決方法,感興趣的朋友一起看看吧2017-07-07

