SQL学习(时间,存储过程,触发器)

SQL学习


  1. 几个操作时间的函数

     1 --datapart 获取时间中的年月日时分秒等部分
     2 select DATEPART(year,current_timestamp);
     3 select DATEPART(DAY,current_timestamp);
     4 select DATEPART(MONTH,current_timestamp);
     5
     6 --dateadd 在相应时间上加上年月日时分秒等
     7 select CURRENT_TIMESTAMP,DATEADD(DAY,10,CURRENT_TIMESTAMP);
     8 select DATEADD(month,11,‘2001-2-28 12:00:00‘) as 上帝时刻;
     9
    10 --datediff 获取两时间段的差值并换算为时分秒年月日等
    11 select DATEDIFF(month,‘2014-8-3‘,‘2015-9-10‘);
    12
    13 --转换函数 转换类型
    14 --cast   convert
    15
    16 select ‘123‘+456;
    17 select ‘123‘+cast(456 as varchar);
    18 select ‘123‘+CONVERT(varchar,456);
    19
    20 --convert时间类型转换 后面的数字即不同地区的时间表示方式
    21 select CURRENT_TIMESTAMP,
    22 CONVERT(VARCHAR,CURRENT_TIMESTAMP,111);--中国时间表示
    23
    24 select CURRENT_TIMESTAMP,
    25 CONVERT(VARCHAR,CURRENT_TIMESTAMP,110);--美国时间表示

  2. 简单练习

     1 --练习题
     2 use TextDB
     3 create table TB_CallRecord
     4 (
     5 Id int not null identity(1,1),
     6 CallNumber nvarchar(50),
     7 TelNum varchar(50),
     8 StartDateTime datetime null,
     9 EndDateTime datetime null
    10 )
    11 --主键约束
    12 alter table TB_CallRecord
    13 add constraint PK_CallRecord primary key (Id);
    14 --检查约束
    15 alter table TB_CallRecord
    16 add constraint CK_CallRecords check(CallNumber like ‘[0-9][0-9][0-9]‘)
    17
    18 alter table TB_CallRecord
    19 add constraint CK_CallRecords_EndDateTime check(EndDateTime > StartDateTime)
    20
    21 --默认约束
    22 alter table TB_CallRecord
    23 add constraint DF_CallRecords default(getdate()) for EndDateTime
    24
    25
    26
    27 INSERT TB_CallRecord ([CallNumber], [TelNum], [StartDateTime], [EndDateTime]) VALUES (‘001‘, ‘0208888888‘, CAST(0x00009DAF00A4CB80 AS DateTime), CAST(0x00009DAF00A62E94 AS DateTime));
    28 INSERT TB_CallRecord ([CallNumber], [TelNum], [StartDateTime], [EndDateTime]) VALUES (‘001‘, ‘0208888888‘, CAST(0x00009DB000D63BC0 AS DateTime), CAST(0x00009DB000D68DC8 AS DateTime));
    29 INSERT TB_CallRecord ([CallNumber], [TelNum], [StartDateTime], [EndDateTime]) VALUES (‘001‘, ‘89898989‘, CAST(0x00009DB000E85C60 AS DateTime), CAST(0x00009DB000E92F50 AS DateTime));
    30 INSERT TB_CallRecord ([CallNumber], [TelNum], [StartDateTime], [EndDateTime]) VALUES (‘002‘, ‘98987676‘, CAST(0x00009DB2015BB7A0 AS DateTime), CAST(0x00009DB2015C4DA0 AS DateTime));
    31 INSERT TB_CallRecord ([CallNumber], [TelNum], [StartDateTime], [EndDateTime]) VALUES (‘002‘, ‘02188839389‘, CAST(0x00009DA4014C9C70 AS DateTime), CAST(0x00009DA4014E0308 AS DateTime));
    32 INSERT TB_CallRecord ([CallNumber], [TelNum], [StartDateTime], [EndDateTime]) VALUES (‘001‘, ‘767676766‘, CAST(0x00009DB400DAA0C0 AS DateTime), CAST(0x00009DB400DD5FE0 AS DateTime));
    33 INSERT TB_CallRecord ([CallNumber], [TelNum], [StartDateTime], [EndDateTime]) VALUES (‘003‘, ‘0227864656‘, CAST(0x00009DB200B9AB40 AS DateTime), CAST(0x00009DB200B9FC1C AS DateTime));
    34 INSERT TB_CallRecord ([CallNumber], [TelNum], [StartDateTime], [EndDateTime]) VALUES (‘003‘, ‘676765777‘, CAST(0x00009DB8014042B8 AS DateTime), CAST(0x00009DB80141804C AS DateTime));
    35 INSERT TB_CallRecord ([CallNumber], [TelNum], [StartDateTime], [EndDateTime]) VALUES (‘001‘, ‘89977653‘, CAST(0x00009D9A00FB9898 AS DateTime), CAST(0x00009D9A00FE6118 AS DateTime));
    36 INSERT TB_CallRecord ([CallNumber], [TelNum], [StartDateTime], [EndDateTime]) VALUES (‘004‘, ‘400400400‘, CAST(0x00009D9A00FB9898 AS DateTime), CAST(0x00009D9A00FE6118 AS DateTime));
    37
    38 --查看全表
    39 select * from TB_CallRecord;
    40
    41 --输出通话时间最长的五条记录
    42 select top 5 *,DATEDIFF(SECOND,StartDateTime,EndDateTime) as 通话时长 from TB_CallRecord order by DATEDIFF(SECOND,StartDateTime,EndDateTime) DESC;
    43
    44 --输出所有数据中拨打长途号码(对方号码以0开头)的总时长。like、sum
    45 SELECT SUM(DATEDIFF(SECOND,StartDateTime,EndDateTime)) from TB_CallRecord WHERE TelNum like ‘0%‘;
    46
    47 --输出通话总时长最多的前三个呼叫员的编号。
    48 select top 3 Id,DATEDIFF(SECOND,StartDateTime,EndDateTime) as 通话时长 from TB_CallRecord order by DATEDIFF(SECOND,StartDateTime,EndDateTime) DESC;
    49
    50 --输出本月拨打电话次数最多的前三个呼叫员的编号.group by,count(*)
    51 select top 3 CallNumber,Id,StartDateTime From TB_CallRecord where DATEPART(MONTH,StartDateTime) = 7 order by CallNumber DESC;
    52
    53
    54 --表序列化row_number()over(order by 字段)  就是将不连续的表依据某一列值排序
    55 select ROW_NUMBER()over(order by Id) as 序列化 ,*from TB_CallRecord;

  3. 事务

     1 --事务:SQL中每一条语句都是一个事务,任何错误都会导致整个事务失败  --语法:   /*  begin transaction    代码   end   */
     2 begin transaction
     3 declare @myError int;
     4 update TextDB..TB_CallRecord set CallNumber = 0127897789 where CallNumber = ‘004‘;
     5 set @myError = (select @@ERROR);
     6 update TextDB..TB_CallRecord set CallNumber = ‘005‘  where Id = 10;
     7 set @myError += (select @@ERROR);
     8 if(@myError!=0)
     9 begin
    10 rollback transaction  --回滚当前的操作
    11 end
    12 else
    13 begin
    14 commit transaction    --执行当前的操作
    15 end
    16 --事务的特征:如果一个事务满足原子性,持久性,隔离性,一致性,那么这个操作则称为事务。
    17
    18
    19 --begin transaction
    20
    21 select *from TextDB..TB_CallRecord;

  4. 存储过程

      1 --存储过程
      2 --语法:
      3 /*
      4     create proc[edure] 存储过程名字
      5     参数 as 类型 [默认值|out]
      6     as
      7     begin
      8         代码
      9     end
     10 */
     11 --例如:
     12 go
     13 create proc usp_text
     14 as
     15 begin
     16 begin transaction
     17     declare @myError int;
     18     update TextDB..TB_CallRecord set CallNumber = ‘008‘ where CallNumber = ‘004‘;
     19     set @myError = (select @@ERROR);
     20     update TextDB..TB_CallRecord set CallNumber = ‘005‘  where Id = 10;
     21     set @myError += (select @@ERROR);
     22     if(@myError!=0)
     23 begin
     24     rollback transaction
     25 end
     26     else
     27 begin
     28     commit transaction
     29 end
     30
     31 end
     32 --执行存储过程
     33 exec usp_text;
     34
     35 select * from TextDB..TB_CallRecord;
     36
     37
     38 --带参数的存储过程
     39 go
     40 create proc usp_text2
     41 @oldnum as nvarchar(50)
     42 ,@newnum as nvarchar(50)
     43 as
     44 begin
     45     update TextDB..TB_CallRecord set CallNumber = @newnum where CallNumber = @oldnum;
     46 end
     47
     48 --调用带参数的存储过程
     49 exec usp_text2 ‘005‘,‘008‘;
     50 select * from TextDB..TB_CallRecord
     51
     52
     53 --带参数和返回值的存储过程
     54 go
     55 create proc usp_text3
     56 @oldnum as nvarchar(50)
     57 ,@newnum as nvarchar(50)
     58 ,@isSuccess int output   --使用output将函数内参数抛出给外部
     59 as
     60 begin
     61     declare @myError int
     62         update TextDB..TB_CallRecord set CallNumber = @newnum where CallNumber = @oldnum;
     63         set @myError = (select @@ERROR);
     64     if(@myError=0)
     65     begin
     66         commit
     67         set @isSuccess = 1
     68     end
     69     else
     70     begin
     71         rollback
     72         set @isSuccess = 0;
     73     end
     74 end
     75
     76 --调用带参数和返回值的存储过
     77 declare @result int
     78 exec usp_text3 ‘008‘,‘004‘,@result output;
     79 select @result;
     80
     81 --使用try catch
     82 go
     83 create proc usp_text4
     84 @oldnum as nvarchar(50)
     85 ,@newnum as nvarchar(50)
     86 ,@IsSucess  int output
     87 as
     88 begin
     89     begin transaction
     90     update TextDB..TB_CallRecord
     91     set CallNumber = @newnum
     92     where CallNumber = @oldnum
     93     begin try
     94         commit
     95         set @IsSucess = 1;
     96     end try
     97     begin catch
     98         rollback
     99         set @IsSucess = 0;
    100     end catch
    101 end
    102
    103 --调用带有try,catch的存储过程
    104 declare @result int
    105 exec usp_text4 ‘004‘,‘007‘,@result output;
    106 select @result;

  5. 触发器

     1 --触发器
     2 --语法
     3 /*
     4 create trigger tr_类型触发器名字 on 表名
     5 触发类型:after|instea of
     6 操作类型:inser|delete|update
     7 as
     8 begin
     9     代码
    10 end
    11 */
    12
    13 --案例
    14 --插入数据的同时获得自动增长的Id
    15 select * from TextDB..TB_USER;
    16
    17 insert INTO TextDB..TB_USER (userID,[password],code,lastTime)
    18 OUTPUT inserted.userID
    19 VALUES (‘aaa‘,‘DDD‘,‘23‘,‘2007-03-12‘);
    20
    21 -----------
    22 go
    23 create trigger tr_delete_不会删除的表 on TextDB..TB_USER
    24 after
    25 delete
    26 as
    27      insert into TextDB..TB_USER(userID,[password],code,lastTime)
    28      select userID,[password],code,lastTime from deleted;
    29 go
    30
    31
    32 select * from TextDB..TB_USER;
    33 delete TB_USER
    34 select SUSER_NAME();

    学习于蒋坤老师视频教程

时间: 2024-10-03 22:54:28

SQL学习(时间,存储过程,触发器)的相关文章

Oracle之PL/SQL学习笔记之触发器

Oracle之PL/SQL学习笔记之触发器 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行. 即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数.所以运行触发器就叫触发或点火(firing).ORACLE事件指的是对数据库的表进行的INSERT. UPDATE及D

sql学习笔记--存储过程

存储过程(stored procedure)有时也称sproc,它是真正的脚本,更准确地说,它是批处理(batch),但都不是很确切,它存储与数据库而不是单独的文件中. 存储过程中有输入参数,输出参数以及返回值等. 一.创建存储过程 创建存储过程的方法和创建数据库中任何其他对象一样,除了他使用AS关键字外.存储过程的基本语法如下: CREATE PROCEDURE|PROC <sproc name> [<parameter name> [schema.] <data type

SQL课堂笔记--存储过程和触发器

---恢复内容开始--- 2017.11.21                  存储过程和触发器   1.存储过程的作用 当SQL server 创建应用程序时,可以用两种方法存储和执行程序: 1).将程序存储在本地,然后创建SQL server 发送命令并处理结果的应用程序  2).将程序以存储过程的形式存储在SQL Server服务器中,然后创建执行存储过程并处理结果的应用程序.SQL server推荐使用这种  2.存储过程(Store Procedure)是一组为了完成特定功能的T-S

Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的表进行的insert .update.delete操作或对视图进行类似的操作. 触发器是很多关系数据库系统都提供的一项技术.在Oracle系统里,触发器类似过程和函数,都有声明,运行和异常 处理过程的PL/SQL块. 触发器的组成: 触发事件:在何种情况下触发:比如:INSERT , UPDATE

查看SQL SERVER 加密存储过程,函数,触发器,视图

原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create  PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset nocount on--CSDN:j9988 copyright:2004.07.15 --V3.2 --破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器--修正上一版"视图触发器"不能正确解密错误--发现有错,请E_MAIL:[email protected]be

SQL Server中的触发器

去年接触触发器的时候一头雾水,现在也算有了个大概的了解.就像的自考一样,学习真的是一个需要反复的过程,从陌生到熟悉这是一个过程.         一.基本概念 触发器是一种特殊类型的存储过程,它不同于普通的存储过程.触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名称而被直接调用.当往某一个表格中插入记录.修改记录或者删除记录时,SQL  SERVER就会自动执行触发器所定义的SQL语句,以确保数据的完整性.         二.作用         就我的理解,触发器的主要作

略谈SQL中的存储过程

对于数据库,一直在增,删,查,改这四个操作中转悠徘徊,没去想太多数据其他的东西.最近发现数据库中等待发现的,等待学习的,等待挖掘的东西太多了.我一直没去搞清楚游标,存储过程以及触发器等等这些知识概念,从没有想过数据库的优化工作和代码简化工作. 之前写了一篇关于数据库的触发器,这一篇主要谈一下数据库的存储过程. 首先SQL Server支持5种类型的存储过程: 系统存储过程,本地存储过程,临时存储过程,远程存储过程,扩展存储过程 1.系统存储过程:由系统提供的存储过程,可以作为命令执行各种操作.系

【PLSQL】详解SQL中的trigger(触发器)

本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INSTEAD OF)触发器 8.2.3 创建系统事件触发器 8.2.4 系统触发器事件属性 8.2.5 使用触发器谓词 8.2.6 重新编译触发器 8.3 删除和使能触发器 8.4 触发器和数据字典 8.5   数据库触发器的应用举例 触发器是许多关系数据库系统都提供的一项技术.在O

MySQL笔记---视图,存储过程, 触发器的使用入门

大二学数据库的时候,只是隐约听到老师提起过视图啊,存储过程啊,触发器啊什么的,但只是淡淡的记住了名字,后来自己做些小项目,小程序,也没有用上过,都只是简单的建表,关联表之类的,导致我对这些东西的理解只能停留在名称的阶段.最近看完了一本薄薄的小书叫<MySQL必知必会>,记了不少笔记,也自己上手实践了一番,总算是了解了些皮毛. 下面通过实例来具体了解这几个东西,首先我的样例表是这样的. 视图: 什么是视图? 视图是虚拟的表,本身并不包含数据,通过一个例子,来更好地理解视图: 假设上述表中,我需要