CREATE TABLE tb(ID int, 名稱 NVARCHAR(30), 備注 NVARCHAR(1000))
INSERT tb SELECT 1,'DDD',1
UNION ALL SELECT 1,'5100','D'
UNION ALL SELECT 1,'5200','E'
也可以這樣寫:
CREATE TABLE tb1(ID int, 名稱 NVARCHAR(30), 備注 NVARCHAR(1000))
INSERT TB1 (ID,名稱,備注)VALUES(1,'DDD',1)
INSERT TB1 (ID,名稱,備注)VALUES(1,'5100','D')
INSERT TB1 (ID,名稱,備注)VALUES(1,'5200','E')
解答:
第1種好一些, 但也得有個量的控制, 因為第1種的union all是作為一個語句整體, 查詢優化器會嘗試做優化, 同時, 也要先算出這個結果再插入的。
問題2:
賦值時:
SELECT @a=N'aa'
SET @a=N'aa'
上面兩種方法,哪種方法效率高?
解答:
如果是單個賦值, 沒有什么好比較的話.
不過, 如果是為多個變量賦值, 經測試, SELECT 一次性賦值, 比用SET 逐個賦值效率好..
問題3:取前幾條數據時
set ROWCOUNT 2 select * from tb order by fd
select Top 2 * from tb order by fd
上面兩種方法,哪種方法效率高?
答:
SET ROWCOUNT和TOP 是一樣的, 包括執行的計劃等都是一樣的
問題4:條件判斷時:
where 0<(select count(*) from tb where ……)
where exists(select * from tb where ……)
上面兩種方法,哪種方法效率高?
答:
這個一般是exists快, 當然, 具體還要看你后面的子查詢的條件, 是否會引用外層查詢中的對象的列.
exists檢查到有值就返回, 而且不返回結果集, count需要統計出所有滿足條件的, 再返回一個結果集, 所以一般情況下exists快.
問題5:
(5)NULLIF的使用----->同理它的反函數ISNULL的使用
update tb set fd=case when fd=1 then null else fd end
update tb set fd=nullif(fd,1)
上面兩種方法,哪種方法效率高?
答:
應該是一樣的
問題6:從字符串中取子字符串時
substring('abcdefg',1,3)
left('abcderg',3)_
上面兩種方法,哪種方法效率高?
答:
基本上是一樣的
問題7:EXCEPT和Not in的區別?
答:
except會去重復, not in 不會(除非你在select中顯式指定)
except用于比較的列是所有列, 除非寫子查詢限制列, not in 沒有這種情況
問題8:INTERSECT和UNION的區別?
答:intersect是兩個查詢都有的非重復值(交集), union是兩個查詢結果的所有不重復值(并集)
新聞熱點
疑難解答