久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

sql語句with as的用法詳解

169次閱讀
沒有評論

共計 2848 個字符,預計需要花費 8 分鐘才能閱讀完成。

這篇文章主要介紹“sql 語句 with as 的用法詳解”,在日常操作中,相信很多人在 sql 語句 with as 的用法詳解問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”sql 語句 with as 的用法詳解”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!

一.WITH AS 的含義 WITH AS 短語,也叫做子查詢部分(subquery factoring),可以讓你做很多事情,定義一個 SQL 片斷,該 SQL 片斷會被整個 SQL 語句所用到。有的時候,是為了讓 SQL 語句的可讀性更高些,也有可能是在 UNION ALL 的不同部分,作為提供數據的部分。特別對于 UNION ALL 比較有用。因為 UNION ALL 的每個部分可能相同,但是如果每個部分都去執行一遍的話,則成本太高,所以可以使用 WITH AS 短語,則只要執行一遍即可。如果 WITH AS 短語所定義的表名被調用兩次以上,則優化器會自動將 WITH AS 短語所獲取的數據放入一個 TEMP 表里,如果只是被調用一次,則不會。而提示 materialize 則是強制將 WITH AS 短語里的數據放入一個全局臨時表里。很多查詢通過這種方法都可以提高速度。

二.使用方法先看下面一個嵌套的查詢語句:復制代碼 代碼如下:
select * from person.StateProvince where CountryRegionCode in (select CountryRegionCode from person.CountryRegion where Name like C%)

上面的查詢語句使用了一個子查詢。雖然這條 SQL 語句并不復雜,但如果嵌套的層次過多,會使 SQL 語句非常難以閱讀和維護。因此,也可以使用表變量的方式來解決這個問題,SQL 語句如下:復制代碼 代碼如下:
declare @t table(CountryRegionCode nvarchar(3))insert into @t(CountryRegionCode) (select CountryRegionCode from person.CountryRegion where Name like C%)select * from person.StateProvince where CountryRegionCode in (select * from @t)

雖然上面的 SQL 語句要比第一種方式更復雜,但卻將子查詢放在了表變量 @t 中,這樣做將使 SQL 語句更容易維護,但又會帶來另一個問題,就是性能的損失。由于表變量實際上使用了臨時表,從而增加了額外的 I / O 開銷,因此,表變量的方式并不太適合數據量大且頻繁查詢的情況。為此,在 SQL Server 2005 中提供了另外一種解決方案,這就是公用表表達式(CTE),使用 CTE,可以使 SQL 語句的可維護性,同時,CTE 要比表變量的效率高得多。下面是 CTE 的語法:復制代碼 代碼如下:
[WITH common_table_expression [ ,n] ] common_table_expression ::=expression_name [( column_name [ ,n] ) ]AS(CTE_query_definition)

現在使用 CTE 來解決上面的問題,SQL 語句如下:復制代碼 代碼如下:
withcr as(select CountryRegionCode from person.CountryRegion where Name like C%)select * from person.StateProvince where CountryRegionCode in (select * from cr)

其中 cr 是一個公用表表達式,該表達式在使用上與表變量類似,只是 SQL Server 2005 在處理公用表表達式的方式上有所不同。在使用 CTE 時應注意如下幾點:

1. CTE 后面必須直接跟使用 CTE 的 SQL 語句(如 select、insert、update 等),否則,CTE 將失效。如下面的 SQL 語句將無法正常使用 CTE:復制代碼 代碼如下:
withcr as(select CountryRegionCode from person.CountryRegion where Name like C%)select * from person.CountryRegion — 應將這條 SQL 語句去掉 – 使用 CTE 的 SQL 語句應緊跟在相關的 CTE 后面 –select * from person.StateProvince where CountryRegionCode in (select * from cr)

2. CTE 后面也可以跟其他的 CTE,但只能使用一個 with,多個 CTE 中間用逗號(,)分隔,如下面的 SQL 語句所示:復制代碼 代碼如下:
withcte1 as(select * from table1 where name like abc%),cte2 as(select * from table2 where id 20),cte3 as(select * from table3 where price 100)select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id

3. 如果 CTE 的表達式名稱與某個數據表或視圖重名,則緊跟在該 CTE 后面的 SQL 語句使用的仍然是 CTE,當然,后面的 SQL 語句使用的就是數據表或視圖了,如下面的 SQL 語句所示:復制代碼 代碼如下:
— table1 是一個實際存在的表 withtable1 as(select * from persons where age 30)select * from table1 — 使用了名為 table1 的公共表表達式 select * from table1 — 使用了名為 table1 的數據表

4. CTE 可以引用自身,也可以引用在同一 WITH 子句中預先定義的 CTE。不允許前向引用。5. 不能在 CTE_query_definition 中使用以下子句:(1)COMPUTE 或 COMPUTE BY(2)ORDER BY(除非指定了 TOP 子句)(3)INTO(4)帶有查詢提示的 OPTION 子句(5)FOR XML(6)FOR BROWSE6. 如果將 CTE 用在屬于批處理的一部分的語句中,那么在它之前的語句必須以分號結尾,如下面的 SQL 所示:復制代碼 代碼如下:
declare @s nvarchar(3)set @s = C% — 必須加分號 witht_tree as(select CountryRegionCode from person.CountryRegion where Name like @s)select * from person.StateProvince where CountryRegionCode in (select * from t_tree)

到此,關于“sql 語句 with as 的用法詳解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-28發表,共計2848字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 馆陶县| 达日县| 广南县| 鄂托克前旗| 上饶县| 措勤县| 萨迦县| 凤山县| 改则县| 荣成市| 庄河市| 合江县| 东山县| 萨嘎县| 丽水市| 湟中县| 响水县| 大英县| 鹿泉市| 当阳市| 德格县| 呼和浩特市| 宜兰市| 苏尼特右旗| 怀集县| 怀化市| 通江县| 儋州市| 英德市| 湖北省| 峡江县| 禹州市| 江永县| 岢岚县| 南皮县| 镇坪县| 彭州市| 西丰县| 泸西县| 新沂市| 武宣县|