zoukankan      html  css  js  c++  java
  • sql基础

    存储过程一般用在实现复杂的功能,数据操纵方面。

    存储过程:一段有名子的代码块,对单表或多表的增删改查,用时进行调用
              只返回单一记录集的存储过程 --> 没有输入输出的存储过程 --> 有返回值的存储过程 --> 有输入参数和输出参数的存储过程 --> 同时具有返回值、输入参数、输出参数的存储过程 --> 同时返回参数和记录集的存储过程 --> 返回多个记录集的存储过程
              return @@rowcount为执行存储过程影响的行数,执行的结果是不仅插入了一条数据,还返回了一个值即 return value =1


              --------------创建存储过程-----------------


              CREATE PROC [ EDURE ] procedure_name [ ; number ]
              [ { @parameter data_type }
              [ VARYING ] [ = default ] [ OUTPUT ]
               ] [ ,...n ]


              [ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]


              [ FOR REPLICATION ]


              AS sql_statement [ ...n ]


              --------------调用存储过程-----------------


              EXECUTE Procedure_name '' --存储过程如果有参数,后面加参数格式为:@参数名=value,也可直接为参数值value


              --------------删除存储过程-----------------


              drop procedure procedure_name    --在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程

    游标作用:
    1.定位到结果集中的某一行。
    2.对当前位置的数据进行读写。
    3.可以对结果集中的数据单独操作,而不是整行执行相同的操作。
    4.是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。

    declare @ID int
    declare @Oid int
    declare @Login varchar(50)
     
    --定义一个游标
    declare user_cur cursor for select ID,Oid,[Login] from ST_User
    --打开游标
    open user_cur
    while @@fetch_status=0
    begin
    --读取游标
        fetch next from user_cur into @ID,@Oid,@Login
        print @ID
        --print @Login
    end
    close user_cur
    --释放游标
    deallocate user_cur
    视图:视图是一张虚拟表,他所存储的不是实际数据,而是查询语句
             创建:create view vw_city
                   as
                   select cityName from city
             查询:select * from vw_city
    局部变量:
             局部变量的声明(一个@)
             declare @n int   --声明变量关键字为declare 然后@加变量名 后面是变量类型
             declare @s varchar(36)
             局部变量的赋值
             set @s='f4'
             set @n=@n+1  --变量的赋值有两种方法,一种是通过set,一种是select 如果变量不附初始值则默认为null,null参与计算的结果还是null,这一行的@n就等于null
             select @n=age from students  --如过变量通过select赋值,这里可能在表中查到很多age结果,这里只赋值查询出来的最后一个age结果,如果set使用这种方法会出错。
             set @n=(select age from Students where ID='1')--亦可以这样给他赋值
    全局变量:
              select @@ERROR    --返回最后执行的 Transact-SQL 语句的错误代码(integer)(如果最后一条语句不出错,就一直是0)
              select @@IDENTITY   --返回最后插入的标识值
    条件语句:
             if(条件表达式)
             begin
             语句...
             end
             else
             begin
             语句...
             end
    循环语句:
             while
             begin
             语句....
             break/continue
             end
    事务(去不了终点,回到原点)
         如果你要一起执行多条语句,如果有一条失败你就可以让他们全部都撤销执行。
         ---bank表为转账表,MeMoney字段为我的账余额,HeMoney为朋友的账户余额,这个事务完成的是我给朋友转账
         begin tran
         declare @ersum int        --定义这个局部变量为了记载这个事务过程中是否会出错,如果出错则最终将得不到为0的值,也就完成了我们判断这个事务是否出错过
         set @ersum=0
         update bank set MeMoney=MeMoney-1000 where ID=me   ---从我卡里扣掉1000
         set @ersum=@ersum+@@ERROR           --如果不出错这里还是0,如果错了,这里将不是0
         update bank set HeMoney=HeMoney+100 where ID=he    ---给我朋友卡里加上1000
         set @ersum=@ersum+@@ERROR     --如果这里的结果是0将表明没有出错
         if(@ersum<>0)  --true有错,false没错
         begin
         rollback tran  ---回滚事务
         end
         else
         begin
         commit tran    --执行事务
         end
    触发器:
           数据库中的表有所改动(添删改)是会触发一中事件
           --这个例子是,删除Tb1里面的数据,把删除的数据同时备份到Tb1Bak表中
           create trigger tri_bak on Tb1              --声明一个tri_bak ,如果Tb1表中的数据变化触发这个触发器
           after delete                               ---删除完成后执行下面的操作
           as
           insert into Tb1Bak select * from deleted   ---这里的deleted是系统自动生成的表,存放为上一次的数据库表中删除的数据。
    时间函数:
             --getdate 获取当前时间
             select getdate()
     
             --dateadd 原有时间加: 2013-02-17 13:20:16 此时间加12个月
             select dateadd(MONTH,12,'2013-02-17 13:20:16')  --返回:2014-02-17 13:20:16.000  (参数month可以改为 day,year等日期加相应的值)
     
             --datediff 两个时间的差 (后面-前面=返回值)
             select datediff(day,'2013-02-01','2013-02-18')   --返回:17  (参数day可以改为 month,year等日期加相应的值)
     
             --datepart 获取日期的某个部分整数
             select DATEPART(month, '2013-2-17')  --返回 2    (参数month可以改为 day,year等日期加相应的值)
     
             --datename 获取指定部位的字符串
             select datename(weekday, '2013-2-17')  --返回 星期日 (参数weekday可以改为 day,year等日期加相应的值)


             --day(), month(),year() 获取指定部位的字符串
             select day('2013-2-15') --返回15
             格式转换:
             select CONVERT(varchar, getdate(), 120 )  --返回 2013-02-17 13:37:54 
             select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','') --返回 20130217133828


             select CONVERT(varchar(12) , getdate(), 111 )  --返回 2013/02/17


             select CONVERT(varchar(12) , getdate(), 112 )  --返回 20130217


             select CONVERT(varchar(12) , getdate(), 102 )  --返回 2013.02.17
             缩写:Year Yy···
    查询执行顺序:
                 --查询组合字段
                 (5)select (5-2) distinct(5-3) top(<top_specification>)(5-1)<select_list>
                 --连表
                 (1)from (1-J)<left_table><join_type> join <right_table> on <on_predicate>
                 (1-A)<left_table><apply_type> apply <right_table_expression> as <alias>
                 (1-P)<left_table> pivot (<pivot_specification>) as <alias>
                 (1-U)<left_table> unpivot (<unpivot_specification>) as <alias>
                 --查询条件
                 (2)where <where_pridicate>
                 --分组
                 (3)group by <group_by_specification>
                 --分组条件
                 (4)having<having_predicate>
                 --排序
                 (6)order by<order_by_list>

  • 相关阅读:
    java的多线程学习,第二记
    java多线程的学习
    长城
    2018-12-6
    mysql的笔记
    springboot用jpa生成表,没有外键
    idea 使用方法
    Oracle数据库中文乱码问题
    JAVA-Could not create the Java virtual machine java启动失败
    log4j日志如何在ssh中配置?
  • 原文地址:https://www.cnblogs.com/qq424441031/p/6526522.html
Copyright © 2011-2022 走看看