麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > SQL Server > 正文

SQL Server簡單查詢示例匯總

2024-08-31 01:04:25
字體:
來源:轉載
供稿:網友

前言

本節我們講講一些簡單查詢語句示例以及需要注意的地方,簡短的內容,深入的理解。

EOMONTH

在SQL Server 2012的教程示例中,對于Sales.Orders表的查詢,需要返回每月最后一天的訂單。我們普遍的查詢如下

USE TSQL2012GOSELECT orderid, orderdate, custid, empidFROM Sales.OrdersWHERE orderdate = DATEADD(MONTH, DATEDIFF(MONTH, '19991231', orderdate), '19991231')

sqlserver,簡單查詢

但是在SQL Server 2012出現了新的函數直接返回每個月最后一天的訂單,通過EOMONTH函數即可,將

WHERE orderdate = DATEADD(MONTH, DATEDIFF(MONTH, '19991231', orderdate), '19991231')

替換為

SELECT orderid, orderdate, custid, empidFROM Sales.OrdersWHERE orderdate = EOMONTH(orderdate)

如上簡單而粗暴。

HAVING AND WHERE

我們利用Sales.OrderDetails表來查詢總價(qty*unitprice)大于10000的訂單,且按照總價排序。

USE TSQL2012GOSELECT orderid,SUM(unitprice *qty) AS TotalValueFROM Sales.OrderDetailsGROUP BY orderidHAVING SUM(unitprice *qty) > 10000ORDER BY TotalValue DESC

 sqlserver,簡單查詢

通過此例我們來說說WHERE和HAVING的區別,下面的示例是等同的

SELECT orderidFROM Sales.OrderDetailsWHERE orderid >10357GROUP BY orderidSELECT orderidFROM Sales.OrderDetailsGROUP BY orderidHAVING orderid >10357

但是利用聚合函數時能等同嗎?

SELECT orderidFROM Sales.OrderDetailsWHERE COUNT(qty * unitprice) >10000GROUP BY orderidSELECT orderidFROM Sales.OrderDetailsGROUP BY orderidHAVING COUNT(qty * unitprice) >10000

 sqlserver,簡單查詢

二者的區別我們總結一下:

(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分析

當將查詢出的數據插入到表中,我們其實有兩種解決方案。

方案一

NSERT 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 1UNION ALLSELECT 2UNION ALLSELECT 3UNION ALLSELECT 4UNION ALLSELECT 5

需要插入的兩個表

USE TSQL2012GOCREATE TABLE InsertTestValue (ID INT)CREATE TABLE InsertTestValue1 (ID INT)

方案一的插入

INSERT INTO InsertTestValue (ID)SELECT TOP (2) IDFROM TestValueORDER BY ID DESCGO

方案二的插入

INSERT TOP (2) INTO InsertTestValue1 (ID)SELECT IDFROM TestValueORDER BY ID DESCGO

接下來查詢方案一和方案二的數據

SELECT *FROM InsertTestValueGOSELECT *FROM InsertTestValue1GO

sqlserver,簡單查詢

我們對方案一和方案二插入數據之前我們對查詢的數據是進行了降序,此時我們能夠很明顯的看到方案一中的查詢數據確確實實是降序,而方案二則忽略了降序,這是個很有意思的地方,至此我們看到了二者的不同。

二者性能比較

在插入數據時我們對其進行開銷分析如下:

sqlserver,簡單查詢

到這里我們能夠知道利用INSET TOP (N)比INSERT … SELECT TOP (N)性能更好,同時SELECT 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);

插入如下測試數據

sqlserver,簡單查詢

接下來我們進行如下查詢

USE TSQL2012GOSELECT COUNT(NAME) AS COUNT_NAMEFROM dbo.TestDataSELECT COUNT(ALL NAME) AS COUNT_ALLNAMEFROM dbo.TestDataSELECT COUNT(DISTINCT NAME) AS COUNT_DISTINCTNAMEFROM dbo.TestData

sqlserver,簡單查詢

此時我們能夠很清楚的看到COUNT(colName)和COUNT(ALL colName)的結果是一樣的,其實COUNT(ALL colName)是默認的選項且包括所有非空值,換句話說ALL根本不需要我們去指定。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時也希望多多支持VeVb武林網!


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 一区二区三区欧美在线 | 亚洲电影在线观看高清免费 | 性 毛片| 91成人午夜性a一级毛片 | 国产一级爱c视频 | 99视频有精品视频高清 | 亚洲精品久久久久久久久久久 | 久久久免费观看完整版 | 久久99精品国产99久久6男男 | 牛牛碰在线 | 国产精品色在线网站 | av在线免费观看网站 | 国产妇女乱码一区二区三区 | 免费在线观看毛片 | 成人毛片100免费观看 | 一级黄色大片在线观看 | 欧美日韩大片在线观看 | 日日操夜夜透 | 久久精品中文字幕一区二区 | 亚洲自拍第二页 | 欧美18一12sex性处hd | 毛片在线免费播放 | 久久影院午夜 | 美国一级黄色毛片 | 欧美 中文字幕 | 5xsq在线视频 | 91精品国产777在线观看 | 免费性爱视频 | 亚洲二区不卡 | 欧美一级棒 | 99sesese| 久久精品探花 | 99riav视频一区二区 | 成人免费毛片一 | 99爱国产精品| 黄色成年在线观看 | 韩国美女一区 | av免费在线观 | 免费毛片视频 | 国产成人精品午夜 | 欧美一级黄色片在线观看 |