开发总结之数据库

    本文是我在平时工作中所遇到的数据库方面的一些知识总结
1.多条件查询
    多条件查询在实际应用中用的很多,在一些页面上会要求根据时间,类别,或是其他的一些关键字来查询数据,而且这些条件并不是一定要输入的。以前有过在C#代码中根据条件选中的情况来拼where条件字串,也有过在存储过程中用if来判断传进的参数,但是后来知道早存储过程中使用OR是最简单的,如下:

create Table Users
(
    id 
int,
    name 
nvarchar(20),
    age 
int
)

create proc sp_SGetUserInfo
(
  
@Name nvarchar(20),
  
@Age int
)
as
select 
    
*
from
    Users
where
    (
@Name='' or name=@Name)
and
    (
@Age='' or age=@Age)

2.使用isnull
    对于传进的参数有可能为空或是null的情况,isnull就很有用了。 通常可以这样来判断

ISNULL(@Name,'')  --如果参数@Name为null,则返回''

3.在数据库中几个常用的日期格式转换
    日期格式转换也是经常用到的,通常2008-04-12和20080412 这两种格式用的比较多,下面列出一些常用的:
CONVERT(VARCHAR(10),GETDATE(),120)
--返回2008-04-12
CONVERT(VARCHAR(10),GETDATE(),20)
--返回2008-04-12
CONVERT(VARCHAR(10),GETDATE(),112)
--返回20080412
CONVERT(VARCHAR(10),GETDATE(),111)
--返回2008/04/12

4.取指定字符串中两个字符 中间的字符串

declare @str1 nvarchar(20)
declare @str2 nvarchar(20)
declare @str3 nvarchar(20)
set @str1 = 'ABCDEFGH'
set @str2 = 'ab' 
set @str3 = 'f'

declare @a int  ,@b int 
set @a=CHARINDEX(right(@str2,1),@str1--第二个字符串的最后一个字符的索引
set @b=CHARINDEX(left(@str3,1),@str1)  --第三个字符串的第一个字符的索引


select substring(@str1,@a+1,@b-@a-1)  --结果取得是 第二个字符串和第三个字符串中间的字符


5.一个实现拆分由特殊符分隔的字符串的函数

ALTER   FUNCTION split
(
  
@StrAll varchar(8000),
  
@StrSeprate varchar(10)
)
RETURNS @temp TABLE(F1 VARCHAR(100))    
AS
BEGIN
    
DECLARE @i INT
    
SET @StrAll =rtrim(ltrim(@StrAll ))
    
SET @i=charindex(@StrSeprate,@StrAll )
    
WHILE @i>=1
    
BEGIN
        
INSERT @temp VALUES(left(@StrAll ,@i-1))
        
SET @StrAll =substring(@StrAll ,@i+1,len(@StrAll )-@i)
        
SET @i=charindex(@StrSeprate,@StrAll )
    
END
    
IF @StrAll <>''
    
INSERT @temp VALUES(@StrAll )
    
RETURN
END


6.取出数据库中所有的表名

select name as  tablename from sysobjects where type='U' and name<>'dtproperties'

7.sqlserver中取随机数的两种方法
   a.创建一个表Rand,字段是:RandomNum ,存储0到9的数据。
      使用下面SQL语句可产生随机数:

select top 1 RandomNum from Rand order by NewID()

   b.使用sqlserver提供的Rand()函数

select castfloor(rand()*N) as int
--产生0到N-1之间的随机数
select cast(ceiling(rand() * N) as int)
--产生1到N之间的随机数

8.数据库中的集合运算(交, 并 ,差)
先创建示例表
create table T1
(
    id 
int
)

create table T2
(
    id 
int
)
insert T1
select 1 union all
select 2 union all
select 3 union all
select 4 

insert T2
select 3 union all
select 4 

运算代码:
--交集
--
--------------------------------------------
--
方法1 
select *  from T1
intersect
select * from T2
--方法2
select distinct 
    
*  
from 
    T1
where 
    T1.id 
in (select id from T2)
--方法3
select distinct
    
*
from
    T1
where exists(select id from T2 where T2.id=T1.id)

--in和exists 的不同是in只能判断唯一列,而exists可以判断多列
--
-------------------------------------------------

--并集
select *  from T1
union all
select * from T2
----------------------------------------------------
--
差集
select *  from T1
except
select * from T2

返回结果就不写了,呵呵,大家运行一下就知道了。


不断更新中........
posted @ 2008-04-12 13:33 oec2003 阅读(512) 评论(5)  编辑 收藏 所属分类: sqlserver

  回复  引用  查看    
#1楼 2008-04-12 15:11 | 赵鹏      
嗯,不错,支持一下,
  回复  引用  查看    
#2楼 [楼主]2008-04-12 16:47 | oec2003      
@赵鹏
呵呵,谢谢
  回复  引用  查看    
#3楼 2008-04-14 14:32 | Clark Zheng      
第一条很方便,我也是最近才知道的,惭愧
  回复  引用    
#4楼 2008-04-23 01:23 | fu [未注册用户]
第一条好像有点问题:当@Age等于0时,(0='' or age=0) ,其中 0=''成立,age=0的条件无效了

  回复  引用    
#5楼 2008-04-23 01:30 | fu [未注册用户]
第一条好像有点问题:当@Age等于0时,(0='' or age=0) ,其中 0=''成立,age=0的条件无效了。应该在存储过程里面检查@Age 是否为零!如果为零则用
select
*
from
Users
where
(@Name='' or name=@Name)
and
(age=0)
如果不为零
select
*
from
Users
where
(@Name='' or name=@Name)
and
(@Age='' or age=@Age)


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-27 10:11 编辑过
 
另存  打印