SQL Server

6

SQLServer基本操作

打开数据库

数据库的基本操作

1.建库

2.建表

3.数据维护

数据库的迁移

1. 数据库的分离,附加

2.数据库的备份

3.数据库脚本的保存

脚本建库建表

1.创建数据库

//创建数据库
create database 你的数据库名字
on //设定数据文件
(
    name = '你的逻辑文件名字'
    filename = 'D:....\nD:....\你的文件名字.mdf'//物理路径
    size = 5MB,//文件初始大小
    filerowth = 2MB//文件增长方式可以写大小,也可以写百分比
)

log on 
(
    name = '你的逻辑文件名字_log'
    filename = 'D:....\nD:....\你的文件名字_log.ldf'//物理路径
    size = 5MB,//文件初始大小
    filerowth = 2MB//文件增长方式可以写大小,也可以写百分比
)



//创建数据库(简写)
create database 你的数据库名字
//on   log on  里里面的东西有默认值 

2.删除数据库

if exists(select * from sys.database where name = '你的数据库名字' )
    drop database 你的数据库名字

3.创建表

//切换数据库
use 你想要的数据库名字
//创建表的基本语法
create table 表名
(
    字段名1 数据类型
    ......
)
//实例建表
if exists (select *from sys.objects where name = '你的表名' and type = 'U')
    drop table 你的表名
create table DepartmentID
(
    //部门编号,primary key(用来标识主键),identity(1,1):自动增长,初始值1,加1
    id int primary key identity(1,1),
    name nvarchar(50) not null,
    ......
)

create table people
(
    People int primary key identity(1,1),
   DepartmentID int references Department(DepartmentID) not null,//references与上面的表产生联系(引用外键)
    PeopleSex nvarchar(1) default('男')check(PeopleSex = '男' or PeopleSex = '女') not null ,//default不填的时候有默认值,check产生选择
    PeopleBirth smalldatatime not null,//smalldatetime 可填近段时间内的时间太久远的时间填补不上去
    Peoplenum varchar(20) unique not null,
    PeopleAddTime smalldatetime default (getdate())
)//添加自动生成当前时间

数据类型

修改表结构

数据的增删改查

插入数据

修改数据

删除数据

查询数据

基本查询

条件查询

常见的运算符

模糊查询

聚合函数

分组查询

多表查询

简单的多表查询

内连接查询

外连接查询

左外连

右外连

全外连

例子

自连接

三范性

表关系

T-SQL语法

运算符

(Convert)——类型转换

流程控制

子查询

分页

事务

索引

视图

游标

一、什么是“游标(Cursor)”?

游标是SQL 的一种数据访问机制 ,游标是一种处理数据的方法。众所周知,使用SQL的select查询操作返回的结果是一个包含一行或者是多行的数据集,如果我们要对查询的结果再进行查询,比如(查看结果的第一行、下一行、最后一行、前十行等等操作)简单的通过select语句是无法完成的,因为这时候索要查询的结果不是数据表,而是已经查询出来的结果集。游标就是针对这种情况而出现的。

我们可以将“ 游标 ”简单的看成是结果集的一个指针,可以根据需要在结果集上面来回滚动,浏览我需要的数据。

二、游标的操作——五步走

声明游标—>打开游标—>读取数据—>关闭游标—>删除游标

1、声明游标——Declare cursorname Cursor

语法如下:

declare cursor_name Corsor [ LOCAL | GLOBAL] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ]

for

Slect查询的相关语句

上面的彩色字体表示的是,声明游标时的选项,不是必须提供的,每一个都代表游标的相关选项和特性

(1)LOCAL:对于在其中创建批处理、存储过程或触发器来说,该游标的作用域是局部的。GLOBAL:指定该游标的作用域是全局的

(2)FORWARD_ONLY:指定游标只能从第一行滚动到最后一行。否则默认为FORWARD_ONLY。SCROLL表示游标可以来回滚动

(3)STATIC:定义一个游标,以创建将又该游标使用的数据临时复本,对游标的所有请求都从tempdb中的这以临时表中不得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。

KEYSET:指定当游标打开时,游标重的行的成员身份和顺序已经固定。对行进行唯一标识的键值内置在tempdb内一个称为keyset的表中。

DYNAMIC:定义一个游标,以反映在滚动游标时对结果集内的各行所做的所有数据更改。行的数据值、顺序和成员身份在每次提取时都会更改,动态游标不支持ABSOLUTE提取选项。

FAST_FORWARD:指定启动了性能优化的FORWARD_ONLY、READ_ONLY游标。如果指定了SCROLL或FOR_UPDATE,则不能指定FAST_FORWARD。

SCROLL_LOCKS:指定通过游标进行的定位更新或删除一定会成功。将行读入游标时SQL Server将锁定这些行,以确保随后可对它们进行修改,如果还指定了FAST_FORWARD或STATIC,则不能指定SCROLL_LOCKS。

OPTIMISTIC:指定如果行自读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时,SQL Server不锁定行,它改用timestamp列值比较结果来确定行读入游标后是否发生了修改,如果表不包含timestamp列,它改用校验和值进行确定,如果以修改该行,则尝试进行的定位更新或删除将失败,如果还指定了FAST_FORWARD,则不能指定OPTIMISTIC。

TYPE_WARNING:指定游标从所请求的类型隐式转换为另一种类型时,向客户端发送警告消息。

2、打开游标——Open Cursorname

3、取出数据——Fetch.........From

Fetch [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar }] FROM Cursorname

[ INTO @variable_name [ ,...n ] ]

NEXT:紧跟当前行返回结果行,并且当前行递增为返回行,如果FETCH NEXT为对游标的第一次提取操作,则返回结果集中的第一行。NEXT为默认的游标提取选项。

PRIOR:返回紧邻当前行前面的结果行,并且当前行递减为返回行,如果FETCH PRIOR为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。

FIRST:返回游标中的第一行并将其作为当前行。

LAST:返回游标中的最后一行并将其作为当前行。

ABSOLUTE { n | @nvar }:如果n或@nvar为正,则返回从游标头开始向后n行的第n行,并将返回行变成新的当前行。如果n或@nvar为负,则返回从游标末尾开始向前的n行的第n行,并将返回行变成新的当前行。如果n或@nvar为0,则不返回行。n必须是整数常量,并且@nvar的数据类型必须为int、tinyint或smallint.

RELATIVE { n | @nvar }:如果n或@nvar为正,则返回从当前行开始向后的第n行。如果n或@nvar为负,则返回从当前行开始向前的第n行。如果n或@nvar为0,则返回当前行,对游标第一次提取时,如果在将n或@nvar设置为负数或0的情况下指定FETCH RELATIVE,则不返回行,n必须是整数常量,@nvar的数据类型必须是int、tinyint或smallint.

GLOBAL:指定cursor_name是全局游标。

cursor_name:已声明的游标的名称。如果全局游标和局部游标都使用cursor_name作为其名称,那么如果指定了GLOBAL,则cursor_name指的是全局游标,否则cursor_name指的是局部游标。

@cursor_variable_name:游标变量名,引用要从中进行提取操作的打开的游标。

INTO @variable_name [ ,...n ]:允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果集列的数据类型相匹配,或是结果集列数据类型所支持的隐士转换。变量的数目必须与游标选择列表中的列数一致。

4、关闭游标——Close Cursorname

5、删除游标——Deallocate Cursorname

触发器

什么是触发器

MySQL触发器(Trigger)是一种特殊的存储过程,

它与表有关,当表上的特定事件(insert,update,delete)发生时,触发器会自动执行。

可以使用触发器来实现数据约束,数据验证,数据复制等功能

为什么使用触发器

可以实现数据约束,数据验证,数据复制等功能

例如:

可以创建一个触发器,在向表中插入一条记录时,自动向另一个表中插入一个记录,从而实现数据复制的功能。

触发器还可以用于实现数据验证,

例如

在插入或更新数据时,检查记录的某些字段是否符合要求,则拒绝插入或者更新,这样可以保证数据的完整性和一致性。

创建触发器

语法:

create trigger 触发器名称

{before | after } {insert | update | delete} -- 触发器类型和事件

on 表名称

for each row -- 触发器的作用范围

begin

-- 触发器执行的操作

end;

1

2

3

4

5

6

7

触发器名称可以自定义 ,并唯一性,见名知意

before / after : 表示触发器的类型,分别表示发生前/发生后执行

insert / update / delete : 表示触发器的事件类型,分别表示插入 / 更新 / 删除操作

on 表名称 : 为触发器所在的表名

for each row : 表示触发器作用的范围,即每一行记录都会触发该触发器

begin 和 end之间是触发器执行的操作,可以是一条或者多条SQL语句

触发器是自动执行的,无需手动调用,

当表上的特定事件(insert , update, delete ) 发生时,触发器会自动执行

在创建触发器时,可以定义触发器的类型和事件,从而控制触发器的时机和条件

案例:

-- 创建两张表

create table table1(

id int,

name varchar(20) character set utf8

)charset = utf8;

create table table2(

id int,

name varchar(20) character set utf8

)charset = utf8;

1

2

3

4

5

6

7

8

9

10

添加事件

-- 创建一个触发器,当向表中插入一条记录时,自动向另一个表中插入一条记录

create trigger insert_trigger_1

after insert on table1

for each row

begin

-- 触发器的具体事件

insert into table2(id,name) values (NEW.id,New.name);

end;

1

2

3

4

5

6

7

8

添加数据:

向table1表中添加数据时,会触发insert_trigger_1触发器,自动向table2表中添加数据

insert into table1(id,name) values (1,'张三'),(2,'李四'),(3,'王五'),(4,'赵六'),(5,'唐七'),(6,'老王');

1

查询table1表

select * from table1;

1

查询table2表

select * from table2;

1

删除事件

-- 创建一个触发器,当从表中删除一条记录时,自动从另一个表中删除一条记录

create trigger delete_trigger_1

after delete on table1

for each row

begin

delete from table2 where id = OLD.id and name = OLD.name;

end;

1

2

3

4

5

6

7

删除数据:

删除table1表中数据时,会触发delete_trigger_1触发器,自动删除table2表中对应的数据

delete from table1 where id = 5 and name = '王五';

1

查看两张表中的数据

select * from table1;

1

select * from table2;

1

修改事件

-- 创建一个触发器,当向表中更新一条记录时,自动更新另一个表中的记录

create trigger update_trigger_1

after update on table1

for each row

begin

update table2 set id = NEW.id, name = NEW.name where id = OLD.id and name = OLD.name;

end;

1

2

3

4

5

6

7

修改数据:

修改table1表中数据时,会触发update_trigger_1触发器,自动更新table2表中对应的数据

update table1 set id = 10,name = '小明' where id = 6 and name = '老王';

1

select * from table1;

1

select * from table2;

1

删除触发器

drop trigger 触发器名称;

1

触发器的应用场景

触发器的应用场景包括但不限于以下几种:

强制实施业务规则:通过在触发器中编写逻辑,可以在特定的表上自动执行业务规则,例如检查输入的数据是否符合要求,或者限制某些操作的执行。

记录日志变更:通过在触发器中编写逻辑,可以在特定的表上自动记录数据的变更情况,例如记录数据的修改时间、修改人等信息。

复杂的默认值计算:通过在触发器中编写逻辑,可以在特定的表上自动计算默认值,例如根据其他字段的值计算出一个新的字段的值。

数据同步:通过在触发器中编写逻辑,可以在多个表之间自动同步数据,例如在一个表中插入一条数据时,自动在另一个表中插入相应的数据。

数据校验:通过在触发器中编写逻辑,可以在特定的表上自动校验数据的正确性,例如检查数据的唯一性、完整性等。

总结:

触发器的应用场景非常广泛,可以用于强制实施业务规则、记录日志变更、复杂的默认值计算、数据同步以及数据校验等。在创建触发器时,需要指定触发器的名称、触发器所在的表、触发器的触发时机(如insert、update或delete操作)、触发器的执行次数(for each row或for each row statement)以及触发器的逻辑。


SQL Server
http://localhost:8090//archives/sql-server
作者
丘瑚珊
发布于
2025年03月03日
许可协议