SQL語法學習

2021-08-05 23:55:53 字數 3927 閱讀 2213

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 ...