union 操作符用於合併兩個或多個 select 語句的結果集。
請注意,union 內部的 select 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每條 select 語句中的列的順序必須相同。
sql union 語法
select column_name(s) from table_name1
union
select column_name(s) from table_name2
注釋:這個命令無法列出在中國和美國的所有雇員。在上面的例子中,我們有兩個名字相同的雇員,他們當中只有乙個人被列出來了。union 命令只會選取不同的值。
union all
union all 命令和 union 命令幾乎是等效的,不過 union all 命令會列出所有的值。
select e_name from employees_china
union
allselect e_name from employees_usa
with as
with as短語,也叫做子查詢部分(subquery factoring),可以讓你做很多事情,定義乙個sql片斷,該sql片斷會被整個sql語句所用到。有的時候,是為了讓sql語句的可讀性更高些。
二.使用方法
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 [ ,n ] ]
::=expression_name [ ( column_name [ ,n ] ) ]
as( cte_query_definition )
現在使用cte來解決上面的問題,sql語句如下
with cr 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:
with
cr 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)
cte後面也可以跟其他的cte,但只能使用乙個with,多個cte中間用逗號(,)分隔,如下面的sql語句所示:
with
cte1 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
如果cte的表示式名稱與某個資料表或檢視重名,則緊跟在該cte後面的sql語句使用的仍然是cte,當然,後面的sql語句使用的就是資料表或檢視了,如下面的sql語句所示:
– table1是乙個實際存在的表
with
table1 as
( select * from persons where age < 30
) select * from table1 – 使用了名為table1的公共表表示式
select * from table1 – 使用了名為table1的資料表
儲存過程之set nocount on/off 含義
每次我們在使用查詢分析器除錯sql語句的時候,通常會看到一些資訊,提醒我們當前有多少個行受到了影響,這是些什麼資訊?在我們呼叫的時候這些資訊有用嗎?是否可以關閉呢?
答案是這些資訊在我們的客戶端的應用程式中是沒有用的,這些資訊是儲存過程中的每個語句的done_in_proc 資訊。
我們可以利用set nocount 來控制這些資訊,以達到提高程式效能的目的。
set nocount
使返回的結果中不包含有關受 transact-sql 語句影響的行數的資訊。
語法 set nocount
注釋 當 set nocount 為 on 時,不返回計數(表示受 transact-sql 語句影響的行數)。當 set nocount 為 off 時,返回計數
許可權 set nocount 許可權預設授予所有使用者。
結論:我們應該在儲存過程的頭部加上set nocount on 這樣的話,在退出儲存過程的時候加上 set nocount off這樣的話,以達到優化儲存過程的目的。
即使當 set nocount 為 on 時,也更新 @@rowcount 函式。
當 set nocount 為 on 時,將不給客戶端傳送儲存過程中的每個語句的 done_in_proc 資訊。當使用 microsoft sql server 提供的實用工具執行查詢時,在 transact-sql 語句(如 select、insert、 update 和 delete)結束時將不會在查詢結果中顯示」nn rows affected」。如果儲存過程中包含的一些語句並不返回許多實際的資料,則該設定由於大量減少了網路流量,因此可顯著提高效能。
set nocount 設定是在執行或執行時設定,而不是在分析時設定。
SQL 語法學習
2017 2 13 查詢 select from c2 company 唯一值 select distinct company type from c2 company 更精確的查詢 select from c2 company c where c.company name 劉歡的de and se...
SQL語法學習
sql語法 注意 sql語法中,增刪改查是我們剛開始學的重中之重。1 新增新的資料 1 第一種形式不需要插入列名,只需要插入值 一般所有列需要新增值的時候使用這種形式 注意 被設定為自增列的那一列不需要手動新增 語法 insert into table values value1,value2,va...
SQL語法學習二
case when.else.and substring case when logic then expression1 else expression2 有點像if.else.substring columnname,start,len 擷取某column從開始start的位置到一定長度len ...