SQL数据库

来源:互联网 发布:网络电视怎么看回放 编辑:程序博客网 时间:2024/04/27 23:13


数据结构和数据库的区别:
数据结构:是研究数据在内存中的存储方式
数据库:  是研究数据在硬盘中的存储方式
数据库和编程语言的关系:
编程语言是对内存操作的强项,对硬数据盘操作却是弱项。
数据库是对硬盘数据操作的强项,是数据库研究的核心问题


maste  系统的所有的系统信息
tempdb 临时表和其他临时存储需求提供存储空间
model  建立所有用户数据库时的模板
msdb   代理承销调度报警和作业
类似ACCESS的自动序号功能,标识规范--是标识--是
收缩数据库容量:
任务--收缩---数据库/文件   --可以使数据库文件减小

数据库管理系统(DBMS)
SQL语句: 一条语句必须以分号(;)分隔
SQL语句是不区分大小写的
SQL语句中的所有空白被忽略(不是空格)
'' 单引号用来限定字符串,如果将值与串数据类型的列进行比较,则需要限定引号。用来与数值列进行比较的值不用引号
* --是通配符,还是列出所有列
SELECT 列 from 表
SELECT *from 表
WHERE字句操作符
=    等于
<>   不等于
!=   不等于
<    小于
<=   小于等于
!<   不小于
<    小于
<=   小于等于
!<   不小于
>    大于
>=   大于等于
!>   不大于
AS  别名
BETWEEN  在指定的两个值之间
IS NULL  不为空
IN
IN操作用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔
SELECT *FROM Table_1 WHERE id IN(1,3,4,5)
NOT
NOT操作符是否定它之后所跟的任何条件
SELECT *FROM Table_1 WHERE id NOT IN(1,3)


select @@VERSION 返回当前sql server的版本,处理器体系结构,生成日期和操作系统
select @@SERVERNAME 返回当前服务器的名称

//变量使用
DECLARE @变量名称 变量类型  --T-SQL中的变量不可以声明为text ntext image数据类型
DECLARE @a int   --定义一个int类型的变量
set @a=123  --给变量赋值值
select @a  --输出变量的内容


//位运算符
&(位与)      按位与运算。从两个表达式中取对应的二进制位,当且仅当两个表达式中的对应位的值都为1时,结果中的位才为1,否则为0
|(位或)   按位或运算。从两个表达式中取对应的二进制位,如果两个表达式中的对应位有一个位的值为1,结果的位就被设置为1,两个位的值都为0时,结果为0
^(位异或)  按位异或运算。从两个表达式中取对应的二进制位,如果有一个位为1,结果为1.而当两个为的值相同时,结果中的位被设置为0
 
//逻辑运算符
ALL   如果一组比较都返回TRUE,则比较结果为TRUE
AND   如果两个布尔表达式都返回TRUE,则结果为TRUE
ANY   如果一组比较中的任何一个返回TRUE,则结果为TRUE
BETWEEN   如果操作数在某个范围之内,则结果为TRUE
EXISTS   如果子查询中包含了一些行,则结果为TRUE
IN   如果操作数等于表达式列表中的一个,则结果为TRUE
LINK   如果操作数与某种模式相匹配,则结果为TRUE
NOT   对任何其他布尔运算的结果值取反
OR   如果两个布尔表达式中的任何一个为TRUE,则结果为TRUE
SOME   如果在一组比较中,有些比较为TRUE,则结果为TRUE

新建数据库:
数据库--新建数据库

删除数据库
选择数据库--删除

分离数据库(从sql2008中分离出去)
选择数据库---任务---分离

附加数据库(选择一个数据库附加到sql2008中)
选择数据库--附加

账户权限
安全性--登陆名

主键:
事物的唯一编号

外键:
事物与外界的联系,一个表中的数据来自另外一个表。

字段:
模拟事物的某一个特征

记录:
字段的组合,表示的是具体的事物

表:
记录的组合,表示的是同一类型事物的集合
他们三者的关系:
字段是事物的属性
记录是事物的本身
表是事物的集合
列:
字段的另一种称谓
属性:
字段的另一种称谓
元组:
记录的另一种称谓


约束:
对一个表中的属性进行操作的限制叫做约束
  分类:
  主键约束:
    不允许重复元素 避免了数据的沉余
  外键的约束:
    通过外键约束从语法上保证了本事物所关联的其他事物一定是存在的
    事物和事物之间的关系是通过外键来体现的
  check约束:
    保证事物属性的取值在合法的范围之内
  default约束:
    保证事物的属性一定会有一个默认的值
  唯一约束:
    保证了事物属性的取值不允许重复,允许其中一列为空,oracle允许多个为空


表和约束的区别:
 数据库是通过表来解决事物的存储问题的
 数据库是通过约束解决事物取值有效范性和合法性
 建表的过程就是指定事物属性及其事物属性各种约束的过程


主键:
   定义:能够唯一标示一个事物的一个字段或者多个字段的组合,被称为主键
   附注:含有主键的表叫做主键表
         主键通常都是整数 不建议使用字符串当主键
         主键的值通常都不允许修改,除非本记录被删除
外键:
   定义:如果一个表中的若干个字段是来自另外若干个表的主键或唯一键,则这若干个字段都是外键
   注意:外键通常是来自另外表的主键而不是唯一键,因为唯一键可能为NULL
         外键不一定是来自另外的表,也可能来自本表的主键
         含有外键的表叫外建表,外键字段来自得那一张表叫做主键表

 

--自定义函数--1.标量值函数CREATE FUNCTION mysum(@a int,@b int)RETURNS int--函数返回类型ASBEGINRETURN @a+@b--函数体,函数返回ENDselect dbo.mysum(5,6) AS '两数相加和'--调用函数--2.表值函数CREATE FUNCTION GetUsers()RETURNS table--函数返回类型ASRETURN select *from UserInfo--函数体,函数返回select *from GetUsers()--调用函数


 

--数据类型转换CONVERTDECLARE @a varchar(50)DECLARE @b intset @a='143'set @b=3set @a=CONVERT(int,@a)+@bPRINT @a


--CASE语句用法DECLARE @n intset @n=3select case @nWHEN 1 THEN '变量值为1'WHEN 2 THEN '变量值为2'WHEN 3 THEN '变量值为3'WHEN 4 THEN '变量值为4'WHEN 5 THEN '变量值为5'ELSE '变量值不明确'ENDset @n=77select caseWHEN @n>=90 THEN 'A'WHEN @n>=80 THEN 'B'WHEN @n>=70 THEN 'C'WHEN @n>=60 THEN 'D'ELSE 'E'END AS '级别'


 

--WHILE语句用法DECLARE @a intDECLARE @b intSET @a=0SET @b=0while @a<10BEGINSET @a=@a+1SET @b=@a+@bENDselect @b '累加结束'


 

 

 

--创建数据库CREATE DATABASE [books]ON PRIMARY(NAME=N'books',--数据库名称FILENAME=N'e:\db\data\books.mdf',--数据库存储路径SIZE=10MB,--数据库初始值MAXSIZE=100MB,--数据库最大值FILEGROWTH=10%--数据库增长方式)LOG ON(NAME=N'books_log',--日志文件名称FILENAME=N'e:\db\log\books_log.ldf',--日志文件路径SIZE=3MB,--日志文件初始化值MAXSIZE=20MB,--日志文件最大值FILEGROWTH=10%--日志文件增长方式)


 

--指定多个数据库文件创建数据库CREATE DATABASE [books]ON PRIMARY(NAME=N'books',FILENAME=N'E:\db\data\books.mdf',SIZE=10MB,MAXSIZE=100MB,FILEGROWTH=10%),(NAME=N'books_data1',FILENAME=N'E:\db\data\books_data1.mdf',SIZE=10MB,MAXSIZE=100MB,FILEGROWTH=10%),(NAME=N'books_data2',FILENAME=N'E:\db\data\books_data2.mdf',SIZE=10MB,MAXSIZE=100MB,FILEGROWTH=10%)LOG ON(NAME=N'books_log',FILENAME=N'E:\db\log\books_log.ldf',SIZE=10MB,MAXSIZE=100MB,FILEGROWTH=10%)


 

--主键--表通常需要包含唯一标识表中记录的一列或多列,这样的一列或多列称为表的主键(PK)--主键用于作为查询关键字来精确定位一条记录,这样可以实现表的实体完整性。在创建或修改表时,可以通过关键字PRIMARY KEY来创建主键--在下述代码中BookNumber字段定义为主键,这样就可以使用BookNumber字段来唯一确定该表中的记录CREATE TABLE BookInfo(BookNumber VARCHAR(10) NOT NULL PRIMARY KEY,  --主键关键字PRIMARY KEYBookNamber VARCHAR(60) NOT NULL,Classify VARCHAR(20) NULL,Author VARCHAR(30) NOT NULL,ISBN VARCHAR(30) NOT NULL,Publisher VARCHAR(20) NOT NULL,PubTime VARCHAR(10) NULL,Pages INT NULL,Price DECIMAL NOT NULL,proce DECIMAL NOT NULL,Dedails TEXT NULL,)


 

--创建自动编号列--使用IDENTITY关键字定义的字段叫标识字段。标识字段是一个自动编号的字段,可以用来保证数据的唯一性。--当莫i个字段被设置为标识字段时,那么该字段将不允许用户输入任何值,并且不会存在任何重复的值。--当一个新的记录添加到这表中时,这个字段就会根据一定的规则自动被赋予一个新的值CREATE TABLE UserInfo(ID INT IDENTITY(1,1)NOT NULL,  --设置自动编号字段UserName NVARCHAR(20) NOT NULL,Sex NCHAR(2) NULL,Age INT NULL,IDCard VARCHAR(20) NULL,Phone VARCHAR(12) NULL,[Address] NVARCHAR(50) NULL,PRIMARY KEY(ID)--设置为主键)

--创建外键--在关系型数据库中,外键主要用于定义数据库的参照完整性。通过使用FOREIGN KEY关键字定义外键CREATE TABLE CardInfo(CardNumber VARCHAR(20) NOT NULL,UserID INT NOT NULL FOREIGN KEY REFERENCES UserInfo(ID) UNIQUE,--定义外键 --UNIQUE为一列约束不允许有重复值CreateTime DATETIME NOT NULL,Scope NVARCHAR(50) NOT NULL,MaxNumber INT NOT NULL,Score INT NOT NULL DEFAULT(0),--DEFAULT来设置默认值PRIMARY KEY(CardNumber),--设置主键CHECK(MaxNumber<5),--CHECK约束)


 

--维护表ALTER TABLE--添加新列ALTER TABLE UserInfo Add Email VARCHAR(30) NOT NULL--删除列ALTER TABLE UserInfo DROP COLUMN Email--修改列属性--重命名、数据类型、长度、是否为空、设置和取消一个列主键约束等--ALTER TABLE table_name--ALTER COLUMN column_name column_attribute--修改Age字段属性为TINYINT类型,不允许为NULLALTER TABLE UserInfoALTER COLUMN Age TINYINT NOT NULL//删除表DROP TABLE table_name--重命名表(没有重命名表的T-SQL语句,但是可以用SQL Server提供的存储过程)EXEC sp_rename 'Table_4','Table_new';--重命名列exec sp_rename 'table_name.备注','其他';--添加新列alter table table_nameadd 新列 int--更改表的数据类型alter table table_namealter column 新列 char --删除列alter table table_namedrop column 新列--清空表的数据Truncate Table table_name--插入数据--INSERT INTO table_or_view[(column_list)]VALUES data_values--table_or_view   用于指定插入新数据表或试图名称--column_list     用于指定数据表的列名--data_values     用于指定插入的新数据值--方式一:INSERT INTO UserInfo(UserName,Sex,Age,IDCard,Phone,[Address])VALUES('刘莹','女',21,'222333199001018520','0371999999','广东深圳')--方式二:INSERT INTO UserInfo VALUES ('马化腾','男',40,'222333199001018521','0381999999','广东深圳')<p>--update更新表中的值update UserInfo   --更新UserInfo表set Age=Age+20   --将Age字段的值增加20</p><p>--TOP用法update TOP(1) UserInfo  --TOP表示前多少个set Age=Age+20</p><p>//删除数据delete UserInfo where ID=2</p><p>//删除整个表的数据TRUNCATE TABLE UserInfo   --注意,不能使用ROLLBACK来取消删除操作</p>


--表查询--1.查询表所有内容select * from UserInfo--2.只查询指定字段select [UserName],[Age] from UserInfo   --3.过滤重复的值select DISTINCT [Address] from UserInfo--4.范围条件查询select * from UserInfo where [Age] BETWEEN 20 AND 30--5.字符匹配查询 %任意多个字符,[]指定范围的单个字符,_单个字符,[^]不再指定范围内的单个字符select * from UserInfo where [Address] LIKE '%广东%'--6.列表运算符select * from UserInfo where [UserName] IN('马化腾','刘莹') --7. 查询为NULL的值select * from UserInfo where [UserName] IS  NULL--8.查询不为NULL的值 select * from UserInfo where [UserName] IS NOT NULL --9.降序排序查询select * from UserInfo ORDER BY [Age] DESC--10.升序排序查询    select * from UserInfo ORDER BY [Age] ASC--11.分组查询,统计地理位置人数                select [Address],COUNT(*) AS '地址位置' from UserInfo GROUP BY [Address]  --12.--筛选查询select [Address],COUNT(*) AS '地址位置' from UserInfo GROUP BY [Address] HAVING COUNT(*) >=2 --13.IN用法 查询用户表中没有借书的人 select * from UserInfo where ID NOT IN (select UserID from CardInfo)--14.EXISTS用法 统计借书的用户  select * from UserInfo AS UI where EXISTS(select UserID from CardInfo AS CI where UI.ID=CI.UserID)--15.UNION将两个或者两个以上的select语句查询结果集合并成一个结果集显示     select * from UserInfo where Sex='男'UNION select * from  UserInfo where Age>20 --16.返回两个结果集select * from UserInfo where Sex='男' INTERSECT select * from  UserInfo where Age>20 --17.差查询select * from UserInfo where Sex='女' EXCEPT select * from  UserInfo where Age>20    


 

--多表查询一内连接--1.等值连接--查询借书卡表中所有信息,但要求同时列出每一张借书卡对应的用户信息select UI.*,CI.* from CardInfo CIINNER JOIN UserInfo UION CI.UserID=UI.ID--2.非等值连接--查询借书卡表中的所有信息,并且同事列出每一张借书卡对应的用户信息,要求只连接查询出2015-17-30日以前的借书信息select UI.*,CI.* from CardInfo CIINNER JOIN UserInfo UION CI.UserID=UI.ID ANDCI.CreateTime<'2015-07-30'--3.自然连接--如果将等值连接中的重复列消去则为自然连接。select UI.*,CI.* from CardInfo CIINNER JOIN UserInfo UION CI.UserID=UI.ID--二外连接--1.左外连接查询--在左外连接查询中左表就是主表,右表则是从表。左外连接返回关键字JOIN左边的表中所有的行,但是这些行必须符合查询条件。--如果左表的某数据行没有在右表中找到相应的匹配的数据行,则结果集中右表的对应位置填入NULL值。--使用左外连接查询UserInfo表和CardInfo表中的内容,将表UserInfo作为左外连接的主表,CardInfo作为左外连接的从表select UI.*,CI.* from UserInfo UILEFT OUTER JOIN CardInfo CION CI.UserID=UI.ID--2.右外连接查询--在右外连接查询中右表就是主表,左表就是从表。右外连接返回关键字JOIN右边表中所有的行。--右外连接是左外连接的反向,如果右表的某数据行没有在左表找到相应的匹配的数据。则结果集中左表对应的位置填入NULL值select UI.*,CI.* from UserInfo UIRIGHT OUTER JOIN CardInfo CION CI.UserID=UI.ID--3.完全连接查询--完全连接查询返回主表和从表中所有行的数据,当一个表中某一行在另一个表中没有与之匹配的行时,则另一个表与之相对应的列设为NULL值。select UI.*,CI.* from UserInfo UIFULL OUTER JOIN CardInfo CION CI.UserID=UI.ID--交叉连接--使用交叉连接查询时,将返回两个表中所有行可能的组合,即在结果集中将显示所有两个表中可能相匹配的数据行--交叉连接查询中,查询条件一般限制在WHERE子句中,主要分为以下两种情况:--1.不使用WHERE子句,将返回被连接两个表中的所有行的笛卡尔积--2.使用WHERE子句,将返回被连接两个表中的所有行的笛卡尔积减去不符合WHERE子句查询条件的数据行--不使用WHERE子句,将UserInfo表和CardInfo表进行交叉连接select UI.*,CI.* from UserInfo UI CROSS JOIN CardInfo CI--使用WHERE子句,将UserInfo表和CardInfo表进行交叉连接select UI.*,CI.* from UserInfo UI CROSS JOIN CardInfo CIWHERE UI.ID=CI.UserID


 

--将一个表中的数据插入到另一个表中/*1.在最外面的查询表中插入所有满足SELECT语句的数据行2.必须保证要插入新数据的表已经存在3.对于插入新数据的表,各列数据类型必须和源数据表中各列的数据类型保持一致4.必须明确是否存在默认值,是否允许为NULL。如果不允许为空,则必须为这些列提供列值INSERT...SELECT语句的语法格式如下INSERT table_nameSELECT column_listFROM table_listWHERE search_condirions*/INSERT INTO TempUser([UserName],[Sex],[Age],[IDCard],[Phone],[Address])SELECT [UserName],[Sex],[Age],[IDCard],[Phone],[Address]from UserInfo--将一个表的值复制到另外一个表中select * into UserInfo1 from UserInfo


 

--索引XML数据SELECT ID,RTrim([UserName]) AS [UserName],SexFROM UserInfoORDER BY [UserName]FOR XML AUTO;--XML格式输出select DISTINCT 1 AS TAG,NULL AS PARENT,UserName AS[用户!1!姓名],Sex AS[用户!1!性别],Age AS[用户!1!年龄],[Address] AS [用户!1!地址]from UserInfofor XML EXPLICIT
DECLARE @x xmlset @x='<Invoices><Invoice> <Customer>海峰</Customer> <Books> <Book Name="SQL Server 2008 完全学习手册" Price="69"/> <Book Name="Oracle 完全学习手册" price="79"/> </Books></Invoice><Invoice> <Customer>刘冰</Customer> <Books> <Book Name="ASP.NET 网络大讲堂" price="50"/> </Books></Invoice></Invoices>'select @x.query('<Orders>{ for $invoice in /Invoices/Invoice let $count:=count($invoice/Books/Book) order by $count return <Order> {$invoice/Customer} <ItemCount>{$count}</ItemCount> </Order>}</Orders>')


 

--视图--1.创建视图CREATE VIEW CardViewASselect CI.CardNumber,   UI.UserName,   CI.CreateTime,   CI.Scope,   CI.MaxNumberfrom CardInfo CI,UserInfo UIwhere CI.UserID=UI.ID   --2.查询视图select *from CardView--3.查看视图EXEC sp_helptext CardView--4.修改视图ALTER VIEW  CardView AS select *from CardInfo --5.删除视图 DROP VIEW CardView


 

--存储过程--EXECUTE和EXEC是执行存储过程的,他们的功能是相同的exec sp_server_info--显示广泛的服务器状态信息exec sp_spaceused--显示数据库使用情况(和未使用)的空间量exec sp_statistics table_1  --显示与数据库表有关的使用统计数据exec sp_helpuser--显示可用的的用户账号exec sp_helplogins--显示用户登录权限exec sp_who--查看当前用户、回话和进程的信息。exec sp_helpdb--查看指定数据库或者所有据数据库的信息exec sp_helptext--查看存储过程  --也可以用 PRINT OBJECT_DEFINITION(OBJECT_ID(N'Proc_GetName'))EXEC sp_who--EXEC执行存储过程--#和##表示创建的存储过程是本地临时存储过程和全局临时存储过程,当SQL关闭该存储过程不存在--1.简单的存储过程创建CREATE PROCEDURE Proc_UsersASselect * from UserInfo--2.创建加密存储过程CREATE PROCEDURE Proc_Users1WITH ENCRYPTIONASselect * from UserInfo--存储过程解密文件---新建---数据库引擎查询---admin:192.168.2.101use QPAccountsDBexec sp_windbi$decrypt 'GSP_GP_QueryUserIndividual',0--3.创建嵌套存储过程CREATE PROCEDURE Proc_1ASselect @@NESTLEVEL AS 'Proc_1 Level'GOCREATE PROCEDURE Proc_2ASBEGINselect @@NESTLEVEL AS 'Proc_2 Level'EXEC Proc_1ENDGO--4.创建带参数的存储过程CREATE PROCEDURE Proc_FindBooks @Sex NVARCHAR(50),@Age tinyintASBEGINselect * from UserInfo where Sex=@Sex AND Age=@AgeEND--EXEC Proc_FindBooks '男',40--EXEC Proc_FindBooks @Sex='男',@Age=40--5.创建带输出参数的存储过程(指定OUTPUT关键字)CREATE PROCEDURE Proc_GetName @ID int,@Name NVARCHAR(50)OUTPUTASBEGINselect @Name=UserInfo.UserName from UserInfo where UserInfo.ID=@IDENDDECLARE @Name NVARCHAR(50)EXEC Proc_GetName 1,@Name OUTPUTprint @Name--6.修改存储过程ALTER PROCEDURE Proc_UsersASselect * from UserInfo where Sex='男'--7.删除过程过程DROP PROCEDURE Proc_GetName--删除存储过程前先查看是否有对象依赖于该存储过程 EXEC sp_depends Proc_Users

 

 


 

/*什么是触发器,为什么需要触发器?T-SQL语句在需要时被执行,存储过程也是如此。但是如果想要某条语句(或某些语句)在事件发生时自动执行,怎么办呢?每天增加一个顾客到某个数据库表时,都检查其电话号码个数是否正确,州的缩写是否为大写每当订购一个产品时,都从库存数量中减去订购的数量无论何时删除一行,都在某个存档表中保留一个副本所有这些例子的共同之处是他们都需要在某个表更改发生时自动处理。这确切地说就是触发器。以下语句支持触发器 DELETE INSERT UPDATE 表和视图,但是临时表不支持一个表每个事件每次只允许一个触发器,因此每个表最多支持3个触发器(INSERT、UPDATE、DELETE 各一个触发器)每个触发器多个事件,单个触发器可与多个事件关联,因此如果你需要对INSERT和UPDATE操作执行一个触发器,可定义为AFTER INSERT,UPDATE*/--触发器--1.DML触发器(INSERT、UPDATE、DELETE)--INSERT触发器CREATE TRIGGER Trig_ShowNumON UserInfoAFTER INSERTASBEGINDECLARE @num intselect @num=COUNT(*)from UserInfoPRINT @numENDgoCREATE TRIGGER Trig_ShowUserON UserInfoINSTEAD OF INSERTASBEGINDECLARE @num intselect @num=COUNT(*)from UserInfoPRINT @numINSERT INTO UserInfo(UserName,Sex,Age,IDCard,Phone,[Address])select UserName,Sex,Age,IDCard,Phone,[Address] from insertedEND--DELETE触发器--(TRUNCATE TABLE语句不会除非DELETE触发器)--对于含有用DELETE操作定义的外键表,不能定义INSREAD OF DELETE触发器CREATE TRIGGER Trig_DeleteUserON UserInfoAFTER DELETEASselect * from deletedgo--UPDATE触发器CREATE TRIGGER Trig_UpdateUserON UserInfoAFTER UPDATEASBEGINselect * from insertedselect * from deletedENDUPDATE UserInfoSET Age=25where UserName='马化腾'--2.DLL触发器(CREATE、ALTER、DROP)--作用域触发器CREATE TRIGGER Trig_NoCreateTableON DATABASEFOR CREATE_TABLEASBEGINPRINT '不能创建数据库表'ROLLBACK TRANSACTIONENDCREATE TABLE temp(ID int,)--整个SERVER的触发器CREATE TRIGGER Trig_NoCreateDatabaseON ALL SERVERFOR CREATE_DATABASEASPRINT '不能在当前服务器创建数据库'ROLLBACK TRANSACTIONCREATE DATABASE NewDB--修改触发器ALTER TRIGGER Trig_UpdateUserON UserInfoAFTER UPDATEASBEGINselect * from deletedselect * from insertedEND--禁用触发器--方式一DISABLE TRIGGER Trig_UpdateUser ON UserInfo--方式二ALTER TABLE UserInfo DISABLE TRIGGER Trig_UpdateUser--启用触发器ENABLE TRIGGER Trig_UpdateUser ON UserInfo--删除触发器--方式一DROP TRIGGER Trig_UpdateUser--方式二DROP TRIGGER Trig_NoCreateTable ON DATABASE--查看表存在的触发器SP_HELPTRIGGER UserInfo

 


 

/*事物处理事物处理可以用来维护数据库的完整性,它保证成批的T-SQL操作要么完全执行,要么完全不执行。事物(Transaction)指一组SQL语句回退(RollBack)指撤销指定SQL语句的过程提交(Commit)指将未存储的SQL语句结果写入数据库表保留点(SavePoint)指事物处理中设置的临时占位符你可以对它发布回退(回退整个事物处理不同)--COMMIT用法BEGIN TRANSACTIONINSERT INTO table_1 VALUES('嘿嘿','16');    --如果第一条INSETT语句执行成功INSERT INTO table_2 VALUES ('嘿嘿','12');   --如果第二条语句执行失败,那么撤销第一条语句COMMIT;SAVE TRANSACTION delete1;  --创建一个保留点,事实上sql回退到最近的一个保留点ROLLBACK TRANSACTION delete1; --回退到保留点ROLLBACK TRANSACTION; --回退到事物的开始*/--事物--创建一个银行表CREATE TABLE BankAccount(CardNumber NVARCHAR(20) NOT NULL PRIMARY KEY,UserName   NVARCHAR(10) NOT NULL,Balance    DECIMAL(18,2) DEFAULT(0) NOT NULL,CHECK(Balance>=0))--插入两条记录INSERT INTO BankAccount VALUES('432156789023','张三',6000)INSERT INTO BankAccount VALUES('876509874567','李四',1000)--把张三的钱清零UPDATE BankAccount SET Balance=0where UserName='张三'--查询表select * from BankAccount--张三向李四转500元--执行转账功能/*DECLARE @outCard NVARCHAR(20)DECLARE @inCard  NVARCHAR(20)DECLARE @num DECIMAL(18,2)SET @outCard='432156789023'SET @inCard= '876509874567'SET @num=500UPDATE BankAccountSET Balance=Balance+@numwhere CardNumber=@inCardUPDATE BankAccountSET Balance=Balance-@numwhere CardNumber=@outCard(1 行受影响)消息 547,级别 16,状态 0,第 11 行UPDATE 语句与 CHECK 约束"CK__BankAccou__Balan__1C281490"冲突。该冲突发生于数据库"WTBK_OA",表"dbo.BankAccount", column 'Balance'。语句已终止。*/--查询表select * from BankAccountDECLARE @Err INTDECLARE @outCard NVARCHAR(20)DECLARE @inCard  NVARCHAR(20)DECLARE @num DECIMAL(18,2)SET @outCard='432156789023'SET @inCard= '876509874567'SET @num=500BEGIN TRANSACTIONUPDATE BankAccountSET Balance=Balance+@numwhere CardNumber=@inCardSET @Err=@@ERRORupdate BankAccountSET Balance=Balance-@numwhere CardNumber=@outCardSET @Err=@@ERRORIF @Err=0 BEGIN  COMMIT TRANSACTION  PRINT '事物提交成功' ENDELSE  BEGIN  ROLLBACK TRANSACTION  PRINT '事物回滚'  END--查询表select * from BankAccount


 

//数据库备份--1.选择数据库--右键---任务---备份--2.T-SQL命令备份BACKUP DATABASE WTBK_OATO DISK='D:\OA\WTBK_OA.BAK'WITH INIT,NAME='WTBK_OA',DESCRIPTION='WTBK_OA数据库的完整备份,2014-07-21'//还原数据--1.数据库--右键--还原数据库--源设备--选择备份的数据库--2.T-SQL命令还原RESTORE DATABASE WTBK_OAFROM DISK='D:\OA\WTBK_OA.BAK'WITH FILE=1//分离数据库--1.选择数据库--右键---任务---分离--2.T-SQL命令分离EXEC sp_detach_db WTBK_OA//附加数据库--1.数据库--右键--附加数据库--2.T-SQL命令附加CREATE DATABASE WTBK_OAON(FILENAME='D:\OA\WTBK_OA.MDF')LOG ON(FILENAME='D:\OA\WTBK_OA_1.LDF')FOR ATTACH//收缩数据库--收缩数据库和收缩文件的区别--收缩数据库:整个数据库,所有文件组--收缩文件:指定的文件进行收缩--1.选择数据库--右键---任务---收缩数据库--通过日志来恢复数据库use db_bankgo--误操作删除表DROP TABLE TransInfo--记录时间select dt=GETDATE()use mastergo--备份日志文件backup LOG db_bank TO DISK=N'D:\Bank\Database\logback.bak' WITH NORECOVERY--还原数据库(需要以前已经备份过)RESTORE DATABASE db_bank from DISK='D:\Bank\Database\db_bank.bak' WITH REPLACE,NORECOVERY--还原日志DECLARE @dt datetimeselect @dt=2015-07-22-16-13RESTORE LOG db_bank from DISK='D:\Bank\Database\logback.bak' WITH RECOVERY,STOPAT=@dt


 

--SQL加锁(一般用于事物中)NOLOCK--不加锁HOLDLOCK--保持锁  其他事物可以读取,但不能更新UPDLOCK     --修改锁TABLOCK--表锁  其他事物只能读取,但不能改写PAGLOCK--页锁TABLOCKX--排它表锁 其他事物不能读写删SET LOCK_TIMEOUT 2000--锁表的某一行--下面的例子是锁定这个银行卡号select * from CardInfo ROWLOCK where CardNumber='987671541802439' --解锁select * from CardInfo NOLOCK where CardNumber='987671541802439' --锁整个表select * from CardInfo WITH(HOLDLOCK)--解锁select * from CardInfo WITH(NOLOCK)--查看锁EXEC SP_LOCK


 

--更改自动提交的行为--默认执行SQL语句会立即执行,不自动执行需要使用以下语句SET IMPLICIT_TRANSACTIONS ON;  --不自动提交SET IMPLICIT_TRANSACTIONS OFF; --取消不自动提交--用户管理CREATE LOGIN sa125096 WITH PASSWORD='125096';--创建用户EXEC sp_addlogin 'sa125098','125098';--存储过程创建用户DROP LOGIN sa125098;--删除用户ALTER LOGIN sa125096 DISABLE;--禁用账户ALTER LOGIN sa125096 ENABLE;--启用账户ALTER LOGIN sa125096 WITH NAME = sa125096s;--重命名账户ALTER LOGIN sa125096s WITH PASSWORD = '125096'; --重命名密码GRANT CREATE TABLE TO sa125096--添加创建表的权限REVOKE CREATE TABLE FROM sa125096--删除访问权限


 

0 0
原创粉丝点击