主頁 > 知識庫 > 詳解SQL Server的簡單查詢語句

詳解SQL Server的簡單查詢語句

熱門標(biāo)簽:我要地圖標(biāo)注數(shù)量有限制嗎 千呼電話機(jī)器人可以試用嗎 安卡拉地圖標(biāo)注app 家庭農(nóng)場地圖標(biāo)注名稱怎樣起名 互聯(lián)網(wǎng)電話外呼系統(tǒng) 400電話辦理泰安 電話機(jī)器人怎么代理商 電銷需要外呼系統(tǒng)嗎 零成本地圖標(biāo)注賺錢

前言

對于一些原理性文章園中已有大量的文章尤其是關(guān)于索引這一塊,我也是花費(fèi)大量時(shí)間去學(xué)習(xí),對于了解索引原理對于后續(xù)理解查詢計(jì)劃和性能調(diào)優(yōu)有很大的幫助,而我們只是一些內(nèi)容進(jìn)行概括和總結(jié),這一節(jié)我們開始正式步入學(xué)習(xí)SQL中簡單的查詢語句,簡短的內(nèi)容,深入的理解。

簡單查詢語句

所有復(fù)雜的語句都是由簡單的語句組成基本都是由SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY等組成,當(dāng)然還包括一些謂詞等等。比如當(dāng)我們要查詢某表中所有數(shù)據(jù)時(shí)我們會像如下進(jìn)行。

SELECT * FROM TABLE

到這里是不是查詢就是從SELECT開始呢?我們應(yīng)該從實(shí)際生活舉例,如我們需要到菜市場買菜,我們想買芹菜,我們應(yīng)該是到有芹菜的攤位上去買,也就是從哪里去買,到這里我們會發(fā)現(xiàn)上述查詢數(shù)據(jù)的順序應(yīng)該是先FROM然后是SELECT。在SQL 2012基礎(chǔ)教程中列出子句是按照以下順序進(jìn)行邏輯處理。

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY

比如我們要查詢篩選客戶71下的訂單,我們會進(jìn)行如下查詢。

SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numbers 
FROM Sales.Orders
WHERE custid = '71'
GROUP BY empid, YEAR(orderdate)
HAVING COUNT(*) > 1
ORDER BY empid, orderyear

但是實(shí)際上按照我們上述所說的順序,其邏輯化的子句是這樣的。

FROM Sales.Orders
WHERE custid = 71
GROUP BY empid, YEAR(orderdate)
HAVING COUNT(*) > 1
SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numberorders
ORDER BY empid, orderyear

對于博主的SQL系列并非會將SELECT、HAVING等語句單獨(dú)拿來講,針對的是有了一定基礎(chǔ)的人群,后續(xù)內(nèi)容也是如此,所以到了這里我們算是將簡單查詢語句敘述完畢。但是我一直強(qiáng)調(diào)的是簡短的內(nèi)容,深入的理解,所以接下來看看有些需要注意的地方。

我們看到過很多文章一直在講SQL性能問題,比如在查詢所有數(shù)據(jù)時(shí)要列出所有列而非SELECT *,所以在本系列中,我也會在適當(dāng)?shù)娜ブv性能問題,比如本節(jié)要講的SELECT 1和SELECT *的性能問題。

SELECT 1和SELECT *性能探討

在數(shù)據(jù)庫中查看執(zhí)行計(jì)劃時(shí)我們通常會點(diǎn)擊【顯示估計(jì)的執(zhí)行計(jì)劃】快捷鍵是Ctrl+L,這里我們可以看到它已經(jīng)表明顯示的只是估計(jì)的執(zhí)行計(jì)劃,所以是不準(zhǔn)確的,所以為了顯示實(shí)際的執(zhí)行計(jì)劃,我們應(yīng)該啟動【包括實(shí)際的執(zhí)行計(jì)劃】,快捷鍵是Ctrl+M,這樣才能得到比較準(zhǔn)確的執(zhí)行計(jì)劃,如下

查詢方式一(整表查詢)

USE TSQL2012
GO
IF EXISTS(
SELECT 1
FROM Sales.Orders)
SELECT 'SELECT 1'
GO
IF EXISTS(
SELECT *
FROM Sales.Orders)
SELECT 'SELECT *'
GO

此時(shí)查看執(zhí)行計(jì)劃是相同的,如下:

查詢方式二(在索引列上條件查找)

我們對某一列創(chuàng)建索引

CREATE INDEX ix_shipname
ON Sales.Orders(shipname)

接下來繼續(xù)查看其執(zhí)行計(jì)劃。

此時(shí)顯示查詢計(jì)劃依然一樣。我們再來看看其他查詢方式。

查詢方式三(使用聚合函數(shù))

USE TSQL2012
GO
IF (
SELECT 1
FROM Sales.Orders
WHERE shipname = 'Ship to 85-B') = 1
SELECT 'SELECT 1'
GO
IF (
SELECT COUNT(*)
FROM Sales.Orders
WHERE shipname = 'Ship to 85-B') = 1
SELECT 'SELECT *'
GO

我們看到查詢計(jì)劃依然一樣。

查詢方式四(使用聚合函數(shù)Count在非索引列上查找)

USE TSQL2012
GO
IF (
SELECT COUNT(1)
FROM Sales.Orders
WHERE freight = '41.3400') = 1
SELECT 'SELECT 1'
GO
IF (
SELECT COUNT(*)
FROM Sales.Orders
WHERE freight = '41.3400') = 1
SELECT 'SELECT *'
GO

我們看到執(zhí)行計(jì)劃還是一樣。

查詢方式五(子查詢)

我們看看在子查詢中二者性能如何

USE TSQL2012
SELECT custid, companyname FROM Sales.Customers AS C
WHERE country = N'USA' AND
EXISTS (SELECT * FROM Sales.Orders AS O WHERE O.custid = C.custid)
GO
SELECT custid, companyname FROM Sales.Customers AS C
WHERE country = N'USA' AND
EXISTS (SELECT 1 FROM Sales.Orders AS O WHERE O.custid = C.custid)

此時(shí)結(jié)果二者查看執(zhí)行計(jì)劃還是一樣

查詢方式六(在視圖中查詢)

我們創(chuàng)建視圖繼續(xù)來比較SELECT 1和SELECT *的性能

USE TSQL2012
Go
CREATE VIEW SaleOdersView
AS
SELECT shipaddress,shipname,(SELECT unitprice FROM Sales.OrderDetails AS sod where sod.orderid = so.orderid) as tc3
FROM Sales.Orders AS so
GO

進(jìn)行視圖查詢

USE TSQL2012
SELECT 1 FROM dbo.SaleOdersView
go
SELECT * FROM dbo.SaleOdersView
go

結(jié)果執(zhí)行計(jì)劃如下:

此時(shí)我們通過上述圖發(fā)現(xiàn)利用視圖查詢時(shí),SELECT *的性能是如此低下占有97%,而SELECT 1才3%,這是為何呢?不明白其中原因,希望有清楚其中原因的園友能夠留下你們的評論給出合理的解釋。

SELECT 所有列和SELECT *性能探討

一直以來所有教程都在講SELECT *性能比SELECT 所有列性能低,同時(shí)也給出了合理的理由,我也一直這樣認(rèn)為,但是在查資料學(xué)習(xí)過程中,發(fā)現(xiàn)如下一段話。

I don't think there is any difference, as long as the SELECT 1/* is inside EXISTS, which really doesn't return any rows – it just returns boolean as soon as condition of the WHERE is checked.
I'm quite sure that the SQL Server Query Optimizer is smart enough not to search for the unneeded meta data in the case of EXISTS.
I agree that in all the other situations SELECT * shouldn't be used for the reasons Simon mentioned. Also, index usage wouldn't be optimal etc.
For me EXISTS (SELECT * ..) is the only place where I allow myself to write SELECT * in production code ;)

最后一句表明SELECT *使用的唯一場景是在EXISTS中,看到這里顛覆我以往看的教程的想法,不太明確,真的是這樣嗎?

總結(jié)

通過以上對SELECT 1和SELECT *性能的探討,在視圖中利用SELECT *性能更加低下,同時(shí)也結(jié)合SELECT *盡量避免用,我是不是可以下結(jié)論我可以更傾向于用SELECT 1呢?第二點(diǎn)是看到上述所給的資料SELECT *在Exist中的性能是不是和一定SELECT 所有列一樣呢?這是我存在疑問的兩個(gè)問題,是不是我所疑問的兩個(gè)問題,沒有具體的答案,需要看應(yīng)用場景呢?那應(yīng)用場景又是在哪里?畢竟不是專業(yè)的DBA,同時(shí)對SQL也研究不深,所以希望看到此文的讀者,能給出精彩的回答,同時(shí)也讓我學(xué)習(xí)學(xué)習(xí)。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時(shí)也希望多多支持腳本之家!

您可能感興趣的文章:
  • SQL Server Table中XML列的操作代碼
  • SQLSERVER查詢所有數(shù)據(jù)庫名,表名,和字段名的語句
  • SQL Server SQL高級查詢語句小結(jié)
  • SQLServer中用T—SQL命令查詢一個(gè)數(shù)據(jù)庫中有哪些表的sql語句
  • SQL語句實(shí)現(xiàn)查詢SQL Server服務(wù)器名稱和IP地址
  • 關(guān)于SQL Server查詢語句的使用
  • SqlServer 基礎(chǔ)知識 數(shù)據(jù)檢索、查詢排序語句
  • SQL Server中Table字典數(shù)據(jù)的查詢SQL示例代碼

標(biāo)簽:池州 新鄉(xiāng) 黃山 來賓 文山 濱州 東營 大同

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解SQL Server的簡單查詢語句》,本文關(guān)鍵詞  詳解,SQL,Server,的,簡單,查詢,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解SQL Server的簡單查詢語句》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解SQL Server的簡單查詢語句的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章