SQL数据库



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


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									--函数返回类型
AS
BEGIN
RETURN @a+@b								--函数体,函数返回
END

select dbo.mysum(5,6) AS '两数相加和'		--调用函数

--2.表值函数
CREATE FUNCTION GetUsers()
RETURNS table								--函数返回类型
AS
RETURN select *from UserInfo				--函数体,函数返回

select *from GetUsers()						--调用函数


 

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


--CASE语句用法
DECLARE @n int
set @n=3

select case @n
	WHEN 1 THEN '变量值为1'
	WHEN 2 THEN '变量值为2'
	WHEN 3 THEN '变量值为3'
	WHEN 4 THEN '变量值为4'
	WHEN 5 THEN '变量值为5'
	ELSE '变量值不明确'
END

set @n=77

select case
	WHEN @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 int
DECLARE @b int

SET @a=0
SET @b=0

while @a<10
BEGIN
	SET @a=@a+1
	SET @b=@a+@b
END

select @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 KEY
	BookNamber 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类型,不允许为NULL
ALTER TABLE UserInfo
ALTER 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_name
add 新列 int

--更改表的数据类型
alter table table_name
alter column 新列 char 

--删除列
alter table table_name
drop 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 CI
INNER JOIN UserInfo UI
ON CI.UserID=UI.ID

--2.非等值连接
--查询借书卡表中的所有信息,并且同事列出每一张借书卡对应的用户信息,要求只连接查询出2015-17-30日以前的借书信息
select UI.*,CI.* 
from CardInfo CI
INNER JOIN UserInfo UI
ON CI.UserID=UI.ID AND
CI.CreateTime<'2015-07-30'

--3.自然连接
--如果将等值连接中的重复列消去则为自然连接。
select UI.*,CI.* 
from CardInfo CI
INNER JOIN UserInfo UI
ON CI.UserID=UI.ID

--二外连接
--1.左外连接查询
--在左外连接查询中左表就是主表,右表则是从表。左外连接返回关键字JOIN左边的表中所有的行,但是这些行必须符合查询条件。
--如果左表的某数据行没有在右表中找到相应的匹配的数据行,则结果集中右表的对应位置填入NULL值。
--使用左外连接查询UserInfo表和CardInfo表中的内容,将表UserInfo作为左外连接的主表,CardInfo作为左外连接的从表
select UI.*,CI.* 
from UserInfo UI
LEFT OUTER JOIN CardInfo CI
ON CI.UserID=UI.ID

--2.右外连接查询
--在右外连接查询中右表就是主表,左表就是从表。右外连接返回关键字JOIN右边表中所有的行。
--右外连接是左外连接的反向,如果右表的某数据行没有在左表找到相应的匹配的数据。则结果集中左表对应的位置填入NULL值
select UI.*,CI.* 
from UserInfo UI
RIGHT OUTER JOIN CardInfo CI
ON CI.UserID=UI.ID

--3.完全连接查询
--完全连接查询返回主表和从表中所有行的数据,当一个表中某一行在另一个表中没有与之匹配的行时,则另一个表与之相对应的列设为NULL值。
select UI.*,CI.* 
from UserInfo UI
FULL OUTER JOIN CardInfo CI
ON 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 CI
WHERE UI.ID=CI.UserID


 

--将一个表中的数据插入到另一个表中
/*
1.在最外面的查询表中插入所有满足SELECT语句的数据行
2.必须保证要插入新数据的表已经存在
3.对于插入新数据的表,各列数据类型必须和源数据表中各列的数据类型保持一致
4.必须明确是否存在默认值,是否允许为NULL。如果不允许为空,则必须为这些列提供列值

INSERT...SELECT语句的语法格式如下
INSERT table_name
SELECT column_list
FROM table_list
WHERE 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],Sex
FROM UserInfo
ORDER 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 UserInfo
for XML EXPLICIT
DECLARE @x xml
set @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 CardView
AS
select CI.CardNumber,
	   UI.UserName,
	   CI.CreateTime,
	   CI.Scope,
	   CI.MaxNumber
from CardInfo CI,UserInfo UI
where 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_Users
AS
select * from UserInfo


--2.创建加密存储过程
CREATE PROCEDURE Proc_Users1
WITH ENCRYPTION
AS
select * from UserInfo

--存储过程解密
文件---新建---数据库引擎查询---admin:192.168.2.101

use QPAccountsDB
exec sp_windbi$decrypt 'GSP_GP_QueryUserIndividual',0



--3.创建嵌套存储过程
CREATE PROCEDURE Proc_1
AS
select @@NESTLEVEL AS 'Proc_1 Level'
GO

CREATE PROCEDURE Proc_2
AS
BEGIN
	select @@NESTLEVEL AS 'Proc_2 Level'
	EXEC Proc_1
END
GO

--4.创建带参数的存储过程
CREATE PROCEDURE Proc_FindBooks @Sex NVARCHAR(50),@Age tinyint
AS

BEGIN
		select * from UserInfo where Sex=@Sex AND Age=@Age
END
--EXEC Proc_FindBooks '男',40
--EXEC Proc_FindBooks @Sex='男',@Age=40


--5.创建带输出参数的存储过程(指定OUTPUT关键字)
CREATE PROCEDURE Proc_GetName @ID int,@Name NVARCHAR(50)OUTPUT
AS

BEGIN
		select @Name=UserInfo.UserName from UserInfo where UserInfo.ID=@ID
END

DECLARE @Name NVARCHAR(50)
EXEC Proc_GetName 1,@Name OUTPUT
print @Name


--6.修改存储过程
ALTER PROCEDURE Proc_Users
AS
select * 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_ShowNum
ON UserInfo
AFTER INSERT
AS
BEGIN
	DECLARE @num int
	select @num=COUNT(*)from UserInfo
	PRINT @num
END

go
CREATE TRIGGER Trig_ShowUser
ON UserInfo
INSTEAD OF INSERT
AS
BEGIN
	DECLARE @num int
	select @num=COUNT(*)from UserInfo
	PRINT @num
	INSERT INTO UserInfo(UserName,Sex,Age,IDCard,Phone,[Address])
		select UserName,Sex,Age,IDCard,Phone,[Address] from inserted
END

--DELETE触发器
--(TRUNCATE TABLE语句不会除非DELETE触发器)
--对于含有用DELETE操作定义的外键表,不能定义INSREAD OF DELETE触发器
CREATE TRIGGER Trig_DeleteUser
ON UserInfo
AFTER DELETE
AS
	select * from deleted
go

--UPDATE触发器
CREATE TRIGGER Trig_UpdateUser
ON UserInfo
AFTER UPDATE
AS
BEGIN
	select * from inserted
	select * from deleted
END

UPDATE UserInfo
SET Age=25
where UserName='马化腾'



--2.DLL触发器(CREATE、ALTER、DROP)
--作用域触发器
CREATE TRIGGER Trig_NoCreateTable
ON DATABASE
FOR CREATE_TABLE
AS
BEGIN
	PRINT '不能创建数据库表'
	ROLLBACK TRANSACTION
END

CREATE TABLE temp
(
	ID int,
)

--整个SERVER的触发器
CREATE TRIGGER Trig_NoCreateDatabase
ON ALL SERVER
FOR CREATE_DATABASE
AS
	PRINT '不能在当前服务器创建数据库'
	ROLLBACK TRANSACTION


CREATE DATABASE NewDB

--修改触发器
ALTER TRIGGER Trig_UpdateUser
ON UserInfo
AFTER UPDATE
AS
BEGIN
	select * from deleted
	select * from inserted
END

--禁用触发器
--方式一
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 TRANSACTION
INSERT 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=0
where 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=500
UPDATE BankAccount
SET Balance=Balance+@num
where CardNumber=@inCard

UPDATE BankAccount
SET Balance=Balance-@num
where CardNumber=@outCard

(1 行受影响)
消息 547,级别 16,状态 0,第 11 行
UPDATE 语句与 CHECK 约束"CK__BankAccou__Balan__1C281490"冲突。该冲突发生于数据库"WTBK_OA",表"dbo.BankAccount", column 'Balance'。
语句已终止。

*/

--查询表
select * from BankAccount

DECLARE @Err INT
DECLARE @outCard NVARCHAR(20)
DECLARE @inCard  NVARCHAR(20)
DECLARE @num	 DECIMAL(18,2)
SET @outCard='432156789023'
SET @inCard= '876509874567'
SET @num=500

BEGIN TRANSACTION
	UPDATE BankAccount
	SET Balance=Balance+@num
	where CardNumber=@inCard
	
	SET @Err=@@ERROR
	
	update BankAccount
	SET Balance=Balance-@num
	where CardNumber=@outCard
	
	SET @Err=@@ERROR

IF @Err=0
 BEGIN
  COMMIT TRANSACTION
  PRINT '事物提交成功'
 END
ELSE
  BEGIN
  ROLLBACK TRANSACTION
  PRINT '事物回滚'
  END

--查询表
select * from BankAccount


 

//数据库备份
--1.选择数据库--右键---任务---备份

--2.T-SQL命令备份
BACKUP DATABASE WTBK_OA
TO DISK='D:\OA\WTBK_OA.BAK'
WITH INIT,
NAME='WTBK_OA',
DESCRIPTION='WTBK_OA数据库的完整备份,2014-07-21'

//还原数据
--1.数据库--右键--还原数据库--源设备--选择备份的数据库

--2.T-SQL命令还原
RESTORE DATABASE WTBK_OA
FROM 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_OA
ON
(
	FILENAME='D:\OA\WTBK_OA.MDF'
)
LOG ON
(
	FILENAME='D:\OA\WTBK_OA_1.LDF'
)
FOR ATTACH

//收缩数据库
--收缩数据库和收缩文件的区别
--收缩数据库:整个数据库,所有文件组
--收缩文件:指定的文件进行收缩
--1.选择数据库--右键---任务---收缩数据库




--通过日志来恢复数据库
use db_bank
go

--误操作删除表
DROP TABLE TransInfo
--记录时间
select dt=GETDATE()

use master
go
--备份日志文件
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 datetime
select @dt=2015-07-22-16-13
RESTORE 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				--删除访问权限


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值