网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.只让指定的机器连接SQLServer服务.
.50种方法巧妙优化你的SQL Server.
.存储过程编写经验和优化措施.
.MS SQL Server存储过程参数的隐式.
.通过作业调度建立SQL Server的自.
.关于SQL server中字段值为null的.
.sql server中如何计算农历.
.SQL Server数据库sa密码相关问题.
.监测你的SQL SERVER--让瓶颈暴露.
.教你快速掌握SQL语言中游标的使用.
.通过查询分析器对比SQL语句的执行.
.SQL Server 2000的数据转换服务(.
.dp备份检查时发现有session报错的.
.SQL Server Compact Edition 程序.
.连接到 SQL Server 2005 时出现的.
.如何将图片存到数据库中?.
.数据库连接字符串大全.
.用SQL Server为Web浏览器提供图像.
.取得拼音字头的存储过程.
.如何使用系统管理员帐户管理多个.

SQL各种写法的效率问题

发表日期:2007-4-5


经常可以遇到这种情况:用不同的SQL写法可以达到同样的目的。爱钻牛角尖的人就想搞明白,诚然结果一样,但到底孰优孰劣?下面是我列出的一些,请兄弟们赐教。也请兄弟们将你们遇到的类似问题一并列出。

(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')
_________________________________
上面两种方法,哪种方法效率高?

(2)赋值时:
SELECT @a=N'aa'
SET @a=N'aa'
_________________________________
上面两种方法,哪种方法效率高?

(3)取前几条数据时
set ROWCOUNT 2 select * from tb order by fd
select Top 2 * from tb order by fd
_________________________________
上面两种方法,哪种方法效率高?

(4)条件判断时
 where 0<(select count(*) from tb where ……)
 where exists(select * from tb where ……)
_________________________________
上面两种方法,哪种方法效率高?

(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的区别?

(8)INTERSECT和UNION的区别?
下面是邹老大的回答:

'http://blog.knowsky.com
(1)一次插入多条数据时:

第1种好一些, 但也得有个, 因为第1种的union all是做为一个语句整体, 查询优化器会尝试做优化, 同时, 也要先算出这个结果再插入的.


2. 如果是单个赋值, 没有什么好比较的话.
不过, 如果是为多个变量赋值, 我测试过, SELECT 一次性赋值, 比用SET 逐个赋值效率好.


3. SET ROWCOUNT和TOP 是一样的, 包括执行的计划等都是一样的

4. 这个一般是exists快, 当然, 具体还要看你后面的子查询的条件, 是否会引用外层查询中的对象的列.
   exists检查到有值就返回, 而且不返回结果集, count需要统计出所有满足条件的, 再返回一个结果集, 所以一般情况下exists快.

5. 应该是一样的


6. 基本上是一样的

7. except会去重复, not in 不会(除非你在select中显式指定)
   except用于比较的列是所有列, 除非写子查询限制列, not in 没有这种情况
8. intersect是两个查询都有的非重复值(交集), union是两个查询结果的所有不重复值(并集)

上一篇:sql server 2000 游标用法小例 人气:8495
下一篇:sql server分布式事务解决方案 人气:3922
浏览全部SQL的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐