問:
(1)一次插入多條資料時:
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)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是兩個查詢結果的所有不重複值(並集)