自作者的ASP.NET学习笔记011SqlServer基础知识

sqlServer_基本功概念

SQL server的管理工科具

SQL server联机丛书

早先菜单à Microsoft SQL Server 二〇一〇 à 文书档案和课程 à SQL Server联机丛书

SQL Server 配置管理器

用于运营和管理SQL server数据库的服务端,以及其余有关效能。

当大家运营SQL Server 配置管理器之后,能够在左侧目录中看出“SQL Server服务”,在“SQL Server服务”里,大家就能够对SQL Server的服务端,也便是基本数据引擎进行政管理理。

中间“SQL Server (MSSQLSE宝马X5VELX570)” 和 “SQL Server (SQLEXPRESS)”正是象征大家所设置的切切实实的服务端,前者是行业内部版,后者是体验版。

开拓Server配置管理器的另一种艺术:

“笔者的微处理器”à右键菜单à管理à”服务和行使”àSQL Server配置管理器

SQL server profiler

当大家的数据服务端出现难点和故障的时候,它能够给我们提供实时的跟踪工具,和性质量监督控的效应。

SQL Server Management Studio

它就是SQL server的图形化的田管界面,也便是客户端。

启动Management Studio

在登陆界面输入相关的音信:

服务器类型:数据库引擎

服务器名称:大家能够输入IP地址,
总括机名称。即便是造访本机的SQL server服务并且没有改变暗中同意端口号的话,只需求输入3个点
” . ”,它就意味着本机的SQL Server正式版的服务端。(体验版是.\SQLEXPRESS)

身份验证:SQL Server身份验证

用户名:sa

密码:sa

当SQL Server身份验证不能登陆时

壹 、 用windows身份验证(约等于用本机管理员来登陆,不须求输入用户名密码的)。

贰 、 展开左边目录中的 SQL
Server à 安全性 à 登陆名 à 双击sa à 打开sa 用户的性质窗口。

叁 、 修改密码

四 、 撤消”强制实施密码策略”

五 、 在“状态”选项卡中,对“是还是不是同意连接到数码引擎”和“登陆”分别采纳“授予”和“运营”。

陆 、 点击明确关闭sa 用户的本性窗口

柒 、 右键点击服务器根节点,选用属性打开“服务器性能”弹窗。

八 、 采纳“安全性”选项卡,设置“服务器身份验证”为“SQL Server和Windows身份验证”。

⑨ 、 鲜明并关闭“服务器质量”弹窗,然后在SQL server配置管理器中重启数据服务端,再用sql server 帐户密码来登陆即可。

SQL Management Studio的界面操作

右侧目录中,大家得以创设数据库数据表。

左上角的新建查询按钮,能够打开贰个输入与实践SQL语句的窗口。在此窗口中我们能够通过按F5键或点击“执行”来运作SQL语句。 在输入多条SQL语句的景观下,能够选中要求执行的代码,然后按F5来只进行被选中的部分。

sqlcmd命令行政管理理工具

通过纯指令的法子来管理SQL
server数据库服务端。

初阶菜单à 运维à输入cmd打开命令行窗口à输入sqlcmd /? 查看sqlcmd命令的协理音讯。

在该命令行下大家得以由此sql语句来操作数据库。

比如:

sqlcmd

use test

select * from student

go

末尾,必须输入go才会起首推行SQL语句。exit退出sqlcmd命令行状态。

修改数据表结构

有的是时候我们须要修改数据表字段结构,比如添加字段、修改字段类型和字段名,但是SQL
server私下认可景况下会阻止大家对数据表结构的改动。所以大家需求转移SQL Server的设置参数。

工具菜单à 选项à 打开”选项”弹窗中的”Designers”选项卡à打消”阻止保存必要重新创造表的转移”前边的入选状态。

T-SQL基本语法

select语句

语法:

SELECT 字段列表 FROM 表名

where子句

where运算符

=,>,<,>=,<=,<>,!=,!>,!<

<>表示不等于,!>不大于。

AND 、OR、NOT

 

BETWEEN

select * from student 

where age BETWEEN 13 AND 19

 

查询指定的数据值是否在第一个值和第二个值的范围内。

LIKE

select * from student 

where name LIKE ‘%小%’

 

 

模糊查询,可以使用通配符,

%用来表示任意个任意字符,

_ 下划线用来表示一个字符。

 

select * from student 

where name LIKE ‘_白’

 

 

 

IN

是指从一个集合中去逐一匹配,只要数据值在集合中能找到相同的项,where条件就成立了。

 

select * from student 

where name IN (‘小张’,’小黑’,’小平’,’小李’)

 

———————————-

select * from student 

where name IN (select name from student where age <20)

 

 

 

 

 

EXISTS

用来判断一个子查询是否有结果,当子查询返回了至少一个结果时,where条件成立。

 

select * from student 

where exists(select * from student where age =99)

 

 

 

group by子句

将点名字段中的相同的值进行分组。值相同的只显示一行。

示例1:

SELECT age,COUNT(name) from student group by age

示例2:

在sql server 中所呈现的字段列表中,不能够运用group by后边没有出现过的字段名,除非采纳聚合函数。

SELECT age,address,COUNT(name) from student group by age,address

order by子句

譬如倒序排序

SELECT * from studentorder by id DESC

top子句

Having子句

用来给分组织设立置规范

示例:

SELECT age,name from student group by age,name having name = '小李'

DISTINCT子句

免去并回到结果中再一次的值。

SELECT DISTINCT age from student

insert into插入数据

1次插入一行数据

insert into student (name,age,sex,address,phone) values('小宝',13,1,'城革大本营',12345678)

一遍插入多行数据

insert into student (name,age,sex,address,phone) values
('大宝',28,1,'城革大本营',12345678),
('小宝',13,1,'城革大本营',12345678),
('老宝',82,1,'城革大本营',12345678);

省略字段名按表的字段顺序来插入数据

insert into student values('小白楼',60,1,'沙坪坝',12345678)

注意:那种方法必须按照表的字段顺序(除了主键ID)来排列语句中的字段值,并且有所字段都必须填写值

聚合函数

AVG() 求平均值

SUM() 求合

MIN()/MAX() 求最大最小值

COUNT() 总括行数

UPDATE语句

update dbo.student set name='小白龙' where id = 14

DELETE语句

delete dbo.student where id=14

练习

创建一张学生数据表,包蕴字段id、name、age、sex、address、phone、classNum

一 、 3次性插入5条学生数量,并且不写字段名。

贰 、 用select语句询问ID为2到ID为4里边的笔录,(用BETWEEN关键字)。

叁 、 查询出装有姓王的同班(用LIKE模糊查询)。

四 、 查询出班上年龄为(1⑥ 、1⑦ 、2③ 、24)的同室

⑤ 、 总计各班分别有微微名学生

⑥ 、 分别总结男人与女孩子的年龄总合。

柒 、 找到年龄最大的女子。

八 、 修改id为3的学员姓名为”李小虫”

9、 删除id为3的学生。

老是查询

而且询问多张数据表并将这一个数据表以自然的逻辑关系进行连接,让它们彰显的结果类似于一张数据表。

与连接有关的显要字:

INNER JOIN 、OUTER JOIN ( LEFT和RIGHT)、FULL JOIN、CROSS JOIN

 

内部连接

它根据三个或多少个相同的字段将记录匹配在协同,将那两张表中的数额一起查询出来。

其中连接的性状是,只显示有关联的数量,不过没有关联的数目是不会被出示出来的。

语法:

SELECT <字段列表> FROM <第一张表> <连接类型> <第二张表> <ON 连接条件>

二表连接,示例:

select * from student INNER JOIN class ON student.cid = class.id

多表连接,示例:

select student.name,classInfo.className,teacher.name from student
INNER JOIN 
classInfo  ON student.cid = classInfo.cid
INNER JOIN 
teacher ON classInfo.teacher= teacher.tid

多表连接的采用小名,省略as

select s.name,c.className,t.name from student as s
INNER JOIN 
classInfo as c  ON s.cid = c.cid
INNER JOIN 
teacher as t ON c.teacher= t.tid

大家得以透过as关键字来给多少表定义3个别称,而且经过那些外号调用表中的字段。

专注:只要定义了外号,就必须利用小名,原表的名字就不能再用了。

而且as关键字是能够简简单单的:

select s.name,c.className,t.name from student  s
INNER JOIN classInfo  c  ON s.cid = c.cid
INNER JOIN teacher  t ON c.teacher= t.tid

填补:内部连接的INNE卡宴JOIN能够简化为JOIN ,效果是千篇一律的。

外部连接

内部连接有一定的排他性,第3张表是对第二张表的补给,若是第1张表不供给第三张表中的有个别数据,那么第②张表中不被亟需的数目就不会被展现出来。

语法:

SELECT <字段列表> FROM <左表><LEFT | RIGHT > [OUTER] JOIN <右表> ON <连接条件>

万一选择LEFT正是显得左表中的全数数据,如若运用Right就是彰显右表中的全体数据

示例:

select *from student as s RIGHT JOIN Class Info as c  ON s.cid = c.cid

多部外部连接示例:

select * from student  s RIGHT JOIN classInfo  c  ON s.cid = c.cid
LEFT JOINteacher t ON c.teacher=t.tid

统统连接

一齐连接( FULL JOIN 或 FULL OUTESportage JOIN )

用来体现所连接的全数表的有所数据,就算那条数据没有其余涉及关系。

select *from student  s FULL JOIN classInfo  c  ON s.cid = c.cid

练习:

一 、 先重做上课时讲的例证。

2a、
若是未来创建三个杂货店购物系统,产品音讯表(product)(id、name、price)、用户表(customer)(id、name)、购物清单表(saleList)(id、产品编号pid、用户号码cid)

2b、 用一条select语句询问某些用户的购清单上的有着产品。

2c、 用一条select语句询问得到某个用户的购清单上的保有产品的总价。

 

3a、借使以后创制三个影院的多少查询系统,坐位表(site)(id、row、col)、客户表(customer)(id、name、phoneNum)、电影票(ticket)(id、cid、sid、mid)、电影表(movie)(id、name、mtime)

3b、查询某一场电影的全体坐位上的客户的音讯。

3c、查询某一场电影的具备坐位上的客户的音讯,并且出示空座位。

(怎样判定八个字段的值为NULL值:

select * from movie where name is null)
select s.id,c.name from dbo.ticket t
join dbo.customer c on t.cid=c.id
join dbo.movie m on t.mid=m.id
right join dbo.site s on t.sid = s.id
where m.id=1
union
select id,'无座' as name  from site where id not in
(select site.id from ticket
join dbo.customer on ticket.cid=customer.id
join dbo.movie on ticket.mid=movie.id
right join dbo.site on ticket.sid = site.id
where movie.id=1)

3d、查询某一个客户看过的拥有电影的名称。

子查询

它是指一个select查询语句,并不是直接从数据表中来获取数码,而是从别的叁个查询语句的结果集中来进展查询。

示例:

select s.name,s.age,s.sex from (

select * from student where sex = 0

) as s

where age >20

其间,在from关键字的末尾,并不是数据表而是select语句。

交叉连接

接力连接在真相上,也能够看成是一种内接连。只显示有一关系的数码。

示例

–内连接写法

select * from classInfo

inner join teacher

on classInfo.teacher=teacher.tid

 

–交叉连接写法

select * from classInfo,teacher

where classInfo.teacher=teacher.tid

 

 

三头的结果是如出一辙的

 

联合UNION

运用三个或四个以上查询合并后只回去一个结实集

比如:

赢得班上年龄大于20和拥有男子的合集

select * from student where age>20

union

select * from student where sex = 1

 

 

前提每条select语句重返的字段列表的个数和一一必须是平等的。

 

一起后回去重新的数据

union联合后的结果机关去除掉两个select结果中的重复数据,若是须求再行显示这几个再次数据,我们得以采纳union all关键字:

select * from student where age>20

union all

select * from student where sex = 1

 

始建与修改数据库、表

 

SQL Server中的对象名

大部分气象下大家运用的是数据表或数据库的简写格局,实际上SQL
server中的数据表有4层命名约定。

[数码服务器名.[数据库名.[模式名.]]] 对象名

.test.dbo.student

数据库服务器名:默许是指当前已登陆的那个数额服务器。

数据库名:默许是指在客户端左上角的下拉列表中已选拔的数码库名,或用use
指令钦赐数据库。

use test select * from student where sex = 1

模式名

SQL server对象足以具有二种方式名。

先是种形式:该指标具备的权限的用户。

第③种形式:暗许dbo,允许多少个登陆用户共享的一种访问方式。

形式所表示的便是访问权限,平日我们接纳暗中同意的dbo情势。

CREATE语句

它用来制造数据库对象

语法:

CREATE <对象类型> <对象名称>

CREATE DATABASE news

CREATE TABLE newContext( id int )

CREATE DATABASE创立数据库

新创建的数据库,除了创造者、系统一管理理员、数据库全体者以外,别的人都无法访问。

CREATE DATABASE 的整体语法

CREATE DATABASE
[
[ON | PRIMARY ]
(
[NAME = ‘实例名’ ,]
[FILENAME = ‘文件名’ ,]
[SIZE = 文件大小 ,]
[MAXSIZE = 文件最大容量]
)
]
[
[ON | PRIMARY ]
(
[NAME = ‘实例名’ ,]
[FILENAME = ‘文件名’ ,]
[SIZE = 文件大小 ,]
[MAXSIZE = 文件最大容量]
)
]
 [COLLATE <核对名称>]
[FOR ATTACH [ WITH <server broker> ||FROM ATTACH_REBUILD_LOG ||WITH DB_CHAINING ON|OFF|TRUSTWORTHY ON|OFF  ]]
[AS SNAPSHOT OF<源数据库名>]
ON

 

用在七个地点:一是概念数据库文件的职务。二是定义数据日志库文件的任务。

P锐界IMA奇骏Y 关键字用于内定多少个数据库文件中的主文件。

NAME 钦命文件的实例名称。相当于在数据库的逻辑名(非物理文件名)

FILENAME 正是指数据文件的情理地方和文书名,mdf(数据库)  ldf(日志文件)

SIZE 数据库大小,能够在数字背后用KB或GB表示数据库的轻重缓急。

MAXSIZE 最大小体积。

 

COLLATE

用于拍卖排序和字母大小写等难点

 

FOR ATTACH

将已存在的一部分数据库文件附加到当前服务器上。当前,那些文件必须是数据库的一有的。

 

WITH DB_CHAINING

跨越数据库全数权

 

TRUSTWORTHY

为sql server数据库文件添加安全层

创造数据库示例:

CREATE DATABASE TESE22BB
ON
(
NAME =TEST22BB,
FILENAME = 'e:\test22bb.mdf',
SIZE =30MB,
MAXSIZE = 50MB
)
LOG ON
(
NAME = 'TEST22BBLOG',
FILENAME='e:\test22bb.ldf',
SIZE = 10MB,
MAXSIZE = 20MB
)
GO

 

用那种方法,我们得以在钦定的硬盘或U盘路径之下创建数据库。

 

在意:假诺要求对数据库文件举行理并答复制、剪切或删除操作。

 

查看数据库消息

EXEC sp_helpdb ‘test’

以近乎查询语句的结果集的不二法门赶回数据库的尺寸、拥有者、创立日期、文件路径等音信。

 

CREATE TABLE创造数据表

CREATE TABLE 数据表名

成立表从前明确是还是不是业已挑选当前数据库

 

完全语法

CREATE TABLE [数据库.[数据库所有者]] 数据表名
(
<字段名><字段的数据类型>
[DEFAULT <默认值表达式>]
|
[IDENTITY [seed,increment][NOT FOR REPLICATION] ]
[ROWGUIDCOL]
[COLLATE<COLLATION NAME>]
[PRIMARY KEY]
[NULL | NOT NULL]
[<column constraint 字段约束>]
|
[table_constraint 表约束]
|
[字段名 as 计算列表达式]
)
[ON (<文件组>)|DEFAULT]
[TEXTIMAGE_ON(<文件组>)|DEFAULT]

 

DEFAULT 默认值

指该字段在并未输入值的情景下暗许使用的值。

IDENTITY标识、自增量

暗许情况下,每条记下自动增添1

NOT FOR REPLICATION

就是指对这几个表展开复制的时候,ID主键的值是重新排列,如故延用从前的ID

ROWGUIDCOL

是指将三个表中的数额复制到另三个表中时,要是产生ID重复景况下,应用如何处理。

COLLATE

用于拍卖排序和字母大小写等题材。

PRIMARY KEY

安装该字段为主键

NULL/NOT NULL

是不是同意为空

字段约束

对字段中输入的数目开始展览平整的限制。

计算列

能够成立1个自笔者没有任何数据的列,那些列的值由其余列来动态的转变。

比如:

PCount AS price*num

此地大家就定义了叁个总结列,总价=单价*数量

 

注意:

① 、不可能估计主键、外键、唯一键

二 、只可以引用当前数据表中的字段

 

表约束

对插入表的数目实行界定

ON

一经数据库由三个部分构成,我们得以钦点数据表存款和储蓄在哪些部分。

TEXTIMAGE_ON

与ON的职能类似,不过它只有在表中有Text或Image类型的字段时才有效。

创制数据表的示范:

use testStudent2;

CREATE TABLE student(

sid int IDENTITY PRIMARY KEY NOT NULL,

sName nvarchar(50) NOT NULL,

sAge int,

sSex bit  DEFAULT 0 NOT NULL,

sYW float DEFAULT 0 NOT NULL,

sSX float DEFAULT 0 NOT NULL,

sCount AS sYW+sSX

)

 

练习:

制造三个产品销售表,字段如下:pid、pname(产品名称)、pPrice(产品价格)、pNum(产品销售数量)、pCount(产品销售总价= pPrice* pNum),用CREATE语句创造那几个数据表。

 

ALTE陆风X8修改语句

ALTER <数据对象类型><数据对象名称>

ALTEXC60 DATABASE 修改数据库

修改数据库名

ALTER DATABASE test MODIFY NAME = test22

将数据库test改名为test22

修改数据库大小

ALTER DATABASE test MODIFY FILE (SIZE = 500MB)

留意:不能够变小,只可以叠加它的容积。

ALTEXC90 TABLE 修改数据表

最广大的操作正是修改数据表名和表中的字段。

 

添加字段

ALTER TABLE dbo.student

ADD --这个关键字代表添加

phoneNum char(20) DEFAULT '00000000',

sAddress nvarchar(100) ,

createTime DateTime DEFAULT GETDATE()

--GETDATE()代表获取系统当前时间

修改字段名

EXEC sp_rename ‘表名.原字段名’ , ’新字段名’ , ’COLUMN’

示例:

EXEC sp_rename 'student.createTime','regTime','COLUMN'

修改字段类型

ALTER TABLE 表名 ALTER COLUMN 字段名 类型

示例:

ALTER TABLE dbo.student

ALTER COLUMN sAge nvarchar(30)

除去字段

ALTER TABLE 表名 DROP COLUMN 字段名

示例:

ALTER TABLE dbo.student

DROP COLUMN sAddress

字段的值会被一道删除

修改表名

EXEC sp_rename ‘原表名’,’新表名’

示例:

EXEC sp_rename 'student','studentInfo'

DROP语句

除去数据库对象,比如:删除数据表、视图、存款和储蓄进度、触发器

语法:

DROP <数据对象> <数据对象名>

DROP语句能够而且删除多张数据表

DROP TABLE 表1,表2,….

示例:

drop table table1,table2,table3

DROP删除数据库

DROP DATABASE 数据库名

练习:

用户CREATE 语句创建几个电影院相关的数据库,个中包含数据表(site)(id、row int、col int)、客户表(customer)(id int,name
nvarchar(50)、phoneNum char(20))、电影表(movie)(id int 、name nvarchar(50)、mtime dateTime)

 

里面,用户电话的私下认可值是12345678

影视的私下认可时间是近期系统时间

每种表的id都不可能不是自增的主键

修改site数据表名为userSite

修改customer中的字段phoneNum的种类为char(50)

 

数据库相关的始末

系统数据库

master

存款和储蓄了数据库的基本指标消息,没有这么些数据库Sql
Server就不可能经常运作。

msdb

提供了SQL Server的代表劳务中要推行的任务和调节和测试安排

model

被SQL server用于数据库模板音讯的蕴藏

tempdb

用来存放在一些临时消息,重启数据库服务端时,它存款和储蓄的音讯会被清空。

分手数据库

数据库默许的蕴藏地点

C:\Program Files\Microsoft SQL
Server\MSSQL10.MSSQLSERVER\MSSQL\DATA

要是我们供给将它移动地方的话,就要求首先分离数据库:

右击数据库图标弹出菜单à职分à分离à弹出分手数据库窗口à选中”删除连接”à鲜明

如此那般大家就可以复制和分叉数据库了。

外加数据库

用以将早已分其他数据库文件mdf、ndf(数据库接济文件)、ldf 添加到数据库服务端中开始展览运维。

右击“数据库”à在弹出菜单中选取”附加”à在“附加数据库”窗口中式点心击添加
à 选拔mdf文件à分明à分明

备份与还原数据库

备份

顶牛于分别数据库,备份的时候我们不必要结束数据库的周转。备份能够在用户正在选用数据库的情景下进行。在钦赐数据库的右键菜单中à职分à备份à在“目录-备份到”区域中钦赐数据库备份的路子(默许路径是在sql server的安装目录下,假设急需改变备份路径,供给先删除暗中认可路径,再点击添加)

还原

右击“数据库”à在弹出菜单中选用”还原数据库”à在“还原数据库”窗口中钦命”设备源” à点击”设备源”后的
”…” 按钮à添加à选用备份文件à明确à选中数据库前方的对勾à采纳对象数据库下拉列表à鲜明

数据库备份文件的扩充名是bak

sqlServer_束

自律便是添加一种范围,为字段或表添加限制,以确定保障数量符合用户制定的规则。

自律的归类

依照约束范围

实体约束

域约束

参考完整性约束

按照约束的主意

主键约束

外键约束

唯一约束

CHECK约束

DEFAULT约束

规则

默认值

封锁的定义

域约束

域约束用来拍卖一个或三个字段。

譬如:商品价位不能够为负数。

当用户插入一行数据时,只要有一字段不吻合约束原则,那么整条记录都无法插入。

实体约束

它用来针对行进行约束。

譬如:需要各种学员的人名、电话、地址都不能够现身重复。

平等的值不能够在其行出现。

参照完整性约束

某一字段的值,必须含有于(当前表或任何表的)其余字段值的范围内。

封锁的命名

主键约束的命名:PK_student,PK代表主键Primary Key 。

CHECK约束:CK_ students_4j432j,CK_ students_ageNotSmall0

键约束

主键、外键、替换键、倒置键

主键约束

担保主键的值是绝无仅有的。

何以给一张并未主键的表添加主键

ALTER TABLE Table_1

ADD CONSTRAINT PK_table111

PRIMARY KEY (id)

外键约束

不怕为了保障数量的准确性,比如:确认保障每一条论坛贴子的发贴人都以确实存在于用户表的。

透过sql manageMent studio 来添加外键

一 、鲜明须要被限制的数据表。

二 、进入被限制的数据表的“设计”视图,在空白处点击右键菜单中的“关系”项。

③ 、点击添加按钮新建二个封锁。

肆 、选中新拉长的自律,在左边的“表和列规范”后边有二个按钮”…”,点它开辟外键关系编辑窗口。

伍 、选中相应的表的应和字段即可。

 

外键约束的双向性

当两张表之间添加了外键之后,它所创设的牢笼对那两张表的表现都以颇具约束作用的:

壹 、 外键引用表,不能够添加主键表中不设有的值。

2、 主键表中不能够去除已经被外键表引用的主键。

 

一般而言外键在外键引用表上添加

第2要分别哪张表是主键表(是指用已经存在的值作为约束范围),哪张表是外键表(是指添加数量时被封锁必须符合范围的那张表)

 

始建国门外键的时候,通常是在外键表上成立的。

练习:

① 、 用create创制学生表(sid、sname、sage、cid)和班级表(cid、cname、cteacher)

② 、 对那两张表添加外键约束,班级表是主键表、学生表是外键引用表。

叁 、 在学生表中添加三个不设有的班级试一下。

④ 、 在班级表中删除多少个已经被引述的班级试一下。

 

经过SQL语句来创立外键

在开创数据表的还要对有些字段添加外键

CREATE TABLE ticketVIP
(
tid int identity primary key not null,
cid int not null
FOREIGN KEY REFERENCES customer(id)
)

其中,FOREIGN KEY REFERENCES之后的表名(字段名)正是意味字段与哪张表的哪个字段建立外键关系。

查询一张表中的外键新闻

语法:

EXEC sp_helpconstraint 表名

示例:

EXEC sp_helpconstraint ticketVIP

在已存在的数据表中添加外键

ALTER TABLE dbo.ticketVIP

ADD CONSTRAINT

FK_dbocustomer_ticketVIP

--外键的名字

FOREIGN KEY (cid)

--指定当前表的字段

REFERENCES dbo.customer(id)

--指定与哪张表的哪个字段建立外键关系

练习:

壹 、 用create创制商品表product(pid、pname、pPrice),添加至少5条数据。

② 、 用create创造客户表customer(cid、cname)添加至少5条数据。

叁 、 用create创立购物清单saleList (sid、pid、countNum、saleTime、cid),并且增加对pid外键。

④ 、 用ALTECR-V TABLE指令来给saleList表的cid添加外键。

数据表的自引用

固然约束三个张表中的有个别字段的值必须符合另二个字段的已存在的值的界定。

比如现有一张员工表,员工表中字段如下(员工id、职员和工人姓名、上级领导id),在此我们能够约束“上级领导id)”必须属于“员工id”的限定内。

create table employee(

eid int identity primary key not null,

eName nvarchar(10),

lindaoID int

FOREIGN KEY REFERENCES

employee(eid)

)

在意:创造自引用的主意与创建国门外键的主意一致,不相同是表名与字段都以方今表中的。

平等用ALTE大切诺基语句也能够添加自引用

ALTER TABLE employee

ADD CONSTRAINT

FK_linDao_Must_Be_employee

--自引用的名字

FOREIGN KEY (lindaoID)

--指定当前表的字段

REFERENCES employee(eid)

--指定与哪个字段建立自引用关系

级联合浮动作

当大家改变数据记录的时候,能够同时操作两张表中的有涉及的多少。

诚如而言添加数据不须要级联操作,唯有删除和修改的时候有或许因为破坏了外键约束而招致四个表之间数据的荒唐,因而就供给一块的改动或删除四个表之间的多寡。

在创造数据库的还要添加外键与级联合浮动作

譬如:现成立一张工资表与职工表并建立级联关系。正是说当职员和工人音讯被删去的时候,其薪水记录一起被删除。

CREATE TABLE EMoney(

mid int identity primary key not null,

mtime datetime,

howMuch float not null,

eid int not null,

CONSTRAINT FK_money_give_to_employee

FOREIGN KEY(eid)

REFERENCES employee(eid)

ON UPDATE NO ACTION

ON DELETE CASCADE

--当主键列的相关数据被删除后,外键列的相关数据也一起被删除

)

其间,CONSTRAINT 与FOREIGN
KEY、REFERENCES语句就是成立外键并声称数据的依靠关系。

ON UPDATE NO ACTION

NO ACTION便是指不实施其它履行,暗中同意值。

ON DELETE CASCADE

CASCADE建立级联删除关系,在那边正是去除职员和工人的还要,删除另一张表中该职工的连带记录。

练习:

创造1个班级表,并与学员表建立级联关系。须求删减班级的时候,那一个表中的学员音信也还要被剔除。

唯一约束

纵使约定1个字段中的值不能够重复,每四个值都以唯一的。

在创制数据表的时候添加唯一约束

CREATE TABLE USERINFO(

uid int identity primary key NOT NULL,

uName nvarchar(50),

uPhone char(20) UNIQUE

)

只顾:唯一约束与唯一索引达到的功效是一模一样的。

在已存在的表中添加唯一约束

ALTER TABLE dbo.employee

ADD CONSTRAINT UQ_name_no_repeat

UNIQUE(eName)

CHECK约束

经过用户自已定义的原则来对一个要么多少个字段展开约束。

对已存在的数量表添加check约束

ALTER TABLE dbo.employee

ADD CONSTRAINT CN_AGE_MORE_ZERO

--约束的名称

CHECK

--说明这是一个CHECK约束

(eAge>=0 AND eAge<250)

小心:添加CHECK约束的时候,数据表中今后的多少必需要满足约束规范。

CHECK约束规范示例

限制字段age的数据范围为0到250

age BETWEEN 0 AND 250

限制字段PhoneNum 值必须为电话座机号

PhoneNum LIKE ‘[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’

限制字段的值为多个可选值之一,比如:学历(初中、高中、大专、本科、研究生、博士)

xueLi IN(‘初中’,’高中’,’大专’,’本科’,’研究生’,’博士’)

限制一个字段的值必须小于另外一个字段,比如年龄必须大于工龄。

(age>workYears)

 

练习:

① 、 现有学生表如下(age、name、phoneNum、sex(nvarchar))

限制age 必须0到50。

限制phoneNum必须是11位数字

界定性别只可以输入“男”或“女”

剥夺约束

偶尔大家需求暂时告一段落或剥夺约束。

暂时禁止使用约束

ALTER TABLE employee

NOCHECK

CONSTRAINT CK_ageMoreZero

--这里要指定约束的名字

回复已禁止使用的约束

ALTER TABLE employee

CHECK

CONSTRAINT CK_ageMoreZero

--这里要指定约束的名字

规则

平整与check约束是充裕相近的,它们的区分是规则只可以限量四个字段,但是规则定义一回,能够屡屡行使。

就比如:年龄不能够为负数,这么些规则能够动用于客户表、职员和工人表、学生表。

成立规则并将其应用到钦点的字段

--创建规则

create rule age_rule as @eAge>0

--把自定义的规则绑定到字段

exec sp_bindrule 'age_rule' ,'employee.eAge'

--‘规则名’,’表名.字段名’

撤除规则绑定

exec sp_unbindrule 'employee.eAge' --‘表名.字段名’

除去规则

drop rule 规则名

示例:

drop rule age_rule

索引 index

目录是2个排列、排序的法门,索引之后的结果就是目录。

比如说:新华字典,它就有种三种索引排序方式:拼音、扩偏旁部首,按笔画。

sql server中的索引的归类

按聚集性分类

聚集索引

例如:对于新华字典来说其最重大的、物理上的实在排列形式正是拼音顺序。

聚集索引就是数码的最主最的排列方式,对于数据表而言,自增主键id正是聚集索引。

一张数据表只好有一个聚集索引。

非聚集索引

例如:对于新华字典来说,它有三种补充性的排列形式,按偏旁部首、按笔画。

非聚集索引是指,非物理上的骨子里排列情势的逻辑目录顺序的目录。

对此数据表而言,成立了主键之后,其余的目录都以非聚集索引。

一张表中最多能够添加2肆十六个非聚集索引。

手动在SQL management中增进引用

右击钦命数量表弹出右键菜单
à ‘设计’ à 在编辑表结构界面空白处没点击右键
à “索引/键” à点击“添加”来创制新的索引 à 在“列”选项中选拔对哪1个字段实行排序,以如何措施排序。

目录的用途和职能

是加强数据查询的性质和频率。

比如说:大家依照用户年龄创建了目录。

履行用户年龄的询问操作时,性能会有一点都不小的晋级。

select age from student order by age where age>20

按唯一性分类

唯一索引

在3个字段中, 无法存在双重的平等的数额。强制约束一个字段中的值不能够重新。

非唯一索引

在二个字段中,能够存在同样的数目。

怎样添加唯一索引

因此右击内定数量表弹出右键菜单à “设计” à在编辑表结构界面空白处点击右键
à “索引/键” à“添加”或选中内定的索引à选用列à 左边“是唯一的”这一项上摘取“是”à鲜明。

如此就能够在二个点名字段之上添加唯一索引了。

按单列或多列分类

单列索引

是指八个目录只针对贰个字段举办排序。

多列索引

是指三个索引依照七个字段展开排序。其排序格局:第贰个目录排序之后,对内部的值相同重复的数据,再遵照第三个字段来排序。

什么样添加多列索引

透过右击钦点数量表弹出右键菜单à “设计” à在编辑表结构界面空白处点击右键
à “索引/键” à“添加”或选中钦定的索引à点击“列”之后的小按钮à在弹出窗口中添加四个“列名”。

目录的长处

当大家在查询时行使order
by或 group by的时候,sql的实行功效会大大升高。

目录的相干sql指令

翻看一张数据表中的拥有索引的连锁音信

exec sp_helpindex 数据表名

示例:

exec sp_helpindex student

树立目录

简写语法

CREATE INDEX 索引名 ON 数据表 ( 字段名 desc )

总体语法

CREATE [UNIQUE] [CLUSTERED] [NonCLUSTERED] index 索引名 on <表/视图名>(字段 asc/desc)

其中:

UNIQUE 创设唯一索引

CLUSTERED /NonCLUSTERED 聚集索引或非聚集索引

示例:

create Unique nonclustered index

IX_ageMore on student(name desc)

重命名索引

Exec sp_rename ‘表名.原索引名’ , ’新索引名’ ,’index’

示例:

Exec sp_rename 'student.IX_ageMore','IX_AM','index'

删除索引

DROP INDEX 表名.索引名

示例

drop index student.IX_AM

视图

在大家数据库中实际上存在不少的物理表。而视图正是依据物理表的查询结果,来变化的一张虚拟的数据表。

在sql management中创立视图

比如:

现有1个其实存在数量表student

下一场依据student 中有所年龄超越20岁的学员来生成一张虚拟表,相当于视图。

在数据库下的“视图”节点上点右键菜单
à “新建视图” à 在添加表中当选须要的数量表 à 在视图的筹划界面写入SQL语句,比如:

select id,name,age from student where age>=20

视图分类

行业内部视图

正是由三个或七个物理表通过标准查询语句组成的视图,理论上具有用select语句询问出的结果集都得以用来变化视图。

并且,我们对视图中的数据实行修改时会直接影响到其本来的情理数据表。

索引视图

尽管给视图添加索引

CREATE [UNIQUE][CLUSTERED][NonClustered] index 索引名 on <表 / 视图名>(字段 asc/desc)

若果大家为1个视图成立了聚集索引,那么我们就将以此视图叫做索引视图。

也就是给视图添加了贰个主键,然后系统会为索引视图创制缓存,因而索引视图的性质要超标视图。

分区视图

那种视图能够在一台或多台数据库服务器上连接一组有关的数据表,以达到像是在操作贰个数据表的机能。这是落到实处分布式数据库的一种方法。

视图的得失

优点

一 、方便重新排列物理表的多少,和操作源数据表一样。

② 、对于复杂的sql查询语句而言,只须要写一回,就足以将结果生成五个永久性的视图。

③ 、安全性高,只让特定的用户访问一些字段列,或部分数据。

缺点

① 、品质不高,查询耗费时间耗费财富。

② 、对于由复杂的select语句生成的视图而言,修改视图中的数据时有大概会错误。

于是,视图平日只好采取于小型或对品质须要不高的项目上。

视图的相关SQL指令

视图的拜会

select 字段,…. from 视图名 [where 条件]

视图的操作和表的操作十三分类似

视图结构的改动

实际正是修改生成视图的select语句

Alter view 视图名 as 新查询语句

示例:

alter view View_1 as select id,name,age from student where age>20

视图的创导

Create View 视图名 as 查询语句

示例:

Create view View_22 as select id,name,age from student where id>3

除去视图

Drop view 视图名

随堂演练

一 、创制一张学生数据表,包蕴字段id(int)、name(nvarchar)、age(int)、sex(bit)、address(nvarchar)、phone(char)、classNum(int)。

二 、 创设一张班级消息班,cid(int)、className(nvarchar)、teacher(int)。并添加两之上数量。

再成立一张老师表,id(int)、name(nvarchar)、age(int)、phone(char)。并添加两以上数量。

① 、 用一条insert语句三遍性插入十条以上学生消息,并且省略字段名。

二 、 用一条select语句询问学生表ID为2到ID为4中间的记录,(用BETWEEN关键字)。

叁 、 用一条select语句询问出具有姓王的同室(用LIKE模糊查询)。

四 、 用一条select语句询问出班上年纪为(1陆 、1柒 、2三 、24)的校友

⑤ 、 对学员姓名添加唯一索引

⑥ 、 创造视图,将学生表、班级表、教授表连接为四个视图。以学员表为主表。

七 、 查询这么些视图,彰显全数哥们的姓名、年龄、班号、教师姓名。

sqlServer_存款和储蓄进程

积存进程是一层层SQL代码集,相当于是将大家输入的多条SQL语句保存为叁个函数。

开创存款和储蓄进度

创设不带参数的囤积进程

语法:

CREATE PROC[EDURE] 存储过程名 AS   SQL语句序列……

施行存款和储蓄进程

EXEC[UTE] 存储过程名

示例:

CREATE PROC  showNum2 AS
select 1+1;
select 10*21;
select 100/3;
execute showNum

始建带输入参数的储存进程

语法

CREATE PROC[EDURE] 存储过程名

[@参数名1 数据类型 ][, [@参数名2 数据类型 ]]…

AS   SQL语句序列……

推行存款和储蓄进程

EXEC[UTE] 存储过程名 参数值1, 参数值2,….

示例:

CREATE PROC  addNum 

@num1 int,@num2 int

AS

select @num1+@num2

execute addNum 25,13

创办带暗许值的输入参数的囤积进度

带有暗中同意值参数,能够不输入具体的参数值,在不输入值使用默许值。

语法

CREATE PROC[EDURE] 存储过程名

[@参数名1 数据类型=默认值 ]…

AS   SQL语句序列……

示例:

CREATE PROC  addNum 

@num1 int=1,@num2 int=1

AS

select @num1+@num2

execute addNum 8

创制带输出参数的积存进程

语法

CREATE PROC 存储过程名

[@参数名1 数据类型 ][, [@参数名2 数据类型 ]]…

[@输出参数名 数据类型 ] OUTPUT

AS   SQL语句序列……

示例:

CREATE PROC  addNum 
@num1 int,@num2 int,
@result int OUTPUT
--定义输出变量@result,它的值会被自动输出
AS
select @result=@num1+@num2
-------执行存储过程-----
DECLARE @result2 int;
--定义变量@result2
execute addNum 8,1,@result2 OUTPUT
--执行存储过程addNum将其输出结果存放在@result2中
select @result2
--显示@result2中的内容

练习:

创造2个存款和储蓄进度,传入一个职工的日薪酬、要减半的罚金、本月工作天数,用OUTPUT重临本月实际薪资。

翻看存储进程的音信

EXEC sp_help 存款和储蓄进程名

示例:EXEC sp_help porcTest

修改存款和储蓄进度

语法:

Alter proc[edure] 存储过程名 [@参数1 数据类型],[@参数2 数据类型],[@输出参数名 数据类型] OUTPUT

示例:

ALTER PROC porcTest AS select * from student

除去存款和储蓄进度

语法:

DROP PROC[EDURE] 存储过程名

示例:

drop proc porcTest

练习

② 、传入2个id参数,根据这一个id来询问相应的学生掌握记录,并回到这一个学生的全名、年龄、电话。

③ 、传入叁个age参数,依照这么些age参数来回到全数年龄大于该年龄的学员记录。

SQL Server中的数据类型

数值类型

数据类型

取值范围

存储空间

tinyint

0~255

1字节

smallInt

-2768到32767

2字节

int

-231到231-1

4字节

bigint

-263到263-1

8字节

decimal(p,s)

-1038+1到1038-1

5到17字节

numeric(p,s)

-214748.3648到214748.3647

4字节

smallmoney

-922337203685477.5808到

922337203685477.5807

9字节

money

-3.438到-1.1838,0, 3.438到1.1838

4字节

real

-1.79308到-2.23308, 0, 1.79308到2.23308

4字节或8字节

证实:decimal(8,3) 表示存款和储蓄了三个8个人数字,小数位数是几人。

字符数据

数据类型

存储空间

char(n)

每字符1字节,最大可以存储8000字节

varchar(n)

每字符1字节,最大可以存储8000字节

text

每字符1字节,最大可以存储2GB

nchar(n)

每字符2字节,最大可以存储4000字节

nvarchar(n)

每字符2字节,最大可以存储4000字节

ntext

每字符2字节,最大可以存储2GB

说明:

① 、 当中协助Unicode字符集的以n开始。

贰 、 大家得以用varchar(max),表示可变长度。

日子与时间项目

数据类型

值范围

精度

存储空间

smalldatetime

01/01/1900 到06/06/2079

1分钟

4字节

datetime

01/01/1753到

12/31/9999

0.0033秒

8字节

datetime2

01/01/0001到12/31/9999

100纳秒

3字节

date

01/01/0001到12/31/9999

1天

3字节

time

00:00:00.0000000

23:59:59.9999999

100纳秒

3到5字节

 

二进制数据类型

数据类型

值范围

存储空间

bit

null , 0 和 1

1比特

binary

固定长度的二进制数据

8000字节

varbinary

可变长度的二进制数据

最大8000字节

image

可变长度的二进制数据

最大2G

 

除此以外还有xml、table类型。

T-SQL变量

T-SQL变量遵照使用限制大家能够分开为:全局变量(系统变量)和某个变量(用户变量)

全局变量

在整整SQL Server中都能访问到的变量,日常用来表示SQL server的系统参数。

写法:

@@变量名

例子:

SELECT @@SERVERNAME,@@CONNECTIONS

全局变量只可以访问,无法赋值。

 

常用全局变量

@@IDENTITY

上壹遍施行insert语句后插入的数码记录的id

示例:

insert into teacher values('小李',22,'19119111011')

select @@IDENTITY

@@ROWCOUNT

受影响的行数

示例:

delete from teacher

select @@ROWCOUNT

一些变量

功效域:仅限于在贰个批处理(指同一批次实行的代码)内卓有成效。

用途:

一 、在循环语句中著录循环的次数也许用于控制循环的标准化。

② 、控制流程语句的走向。

③ 、存款和储蓄函数或存款和储蓄进度的重返值。

语法:

一部分变量必须以@初阶

Declare @变量名 类型 [,@变量名2 类型]…..

宣称2个或多个变量,示例:

declare @num1 int ,@num2 int

赋值:

在T-SQL中,能够用select 或 set 来对变量举办赋值操作

set

2回只可以对三个变量进行赋值

示例1:

declare @num1 int ,@num2 int,@num3 int

set @num1=10

set @num2=25

set @num3= @num1+@num2

select @num3

示例2:

declare @num1 int

set @num1 =(select top 1 age from student)

select @num1

( select语句中的top关键字表示询问到的数据集的最上边的几条数据记录。比如:查询最上边的3条学生数量select top 3 * from
student )

示例3:

declare @num1 int

set @num1 = (select COUNT(1) from

student where age>19)

print @num1

select

它用于体现变量的值,恐怕对变量实行赋值。

能够贰遍对四个变量实行赋值。

示例1:

declare @num1 int,@num2 int

select @num1=14,@num2=18

select @num1,@num2

若是select 前面是赋值语句的话,则不会展示变量的值。

一旦select 前面是变量的话,则显示变量的值。

示例2:

declare @num1 int

select @num1 = (select COUNT(1) from student where age>19)

print @num1

示例3:

declare @num1 int

select @num1 =  COUNT(1) from student

 where age>19

print @num1

出口变量

print

1回只可以输出多少个变量: print @num1

select

一遍输出多个变量

示例:

select  @num1 as 总数,@num2

T-SQL运算符

注释

多行注释 /* 被诠释的内容
*/

单行注释 — 被诠释的始末

运算符

+、-、*、/

运算方法:

譬如:求圆面积

select 3.1415926 *4*4

正如运算符

>、<、>=、!=或<>

如:

if 2>3

print '2比较大'

else

print '3比较大'

赋值运算符

= 等号
,与其它编写制定语言一样,将左边的值赋值到左手。

逻辑运算符

AND 逻辑与

OR 逻辑或

NOT 逻辑非

字符串连接 +

select '阿姨'+'你好'

位运算符

&按位逻辑与、|按位逻辑或、^按拉逻辑异或、~按拉逻辑非

T-SQL语法相关

语句块

if 9-5=5

 begin --相当于{

print '你说对了'

 end --相当于}

else

begin

print '你说错了'

end

GO指令

意味着早先运转,GO之后的口舌属于另3个批次的代码。

declare @num1 int

set @num1=10

go

select @num1+1

执行报错,这是因为用户定义的有的变量只可以够在同三个批次中央银立竿见影,而go指令将代码分隔成了八个批次。

T-SQL中的流程序控制制

if语句

在三个或多个原则的判定下决定流程的走向。能够包容and、or等逻辑运算符来。

if..else语句

如果…或者

两段代码中只会举办一段

if…else if…else语句

多规格判断

示例:

declare @age int;

set @age=61

if @age<12

print '儿童'

else if @age<20

print '少年'

else if @age<30

print '青年'

else if @age<50

print '中年'

else

print '中老年'

while循环

当规则为true时执行循环代码,当条件为false时退出循环

declare @num1 int

set @num1=0

while @num1<10

begin

print @num1

set @num1=@num1+1

end

GOTO语句

让日前程序执行的相继产生转移,跳转到钦命的标记处。

示例:

print '今天是星期天'

goto theDay

print '今天是星期一'

print '今天是星期二'

theDay:

print '今天是星期三'

case语句

也即是swith,正是以贰个变量的值来支配推行顺序的哪八个有的。

示范1,依据数据表中著录的性别来展现孩子。

select id,name,

CASE sex

WHEN 1 THEN '男'

WHEN 0 THEN '女'

END

AS 性别

FROM student

示例2,单选判断题

DECLARE @N char(2)

SET @N='C'

SELECT

CASE @N

WHEN 'A' THEN '正确'

WHEN 'B' THEN '错误'

WHEN 'C' THEN '错误'

WHEN 'D' THEN '错误'

END

示例3,根据学生的年华来判定是不是成年

SELECT ID,NAME,

CASE

WHEN AGE>18 THEN '成年人'

WHEN AGE<=18 THEN '未成年人'

END AS 成年否

FROM student

从地点例子中大家得以见到,CASE语句能够在select查询数据表的时候,通过标准来判断相应字段的值,并按规则自定义再次来到结果。

随堂练习:

① 、 定义八个int型的变量,求最大值。662

二 、用create成立贰个上学的小孩子表(sid、姓名sname、年龄sage、性别ssex、成绩score ),要求在select查询时,突显对成就的评头品足,40以下差,伍18分以下较差、80之下合格、100或以下能够。

SELECT sname,sage,

case

when score<40 then '差'

when score<60 then '较差'

when score<80 then '合格'

when score<100 then '优秀'

end as '评价'

from student

叁 、创造3个囤积进度,该存款和储蓄进程达成输入1或0,查询上题数据表中的兼具男人或女子的平均分。

④ 、使用循环向上题的数据表中添加多少记录,姓名使用张一 、张2…..,年龄,成绩是随机数生成的。

提示:

类型转换

DECLARE @i int

SET @i =1

SELECT '张'+CAST(@i AS varchar)

实绩随机生成

select ROUND( RAND()*100,0 )

五 、写2个囤积进度,须求重返如下数值。

壹 、一 、② 、③ 、伍 、捌 、1③ 、21…………………数列的个数能够随意钦定。

⑥ 、写三个存款和储蓄进程,七个传入参数,三个输出参数,数据表的字段如下:(学生姓名 varchar(10)、性别 bit、出生年月 datetime 、战绩集合 varchar(1000)  、重临值:新增学生记录的id int output)。将盛传的值作为一条记下插入到数量表中。

前多少个传入参数分别为学生姓名、性别、出生年月,第④个参数varchar代表学生的实际业绩集合拼接成的字符串,如:“2:85,3:90,5:66”表示学科ID为2的科目战绩是85,学科ID为3的课程成绩是90,以此类推。第⑤个参数为新增成功后的那条学生记录的ID,实际上便是重返的出口参数。

create proc proc_InsertStudent

@sname nvarchar(50),

@ssex bit,

@birthdate datetime,

@scoreSum varchar(200),

@rid int output

as

insert into student(sname,ssex,birthdate,scoreSum) 

values(@sname,@ssex,@birthdate,@scoreSum)

set @rid = @@identity

declare @rrid int

exec proc_InsertStudent '江小白',1,

'1995-12-22','2:85,3:90,5:66',@rrid output

select @rrid

七 、完毕单表分页的蕴藏进度,输入表名、pageSize、pageIndex

指示:拼接并推行一条字符串方式的sql语句:

declare @tname varchar(50),@sql varchar(100)

set @tname=’student’

set @sql=’select * from’ + @tname

exec(@sql)

提示:分页语句

select top 10 * from student 

where sid not in

(

select top(10*(3-1)) sid from student order by sid

) order by sid

答案:

create proc getPage

@tname varchar(50),

@pIndex int,

@pSize int,

@keyName varchar(50)

as

declare @sql varchar(200);

set @sql='select top('+CAST(@pSize as varchar(10) )+') * from '+

@tname+

' where '+@keyName+' not in

(

select top('+CAST(@pSize as varchar(10))+

'*('+CAST(@pIndex as varchar(10))+'-1)) '+@keyName+' from

'+@tname+' order by '+@keyName+'

) order by '+@keyName

exec( @sql)

exec getPage 'student',2,8,'sid'

T-SQL中的流程序控制制语句2

Try……Catch语句

当大家实践顺序出现谬误的时候,一般都会报错,并且结束执行。不过假使在try语句的限定内失误的话,程序会一连运行,并且将错误消息在catch语句范围内举行拍卖。

语法:

BEGIN TRY

执行存储过程

END TRY

BEGIN CATCH

……

END CATCH

除非当try中的语句发生错误的动静下,才会去实施CATCH中的语句。

示例:

BEGIN TRY

exec getPage 'student',2,8,'sid'

END TRY

BEGIN CATCH

print '错错错错错错'

END CATCH

return语句

从存款和储蓄进程、批处理中无条件退出

if 3>2

begin

print '东'

print '南'

return

print '西'

print '北'

end

print '中'

waitfor等待

当T-SQL执行到waitfor语句时,程序会进入等待状态,等侍钦点时间过后,程序再继续执行前面包车型地铁话语。

语法:

waitfor delay ‘hh:mm:ss’ --时分秒

示例:

declare @i int

set @i=0

while @i<3

begin

waitfor delay '00:00:02'

set @i=@i+1

print @i

end

算术函数

操作对象仅限于:int、float、money、smallmoney、decamal

三角形函数

sin()、cos()、tan()、cot()

select SIN(0.5*PI()),TAN(0.25*PI())

--sin(90度),tan(45度)

反三角函数

asin()、acos()、atan()

幂函数

power() 次方,比如:select POWER(2,10) –2的10次方

sqrt() 开(平) 方 , select sqrt(81)

square 平方, select SQUARE(9)

Log() 对数, select Log(9)

取近似值

round(浮点数,位数)
保留钦命位数的小数,最后一人四舍五入

select ROUND(3.1415926,4)

FLOOTiguan(浮点数) 向下取整,扬弃小数部分保留整数。

select floor(3.999)

标志函数

abs() 取相对值,如:select
abs(-30)

Sign() 用于判断3个数值的正负,重临值唯有四个(① 、0、-1),如

select sign(-10)

正数再次来到壹 、负数再次回到-壹 、零重回0

其他

PI() 圆周率 select PI()

RAND() 随机数( 0到1里面包车型大巴小数 ) ,如:

select ROUND( RAND()*100,0) 获得0到100时期的整数

字符串函数

操作对象仅限:char、varchar、binary、nvarchar、varbinary类型

Ltrim() 去掉字符串左边的空格。select  LTHavalIM( ‘      abc     ‘)

卡宴trim() 去掉字符串左边的空格。select  汉兰达TRubiconIM( ‘      abc     ‘)

ascii() 将字符转换为内部ascii码表中的地方。select ascii(‘A’)

char() 将ascii码转换为字符。如:select char(65)

lower() 转换字母为小写。如:select LOWE劲客(‘Hello Kitty’)

upper() 转换字母为大写。如:select upper(‘Hello Kitty’)

str() 将数字转换为字符串。语法:str(数值,字符串长度,小数位数)比如:select ‘圆周率是’+str(3.1415926,5,3)

charIndex 重回子字符串在另三个字符串中率先次现身的职位。语法:

charIndex(子串,母串),正是判定前者是还是不是为后人的子集,假若没有在母串中找到子串则重临0。比如:select
charindex(‘day’,’today is a good day’)

substring(字符串,发轫地方,截取长度) 截取字符串,示例:

select substring(‘today is a good day’,12,4)

数据类型转换函数

convert()

convert( 目的数据类型(长度) , 必要被撤换的数额或字段名 ),示例:

select '我们班上有'+CONVERT( varchar(2),10)+'个同学'

CAST()

示例:

select '我们班上有'+CAST(10 as  varchar(2))+'个同学'

str()

系统函数

col_length(表名,字段名)

回到表中的字段的长短,示例:

select col_length('Product','ProductName')

col_name()

回来钦命字段的列名 , 这么些表是以id的款式传播的。

select COL_NAME(OBJECT_ID('Product'),2)

翻看第一个字段的名字

赢得一张表中的有着字段的音信

select * from syscolumns where id=OBJECT_ID('Customer')

收获一张表的字段的总数

select COUNT(1) from syscolumns where id=OBJECT_ID('Customer')

DateLength()

获得数码的实际尺寸,示例:

select

CompanyName,

DATALENGTH(CompanyName)/2 as '名称长度'

from dbo.Customer

翻看函数的扶助新闻

将光标移动到函数之上按下F1键,就足以打开联机丛书并出示该函数的连带文书档案。

isDate()

认清日期数据是还是不是合法,是回到1,否重返0。

select ISDATE('20160229')

getDate()

获得当前时刻,比如:

select GETDATE()

多多时候在要求为日期类型的字段添加当前岁月为暗许值的时候供给选择到该函数。

isNull(表达式1,表达式2)

当表达式1的值不为空时,重回表明式1的值。

比方表明式1的值为null空时,再次回到表明式2的值。

示例:

select CompanyName,

ISNULL(cast(regTime as varchar),'未添加注册时间') 

from dbo.Customer

ISNUMERIC()

认清是还是不是为合理的数值,就算这一个数值以字符串的花样存在。

select ISNUMERIC(‘123f457’)

是返回1,否返回0

练习:

① 、现有字符串如下:”2:80,3:91,4:75”,在那之中,逗号用于分隔差别的教程和成就。当中1:语文,2:数学,3:意大利共和国语,4:物理。将接近那样的多寡存放在学员数量表中。然后,建立二个仓库储存进程,输入学生id,再次回到这些学生的各科战表(每列的称号必须是科目名。)、各科总分,全部科指标平分分。

(假使这4门都以选修课,也正是说有个别人唯恐有陆个战表,某个人只怕唯有1个大成)

declare @id int,@scoreChar char(30),

@isCharOver bit

select

@id=1, --要查询的学生记录的id

@isCharOver =0 --用来判断成绩字符串是否结束。

set @scoreChar=(select score from dbo.student

where id=@id

) --得到存放成绩的字符串

declare @scroeWithNum1 char(5), --语文成绩

@scroeWithNum2 char(5), --数学成绩

@scroeWithNum3 char(5), --英语成绩

@scroeWithNum4 char(5) , --物理成绩 @scroeWithNum char(5) --临时存放成绩的变量

while @isCharOver=0

begin

declare @douIndex int

set @douIndex= charIndex(',',@scoreChar) --获取逗号出现的位置。

if @douIndex = 0 --如果没有找到逗号的话

set @isCharOver=1 --就设置字符串结束的标记为

set @scroeWithNum = LTRIM( RTRIM(substring(@scoreChar,0,@douIndex))) --打印截取出的成绩

set @scoreChar =  LTRIM( RTRIM( substring(@scoreChar,@douIndex+1,30)))

------如果是最后一个成绩的话-----------------

if @isCharOver = 1

begin

set @scroeWithNum= @scoreChar

end

------End___如果是最后一个成绩的话-----------------

---第二次分隔成绩-----------

declare @sNum char(1),@RealScore char(3)

set @sNum = substring(@scroeWithNum,0,2)

set @RealScore =substring(@scroeWithNum,3,3)

if @sNum=1

set @scroeWithNum1 =@RealScore;

else if @sNum=2

set @scroeWithNum2 =@RealScore;

else if @sNum=3

set @scroeWithNum3 =@RealScore;

else if @sNum=4

set @scroeWithNum4 =@RealScore;

---End__第二次分隔成绩-----

end

select @scroeWithNum1 as '语文',

@scroeWithNum2 as '数学',

@scroeWithNum3 as '英语',

@scroeWithNum4 as '物理'

触发器

当用户执行某种操作之后,会被机关激动的存款和储蓄进度,就称为触发器。触发器的实践取决于sqlserver执行的某种操作,而不是由用户一向调用的。

按激活顺序分类

其后触发器

当用户执行某种操作完毕之后,才会被触发的触发器。

轮换触发器

当用户执行某种操作起来在此以前,被触发的触发器,那种触发器能够阻挡或用钦命的操作来替换原来的操作。

规行矩步实施的操作分类

① 、数据操纵语言DML触发器,是指触发器所在数据表中产生了insert、update、delete操作时接触。

贰 、数据定义语言DDL触发器,那类触发器是指当服务器或数额中执行了create、alter、drop语句时被触发。

③ 、登录触发器:是指当用户登录sql server时触发。

DML触发器描述

一 、 在sql server 200第88中学,DML触发器通过运用两张逻辑表DELETED和INSEOdysseyTED。那两张是起家在数据服务器的内部存款和储蓄器中的,大家惟有只读取权限。DELETED和INSE安德拉TED表的字段结构和触发器所在的表的布局是平等的。触发器执行增加和删除改操作后,这两张中的记录也会被同时更新。

② 、 触发器能够经过数据表中的相关表达成级联操作,能够动用比约束更复杂的级联操作,也能够兑现比约束更扑朔迷离的封锁。

三 、 触发器的效应很强劲,能够完成广大复杂的操作,不过过多使用触发器会招致数据库品质的减退和程序维护的不便。

触发器的应用

开创触发器

语法:

create trigger 触发器名 on 表名 for 操作类型

AS

若干T-SQL语句

GO

留神:DML触发器是本着某张表的某项目操作而接触的。

示例:

比如成立二个触发器mytrigger用来监视student那张表的update操作,只要实施update语句,就会激活触发器mytrigger

create trigger mytrgger3 on student for update
as
print '这是第三个触发器'
update student set name = '小小白' where id=1

注:当大家针对同一张表的同样操作定义了多少个触发器的时候,那七个触发器会被同时触发。

修改触发器

语法:

Alter trigger 触发器名 on 表名 for 操作类型

AS

若干T-SQL语句

GO

示例:

ALTER trigger mytrgger3 on student for update

as

print '这是修改之后的update触发器'

查看触发器的内容

exec sp_helptext 触发器名称

示例:

exec sp_helptext mytrgger

翻看当前数据库有稍许个触发器

select * from sysobjects where xtype=’TR’

--实际上就是读取了系统数据表,因为触发器的内容就是存放在系统数据库中的。

打开或关闭触发器

剥夺触发器

disable trigger [触发器名] on 表名

示例:

disable trigger mytrgger3 on student

翻开触发器

enable trigger [触发器名] on表名

示例:

enable trigger mytrgger3 on student

删去触发器

Drop trigger 触发器

示例:

drop trigger mytrgger3

练习

在学生表中定义二个insert触发器,当插入一条数据的时候,检查和测试插入的那么些学生的数额是还是不是当先2肆岁,如若超过删除那条数据并提醒,该学生抢先了征集年龄。

答案在662笔记

删去与更新

当大家在数据库中执行增加和删除改操作的时候,系统会在sql
server服务器的内部存款和储蓄器中期维修改两张一时半刻表Deleted和Inserted一时半刻表。

如果我们未来亟待开发二个高校图书管理连串,种种同学前去借书都会转移一个借书记录。

一 、首先学生数据表中必要三个sNum学号字段

② 、成立借书记录表,当中借书记录须要与学号相关联(不是id)。

CREATE TABLE borrowRecord(

bid int identity primary key not null,

sNum int, --关联学生表学号

borrowDate datetime, --借书日期

returnDate datetime --还书日期

)

除去示例:

–当学生完成学业之后,假使学生表中的上学的小孩子记录就须要被删去掉。借书记录也急需同时被删去掉。

create trigger delStudentWithBR on student for delete

as

delete borrowRecord 

from borrowRecord as br,deleted as d

where br.sNum=d.sNum

--从deleted临时表中找到刚才被删除的那个学生的学号

--然后删除所有这个学号名下借书记录。

创新示例:

常备产生在相关联字段的值发生了转移。

--当学生的学号发生发生改变的时候,借书记录表中的学号也要同时改变,以保证数据仍然与这学生相关联。

create trigger studentNumChange on student for update

as

if update(sNum) --判断是否是指定的字段的值发生了改变

begin

--同时更新借书记录表中的学号

update borrowRecord set sNum = i.sNum

--将借书记录表中的学号改为修改之后的学号

From borrowRecord as br,deleted as d, inserted as i

where br.sNum = d.sNum

--找到借书记录表与更新前的学号相同的记录

--更新操作会同时影响Deleted和inserted这两张表

end

其中:

在履行触发器的update操作的时候,Deleted和inserted那两张表会以创新的立时,先将立异从前记录放入Deleted表中,然后将履新后的笔录放入inserted表中。因而大家就能够通过读取那两张表的剧情,获得所更新记录的原值和新值,以及那张记录的id

练习:

用上例中的表,要是结业年龄22,判断年龄字段发生更新,其值更新为超越等于22的时候,就机关判断这几个学生已经完成学业了,由此删除这几个学生的学生表和借书表中的相关数据记录。

壹 、 怎样判断你更新的是年龄字段?

if update(age)

2、 如何明确刚刚被修改的是哪一条记录。

select age from deleted

select id, age from inserted

大家得以经过上述两条代码获得更新前后的岁数,和所更新记录的id。

create trigger studentAgeChange on student for update

as

if update(age) --判断是否是指定的字段的值发生了改变

begin

--需要变量:修改后的年龄、学号、id

declare @age int,@sNum int,@id int

set @age = (select age from inserted)

set @sNum = (select sNum from inserted)

set @id = (select id from inserted)

if @age>= 22

begin

delete from student where id=@id

delete from borrowRecord where sNum=@sNum

end

end

权且表与表变量

基本概念

表变量

表变量与我们在此之前在其余语言之中见到的二维数组,是有许多一般之外的,不过大家得以像操作数据表一样来操作它,只供给记住一点,那便是表变量是存在于内部存款和储蓄器中的,它的履行效用高,但是它像变量一样有效用域和生存周期。

临时表

用来长期存款和储蓄数据据的表,它使用的是系统的tempdb数据库。

宗旨规则

在能用表变量的时候,就尽量的应用表变量。实用分裂意的情形下,再使用权且表,因为近年来表对系统的支付相比大。

不过当一时数据量非常的大时,才提出利用一时表。

始建表变量

语法

declare @变量名 table(字段列表….)

示例:

declare @mytable table(

id int,

name nvarchar(50),

age int

)

insert @mytable select 1,'小强',17

insert @mytable select 2,'小明',13

union all select 3,'小红',18

union all select 4,'小丽',19

select * from @mytable

示例2:

declare @mytable table(

id int identity primary key,

name nvarchar(50),

age int

)

insert into @mytable values

('小强',17),

('小明',13),

('小红',18),

('小丽',1)

select * from @mytable

示例3,从数额表中读取数据存入表变量:

declare @ttt table(

id int, name nvarchar(50), age int

)

insert @ttt select id,name,age from student

select * from @ttt

创办暂时表

语法:

cteate table #临时表名(字段列表)

示例1:

create table #tt(

id int,

name nvarchar(50),

age int

)

insert #tt select 1,'小强',17

union all select 2,'小明',19

select * from #tt

示例2:

create table #tt2(

id int identity primary key,

name nvarchar(50),

age int

)

insert into #tt2 values('小强',17),

('小明',19),('小红',20)

select * from #tt2

练习:

创设三个表变量用于存放彩票号码,有两字段(id,num char(8))。

用于随机函数生成4七个彩票号码,存入这些表变量中。然后显示出富有的彩票号码。

用户自定义函数UDF

user define function

它那多少个相近于储存进程或许js中的function,平时而言它都以格外select语句来举行利用的,它的用法很像针对某些字段举办操作的聚合函数。

着力语法:

创建UDF

CREATE FUNCTION [模式] 函数名

([@参数名 [AS] 参数类型 [=默认值] [READONLY] [,………]])

RETURNS 返回值的类型

AS

BEGIN

[若干语句]

RETURN (返回单一值)

END

以身作则1,定义三个函数将bit类型值转化为男或女:

CREATE FUNCTION backSex(@sex bit)

returns varchar(10)

AS

BEGIN

RETURN(

select case @sex

when 1 then '男'

when 0 then '女'

end

)

END

select name,dbo.backSex(sex) from student

示例2:

ALTER FUNCTION backSex(@sex bit)

returns varchar(10)

AS

BEGIN

declare @sexChar varchar(10)

if @sex=1

set @sexChar = '男'

else

set @sexChar = '女'

RETURN @sexchar

END

select name,dbo.backSex(sex) from student

用途:

它的能够起到简化查询语句的效用,防止编写制定重复的口舌。

再正是要小心,它还足以重回表

练习:

① 、 在查询学生数量的时候,依照学生年龄,来显示学生表中的各种学生是或不是已成年。通过自定函数完成。

二 、 在询问学生数量的时候,依据学生的地址,来判断当中是不是含有“特古西加尔巴”七个字,包蕴呈现”本地球科学生”,不含有则显示“各地学生”。通过自定函数达成。

三 、 针对student表,用用户自定义函数,完毕每页为10条的分页。传入参数是页数pageIndex,传出参数是存放在了每页数据的结果集。

create function getPage(@pindex int,@psize int)

returns table

as

return(select top(@psize) * from student 

where id not in

(

select top(@psize*(@pindex-1)) id from student order by id

) order by id

)

select * from dbo.getPage(3,3)

sqlServer_游标

基本功概念

当数据库在查询的那刹那间,它实在是将数据记录有序的一行行取出来,那么游标在那一个历程中的功用,就是意味近来正值读取的是第几行。

在sql server中游标的生命周期,由个5片段组成。

① 、定义三个游标

能够领略成在数据集上的指针,我们得以控制那个指针来一条条的将数据集遍历出来,或许也足以独自用于获取一定的行,所以游标必须定义在select语句询问的数据集之上。

语法:

DECLARE 游标名称 cursor

[ LOCAL | GLOBAL ]

[ FORWARD_ONLY | SCROLL ]

[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]

[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]

[ TYPE_WARNING ]

FOR

select 查询语句

[ FORUPDATE [OF 字段名列表…] ]

概念游标的时候,大家要游标类型和游标变量,对于游标变量来说,正是依照t-sql的变量的平整来定义的。

游标变量

咱俩得以在概念时先对游标变量赋值,也许定义完现在再赋值。

--在定义时直接赋值

declare myCursou cursor for

select id,name from student



--先定义后赋值

declare @myCursou cursor

set @myCursou = cursor for select id,name from student

LOCAL和GLOBAL只可以二选一

用以定义游标的成效域,LOCAL是指游标能够在现阶段批处理、函数或存款和储蓄进程中使用,GLOBAL是指游标对于如今数码连接来说在大局有效。

示例:

declare myCursou1 cursor GLOBAL for

select id,name from student



declare myCursou2 cursor LOCAL for

select id,name from student

go

open myCursou1 --全局游标在批处理之外也可以访问

open myCursou2 --局部游标当批处理执行完之后就不存在了

FORWARD_ONLY和SCROLL二选一

FORWARD_ONLY只可以一行一行的前行,而不能够后退或跳过中间的行。

SCROLL定义的游标能够在数据集的其余方向的别的岗位移动。

示例:

declare Cursou_test cursor for --未定义移动方式

select id,name from student

declare Cursou_test2 cursor FORWARD_ONLY for --只进游标

select id,name from student

declare Cursou_test3 cursor SCROLL for --滚动游标

select id,name from student

open Cursou_test

open Cursou_test2

open Cursou_test3

FETCH NEXT FROM Cursou_test --只能一行行前进

FETCH NEXT FROM Cursou_test2 --只能一行行前进

FETCH ABSOLUTE 1 FROM Cursou_test3 --表中的绝对位置的正序第条

FETCH RELATIVE 2 FROM Cursou_test3 --相对于当前针对位置前进条

FETCH RELATIVE -2 FROM Cursou_test3 --相对于当前针对位置后退条

FETCH FIRST FROM Cursou_test3 --第一条

FETCH LAST FROM Cursou_test3 --最后一条

二 、打开游标

open 游标名称

游标需求开辟才能够采纳

③ 、使用游标

将游标获得的数目传入局地变量

我们得以INTO关键字,将游标中的select语句询问后的值存入局地变量。

游标每一次执行只回去一条数据。

示例:

declare @id int,@name nvarchar(50)

--临时变量

declare myCursor cursor LOCAL for

select id,name from student

--定义游标

open myCursor --打开游标

fetch next from myCursor into @id,@name

print @name

由此巡回(协作游标)来遍历数据表

declare CursorX cursor SCROLL for

select id,name from student

--定义游标

open CursorX

declare @id int,@name nvarchar(50)

FETCH NEXT FROM CursorX INTO @id,@name

while @@FETCH_STATUS=0 --游标执行后的状态

begin

print CAST(@id as nvarchar(10))+@name

FETCH NEXT FROM CursorX INTO @id,@name

end

close CursorX

deallocate CursorX

--其中,@@FETCH_STATUS代表上一条游标语句执行后的状态,它的返回值有三个:

 

返回值

说明

0

FETCH 语句执行成功

-1

FETCH 语句失败或行不在结果集中

-2

提取的行不存在

 

四 、关闭游标

close 游标名称

游标使用完后,须要关闭。

⑤ 、释放游标

DEALLOCATE 游标名称

对应用游标时品质上的局地提议

① 、 游标对质量的开支13分严重的。

贰 、 用完游标之后自然要关闭和自由。

③ 、 尽量不要在数据量较大的时候使用游标。

肆 、 尽量选用FAST_FO奥迪Q7WAWranglerD飞速只进形式来操作游标。

⑤ 、 使用游标平日会比直接select 查询慢2-3倍,假若数据量较大这么些比例还会追加。尽管能够用别的方法消除的问题尽量防止使用游标,它只是终极的一种选择。

练习

壹 、通过游标和巡回,查询学生表中的奇数行的数目。

贰 、通过游标和储存进程来促成对学生表的分页功用。

sqlServer_事务

例如你去银行转化,你从帐户A转5000元到帐户B,实际上那就要分两步来操作,第③步,帐户A上扣除六千元。第3步,在帐户B上存入5000元。假设第二步已成功,可是由于一些原因促成第壹步没有科学实施的话。就会招致很严重的损失。

于是,我们就供给一种机制,来保险率先条语句执行之后,第①条语句也会执行。但是实际上情形下,我们不也许百分之百确定保证那或多或少。由此退而求其次,用一种体制来保管,如果第③条语句没有科学实施的话,那么大家就撤消第壹条语句所执行的操作,那种机制就称为事务。

能够形象的将其知晓为操作软件时的历史记录。

基本概念

事务要求明显的发端和截至点,就比如内定在哪一步起先记录“历史记录”,然后在哪一步停止历史记录。

SQL server中的select、insert、update和delete语句都能够变成工作的一部份。

工作的标记点

BEGIN TRAN 设置工作的起初点。

COMMIT TRAN 提交业务,保存你所进行的操作,让其不可防止。

ROLLBACK TRAN 回滚事务,打消你早就进行的操作。

SAVE TRAN
保存标记符,保存点,正是将您的操作在此存档,允许将工作回滚到你日前保存的操作地点。

BEGIN TRAN

表示贰个事务单元起始,在此之后没有提交的享有语句都属于工作的一有的。

语法:

BEGIN TRAN [SACTION] [<事务名称>|<@事务参数>] [WITH MARE[<’描述’>]]

COMMIT TRAN

交付事条,也正是事情的终极,当执行了commit
tran之后,大家所推行的操作就兑现保存。

语法:

Commite tran[SACTION] [<事务名称>|<@事务参数>]

RollBack tran

回滚事务,在没有保存点的意况下,回滚到业务最初没有执行操作时的情景,在有保存点的场所下,能够回滚到保存点。

语法:

ROLLBACK TRAN [SACION ] [<事务名称>|<保存点名称>| <@事务参数>|<@保存点参数> ]

SAVA TRAN

成立保存点,以便大家在业务回滚的时候引用它。

语法:

SAVA TRAN[SACTION] [<保存点名称>] [<@保存点参数>]

留意:当大家回滚事务的时候,保存点会活动被铲除,尽管用户保存了多少个保存点,执行ROLLBACK时也会被整个清空。

假诺此时还亟需保存点的话,只可以重复成立SAVE TRAN了。

政工的实操

当大家打开事务之后,大家操作的实际都以缓存中的数据。唯有当提交业务的时候,操作才会写入日志。

示例1:

BEGIN TRAN --开始事务

DECLARE @errorSum int --定义错误计数器

SET @errorSum=0

update student set age = 11 where id=1

--在事务中操作SQL语句

SET @errorSum=@errorSum+@@ERROR

--@@ERROR是上一次t-sql发生的错误的编号

--此处用来判断是否有出错,没错时@@ERROR的值为零

--有错时就将错误编号进行累加

exec jfdsa --执行一个不存在的存储过程来人为制造错误

SET @errorSum=@errorSum+@@ERROR

if @errorSum<>0

begin

print '有错误,事务开始回滚'

ROLLBACK TRAN --事务回滚

end

else

begin

print '成功,事务已提交'

COMMIT TRAN --事条提交

end

示例2,使用保存点

BEGIN TRAN mytran

insert into student values('小小白',15,0,'中国','12234678')

SAVE TRAN mysave

delete student where id=1

ROLLBACK TRAN mysave

COMMIT TRAN

练习

① 、模拟提款机,达成三个银行转化的例证,创制帐户表account表(id、accName、accNum、money),达成从三个帐户转陆仟块到别的三个帐户,要是现身谬误,则事务回滚,没有不当则形成转帐。

 

相关文章