1. 程式人生 > >SQL Server進階(六)表表達式

SQL Server進階(六)表表達式

ins upd 逗號 csdn 引用 ssd 優點 暫存 可讀性

概述

  SQL Server支持四種類型的表表達式:派生表公用表表達式視圖內聯表值函數

派生表

派生表是一個查詢結果生成的表,類似於臨時表。

派生表可以簡化查詢,避免使用臨時表。相比手動生成臨時性能更優越。派生表與其他表一樣出現在查詢的FROM子句中

select * from (select * from athors)  temp

temp 就是派生表

派生出來的表必須要是一個有效的表.因此,它必須遵守以下幾條規則:

1. 所有列必須要有名稱

2. 列名稱必須是要唯一

3. 不允許使用ORDER BY(除非指定了TOP)

派生表:比如要查找一個叫張鐵牛的人的信息,我們知道他是男性,為了縮小查找範圍我把所有的男性都找出來,然後從這些男性中裏面再去找張鐵牛.這裏男性的集合就相當於派生表,轉成sql語句:

select 姓名,住址,身份證

from (select * from 表名 where 性別=男性) temp 

where 姓名=張鐵牛

(這裏只是為了舉例子),這裏的 temp這個數據集就是派生表,它是虛表,在數據庫中不存在的,是我們構建的,在這裏的目的是為了縮小數據的查找範圍.

公用表表達式CTE

數據庫中臨時表、表變量和CTE使用優劣對比

CTE大部分地方可以代替臨時表。CTE可以完成遞歸才是最重要的。

CTE只是作為公用表達式,並不是一個實體表,在實際運用中,它的遞歸作用非常有用。

CTE最優秀的地方是在實現遞歸操作,和替代絕大部分遊標的功能,但是對於大數據量,由於cte不能建索引,所以明顯比臨時表差。我給開發的建議是少於1萬數據的話,cte和表變量就不要用於做暫存數據的功能。而改用臨時表。

CTE後面必須直接跟使用CTE的SQL語句(如select、insert、update等),否則,CTE將失效。但是臨時表一直存在,除非drop掉。

數據量大時,CTE的性能要幣臨時表差很多(即使臨時表不建索引)

公用表表達式的好處之一是可以在接下來一條語句中多次引用:

WITH CTE_Test
  AS
  (
      SELECT * FROM Person_1
  )
  SELECT * FROM CTE_Test AS a  --第一次引用
  INNER JOIN  CTE_Test AS b    --第二次引用
  ON a.Id = b.Id
  
ORDER BY a.Id DESC

由於CTE只能在接下來一條語句中使用,因此,當需要接下來的一條語句中引用多個CTE時,可以定義多個,中間用逗號分隔,下面是一次定義多個CTE的例子:

WITH CTE_Test1
AS
(
SELECT * FROM Person_1
),
CTE_Test2
AS
(
SELECT * FROM Person_2
)
SELECT * FROM CTE_Test1
UNION
SELECT * FROM CTE_Test2

這裏我們利用CTE實現了和派生表同樣的結果,派生表和CTE其實只是在語義上有差異,但是相對於派生表最主要的優勢在於不需要像派生表那樣需要多重嵌套,而CTE只要定義了就無需嵌套,每個CTE在代碼中以模塊化的方式分別出現。這中模塊化的方式和嵌套派生表方式相比,大大提高了代碼的可讀性和可維護性,若有多個表需要嵌套利用CTE來實現更加清爽並有助於代碼的清晰性。而對於派生表的另外一個優勢在於就外部查詢的FROM子句而言,CTE在之前就已經存在,因此可以引用同一個CTE的多個實例。

https://www.cnblogs.com/kissdodog/archive/2013/06/24/3153012.html

https://blog.csdn.net/miqi770/article/details/51505720

https://www.cnblogs.com/janneystory/p/5623019.html

視圖

內聯表值函數

什麽是內聯表值函數

一種可重用的表表達式,能夠支持輸入參數。除了支持輸入參數以外,內聯表值函數在其他方面都與視圖相似。

內嵌表值函數是支持輸入參數的可重復使用的表表達式。除了支持輸入參數之外的其他所有方面都和視圖類似。我們來看下怎麽創建內嵌表值函數。

小結

借助表表達式可以簡化代碼,提高代碼的可維護性,還可以封裝查詢邏輯。當需要使用表表達式,而且不計劃重用它們的定義時,可以使用派生表或CTE。與派生表相比,CTE具有兩個優點:CTE不用像派生表那樣嵌套使用,此外,還可以引用同一CTE的多個實例,也派生表不能這麽用。

當需要定義可重用的表表達式時,可以使用視圖和內聯表值函數。如果不須要支持輸入參數,則使用視圖,相反則使用內聯表值函數

(1)表表達式可以簡化代碼,提高代碼的可維護性和封裝查詢邏輯。

(2)當需要使用表表達式並且不打算重復使用其定義時,可以使用派生表或CTE,而CTE對派生表具有更多優勢不需要像派生表那樣嵌套CTE,使用CTE使代碼更加模塊化和便於維護,此外,還可以引用同一個CTE的多個實例,這一點是派生表無法實現的。

(3)當需要使用表表達式並且需要定義可重復使用的表表達式時,可以使用視圖或內嵌表值函數,當不需要支持輸入參數時,可以使用視圖,否則,應當使用內嵌表值函數(TVF)。

http://www.cnblogs.com/jackson0714/p/TSQLFundamentals_04_part1.html

SQL Server進階(六)表表達式