SQL Server-簡單查詢語句
前言
對於一些原理性文章園中已有大量的文章尤其是關於索引這一塊,我也是花費大量時間去學習,對於瞭解索引原理對於後續理解查詢計劃和效能調優有很大的幫助,而我們只是一些內容進行概括和總結,這一節我們開始正式步入學習SQL中簡單的查詢語句,簡短的內容,深入的理解,Always to review the basics。
簡單查詢語句
所有複雜的語句都是由簡單的語句組成基本都是由SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY等組成,當然還包括一些謂詞等等。比如當我們要查詢某表中所有資料時我們會像如下進行。
SELECT * FROM TABLE
到這裡是不是查詢就是從SELECT開始呢?我們應該從實際生活舉例,如我們需要到菜市場買菜,我們想買芹菜,我們應該是到有芹菜的攤位上去買,也就是從哪裡去買,到這裡我們會發現上述查詢資料的順序應該是先FROM然後是SELECT。在SQL 2012基礎教程中列出子句是按照以下順序進行邏輯處理。
FROM WHERE GROUP BY HAVING SELECT6 ORDER BY
比如我們要查詢篩選客戶71下的訂單,我們會進行如下查詢。
SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numbers FROM Sales.OrdersWHERE custid = GROUP BY empid, YEAR(orderdate)HAVING COUNT(*) > ORDER BY empid, orderyear
但是實際上按照我們上述所說的順序,其邏輯化的子句是這樣的。
FROM Sales.OrdersWHERE custid = GROUP BY empid, YEAR(orderdate)HAVING COUNT(*) > SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numberordersORDER BY empid, orderyear
對於博主的SQL系列並非會將SELECT、HAVING等語句單獨拿來講,針對的是有了一定基礎的人群,後續內容也是如此,所以到了這裡我們算是將簡單查詢語句敘述完畢。但是我一直強調的是簡短的內容,深入的理解,所以接下來看看有些需要注意的地方。
我們看到過很多文章一直在講SQL效能問題,比如在查詢所有資料時要列出所有列而非SELECT *,所以在本系列中,我也會在適當的去講效能問題,比如本節要講的SELECT 1和SELECT *的效能問題。
SELECT 1和SELECT *效能探討
在資料庫中檢視執行計劃時我們通常會點選【顯示估計的執行計劃】快捷鍵是Ctrl+L,這裡我們可以看到它已經表明顯示的只是估計的執行計劃,所以是不準確的,所以為了顯示實際的執行計劃,我們應該啟動【包括實際的執行計劃】,快捷鍵是Ctrl+M,這樣才能得到比較準確的執行計劃,如下
查詢方式一(整表查詢)
USE TSQL2012GOIF EXISTS(SELECT FROM Sales.Orders)SELECT GOIF EXISTS(SELECT *FROM Sales.Orders)SELECT GO
此時檢視執行計劃是相同的,如下:
查詢方式二(在索引列上條件查詢)
我們對某一列建立索引
CREATE INDEX ix_shipnameON Sales.Orders(shipname)
接下來繼續檢視其執行計劃。
此時顯示查詢計劃依然一樣。我們再來看看其他查詢方式。
查詢方式三(使用聚合函式)
USE TSQL2012GOIF (SELECT FROM Sales.OrdersWHERE shipname = SELECT GOIF (SELECT COUNT(*)FROM Sales.OrdersWHERE shipname = SELECT GO
我們看到查詢計劃依然一樣。
查詢方式四(使用聚合函式Count在非索引列上查詢)
USE TSQL2012GOIF (SELECT COUNT()FROM Sales.OrdersWHERE freight = SELECT GOIF (SELECT COUNT(*)FROM Sales.OrdersWHERE freight = SELECT GO
我們看到執行計劃還是一樣。
查詢方式五(子查詢)
我們看看在子查詢中二者效能如何
USE TSQL2012SELECT custid, companyname FROM Sales.Customers AS CWHERE country = N ANDEXISTS (SELECT * FROM Sales.Orders AS O WHERE O.custid = C.custid)GOSELECT custid, companyname FROM Sales.Customers AS CWHERE country = N ANDEXISTS (SELECT 1 FROM Sales.Orders AS O WHERE O.custid = C.custid)
此時結果二者檢視執行計劃還是一樣
查詢方式六(在檢視中查詢)
我們建立檢視繼續來比較SELECT 1和SELECT *的效能
USE TSQL2012GoCREATE VIEW SaleOdersViewASSELECT shipaddress,shipname,(SELECT unitprice FROM Sales.OrderDetails AS sod tc3FROM Sales.Orders AS soGO
進行檢視查詢
USE TSQL2012SELECT FROM dbo.SaleOdersViewgoSELECT * FROM dbo.SaleOdersViewgo
結果執行計劃如下:
此時我們透過上述圖發現利用檢視查詢時,SELECT *的效能是如此低下佔有97%,而SELECT 1才3%,這是為何呢?不明白其中原因,希望有清楚其中原因的園友能夠留下你們的評論給出合理的解釋。
SELECT 所有列和SELECT *效能探討
一直以來所有教程都在講SELECT *效能比SELECT 所有列效能低,同時也給出了合理的理由,我也一直這樣認為,但是在查資料學習過程中,發現如下一段話。
I don’t think there 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中,看到這裡顛覆我以往看的教程的想法,不太明確,真的是這樣嗎
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2524/viewspace-2799976/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL單表查詢語句總結SQL
- MySQL的簡單查詢語句MySql
- sql查詢語句流程SQL
- SQL mother查詢語句SQL
- SQL查詢語句 (Oracle)SQLOracle
- postgresql dba常用sql查詢語句SQL
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- mysql查詢效率慢的SQL語句MySql
- SQL Server 語句日期格式查詢方法SQLServer
- 最簡單的sql語句(增刪改查統計)SQL
- 簡單的SQL語句學習SQL
- MySql和簡單的sql語句MySql
- ATM-簡單SQL查詢SQL
- SQL Server 查詢歷史執行的SQL語句SQLServer
- 在mysql查詢效率慢的SQL語句MySql
- Laravel 框架查詢執行的 SQL 語句Laravel框架SQL
- SQL基礎的查詢語句烈鉍SQL
- Sql語句本身的優化-定位慢查詢SQL優化
- GaussDB SQL查詢語句執行過程解析SQL
- SQL 查詢語句的執行順序解析SQL
- 記一個實用的sql查詢語句SQL
- MySQL資料庫:7、SQL常用查詢語句MySql資料庫
- [20210112]ashtop查詢特定表的SQL語句.txtSQL
- 簡單的查詢語法
- mysql查詢語句MySql
- SQL server資料庫表碎片比例查詢語句SQLServer資料庫
- 一條 SQL 查詢語句是如何執行的?SQL
- MySql常用30種SQL查詢語句優化方法MySql優化
- [20201214]查詢隱式轉換的sql語句.txtSQL
- 20201214]查詢隱式轉換的sql語句.txtSQL
- Mysql之查詢語句MySql
- mysql查詢語句集MySql
- mysql查詢語句5:連線查詢MySql
- mybatis 得sql語句對應簡單型別MyBatisSQL型別
- PostgreSQL 原始碼解讀(18)- 查詢語句#3(SQL Parse)SQL原始碼
- V$sql查詢未使用繫結變數的語句SQL變數
- Mysql 資料庫 -------- SQL語句進階查詢 ------- 前部分MySql資料庫
- Mysql常用sql語句(20)- 子查詢重點知識MySql