• SQL 笔记


    返回字符串中从左/右边开始指定个数的字符
    select left('wjshan0808',6) 
    select right('wjshan0808',4)
    select left([Column_expression],1)
    返回字符、二进制、文本或图像表达式的一部分
    select substring('wjshan0808',7,4) /*索引从0开始*/
    select substring([Column_expression],0,6)
    指定测试范围
    birthday not between '1970' and  '1975-02-06 00:00:00.001' 
    确定给定的值是否与子查询或列表中的值匹配,使用 NOT IN 可以对返回值取反
    where classid not in (4,5,6)
    删除指定长度的字符,并在指定的起点处插入另一组字符
    select stuff( 'wjshna0808',5,2,'an')/*索引从1开始*/
    stuff([Column_Expression],1,2,'$')
    返回从指定集中删除了重复元组后得到的集
    select distinct(Column_Expression) from Table_Name
    select distinct Column_Expression  from Table_Name
    创建 uniqueidentifier 类型的唯一值
    select newid() /*3E1E14FB-2558-41E7-B147-78A2A1FEAADE*/
    分页方案
    /*每页5条 第二页*/
    declare @pageIndex int;
    set @pageIndex=2;
    select top 5 * from student where studentid not in(select top (5*(@pageIndex-1)) studentid from student)
    order by studentid asc
    //多一个ID列
    declare @pageSize int, @pageIndex int;
    set @pageSize=5;
    set @pageIndex=4; 
     select * from (select row_number() over(order by studentid asc) as ID ,* from student) as T
    where T.ID between @pageSize*(@pageIndex-1)+1 and @pageSize*@pageIndex
    //整个student表
    declare @pageSize int, @pageIndex int;
    set @pageSize=5;
    set @pageIndex=1;  
    select * from student where studentid 
    in( 
        select studentid from 
            (select studentid,row_number() over(order by studentid) as ID from student) as T 
        where T.ID between @pageSize*(@pageIndex-1)+1 and @pageSize*@pageIndex
    )
    带固定精度和小数位数的数值数据类型。 
    
    decimal[ (p[ , s] )] 和 numeric[ (p[ , s] )] 
    
    固定精度和小数位数。使用最大精度时,有效值从 - 10^38 +110^38 - 1decimal 的 SQL-92 同义词为 dec 和 dec(p, s)。numeric 在功能上等价于 decimal。
    
    p(精度) 
    最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。该精度必须是从 1 到最大精度 38 之间的值。默认精度为 18。
    
    s(小数位数) 
    小数点右边可以存储的十进制数字的最大位数。小数位数必须是从 0 到 p 之间的值。仅在指定精度后才可以指定小数位数。默认的小数位数为 0;因此,0 <= s <= p。最大存储大小基于精度而变化。
    
    ——————————————————————
    
    将一种数据类型的表达式显式转换为另一种数据类型的表达式。CAST 和 CONVERT 提供相似的功能。
    cast(studentno as numeric(18,0))+10  as 学号
    SELECT CAST(10.3496847 AS money)
    CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
    /*当前日期转换为样式 3,dd/mm/yy*/
    select CONVERT(VARCHAR(12),GETDATE(), 3)
    
    DECLARE @myid uniqueidentifier
    SET @myid = NEWID()
    SELECT CONVERT(char(255), @myid) AS 'char'
     
    确定特定字符串是否与指定模式相匹配。模式可以包含常规字符和通配符。模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配。但是,通配符可以与字符串的任意部分相匹配。与使用 = 和 != 字符串比较运算符相比,使用通配符可使 LIKE 运算符更加灵活。如果任何一个参数都不属于字符串数据类型,则 SQL Server 2005 Database Engine 会将其转换为字符串数据类型(如果可能)。
    
    使用 ESCAPE 子句的模式匹配
    可搜索包含一个或多个特殊通配符的字符串。例如,customers 数据库中的 discounts 表可能存储含百分号 (%) 的折扣值。若要搜索作为字符而不是通配符的百分号,必须提供 ESCAPE 关键字和转义符。例如,一个样本数据库包含名为 comment 的列,该列含文本 30%。若要搜索在 comment 列中的任何位置包含字符串 30% 的任何行,请指定 WHERE comment LIKE '%30!%%' ESCAPE '!' 之类的 WHERE 子句。如果未指定 ESCAPE 和转义符,则数据库引擎 将返回包含字符串 30 的所有行。
    
    如果 LIKE 模式中的转义符后面没有字符,则该模式无效并且 LIKE 返回 FALSE。如果转义符后面的字符不是通配符,则将放弃转义符并将该转义符后面的字符作为该模式中的常规字符处理。这包括百分号 (%)、下划线 (_) 和左括号 ([) 通配符(如果它们包含在双括号 ([ ]) 中)。另外,在双括号字符 ([]) 内,可以使用转义符并将插入符号 (^)、连字符 () 和右括号 (]) 转义
    
    
    通配符  说明  示例  
    %
     包含零个或多个字符的任意字符串。
     WHERE title LIKE '%computer%' 将查找在书名中任意位置包含单词 "computer" 的所有书名。
     
    _(下划线)
     任何单个字符。
     WHERE au_fname LIKE '_ean' 将查找以 ean 结尾的所有 4 个字母的名字(Dean、Sean 等)。
     
    [ ]
     指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。
     WHERE au_lname LIKE '[C-P]arsen' 将查找以 arsen 结尾并且以介于 C 与 P 之间的任何单个字符开始的作者姓氏,例如 Carsen、Larsen、Karsen 等。
     
    [^]
     不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。
     WHERE au_lname LIKE 'de[^l]%' 将查找以 de 开始并且其后的字母不为 l 的所有作者的姓氏。
     
    where loginid like '[a-d]%'
    
    在 mytbl2 表的列 c1 中查找精确字符串 10-15%
    LIKE '%10-15!% off%' ESCAPE '!';
    where address like '[^北]%'
    返回一个整数值,指示两个字符表达式的 SOUNDEX 值之间的差异。
    select difference('wjshan0808','wjshan')/*4*/
    返回删除前/后导空格后的字符表达式
    select Ltrim([Column_Expression])
    select ltrim(' 1  wjshan0808')
    select rtrim('wjshan0808  1 ')
    将第一个字符串表达式中第二个给定字符串表达式的所有实例都替换为第三个表达式。
    select replace([Column_Expression],[old_Expression],[new_Expression])
    select replace('wjshan0909','0909','0808')
    将大/小写字符数据转换为小/大写字符数据后返回字符表达式
    select lower([Column_Expression])
    select upper([Column_Expression])
    select lower('WJSHAN0808')/*wjshan0808*/
    select upper('wjshan0808')/*WJSHAN0808*/
    返回指定字符串表达式的字符(而不是字节)数,其中不包含尾随空格
    select len('wjshan0808 ')/*10*/
    返回表示指定日期的指定日期部分的字符串
    DATENAME ( datepart ,date )
    datepart 
    
    是指定要返回的日期部分的参数。下表列出了 Microsoft SQL Server 2005 可识别的日期部分及其缩写。
    
    日期部分      缩写  
    year         yy, yyyy 
    quarter      qq, q 
    month        mm, m 
    dayofyear    dy, y 
    day          dd, d 
    week         wk, ww 
    weekday      dw 
    hour         hh 
    minute       mi, n 
    second       ss, s 
    millisecond  ms 
    weekday     (dw) 日期部分返回星期几(如星期日、星期一等)。 
    
    select getdate()/*2015-01-14 14:20:08.260*/
    SELECT DATENAME(month, GETDATE()) AS 'Month Name' /*01*/  
    SELECT DATENAME(dw, GETDATE()) AS 'Month Name' /*星期三*/ 
    返回跨两个指定日期的日期边界数和时间边界数
    DATEDIFF ( datepart , startdate , enddate )
    enddate 减去 startdate。如果 startdate 晚于 enddate,则返回负值
    
    datediff(mm,[Column_Expression],getdate()) /*month_Value*/
    可应用于数据库定义的用来定义排序规则的子句
    /*姓氏笔画排列*/
    order by author collate chinese_prc_stroke_cs_as_ks_ws

    /*拼音排列*/
    order by author collate chinese_prc_cs_as

    /*Cross Join 运算符将第一个(顶部)输入中的每一行与第二个(底部)输入中的每一行联接在一起*/
    /*笛卡尔积运算*/
    select classname as 班级,gradename as 年级 from class cross join grade 
    [inner] jion on
    select * from class A  join grade B on A.gradeid=B.gradeid
    select A.classname,B.gradename from class A  join grade B on A.gradeid=B.gradeid
    union [all] /*select 结果累叠和*/
    create view view_Name 
    as 
    SQL_Expression
    计算条件列表并返回多个可能的结果表达式之一。
    
    /*语法1*/
    CASE input_expression 
        WHEN when_expression 
        THEN result_expression
        [ ...n ]     
        [ ELSE else_result_expression ] 
    END  
    /*语法2*/
    CASE
        WHEN Boolean_expression 
        THEN result_expression         
        [ ...n ]     
        [ ELSE else_result_expression ] 
    END
     
    select studentno,c#编程,
    (
        case when c#编程 is null then '无成绩' 
             when c#编程>60 and c#编程<80 then '合格' 
             when c#编程>=80 and c#编程<90 then '优良'  
             when c#编程>=90  then '优秀'  
             else  '不及格' 
        end 
    ) as c#编程成绩  from score
    根据表达式是否为空,返回一个布尔值结果。
    if isnull('','')=''  print 'null' else print 'not null'  /*null*/
    if isnull(null,'')=''  print 'null' else print 'not null'/*null*/
    if isnull('wjshan0808','')=''  print 'null' else print 'not null'/*not null*/
    返回最后插入的标识值的系统函数。
    select @@IDENTITY
    分页存储过程
    
     alter PROCEDURE pro_Paging 
        @tableName Nvarchar(200),--表名
        @where Nvarchar(500),--查询条件
        @orderBy_ColumnName Nvarchar(200),--排序字段
        @order bit=0,--0升序,否则降序
        @pageIndex int,
        @pageSize int,
        @pageCount int output,--总页数
        @itemCount int output --总条目数
    /*加密*/
     with encryption 
     AS
     BEGIN 
        /*总条数*/
        declare @strSQL NVARCHAR(2000)
        declare @item_Count int
        set @strSQL=N'select @item_Count=count(*) from '+@tableName ;
        /*判断查询条件*/
        if(isnull(@where,'')!='')
            begin
                set @strSQL=@strSQL+' where 1=1 and '+@where;
            end
        /**/
        print(@strSQL)
        /*执行获得查询条目数*/
        exec sp_executesql @strSQL,N'@item_Count int output',@item_Count output
        set @itemCount=@item_Count;
        set @strSQL='';
        /*没有数据*/
        if(@pageIndex<=0 or @itemCount=0 or @pageSize<=0)
            begin
                set @pageCount=0;
                /**/
                print(@strSQL)
                goto END_pro_Paging
            end
        else
            begin
                /*总页数舍入*/
                SET @pageCount =ceiling(@itemCount*1.0/@pageSize);
                /*条目数不大于页大小*/
                if(@itemCount<=@pageSize)
                    begin
                        set @strSQL=N'select * from '+@tableName;
                        if(isnull(@where,'')!='')
                            begin
                                set @strSQL=@strSQL+' where 1=1 and '+@where;
                            end
                        /**/
                        print(@strSQL)
                    end
                /*第一页*/
                else if(@pageIndex=1)
                    begin
                        set @strSQL=N'select top '+cast(@pageSize as varchar)+' * from '+@tableName;
                        if(isnull(@where,'')!='')
                            begin
                                set @strSQL=@strSQL+' where 1=1 and '+@where;
                            end
                        /**/
                        print(@strSQL)
                    end
                else
                    begin 
                        set @strSQL=N'select * from '+@tableName+' where '+@orderBy_ColumnName
                                +' in ('
                                    +' select '+@orderBy_ColumnName
                                        +' from ( '
                                            +' select '+@orderBy_ColumnName+',row_number() over(order by '+@orderBy_ColumnName+case @order when 0 then ' asc ' else ' desc ' end+') as RNID '
                                                +' from '+@tableName+''
                        /*条件*/
                        if(isnull(@where,'')!='')
                            begin
                                set @strSQL=@strSQL+' where 1=1 and '+@where;
                            end
                        set @strSQL=@strSQL+') T '
                                    +' where T.RNID between '+convert(varchar(10),(@pageSize*(@pageIndex -1)+1))+' and '+cast((@pageSize*@pageIndex) as varchar)
                                +' )';
                        /**/
                        print(@strSQL)
                    end
                if(isnull(@orderBy_ColumnName,'')!='')
                    begin
                        set @strSQL=@strSQL+' order by '+@orderBy_ColumnName+case @order when 0 then ' asc ' else ' desc ' end;
                    end                    
                    /**/
                    print(@strSQL)
                /*执行*/
                exec(@strSQL)
            end
        /*结束存储过程*/
        END_pro_Paging:
     END
    
    /*测试*/
    declare @pcount int
    declare @icount int
    exec pro_Paging N'student','classid=4',N'studentid',1,2,2,@pcount output,@icount output
    print @pcount
    print @icount
    事务提交
    
    begin tran tran_TEST
        declare @sumError int
        set @sumError=0;
        /*try*/
        begin try
            exec('insert into userstate values(2)');
            set @sumError=@sumError+@@error;
            update users set state=2 where loginid='admin'
            set @sumError=@sumError+@@error;
        end try
        /*catch*/
        begin catch    
            print('Error... '+char(10)+char(9)+convert(varchar,error_number())+char(10)+'详细: '+char(10)+char(9)+error_message())
            set @sumError=110;
        end catch
        print('结果:')
        /*判断*/
        if(@sumError>0)
            begin
                rollback transaction
                print('rollback')
            end
        else
            begin
                commit tran
                print('Ok')
            end
    试图
    
    create view view_TEST
    as
    select classid,classname,gradename from class right join grade on class.gradeid=grade.gradeid
    /*测试*/
    select * from view_TEST
    --创建一个与[Table]表结构一样的一张[copy_Table]表
    select top 0 * into [copy_Table] from [Table]
     
    触发器
    
    --为[copy_Table]表创建一个触发器
    create trigger trig_TEST on [copy_Table]
    after delete--执行删除操作后
    as
    begin
        --当删除[copy_Table]表中记录后触发 从deleted表中查数据插入到new_table 表中 
        insert into [new_table]  select * from deleted
    end
    从服务器分离数据库,并可以选择在分离前对所有表运行 UPDATE STATISTICS。
    
    语法 
    sp_detach_db [ @dbname= ] 'dbname' 
        [ , [ @skipchecks= ] 'skipchecks' ] 
        [ , [ @KeepFulltextIndexFile= ] 'KeepFulltextIndexFile' ] 
     
    参数
    [ @dbname = ] 'dbname'
    要分离的数据库的名称。dbname 的数据类型为 sysname,默认值为 NULL。 
    
    [ @skipchecks = ] 'skipchecks'
    指定跳过还是运行 UPDATE STATISTIC。skipchecks 的数据类型为 nvarchar(10),默认值为 NULL。要跳过 UPDATE STATISTICS,请指定 true。要显式运行 UPDATE STATISTICS,请指定 false。
    
    默认情况下,执行 UPDATE STATISTICS 以更新有关 Microsoft SQL Server 2005 Database Engine 中的表数据和索引数据的信息。对于要移动到只读媒体的数据库,执行 UPDATE STATISTICS 非常有用。
    
    [ @KeepFulltextIndexFile = ] 'KeepFulltextIndexFile' 
    指定在数据库分离操作过程中不会删除与正在被分离的数据库关联的全文索引文件。KeepFulltextIndexFile 的数据类型为 nvarchar(10),默认值为 true。如果 KeepFulltextIndexFile 为 NULL 或 false,则会删除与数据库关联的所有全文索引文件以及全文索引的元数据。
    
    返回代码值
    0(成功)或 1(失败)
    将数据库附加到服务器。
    
    语法 
    sp_attach_db [ @dbname= ] 'dbname'
            , [ @filename1= ] 'filename_n' [ ,...16 ]
     
    参数
    [ @dbname= ] ' dbname '
    要附加到该服务器的数据库的名称。该名称必须是唯一的。dbname 的数据类型为 sysname,默认值为 NULL。 
    
    [ @filename1= ] ' filename_n '
    数据库文件的物理名称,包括路径。filename_n 的数据类型为 nvarchar(260),默认值为 NULL。最多可以指定 16 个文件名。参数名称从 @filename1 开始,一直增加到 @filename16。文件名列表至少必须包括主文件。主文件中包含指向数据库中其他文件的系统表。该列表还必须包括在数据库分离之后移动的所有文件。
    
    返回代码值
    0(成功)或 1(失败)
    
    示例
    以下示例将 AdventureWorks 中的文件附加到当前服务器。
    EXEC sp_attach_db @dbname = N'AdventureWorks', 
        @filename1 = N'c:DataAdventureWorks_Data.mdf', 
        @filename2 = N'c:DataAdventureWorks_log.ldf' ;
     
     cmd.CommandText = "sp_attach_db @dbname='" + txt1.Text + "',@filename1='"+ txt2.Text +"',@filename2='"+ txt3.Text +"'";
    备份数据库
    BACKUP DATABASE AdventureWorks
    TO DISK='C:AdventureWorks1a.bak', DISK='C:AdventureWorks2a.bak', 
    DISK='C:AdventureWorks3a.bak'
    MIRROR TO DISK='C:AdventureWorks1b.bak', DISK='C:AdventureWorks2b.bak', 
    DISK='C:AdventureWorks3b.bak'
    WITH FORMAT
    恢复数据库
    cmd.CommandText = @"RESTORE DATABASE " + txt1.Text + " FROM disk= '" + txt2.Text + "' WITH REPLACE";
  • 相关阅读:
    人生苦短我学Java-1-Helloword
    python-51-MySQLdb查询返回dict格式
    IDEA/PyCharm等系列-会了这些设置编码舒服而效率又提高了一截
    jacoco-2-jenkins集成代码测试覆盖率
    jacoco-1-java代码测试覆盖率之本地环境初体验
    wordpress 安装提示 Error Establishing a Database Connection
    mysql 8.0 重置 root 账户密码
    Ubuntu 20.04 卸载 snapd
    VSCode 扩展选择快捷键插件 Quick and Simple Text Selection
    Swagger 响应数据 response 里包含动态变化的对象 key 的方法
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/4223738.html
Copyright © 2020-2023  润新知