您的位置:首页 > 数据库

教你快速掌握SQL语句各种写法的效率问题

2008-10-08 15:11 471 查看

【赛迪网-IT技术报道】问题1一次插入多条数据时下面这两种方法,哪种方法效率高?
CREATETABLEtb(IDint,名称NVARCHAR(30),备注NVARCHAR(1000))
INSERTtbSELECT1,'DDD',1
UNIONALLSELECT1,'5100','D'
UNIONALLSELECT1,'5200','E'
也可以这样写:
CREATETABLEtb1(IDint,名称NVARCHAR(30),备注NVARCHAR(1000))
INSERTTB1(ID,名称,备注)VALUES(1,'DDD',1)
INSERTTB1(ID,名称,备注)VALUES(1,'5100','D')
INSERTTB1(ID,名称,备注)VALUES(1,'5200','E')
解答:
第1种好一些,但也得有个量的控制,因为第1种的unionall是作为一个语句整体,查询优化器会尝试做优化,同时,也要先算出这个结果再插入的。
问题2
赋值时:
SELECT@a=N'aa'
SET@a=N'aa'
上面两种方法,哪种方法效率高?
解答:
如果是单个赋值,没有什么好比较的话.
不过,如果是为多个变量赋值,经测试,SELECT一次性赋值,比用SET逐个赋值效率好..
问题3取前几条数据时
setROWCOUNT2select*fromtborderbyfd
selectTop2*fromtborderbyfd
上面两种方法,哪种方法效率高?
答:
SETROWCOUNT和TOP是一样的,包括执行的计划等都是一样的
问题4条件判断时:
where0<(selectcount(*)fromtbwhere……)
whereexists(select*fromtbwhere……)
上面两种方法,哪种方法效率高?
答:
这个一般是exists快,当然,具体还要看你后面的子查询的条件,是否会引用外层查询中的对象的列.
exists检查到有值就返回,而且不返回结果集,count需要统计出所有满足条件的,再返回一个结果集,所以一般情况下exists快.
问题5
(5)NULLIF的使用----->同理它的反函数ISNULL的使用
updatetbsetfd=casewhenfd=1thennullelsefdend
updatetbsetfd=nullif(fd,1)
上面两种方法,哪种方法效率高?
答:
应该是一样的
问题6从字符串中取子字符串时
substring('abcdefg',1,3)
left('abcderg',3)_
上面两种方法,哪种方法效率高?
答:
基本上是一样的
问题7EXCEPT和Notin的区别?
答:
except会去重复,notin不会(除非你在select中显式指定)
except用于比较的列是所有列,除非写子查询限制列,notin没有这种情况
问题8INTERSECT和UNION的区别?
答:intersect是两个查询都有的非重复值(交集),union是两个查询结果的所有不重复值(并集)

通过两个例子讲解PIVOT/UNPIVOT的用法

发布时间:2008.03.1304:58来源:赛迪网作者:ChenJaYi
【赛迪网-IT技术报道】使用过SQLServer2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQLServer2005中,使用新引进的关键字PIVOT/UNPIVOT,则可以很容易的实现行列转换的需求。
在本文中我们将通过两个简单的例子详细讲解PIVOT/UNPIVOT的用法。
PIVOT的用法:
首先创建测试表,然后插入测试数据

createtabletest(idint,namevarchar(20),quarterint,profileint)
insertintotestvalues(1,'a',1,1000)
insertintotestvalues(1,'a',2,2000)
insertintotestvalues(1,'a',3,4000)
insertintotestvalues(1,'a',4,5000)
insertintotestvalues(2,'b',1,3000)
insertintotestvalues(2,'b',2,3500)
insertintotestvalues(2,'b',3,4200)
insertintotestvalues(2,'b',4,5500)
select*fromtest
idnamequarterprofile
-----------------------------------------------
1a11000
1a22000
1a34000
1a45000
2b13000
2b23500
2b34200
2b45500
(8row(s)affected)
使用PIVOT将四个季度的利润转换成横向显示:
selectid,name,
[1]as"一季度",
[2]as"二季度",
[3]as"三季度",
[4]as"四季度"
from
test
pivot
(
sum(profile)
forquarterin
([1],[2],[3],[4])
)
aspvt
idname一季度二季度三季度四季度
--------------------------------------------------
1a1000200040005000
2b3000350042005500
(2row(s)affected)
UNPIVOT的用法:

首先建立测试表,然后插入测试数据
droptabletest
createtabletest(idint,namevarchar(20),Q1int,Q2int,Q3int,Q4int)
insertintotestvalues(1,'a',1000,2000,4000,5000)
insertintotestvalues(2,'b',3000,3500,4200,5500)
select*fromtest
idnameQ1Q2Q3Q4
-------------------------------------------------
1a1000200040005000
2b3000350042005500
(2row(s)affected)
使用UNPIVOT,将同一行中四个季度的列数据转换成四行数据:
selectid,name,quarter,profile
from
test
unpivot
(
profile
forquarterin
([Q1],[Q2],[Q3],[Q4])
)
asunpvt
idnamequarterprofile
-------------------------------------------
1aQ11000
1aQ22000
1aQ34000
1aQ45000
2bQ13000
2bQ23500
2bQ34200
2bQ45500
(8row(s)affected)

用一个实例讲解GROUPBYCEIL的使用方法

发布时间:2008.01.3105:07来源:赛迪网作者:孙诗涵
GROUPBYCEIL的使用方法:

SQL>WITHAAS(SELECT'A'CDFROMDUAL
2UNION
3SELECT'B'CDFROMDUAL
4UNION
5SELECT'C'CDFROMDUAL
6UNION
7SELECT'D'CDFROMDUAL
8UNION
9SELECT'E'CDFROMDUAL
10UNION
11SELECT'F'CDFROMDUAL
12UNION
13SELECT'G'CDFROMDUAL
14UNION
15SELECT'H'CDFROMDUAL
16UNION
17SELECT'I'CDFROMDUAL
18)
19selectmax(decode(mod(rownum,5),1,CD,null))ID1,
20max(decode(mod(rownum,5),2,CD,null))ID2,
21max(decode(mod(rownum,5),3,CD,null))ID3,
22max(decode(mod(rownum,5),4,CD,null))ID4,
23max(decode(mod(rownum,5),0,CD,null))ID5
24froma
25groupbyceil(rownum/5)
26;
ID1ID2ID3ID4ID5
---------------
ABCDE
FGHI
例二:
withaas(select'01'ymfromdual
union
select'02'ymfromdual
union
select'03'ymfromdual
union
select'04'ymfromdual
union
select'05'ymfromdual
union
select'06'ymfromdual
union
select'07'ymfromdual
union
select'08'ymfromdual
union
select'09'ymfromdual
union
select'10'ymfromdual
union
select'11'ymfromdual
union
select'12'ymfromdual
)
select
max(decode(mod(rownum,6),1,ym,null))ID1,
max(decode(mod(rownum,6),2,ym,null))ID2,
max(decode(mod(rownum,6),3,ym,null))ID3,
max(decode(mod(rownum,6),4,ym,null))ID4,
max(decode(mod(rownum,6),5,ym,null))ID5,
max(decode(mod(rownum,6),0,ym,null))ID6
froma
groupbyceil(rownum/6)
ID1ID2ID3ID4ID5ID6
------------------
010203040506
070809101112
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: