澳门金沙vip 23

SQL学习笔记2

本文目录列表:

 

1、SQL
Server系统提供的有个别疑心概述

2、系统函数调用时DEFAULT代替可选参数使用不合并
3、队列字段列message_enqueue_time记录的是UTC日期时间 

 

4、@@Pack_Received系统函数提醒音信有荒谬

  *
SqlServer相比较MySQLMySQL不帮忙事务管理,未有视图,未有存款和储蓄进程和触发器,未有数据库端的顾客自定义函数,不可能一心接受职业的SQL语法

5、总结语 6、参照他事他说加以考查清单列表

  * 所以在那处自身动用 SQL Server 二零一四 Management Studio来产生部分SQL
Server的办事

 

 

正文:


1、SQL Server系统提供的局地困惑概述


 


近年职业之余一直在系统地球科学习和研商SQL Server
数据库引擎这一整块,开采了有些原先未有太留意的事物,认为SQL Server
光数据库引擎那块就有那一个要学习和钻探的。作者个人以为SQL
Server提供的成效除了bug(能够由此service
pack打补丁修复)外,应该依然很值得信赖的。以下发掘了之类SQL Server
系统提供功能的八个狐疑:系统函数调用时DEFAULT代替可选参数使用不相近、队列字段列message_enqueue_time记录的是UTC时间和@@Pack_Received系统函数提醒新闻有不当,以下针对每个郁结具体演示和任课。

 


2、系统函数调用时DEFAULT代替可选参数使用不合并

 

 

T-SQL 编码

DEFAULT关键字即能够在DDL语句中定义DEFAULT默许约束,也得以用来代表可选参数来使用。在DEFAULT代替可选参数使用那或多或少上,在效用上和NULL具备相似的法力。

1:局地变量和全局变量

 

*
全局变量由系统提供且预先注明,通过在变量名后面增加“@@”符号分歧于有些变量。顾客只可以选择全局变量无法改过全局变量的值。全局变量的效劳范围是全部SQL
Server系统

在SQL
Server系统提供的动态管理对象中,尤其动态管理函数的调用时,将可选参数代替为NULL或DEFAULT效果同样的。如下T-SQL代码:

* 局地变量由客户自个儿定义,通过在变量名前边增添“@”符号差异于全局变量

SELECT *
FROM [sys].[dm_db_index_physical_stats](NULL, NULL, NULL, NULL, NULL);
GO

SELECT *
FROM [sys].[dm_db_index_physical_stats](DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT);
GO

例1:声惠氏个变量@testDateTime,将getdate()函数的值放入变量中,末了输出变量@testDateTime的值

 

declare @testDateTime varchar(30)
select @testDateTime = getdate() 
select @testDateTime as '当前时间'
go

本着以上T-SQL的测量试验结果如下截图:

运营结果

澳门金沙vip 1

澳门金沙vip 2

 澳门金沙vip 3

例2:声美素佳儿(Friso卡塔尔个变量@getAge,将mytestuser表里面id是2的字段的age的值放入变量@getAge中,最后输出@getAge的值

 

declare @getAge int
select @getAge = age from mytestuser where id=2
select @getAge as '2号的年龄'
go

其它门类的种类函数,有个别函数在可选参数代替NULL或DEFAULT效果也是一律的,有fn_trace_getinfo、fn_trace_gettable等。如以下T-SQL代码:

运营结果

 

澳门金沙vip 4

DECLARE @nvcDefaultTraceFilePath AS NVARCHAR(4000);
SET @nvcDefaultTraceFilePath = N'';

SELECT @nvcDefaultTraceFilePath = [path]
FROM [sys].[traces]
WHERE [id] = 1;

SELECT *
FROM ::fn_trace_gettable(@nvcDefaultTraceFilePath, NULL);

SELECT *
FROM ::fn_trace_gettable(@nvcDefaultTraceFilePath, DEFAULT);
GO

2:使用运算符

 

例1:将表达式67%31的值赋给变量@result

本着上述T-SQL的测量试验结果如下截图:

declare @result int
select @result = 67%31
select @result as '结果'
go

澳门金沙vip 5

运营结果

 澳门金沙vip 6

澳门金沙vip 7

在其余种类系统函数中,更加多的时候在可选参数替代NULL或DEFAULT在效用上是不相通的,有fn_virtualfilestats等。如下T-SQL代码:

例2:定义变量x和y,给变量赋值,然后求多少个变量的与、或、异或的结果

SELECT *
FROM ::fn_virtualfilestats(1, NULL);

SELECT *
FROM ::fn_virtualfilestats(1, DEFAULT);
declare @x int, @y int
set @x = 2
set @y = 7
select @x & @y as '与',
       @x | @y as '或',
       @x ^ @y as '异或'

 

运维结果

针对上述T-SQL测试的结果如下截图:

澳门金沙vip 8

澳门金沙vip 9

例3:定义变量x和y,给变量赋值,然后求三个变量中超小的三个

澳门金沙vip 10

declare @x int, @y int
set @x = 12
set @y = 7
if @x < @y
select @x as '小数据'
else
select @y as '小数据'

 

 运营结果

3、队列字段列message_enqueue_time记录的是UTC日期时间

澳门金沙vip 11

 

例4:使用连接运算符(+)将四个字符串连接起来

学习和探究service
broker时,发掘了从服务队列中字段列message_enqueue_time值缺失UTC日期时间。

--需要注意的是变量x的长度,如果长度不够,就不能完整的显示数据
declare @x varchar(70)
set @x = '米诺八慈'+'的'+'博客园'
select @x as '数据连接的结果'

 

运作结果

在系统数据库tempdb中示范获取创设表的事件通报的意义。如下T-SQL代码:

澳门金沙vip 12

USE [tempdb];
GO

-- 创建队列
IF OBJECT_ID(N'[dbo].[NotifyQueue]', 'SQ') IS NULL
BEGIN
    CREATE QUEUE [dbo].[NotifyQueue]
    WITH
        STATUS = ON
       ,RETENTION = OFF
END
GO

-- 创建服务
IF NOT EXISTS (SELECT 1 FROM [sys].[services] WHERE [name] = N'EventNotifyService') 
BEGIN
    CREATE SERVICE [EventNotifyService]
    ON QUEUE [dbo].[NotifyQueue] ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
END
GO

-- 创建路由
IF NOT EXISTS (SELECT 1 FROM [sys].[routes] WHERE [name] = N'NotifyRoute')
BEGIN
    CREATE ROUTE [NotifyRoute]
    WITH 
        SERVICE_NAME = N'EventNotifyService'
       ,ADDRESS = N'LOCAL';
END
GO

-- 创建事件通知
IF NOT EXISTS (SELECT 1 FROM [sys].[event_notifications] WHERE [name] = N'CreateTableNotification')
BEGIN
    CREATE EVENT NOTIFICATION [CreateTableNotification]
    ON DATABASE
    FOR CREATE_TABLE
    TO SERVICE 'EventNotifyService', 'current database';
END
GO

3:case语句

 

例1:如若年龄低于20岁展现“少年”,若是岁数在20岁到二十二岁期间呈现“青少年”,如若岁数在28周岁以上突显“中年”

创设表的 T-SQL脚本如下:

/*需要注意的是
1:在case和字段之间是有逗号隔开的
2:在when then之间不能使用&&表示并且,所以可以将条件倒置,以避免出现age<30&&age>20
*/
select name,age,
case  
when age>30 then '中年'
when age>20 then '青年'
when age<20 then '少年'
end as level
from mytestuser
IF OBJECT_ID(N'[dbo].[TableCreate]', 'U') IS NULL
BEGIN
    CREATE TABLE [dbo].TableCreate
    (
        Col1 INT
        ,Col2 VARCHAR(100)
        ,Col3 XML
    )
    ON [PRIMARY]
END
GO

运维结果

 

澳门金沙vip 13

从刚刚创建的劳动队列中收获列表的T-SQL代码如下:

4:while代表循环

SELECT 
    CAST([message_body] AS XML)
    ,message_enqueue_time
    ,*
FROM [dbo].NotifyQueue
GO

例1:展现字符串“米诺八慈”中的每叁个字符以至其ASCII码

 

declare @position int,@str varchar(10)
set @position = 1 --需要注意的是在SQL里面字符串的从1开始取值
set @str = '米诺八慈'
while @position <=DATALENGTH(@str)--这里的长度是8
    begin
        select SUBSTRING(@str,@position,1),
        ascii(SUBSTRING(@str,@position,1))
        set @position =@position+1
    end

本着上述T-SQL测量检验的如下图:

运作结果

澳门金沙vip 14

澳门金沙vip 15

澳门金沙vip 16

5:result语句

 

result能够从询问或进度中无条件退出,可在任曾几何时候从进程、批处理或语句块中分离,而不推行result之后的言辞

以上截图中八个浅湖蓝矩形框圈住的地点,鲜明日期时间隔断非常的大的,那是因为队列中的字段列message_enqueue_time记录的是UTC日期时间,那样就或许对展现变成吸引的。

例1:通过存款和储蓄进程求客户平均年龄

 

--删除存储过程
drop procedure mypro

--创建存储过程
create procedure mypro @num int
as return(select avg(age) from mytestuser where id < @num)

--创建查询
declare @avg int ,@number int
set @number = 4
exec @avg = mypro @number --将变量num的值传入存储过程并将存储过程的结果赋给变量avg
select @avg as '平均年龄' 

注意:

以上SQL语句二个三个的实践,施行创造查询的结果

上述演示的T-SQL代码一点都不小多数摘录于SQL Server 二零一三管理高档教程(第2版)中第12章12.4.4事件通报小节中的程序清单 12-3
CreateQueue.sql。

澳门金沙vip 17

 

 

4、@@Pack_Received系统函数提醒有荒诞

 

 


在相继梳理SQL
Server系统提供的种类函数时意识了@@Pack_Received和@@Packet_Errors具备同等的提醒消息。能够显著一定有二个是错误的。提示新闻的示范如截图:


澳门金沙vip 18


澳门金沙vip 19

 

澳门金沙vip 20

 

澳门金沙vip 21

顾客自定义函数

 

例1:成立叁个函数用于显示出很大的年龄的客户消息

5、总结语

--删除函数
drop function showMax
--创建函数
create function showMax(@id1 int,@id2 int) returns  varchar(50)  --函数名
--函数体
as
  begin 
      declare @result varchar(50),@name1 varchar(10),@name2 varchar(10),@age1 varchar(10),@age2 varchar(10)
      select @age1 = age,@name1 = name from mytestuser where id = @id1
      select @age2 = age,@name2 = name from mytestuser where id = @id2
      if (@age1<@age2)
            set @result = @name2 +'的年龄是:'+ @age2
      else
            set @result = @name1 +'的年龄是:'+ @age1
      return @result 
  end
/*
需要注意的是:
1:在函数名里面声明了id1和id2,在函数体里面就不需要声明可以直接使用了
2:必须要用@age1 varchar(10),@age2 varchar(10)将int类型转换成varchar类型,以便与@name2 +'的年龄是:'相连
*/
--使用函数
select dbo.showMax(3,4) as maxMess

 

运转结果

近年全体概要地理解和学习了SQL Server
数据库引擎那块的文化,以为依然要继续深切学习
和斟酌。在深切过程中发觉了上述SQL
Server系统提供功效的3个疑心。针对系统函数调用时DEFAULT代替可选参数不统大器晚成的迷离尽量接受NULL,少用DEFAULT。针对服务队列中字段列message_enqueue_time为啥保存UTC日期时间近来依旧不掌握,研讨了不菲sql
server系统数据库、示例数据库超少使用UTC日期时间值的,也请通晓的同仁告知,卓殊谢谢。

澳门金沙vip 22

 

 

比较久比较久未有更新博文了,首要缘由依旧太懒,读、写和说都以不可缺少的基本手艺的,写和说那多个基本手艺继续进级抓牢。明早适逢其会元夕,也祝福各位上元节欢乐,富贵吉祥。新的一年从前些天发轫,继续踏上道路:撸起袖子加油干。



6、参考清单列表


1、SQL Server 2012管理高档教程(第2版)中第12章12.4.4风云通报小节中的程序项目清单 12-3
CreateQueue.sql。


 

 

 

 

游标

游标实际上即是后生可畏种能从包蕴多条数据记录的结果集中每一遍提取一条记下的体制

1:游标的类型

1:T-SQL游标

爱抚用于T-SQL脚本,存款和储蓄进度和触发器。主要用在服务器上,由顾客端发送给服务器的T-SQL语句或批管理、存储进度、触发器中的T-SQL实行扣押。不匡助提取数额块或多行数据

2:API游标

重中之重哦用在服务器上

3:顾客游标

要害是当在客商机上缓存结果集时使用

———————————————————————————————————————————————————————————————————————————————————————————————由于T-SQL游标和API游标使用在服务器端上,也叫作服务器游标或后台游标。客商端游标又被称之为前台游标

服务器游标富含:静态游标、动态游标、只进游标、键集驱动游标4类别型

2:游标的5种操作

表明游标 –> 展开游标 –> 读取游标 –>
关闭游标(借使不闭馆游标,别的人就足以步入,特别危殆) –> 释放游标

 

 




 

 

存款和储蓄过程

仓库储存进程以二个称呼存款和储蓄并作为二个单元管理,能够增长系统的施用功能和实施进程

积累进度是生机勃勃种独立存款和储蓄在数据Curry面包车型地铁目的,能够承当参数、输出参数、再次来到单个或八个结果集以致重返值,由应用程序通过调用实践

1:优势

1:模块化程序设计

只须求创建一遍并将其积累在数据Curry面,今后就能够在前后相继中调用该进程率性次

2:增加速度T-SQL语句的推行进程

澳门金沙vip,假若有个别操作须求大批量的T-SQL语句大概要双重试行,存款和储蓄进程将比批管理代码的实行快

3:减弱网络流量

一条存款和储蓄进度能够代表多条T-SQL语句,缩小了在互联网中发送的代码量

4:能够看做安全机制使用

数据库顾客能够经过得到权限来实践存款和储蓄进度,而不要授予客商直接待上访谈数据库的权杖

2:存款和储蓄进度的门类

澳门金沙vip 23

3:创立存款和储蓄进度

--创建存储过程,用于查询用户平均年龄
create procedure user_age_avg
as
    select avg(age) as age_avg from mytestuser
go
--执行存储过程 user_age_avg
execute user_age_avg

运作结果