mg4377娱乐娱城官网_mg4377娱乐手机版_www.mg4377.com

当前位置: mg4377娱乐娱城官网 > mg > 正文

mg:二零零六从入门到了解

时间:2019-09-29 09:33来源:mg
目录 目录 约束 目录 1.用到Transact-SQL语言编制程序 1.1.数目定义语言DDL 1.2.数额垄断语言DML 1.3.数据调控语言DCL 1.4.Transact-SQL言语功底 2.运算符 2.1.算数运算符 2.2.赋值运算符 2.3.位运算符

目录

目录

约束

目录

  • 1.用到Transact-SQL语言编制程序
    • 1.1.数目定义语言DDL
    • 1.2.数额垄断语言DML
    • 1.3.数据调控语言DCL
    • 1.4.Transact-SQL言语功底
  • 2.运算符
    • 2.1.算数运算符
    • 2.2.赋值运算符
    • 2.3.位运算符
    • 2.4.相比运算符
    • 2.5.逻辑运算符
    • 2.6.连接运算符
    • 2.7.一元运算符
    • 2.8.运算符的开始的一段时期级
  • 3.操纵语句
    • 3.1.BEGIN END语句块
    • 3.2.IF ELSE语句块
    • 3.3.CASE分支语句
    • 3.4.WHILE语句
    • 3.5.WAITFOXC90延迟语句
    • 3.6.RETUTucsonN无条件退出语句
    • 3.7.GOTO跳转语句
    • 3.8.TXC90Y CATCH错误管理语句
  • 4.常用函数
    • 4.1.数据类型调换函数
  • 1.触发器
    • 1.1.DDL触发器
    • 1.2.DML触发器
    • 1.3.创设触发器
      • 1.3.1.创建DML触发器
      • 1.3.2.创建DDL触发器
      • 1.3.3.嵌套触发器
      • 1.3.4.递归触发器
    • 1.4.管制触发器
主关键字约束(Primary Key Constraint)

用来钦定表中的一列或几列组合的值在表中具备独一性。创设主键的目的是让外键来征引。

  • 1.架构
    • 1.1.创建架构并在架设中创制表
    • 1.2.删减架构
    • 1.3.修改表的框架结构
  • 2.视图
    • 2.1.新建视图
    • 2.2.利用视图修改数据
    • 2.3.刨除视图
  • 3.索引
    • 3.1.集中索引
    • 3.2.非聚焦索引
    • 3.3.创设索引
    • 3.4.修改索引
    • 3.5.查看索引
    • 3.6.查看索引碎片
    • 3.7.查看总计音信

1.选取Transact-SQL语言编制程序

尽管SQL Server 二零零六提供了图形化界面,但独有一种Transact-SQL语言可以间接与数据库引擎进行交互。依照执行效用特色能够将Transact-SQL语言分成3大类:数据定义语言DDL,数据操纵语言DML,数据调节语言DCL。

1.触发器

触发器是一种新鲜的蕴藏进度,与表紧凑关系。

Primary Key的创办格局

在创建表时创办Primary Key

CREATE TABLE table1(
    t_id VARCHAR(12) ,
    t_name VARCHAR(20),
    t_phone VARCHAR(20),
    CONSTRAINT t_idss PRIMARY KEY(t_id)
);

对t_id列创制主键,约束名称叫t_idss。

1.架构

架构是一种独立于客商的逻辑分组,组中能够存款和储蓄表,视图,存款和储蓄进度等。如若表1在架设第11中学,表2在框架结构第22中学,用框架结构1的客商名登入时表2不可知。且未增多该架构的数据库无法被该架构的客商访谈。

1.1.多少定义语言DDL

是最基础的Transact-SQL语言类型,用来创设数据库和创设,修改,删除数据库中的各类对象,为别的语言的操作提供对象。比如数据库,表,触发器,存款和储蓄进度,视图,函数,索引,类型及客商等都是数据库中的对象。常见的DDL语句富含

CREATE TABLE--创建表
DROP TABLE--删除表
ALTER TABLE--修改表

1.1.DDL触发器

当服务器或数据库中爆发多少定义语言(DDL)事件时将被调用。如CREATE,ALTERDROP等操作。如若要试行以下操作,能够应用DDL触发器:

  • 防范对数据库架构实行改造
  • 瞩望数据库中发出一些情状以响应数据库架构中的改动
  • 要记录数据库架构中的改换或事件
删除Primary Key
ALTER TABLE table1
DROP CONSTRAINT t_idss;

自律名与列名差别,此处填写约束名

1.1.创制架构并在架设中成立表

施行如下语句

CREATE LOGIN hy WITH PASSWORD = '123456'
GO
--新建登录名
CREATE DATABASE schematest
GO
--新建数据库
USE schematest
GO
CREATE USER u_for_test FOR LOGIN hy
GO
CREATE SCHEMA dbo_Schema
go
--在schematest数据库下添加dbo_Schema
CREATE TABLE T1(id INT,NAME VARCHAR(20))
go

CREATE TABLE dbo_Schema.T2(Nid int,DD datetime)
go

GRANT SELECT ON SCHEMA :: dbo_Schema TO u_for_test;
--给u_for_test赋予SELECT权限
--重新使用hy登录即可。

用hy登陆,张开未加多dbo_Schema架构的数据库,出现如下提醒
mg 1
打开schematest数据库,展开表,dbo_Schema下的T2表可见,非dbo_Schema架构下的T1表不可知。
mg 2

1.2.数码垄断(monopoly)语言DML

是用来操纵表和视图中的数据的讲话,比方查询数据(SELECT),插入数据(INSERT),更新数据(UPDATEmg:二零零六从入门到了解。)和删除数据(DELETE)等。

1.2.DML触发器

当数据库服务器中发出多少操作语言(DML)事件时将被调用。如INSERT,DELETE,UPDATE等操作。将DML触发器和触发语句作为可在触发器内回滚的单个事务对待,假诺检查测验到不当,则整个业务回滚。DML触发器在眨眼之间间下边格外管用:

  • 可实现数据库相关表之间的级联改换
  • 可避防备恶意或错误的DML说话事件,并强制实践比CHECK封锁越来越复杂的其余限制
  • 能够评估数据修改前后表的事态,并依靠该差别选取措施

三个表中的五个同类DML触发器,允许用四个差别的操作来响应同三个修改语句
SQL Server 2008为各种触发器创立了2个极度的表:INSERTED表和DELETED表。那是五个逻辑表,由系统来成立和维护,客商不能够对她们开展修改。它们存放在内部存款和储蓄器中,实际不是在数据库中,並且协会与被DML触发器成效的表的协会同样。
INSERTED表中寄存了由进行INSERTUPDATE语句而插入的全体行,在实践INSERTUPDATE说话时,新的就要同有时间被插入到触发器成效的表和INSERTED表中。INSERTED表中的行是触发器成效的表中央银行的别本。
DELETED表中寄存了由实施DELETEUPDATE语句而除去的保有行,在实行DELETEUPDATE讲话时,被删除的即将由触发器功效的表中被活动到DELETED表,三个表中不会有重复行。

向已有表中增加Primary Key
ALTER TABLE table1
ADD CONSTRAINT t_idss
PRIMARY KEY(t_id);

1.2.删减架构

除去架构前必得删除或然移动该架构的具备指标,不然删除操作将会倒闭。如实行下列语句

DROP SCHEMA dbo_Schema
GO

结果如图所示
mg 3
此时要将T2表删除或许移动到另外架构技术打响删除dbo_Schema

1.3.数据调节语言DCL

关系到权力管理的语言称为数据调节语言,首要用于实践有关安全管理的操作。如授予权限(GRANT),收回权限(REVOKE),拒绝授予主体权限,并幸免主体通过组或剧中人物成员持续权限(DENY

1.3.创办触发器

累加Primary Key的另一种示例
ALTER TABLE Products
ADD PRIMARY KEY(prod_id);

虽说上述代码运营没问题,查看表格设计也能够看出Primary Key设置成功,可是在剔除Primary Key操作时会提醒:
消息3728,级别16,状态1,第1 行
'prod_id' 不是束缚。
消息3727,级别16,状态0,第1 行
没办法删除约束。请参阅后边的错误音信。
原因是增加Primary Key语句中尚无用CONSTRAINT指明约束名,系统自动生成了主键名和平左券束名,要先查看主键名和平左券束名,删除时填写的也是束缚名。
这种景况的不利删除方法

ALTER TABLE Products
DROP CONSTRAINT CK__Products__prod_p__1A14E395;
ALTER TABLE Products
DROP CONSTRAINT PK__Products__56958AB222AA2996;

1.3.修改表的架构

如图所示,右键表名——设计——侧面属性栏中期维修改表的架构
mg 4
如图所示,当把T2表所引用的框架结构修改为dbo后,可三番两次删除架构dbo_Schema操作。就能够学有所成删除dbo.Schema
mg 5

1.4.Transact-SQL言语功底

1.3.1.创建DML触发器

多列组合增多主键约束
CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT ts_id PRIMARY KEY(t_id,s_id)
);

2.视图

视图是数据库中原始数据的一种转移,是查看表数据的一种形式,视图是一种逻辑对象,是杜撰的表,是一串SELECT语句,并非真实的表。

1.4.1.常量与变量

常量十分少说。在SQL Server 二〇〇九中,存在二种变量。一种是系统定义和保证的全局变量,一种是顾客定义用来保存中间结果的有的变量。

1.3.1.1.INSERT触发器

示例1:创制三个触发器Automatic_division,当在Student表中插入一条学生新闻时,触发器依照入学分数(stu_enter_score)对学员张开活动分班,并在class_student表中插入一条记下。
分班需要:
|Stu_enter_score |Class_id |Class_name|
|-------------------|------------------|--------------|
|stu_enter_score>=700| 01| 创新A班|
|650<=Stu_enter_score<700| 02| 重点B班|
|600<=Stu_enter_score<650| 03| 提高C班|
|550<=Stu_enter_score<600| 04| 普通D班|
|500<=Stu_enter_score<550| 05| 普通E班|
|Stu_enter_score<500| 06| 普通F班|
实行下列语句

CREATE TRIGGER automatic_division
ON student--新建一个检测student表的触发器,命名automatic_division
FOR INSERT--检测到INSERT操作时触发器工作
AS
DECLARE @score INT,@stu_no VARCHAR(8),@class_id CHAR(2)
--声明三个变量
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY--声明一个指向inserted表的局部游标stu_cursor
FOR SELECT stu_no,stu_enter_score FROM inserted
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标指向inserted表的第一个数据并把游标指向的stu_no和stu_enter_score值分别赋值给@stu_no和@score
WHILE @@FETCH_STATUS=0--开始循环
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
--判断结束
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor--关闭游标
DEALLOCATE stu_cursor--释放游标资源
GO

证宋朝码是还是不是科学
student表中插入数据,并查阅class_student表中的数据是还是不是精确

INSERT INTO student(stu_no,stu_name,stu_sex,stu_enter_score)
VALUES('20180001','邹莉莉','女','389'),
('20180002','万兴','男','701'),
('20180003','孙伟','男','652'),
('20180004','温佳静','女','676'),
('20180005','姜立夫','男','542')

Class_student表中的数据如图所示
mg 6
游标示例2:对student表中还未分班的学习者开展分班
Student表中的数据如图所示
mg 7
其中stu_no20180001~20180005的学习者一度在示例1中分班,剩下的学员全都未分班。
试行下列语句

ALTER TABLE student
ADD stu_division_state bit--为student表新建一列记录是否已分班,true表示已分班
GO
DECLARE stu_class_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no FROM class_student
--新建游标stu_class_cursor指向class_student表的所有数据
OPEN stu_class_cursor--打开游标
DECLARE @stu_no VARCHAR(8)
FETCH NEXT FROM stu_class_cursor INTO @stu_no
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE student
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_class_cursor INTO @stu_no
END
CLOSE stu_class_cursor--关闭游标
DEALLOCATE stu_class_cursor--释放游标资源
---所有学生是否分班已经全部记录在stu_division_state中
GO
DECLARE @stu_no VARCHAR(8),@score INT,@class_id CHAR(2)
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no,stu_enter_score FROM student WHERE stu_division_state IS NULL
--新建student表的游标stu_cursor,指向所有未分班学生
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score
WHILE @@FETCH_STATUS=0--循环开始
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
UPDATE student--将student表的stu_division_state改成已分班
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor
DEALLOCATE stu_cursor
GO

结果如图所示
Student表的数目
mg 8
Class_student表的数额
mg 9
至此Student表中存有学生皆已分班
为了以往福利,能够将游标示例2中的代码稍作修改封装成三个客商自定义存款和储蓄进度
仓库储存进程示例3
修改后的代码如下

CREATE PROCEDURE student_division
AS
BEGIN
UPDATE student
SET stu_division_state=0--先将student表中所有学生的分班情况都标成未分班

DECLARE stu_class_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no FROM class_student
--新建游标stu_class_cursor指向class_student表的所有数据
OPEN stu_class_cursor--打开游标
DECLARE @stu_no VARCHAR(8)
FETCH NEXT FROM stu_class_cursor INTO @stu_no
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE student
SET stu_division_state=1
WHERE stu_no=@stu_no--利用游标找出student表中已分班的学生并标记分班状态
FETCH NEXT FROM stu_class_cursor INTO @stu_no
END
CLOSE stu_class_cursor--关闭游标
DEALLOCATE stu_class_cursor--释放游标资源
---所有学生是否分班已经全部记录在stu_division_state中

DECLARE @score INT,@class_id CHAR(2)
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no,stu_enter_score FROM student WHERE stu_division_state=0
--新建student表的游标stu_cursor,指向所有未分班学生
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score
WHILE @@FETCH_STATUS=0--循环开始
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
UPDATE student--将student表的stu_division_state改成已分班
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor
DEALLOCATE stu_cursor
END
GO

注:和游标示例2的代码比较,示例3的代码增添了将有着学面生班状态标志为0的经过,去掉了丰富stu_division_state列的进程,但对原先已某个学员的分班状态赋值这一个手续未有删去,而是实行再一次校验。并且删除了两段代码中的GO和第二段用于给学面生班的代码中对@stu_no变量的重复评释。

student表插入数据并运营student_division的积攒进程

注:对student表插入数据前应先禁用示例1的触发器automatic_division

施行下列语句

ALTER TABLE student DISABLE TRIGGER automatic_division
--禁用automatic_division触发器
INSERT INTO student(stu_no,stu_name,stu_sex,stu_enter_score,stu_division_state)
VALUES('20180006','王洋','男','724',NULL),
('20180007','易阳','男','713',NULL),
('20180008','孙浩','男','584',NULL),
('20180009','张秋燕','女','420','False'),
('20180010','胡燕','女','527','True')

Student表的数码如图所示,红框内正是自家刚刚插入还未分班的数额,个中2018000920180010那多少个学生的分班状态被笔者误标成FalseTrue
mg 10
实施存款和储蓄进度

EXEC dbo.student_division

结果如图所示
Student表的多少(分班状态都为true了)
mg 11
Class_student表的数据
mg 12

外关键字约束(Foreign Key Constraint)

概念了表之间的关联,用来保卫安全三个表之间的一致性的关系。
在成立表时成立Foreign Key Constraint

CREATE TABLE table2(
    s_id VARCHAR(20),
    s_name VARCHAR(12),
    s_tellphone VARCHAR(11),
    s_address VARCHAR(20),
    CONSTRAINT PK_s_id PRIMARY KEY(s_id),
);--首先新建table2,设置s_id为主键

CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT pk_ts_id PRIMARY KEY(t_id,s_id),--新建table1,对t_id和s_id设置联合主键,键名pk_ts_id
    CONSTRAINT fk_s_id FOREIGN KEY(s_id)--对s_id设置外键fk_s_id
    REFERENCES table2(s_id)--外键fk_s_id外键关联table2的列s_id
    ON DELETE CASCADE--设置在table1的s_id删除时table2的s_id同时删除
    ON UPDATE CASCADE--设置在table1的s_id更新时table2的s_id同时更新
);

注:对table1设置外键关联table2,在插入数据时须要先插入table2的多寡,技艺不负职务插入table1的多寡。改造table2.s_id数据,table1.s_id数据也会活动更改。但是改动table1.s_id数据,试行时报外键争论。不问可见对table1设置外键关联table2后,table1的数据跟着table2走,不能反着来。

增多和删除了这么些之外键约束同主键。

2.1.新建视图

示例1:利用student表和class_student表的数据新建视图class_01,记录01班学生详细音讯
Student表的数额如图所示
mg 13
Class_student表的多寡如图所示
mg 14
实行下列语句新建视图class_01

CREATE VIEW class_01
AS
SELECT class_student.stu_no,class_id,stu_name,stu_sex,stu_age,stu_addr,stu_native_place,stu_birthday,stu_enter_score,stu_phone,stu_father_name,stu_mather_name
FROM class_student INNER JOIN student
ON class_student.stu_no=student.stu_no
WHERE class_id='01'

视图class_01的数码如图所示
mg 15

注:视图只是三个SELECT语句,数据依靠基表的多寡变动而自动改动。

编辑:mg 本文来源:mg:二零零六从入门到了解

关键词: