• 开发总结(1)数据库


    本文是我在平时工作中所遇到的数据库方面的一些知识总结
    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)
    --返回-04-12
    CONVERT(VARCHAR(10),GETDATE(),20)
    --返回-04-12
    CONVERT(VARCHAR(10),GETDATE(),112)
    --返回
    CONVERT(VARCHAR(10),GETDATE(),111)
    --返回/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.一个实现拆分由特殊符分隔的字符串的函数

    Create   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 cast( floor(rand()*N) as int) 
    --产生到N-1之间的随机数
    select cast(ceiling(rand() * N) as int)
    --产生到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 


    运算代码:

    --交集
    ----------------------------------------------
    --方法
    select *  from T1
    intersect
    select * from T2
    --方法
    select distinct 
        *  
    from 
        T1
    where 
        T1.id in (select id from T2)
    --方法
    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

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

    9 在sqlserver实现除法

    通常情况下在用sql语句写除法得到的都是整数部分

    select 29/3 
    --结果为

    用下面的方法可以得到小数

    --定义结果变量为Decimal类型
    declare @result decimal(18,2) 
    --关键在于除数要乘以1.0 
    set @result=cast((29*1.0)/3  as decimal(18,2)) 
    select @result 
    --结果为9.67

    10 SqlServer 中根据时间得到星期

    select datename(weekday,'2009-06-19')  
    --结果星期五 
    
    select DATEPART(dw,'2009-06-19') 
    -- 结果6 
    
    --因为系统默认星期天为一个星期的第一天,所以星期五对应的值为

    11 使用sql语句设置表主键

    alter table TableName alter column ColumnName int not null 
     go  
    alter table TableName add constraint pk_ColumnName primary key(ID)

    12 SCOPE_IDENTITY   @@IDENTITY    IDENT_CURRENT的区别

    --SCOPE_IDENTITY和@@IDENTITY都返回上面操作的数据表最后row的IDENTITY 列的值
    --不过SCOPE_IDENTITY受到作用域的限制,@@IDENTITY不受作用域的限制
    /* 
        如有T1和T2两种?表?,在?表?T1中有一insert触发器,当在表T1中插入一条数据时,触发
        器被激发,在T2表中插入一条数据,这时就存在两个作用域,T1 和T2 ,这时如果在
        T1的insert语句后执行SCOPE_IDENTITY() 和@@IDENTITY将返回不同的值
        SCOPE_IDENTITY 返回的是T1的IDENTITY 
        @@IDENTITY 返回的是T2的IDENTITY 
    */ 
    select SCOPE_IDENTITY() 
    select @@IDENTITY 
     
    --返回指?定表中的最后一个identity的值
    select IDENT_CURRENT('TableName')

    13 truncate和delete的区别

    --delete 和truncate的作用作用都是将指定表中的数据清除,但两种方法有很大的区别
     
    --delete语句是dml,这个操作会放到?rollback segement中
    --事务提交之后才生效,如果有相应的trigger,执行的时候将被触发
    --用delete删除的数据可以找回来
    delete from tablename 
     
    --truncate是ddl, 操作立即生效, 
    --原数据不放到rollback segment中,不能回滚. 操作不触发trigger 
    --所以在使用truncate的时候要特别小心
    truncate table tablename

    14 sqlservr中随机取数据

    --MsSql随机取数据
    select top 10 * from tablename order by newid() 
    --Access 随机取数据
    select  top 10 *  FROM tablename order by rnd(id) 
    --mySql 随机取数据
    SELECT * FROM tablename order by rand() limit 10 

    15 根据当前时间取上个月1号的时间

    select dateadd(month,-1,getdate())-
                 day(dateadd(month,-1,getdate()))+1

    不断更新中........

  • 相关阅读:
    12款非常精致的免费 HTML5 & CSS3 网站模板
    Jetstrap 在线构建 Bootstrap 的工具
    Divshot —— 在线的可视化网页设计
    Hello World!
    我的B站主页:https://space.bilibili.com/611212 内有视频题解
    《冒险岛历史》路西德的前世今生
    看错题系列 cf622C C2. Skyscrapers (hard version)
    Codeforces Round #616 (Div. 2) F. Coffee Varieties 交互题
    Codeforces Round #616 (Div. 2) E. Prefix Enlightenment 图论
    Codeforces Round #616 (Div. 2) D. Irreducible Anagrams 找规律
  • 原文地址:https://www.cnblogs.com/oec2003/p/1150189.html
Copyright © 2020-2023  润新知