易截截图软件、单文件、免安装、纯绿色、仅160KB
热门标签: c c# c++ asp asp.net linux php jsp java vb Python Ruby mysql sql access Sqlite sqlserver delphi javascript Oracle ajax wap mssql html css flash flex dreamweaver xml
 最新文章 : sql

[SQL]如何写出高效的SQL

避免使用IN 操作符
   用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。
但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:
  ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。
   推荐方案:在业务密集的SQL当中尽量不采用IN操作符。
NOT IN操作符
   此操作是强列推荐不使用的,因为它不能应用表的索引。
  推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替
<> 操作符(不等于)
   不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。
推荐方案:用其它相同功能的操作运算代替,如
  a<>0 改为 a>0 or a<0
  a<>'' 改为 a>''
IS NULL 或IS NOT NULL操作(判断字段是否为空)
  判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。
   ......

SQL小短句收集

Select TOP N * from TABLE Order By NewID() 
--Access:
Select TOP N * from TABLE Order By Rnd(ID)  
Rnd(ID) 其中的ID是自动编号字段,可以利用其他任何数值来完成,比如用姓名字段(UserName) 
Select TOP N *  from TABLE Order BY Rnd(Len(UserName)) 
--MySql:
Select * from TABLE Order By Rand() Limit 10  
--开头到N条记录
Select Top N * from 表
--N到M条记录(要有主索引ID)
Select Top M-N * from 表Where ID in (Select Top M ID from 表) Order by ID  Desc
--选择10从到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名order by id desc 
--N到结尾记录 ......

SQL语句中 N 后接续字符串的作用

如:SET @sql=N'SELECT * from stu'
其中“N”的作用是表示后面的编码格式为unicode编码
DECLARE @rst INT,@sql NVARCHAR(4000)
SET @sql=N'SELECT * from tb '
EXEC sp_executesql @sql,N'@rst INT OUTPUT',@rst OUTPUT
SELECT @rst
......

SQL语句得到存储过程关联哪些表名

SELECT DISTINCT '['+user_name(b.uid)+'].['+b.name+']' AS 对象名,b.type AS 类型
from sysdepends a,sysobjects b
WHERE b.id=a.depid
    AND a.id=OBJECT_ID('过程名');
 
 
EXEC SP_DEPENDS '过程名'; ......

[SQL]触发器的使用

1. 创建触发器, 在mssql下的触发器的使用:Db->表->选择表名->所有任务(右键)->管理触发器
2. 当表被更新\插入\删除后,都可以通过定义触发器来响应该事件,从而进行相应的处理! 如一个学生转系了,其学号被更换了,他所借的图书对应的学号也相应需要改动,这个我们可以只通过update其学号,和学号相关联的表由触发器来更新!
3. example:
CREATE TRIGGER [user_update] ON [dbo].[Users]
FOR INSERT
AS
BEGIN
DECLARE curUserid CURSOR FOR SELECT [USERID] from [INSERTED]
OPEN curUserid
DECLARE @insertid integer
FETCH NEXT from curUserid INTO @insertid
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Users SET UserName="ycli_in" where UserID = @insertid
FETCH NEXT from curUserid INTO @insertid
END
CLOSE curUserid
DEALLOCATE curUserid
END
注意将 $$ -> \\ ......

[SQL]存储过程的使用

1.在mssql创建存储过程,在db->存储过程->新建存储过程(右键)
CREATE PROCEDURE user_logon_check @username varchar(45),@userpsw varchar(45)
 AS
select * from users where UserName = @username and PasswordCode = @userpsw
return 10
GO
2.在mysql创建存储过程,使用Mysql Query Browser,在db->表名->Create New Procedure/Function(右键)
DELIMITER \\
DROP PROCEDURE IF EXISTS `test`.`user_logon_check`\\
CREATE PROCEDURE `user_logon_check`(in username varchar(45),IN userpsw varchar(45))
BEGIN
  SELECT * from test where name = username and psw = userpsw;
END\\
DELIMITER ;
注意将 $$ -> \\
......
总记录数:4346; 总页数:725; 每页6 条; 首页 上一页 [78] [79] [80] [81] 82 [83] [84] [85] [86] [87]  下一页 尾页
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号