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:\Data\AdventureWorks_Data.mdf', 
    @filename2 = N'c:\Data\AdventureWorks_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";

 

转载于:https://www.cnblogs.com/wjshan0808/p/4223738.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值