*******************逍湘數(shù)據(jù)庫學(xué)習(xí)文檔*******************************
use master --打開數(shù)據(jù)庫
go
select * from sysdatabases --查看所有數(shù)據(jù)庫的相關(guān)信息
sp_helpdb pubs --查看指定數(shù)據(jù)庫的相關(guān)信息
use master
go
execute sp_tables --查看數(shù)據(jù)庫中的所有表名
sp_spaceused --查看數(shù)據(jù)庫數(shù)據(jù)空間
sp_spaceused xiaoxiangwang --查看數(shù)據(jù)庫中表的數(shù)據(jù)空間
dbcc sqlperf(logspace) --查看數(shù)據(jù)庫日志空間
sp_helpfile --查看數(shù)據(jù)庫的文件信息
sp_helpfile pubs_log
sp_helpfilegroup --查看數(shù)據(jù)庫的文件組信息
sp_help:報告有關(guān)數(shù)據(jù)庫對象、用戶定義數(shù)據(jù)類型或SQL Server所提供的數(shù)據(jù)類型的信息sp_helptext:用于顯示規(guī)則、默認(rèn)值、未加密的存儲過程、用戶定義函數(shù)、觸發(fā)器或視圖的文本.。
sp_depends:用于顯示有關(guān)數(shù)據(jù)庫對象相關(guān)性的信息
sp_stored_procedures:用于返回當(dāng)前環(huán)境中的存儲過程列表。
--------------------------------------------------------------------------
***************************創(chuàng)建數(shù)據(jù)庫*************************************
create database TestDb --創(chuàng)建數(shù)據(jù)庫
on primary
( name ='TestDb_data1', --主數(shù)據(jù)文件
filename ='E:\SQL Server\SQL2\MSSQL\Data\TestDb_data1.mdf',
size=1,maxsize=unlimited,filegrowth=10%),
filegroup data2
( name ='TestDb_data2', --輔數(shù)據(jù)文件
filename ='E:\SQL Server\SQL2\MSSQL\Data\TestDb_data2.mdf',
size=2,maxsize=100,filegrowth=1)
log on
( name ='TestDb_log1', --事務(wù)日志文件
filename ='E:\SQL Server\SQL2\MSSQL\Data\TestDb_log1_ldf',
size=1mb,maxsize=25mb,filegrowth=10%)
alter database testdb --修改數(shù)據(jù)庫添加文件組
add filegroup data3
go
alter database testdb
add file
( name ='TestDb_data3', --添加輔數(shù)據(jù)文件
filename ='E:\SQL Server\SQL2\MSSQL\Data\TestDb_data3.mdf',
size=2,maxsize=100,filegrowth=1)
to filegroup data3
go
alter database testdb
remove file testdb_data3 --刪除文件
go
execute sp_helpdb
execute sp_helpdb testdb --查看數(shù)據(jù)庫定義信息
sp_spaceused --查看數(shù)據(jù)庫數(shù)據(jù)空間
sp_spaceused tablename --查看表空間
dbcc sqlperf(logspace) --查看數(shù)據(jù)庫日志空間
sp_helpfile --查看數(shù)據(jù)庫的文件信息
sp_helpfile testdb_log1 --查看指定文件的信息
sp_helpfilegroup --查看數(shù)據(jù)庫文件組信息
sp_helpfilegroup data2 --查看指定文件組的信息
dbcc shrinkdatabase (testdb,20,notruncate) --壓縮數(shù)據(jù)庫
sp_renamedb 'Testdb' ,'testdb2' --重命名數(shù)據(jù)庫
drop database testdb --刪除數(shù)據(jù)庫
**************************創(chuàng)建表*******************************************
create table xinxibiao --創(chuàng)建表
(Sno int not null identity,Sname char(8) not null,
Ssex char(4) not null,Sage int not null,Sdept char(10) not null)
on [primary]
alter table xinxibiao --修改表結(jié)構(gòu)
alter column sage char(4) not null --修改列
alter table xinxibiao
add email char(10) null --添加列
alter table xinxibiao
drop column email --刪除列
insert into xinxibiao --以一行插入數(shù)據(jù)
values( 'ee','ee','ee','ee')
使用INSERT…Values插入行
INSERT INTO XS_KC(Sno,Cno,Grade) Values(‘6’,’4’,86)
update xinxibiao --修改表中數(shù)據(jù)
set sage='ff'
where sname='ee'
delete from xinxibiao where ssex='ee' --刪除指定的行
delete xinxibiao --刪除表中所有數(shù)據(jù)
truncate table xinxibiao --永久刪除表中所有數(shù)據(jù)(不可恢復(fù))
select * from xinxibiao --查詢表中所有數(shù)據(jù)
sp_rename 'xinxibiao', 'xinxi' --重命名表
drop table xinxibiao
數(shù)據(jù)完整性分類:
(1)實體完整性 (行完整性)
(2)域完整性 (列完整性)
(3)參照完整性
(4)用戶定義完整性
數(shù)據(jù)完整性的實施:
1、約束:
主鍵約束(Primary Key Constraint) (標(biāo)示一行記錄的唯一性)
外鍵約束(Foreign Key Constraint) (表之間的關(guān)系)
唯一性約束(Unique Constraint) (限制列的內(nèi)容不能相同)
檢查約束(Check Constraint) (對輸入到列中的數(shù)據(jù)進(jìn)行限制)
默認(rèn)值約束(Default Constraint) (在列中不輸入數(shù)值時顯示默認(rèn)值)
2、規(guī)則: (限定輸入列的數(shù)值)
3、默認(rèn)值: (限定輸入列的數(shù)值)
(注:規(guī)則 和 默認(rèn)值都是一種數(shù)據(jù)庫對象)
4、索引:
(作用:對表中的一個或者多個字段建立一種排序關(guān)系,以加快在表中查詢數(shù)據(jù)的速度。)
簇索引 (以primary key約束建立的索引為簇索引)
非簇索引 (以unique約束建立的索引為非簇索引)
惟一索引 (可以確保所有數(shù)據(jù)行中任意兩行的被索引列不包括NULL在內(nèi)的重復(fù)值)
create table XS
(Sno char(10) not null,Sname char(8) not null,
Ssex char(4) not null,Sage int not null,
Sdept char(10) not null,
constraint PK_XS primary key(Sno)) --主鍵約束
on [primary]
create table CJ
(Sno char(10) not null,Cno char(4) not null,
Grade numeric(8) not null,
constraint PK_CJ primary key(Sno,Cno), --主鍵約束
constraint FK_CJ foreign key(Sno)references XS(Sno) --外鍵約束
on delete cascade --級聯(lián)刪除
on update cascade) --級聯(lián)修改
on [primary]
Alter table XS --惟一性約束
Add constraint u_XS unique nonclustered(Sname)
Alter table CJ --檢查約束
Add constraint ch_CJ CHECK(Grade>=0 AND Grade<=100)
Alter table XS --默認(rèn)值約束
Add constraint sex default 'nan' for Ssex
Create RULE nl_rule AS @Sage<=30 and @Sage>=10 --創(chuàng)建規(guī)則
SP_bindrule nl_rule,'XS.Sage' --綁定規(guī)則
SP_unbindrule 'XS.Sage' --解除規(guī)則
Drop rule nl_rule --刪除規(guī)則
Create default grade_defa AS 0 --創(chuàng)建默認(rèn)值
SP_bindefault grade_defa, 'CJ.Grade' --綁定默認(rèn)值
SP_unbindefault 'CJ.Grade' --解除默認(rèn)值
Drop default grade_defa --刪除默認(rèn)值
create unique index XH_INDEX --創(chuàng)建惟一索引
On XS(sno DESC) --DESC降序 ASC升序
With Fillfactor=80 --指定索引頁葉級的填滿程度
SP_helpindex XS --查看索引
SP_rename 'XS.XH_INDEX','XH_INDEX1' --修改索引名稱
drop index XS.XH_INDEX1 --刪除索引
注意:如果索引是用create index語言創(chuàng)建的,則可以使用drop index刪除。
如果索引是用create table語言創(chuàng)建的,則只能用alter table刪除
create table kc(Cno char(4) not null,Cname char(8) not null,
Credit char(4) not null,constraint PK_KC primary key(Cno))
on [primary]
刪除索引:
alter table kc
drop constraint PK_KC
注意:當(dāng)為表創(chuàng)建主鍵或唯一約束時,將為該表自動創(chuàng)建與約束同名的索引。在表中索引名必須唯一,因此不能在表中創(chuàng)建或重命名與主鍵或唯一約束同名的索引。
*************************創(chuàng)建視圖****************************************
create view view1
as
select * from xs
create view view2
as
select sno,sage from xs
create view view3
(學(xué)號,年齡)
as
select sno,sage from xs
create view view4
as
select cj.sno,cj.grade,xs.sname,xs.ssex
from cj,xs where cj.sno=xs.sno
select * from view4
create view view5
with encryption --對視圖定義文本進(jìn)行加密存儲
as
select * from view4 --基于視圖創(chuàng)建
where view4.grade>50
with check option --數(shù)據(jù)修改準(zhǔn)則
sp_depends view1 --確定有關(guān)數(shù)據(jù)庫對象相關(guān)性的信息
sp_help view2 --返回有關(guān)數(shù)據(jù)庫對象的詳細(xì)信息,如果不針對某一特定對象,則返回數(shù)據(jù)庫中所有對象信息
sp_helptext view4 --顯示規(guī)則、默認(rèn)值、未加密的存儲過程、用戶定義函數(shù)、觸發(fā)器或視圖的文本
*************************************************************************
alter view view2 --修改視圖
as
select sno,sname,ssex,sage,sdept --增加字段
from xs
execute sp_rename view1,view6 --重命名視圖
drop view view6 --刪除視圖
select * from xs
select * from view2
insert into view2 --通過視圖向表中插入一行數(shù)據(jù)
values('3','cc','nan',20,'bb')
update view2 --修改數(shù)據(jù)
set ssex='nv'
where sname='bb'
delete view2 --刪除數(shù)據(jù)
where sno='1'
delete view2 --刪除所有數(shù)據(jù)
----------------------------------------------------------------------------
**************** Transact-SQL 語言 ****************************************
1、注釋語句
“--”(雙連字符),表示單行注釋,從雙連字符開始到行尾均為注釋。
/* ... */(正斜杠+星號對),用于多行(塊)注釋。
注:多行/* */注釋不能跨越批處理,整個注釋必須包含在一個批處理內(nèi)
2、RETURN語句
3、PRINT命令
4、事務(wù)模式
1.顯式事務(wù): 每個顯式事務(wù)均以BEGIN TRANSACTION語句開始,以COMMIT或ROLLBACK語句結(jié)束。
2.隱式事務(wù): 指當(dāng)前事務(wù)在提交或回滾后,自動啟動新事務(wù),而無需描述事物的開始。通過Set Implicit_Transaction on/off可以將隱式事務(wù)模式打開或關(guān)閉。
3.自動提交事務(wù): 自動提交事務(wù)是SQL Server的默認(rèn)事務(wù)管理模式,如果一個語句成功的完成則提交該語句;如果遇到錯誤,則回滾該語句。
4.事務(wù)回滾: 當(dāng)事務(wù)中的某一語句執(zhí)行失敗時將恢復(fù)到事務(wù)執(zhí)行前或某個指定位置(某個保存點)。
5、局部變量
聲明局部變量: DECLARE @變量名 變量類型
局部變量的賦值:
SELECT @局部變量=變量值 (可同時對多個變量賦值,用逗號隔開)
SET @局部變量=變量值 (只能對單個變量賦值)
6、全局變量
7、算術(shù)運算符
8、比較運算符
(1)>:大于。
(2)=:等于。
(3)<:小于。
(4)>=:大于或等于。
(5)<=:小于或等于。
(6)<>(!=):不等于。
(7)!>:不大于。
(8)!<:不小于。
9、位運算符
10、邏輯運算符
11、字符串連接符(+)
12、賦值運算符為等號(=)
13、程序流控制語句
WAITFOR語句指定延遲一段時間(時間間隔或一個時刻)來執(zhí)行(觸發(fā))一個Transact-SQL語句、語句塊、存儲過程或事務(wù)。
waitfor delay ‘01:10:00’ --等待1小時10分后才執(zhí)行select語句。
select * from xs
waitfor time ‘11:12:00’ --等到11點12分才執(zhí)行select語句。
select * from xs
--------------------------------------------------------------------------
**************************************************************************
declare @x int,@y int --用declare聲明兩個局部整型變量@x,@y
select @x=3,@y=5 --用select給兩個局部變量賦值
print @x; print @y; print @x+@y; --顯示輸出
if @x>@y --如果局部變量@x>@y,退出程序
return
else --否則,輸出my god!!
print 'my god!!'
declare @m char(10), @n char(10)
select @m='SQL',@n='Server'
print'微軟公司'
print @m+@n
DECLARE @gh char(4),@xm char(8) --用declare聲明兩個局部字符變量
SELECT @gh = '0014' --用select給局部變量@gh賦值
SET @xm='上官云珠' --用set給局部變量@xm賦值
print @gh+@xm
Go
use testdb2 --begin tran(事務(wù)開始)
insert xs(sno,sname) values(7,'2006上期')
go
insert xs(sno,sname) values('dfdf') --錯誤語句
go
if @@ERROR>0 --@@ERROR為全局變量
begin --rollback(事務(wù)中的insert語句執(zhí)行失敗時將恢復(fù)到事務(wù)執(zhí)行前,即回滾)
return -- return語句結(jié)束當(dāng)前程序,無條件退出
end --commit(標(biāo)志事務(wù)的結(jié)束)
go
select * from xs
delete xs
use testdb2
begin tran --事務(wù)開始
insert xs(sno,sname) values(9,'2007上期')
go
insert xs(sno,sname) values(10 ) --錯誤語句
go
if @@ERROR>0 --@@ERROR為全局變量
begin
rollback --事務(wù)中的insert語句執(zhí)行失敗時將恢復(fù)到事務(wù)執(zhí)行前,即回滾
return -- return語句結(jié)束當(dāng)前程序,無條件退出
end
commit --標(biāo)志事務(wù)的結(jié)束
go
---------------------------------------------------------------------------
--求2000到2100年間的所有閏年,將結(jié)果輸出。
DECLARE @i int
select @i=2000
while @i<=2100
begin
if (@i%4=0 and @i%100<>0) or (@i%400=0) --假如為閏年,則輸出
print @i
set @i=@i+1 --循環(huán)變量自增1
end
go
DECLARE @A INT,@B INT,@C INT
SELECT @A=3,@B=4
WHILE @A<6
BEGIN
PRINT @A
WHILE @B<7
BEGIN
SELECT @C=100*@A+@B
PRINT @C
SELECT @B=@B+1
END
SELECT @A=@A+2
SELECT @B=1
END
--求1!+2!+3!+4!+…+10!的和,并輸出
declare @i int,@sum int,@t int --聲明三個局部整型變量
select @i=1,@sum=0,@t=1 --給三個局部變量賦值
while @i<=10 --當(dāng)@i<=10時,執(zhí)行begin...end語句塊
begin
set @t=@t*@i --給局部變量@t,@sum賦值
set @sum=@sum+@t
set @i=@i+1 --循環(huán)變量自增1
end
PRINT '1!+2!+3!+4!+…..+10!='+CAST(@SUM AS CHAR(10))
***************************************************************************
三種方法指定別名:
列表達(dá)式 AS 列別名
列表達(dá)式 列別名
列別名 = 列表達(dá)式
----------------------------------------------------------------------------
*****************數(shù)據(jù)查詢***************************************************
SELECT語句的語法格式:
SELECT select_list
[ INTO new_table ] FROM table_source
[WHERE search_condition]
[GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
[COMPUTE 子句] [FOR 子句] [OPTION 子句]
SELECT子句的語法
SELECT [ALL | DISTINCT] [TOP n [ PERCENT] [WITH TIES] ]
<選擇列表>
<選擇列表>::=
{* | {表名| 視圖名 | 表別名}.*
| { 列名 | 表達(dá)式 | IDENTITYCOL | ROWGUIDCOL }
[ [ AS ] 列別名 ]
| 列別名 = 表達(dá)式
} [ ,…n ]
(1)選擇指定列:
select column_name [,column_name…]
from table_name
[where search_condition]
(2)選擇所有列:
select * from table_name
[where search_condition]
(3)為所選列指定別名:
select column_name as column_alias
[,column_name as column_alias …]
from table_name
[where search_condition]
(4)替換查詢結(jié)果中的數(shù)據(jù):
select column_name [,column_name…]
結(jié)果表列名稱=
CASE
WHEN 條件1 THEN 表達(dá)式1
WHEN 條件2 THEN 表達(dá)式2
……
ELSE 表達(dá)式
END
from table_name [where search_condition]
(5)計算列值:
select CPMC as ‘產(chǎn)品名稱’,產(chǎn)品總值=DJ*SL
from CP
(6)消除重復(fù)的行:
select DISTINCT column_name [,column_name…]
from table_name
[where search_condition]
(7)限制結(jié)果集返回的行數(shù):
select TOP n [PERCENT] column_name [,column_name…]
from table_name
[where search_condition]
(8)數(shù)據(jù)類型轉(zhuǎn)換:
例:select Sno,(Cno + CAST(Grade AS VARCHAR(4))) AS 課程成績
from xs_kc
WHERE子句
1、表達(dá)式比較:
select *
from table_name
where expression 比較運算符 expression
2、模式匹配:
select * from table_name
where expression [NOT] LIKE string_expression
[ESCAPE ‘escape_character’]
注意:與LIKE一起使用的通配符如下:
_(下劃線)可匹配任意單個字符。
%(百分號)可匹配任意類型和長度的字符。
[ ]可匹配在指定范圍內(nèi)的任何單個字符.
[^]可匹配不在指定范圍內(nèi)的任何單個字符.
3、范圍比較:
例: select * from cp where dj between 200 and 400
select * from xs where Sage not between 15 and 20
例:select * from xs where Sdept not IN (‘jsj’,‘wxd’)
4、空值比較
例:Select * from xs where Sname is not null
5、contains謂詞
Select * from table_name Where CONTAINS ({column |*},search_condition)
6、FREETEXT謂詞
例:select * from xs where freetext (*,’工程’)
子查詢: 是一個select 查詢,它返回單個值且嵌套在select,insert,update,delete語句或其他子查詢中。
(1)IN子查詢:
例一: select * from xs where Sno in
(select Sno from xs_kc where Cno =‘1’)
例二: select Sno,Sdept from xs
where Sno not in
(select Sno from xs_kc where Cno in
(select Cno from kc where Cname =‘SQL’))
(2)比較子查詢
where expression 比較運算符{ALL|SOME|ANY}(子查詢))
例:select Sno,Grade from XS_KC
where Cno=‘2’ and Grade !< ANY
(select Grade from xs_kc where Cno=‘1’)
(3)EXISTS 子查詢: 外部查詢的WHERE子句測試子查詢返回行是否存在,它不產(chǎn)生任何數(shù)據(jù),只返回TRUE或FALSE值。
例1:select Sno,Sname from xs
where exists
(select * from xs_kc
where Sno= xs.Sno and Cno=‘2’)
例2:select Sno,Sname from xs
where exists
(select * from kc
where exists
(select * from xs_kc
where Sno= xs.Sno and Cno=
kc.Cno) )
ORDER BY子句:按查詢結(jié)果中的一列或多列對查詢結(jié)果進(jìn)行排序,排序可以是升序的(ASC),也可以是降序的(DESC)。默認(rèn)為升序。
例:select * from xs
where Sdept=‘jsj’
order by Sage DESC
注意:如果在ORDER BY子句中指定了不止一列,排序就是嵌套的。
例:select * from xs
order by Sage DESC,Sno
GROUP BY 子句: 按字段分組,將查詢結(jié)果表按某一列或多列值分組輸出,值相等的為一組,對查詢結(jié)果分組的目的是使集函數(shù)作用于每一個組,即每一個組都有一個函數(shù)值。
例:求各個課程號及相應(yīng)的選課人數(shù)。
SELECT Cno,COUNT(Sno) as 選課人數(shù)
FROM XS_KC
GROUP BY Cno
HAVING 子句:
例1:select Sno,AVG(Grade) AS 平均成績
from XS_KC
group by Sno
having avg(Grade)>=85
例2:查詢成績在80分以上且選修了2門以上課程的學(xué)生學(xué)號。
select Sno from XS_KC
where Grade>=80
group by Sno
having count(*)>=2
COMPUTE BY子句:
例:計算結(jié)果集中成績的匯總值。
SELECT TOP 4 Sno,Cno,Grade 等價于 SELECT TOP 4 *
FROM XS_KC
COMPUTE sum(Grade)
注意:計算子組的匯總值時要按照BY選項指定的列排序。
例如: SELECT TOP 4 *
FROM XS_KC
ORDER BY Sno
COMPUTE sum (Grade) BY Sno
分離數(shù)據(jù)庫: SP_detach_db 數(shù)據(jù)庫名 [,true或false]
附加數(shù)據(jù)庫: SP_attach_db 數(shù)據(jù)庫名,數(shù)據(jù)庫文件列表
例:SP_attach_db test
‘E:\sql_exercise\test_Data.MDF’,
‘E:\sql_exercise\test_Data_2.NDF’,
‘E:\sql_exercise\test_log.LDF’
---------------------------------------------------------------------------
********************聯(lián)接*************************************************
內(nèi)聯(lián)接 僅顯示兩個聯(lián)接表中的匹配行的聯(lián)接,包括等值聯(lián)接和自然聯(lián)接。
外聯(lián)接 包括在聯(lián)接表中沒有相關(guān)的行的聯(lián)接,可分為以下3種。
1、左向外聯(lián)接:
2、右向外聯(lián)接:
3、完整外部聯(lián)接:
4、交叉聯(lián)接:
左向外聯(lián)接:
USE pubs
SELECT titles.title_id,titles.title,publishers.pub_name
FROM titles
LEFT OUTER JOIN publishers ON
titles.pub_id=publishers.pub_id
右向外聯(lián)接 :
USE pubs
SELECT titles.title_id,
titles.title,publishers.pub_name
FROM titles
RIGHT OUTER JOIN publishers ON
titles.pub_id=publishers.pub_id
完整外部聯(lián)接 :
USE pubs
SELECT titles.title_id, titles.title,publishers.pub_name
FROM titles
FULL OUTER JOIN publishers ON
titles.pub_id=publishers.pub_id
交叉連接 (笛卡爾積)即為兩個表中元組的交叉乘積,因此結(jié)果集的大小為兩個表中行數(shù)的乘積。
例:select Sno,Sname,Cno,Cname
from xs cross join kc
謂詞連接:連接運算符為=時
例:select xs.*,xs_kc.*
from xs, xs_kc
where xs.Sno=xs_kc.Sno
自然連接:若在等值連接中把目標(biāo)列中重復(fù)的屬性列去掉則為自然連接。
例: select xs.*,Cno,Grade
from xs, xs_kc
where xs.Sno=xs_kc.Sno
內(nèi)連接(默認(rèn))
例1:select * from xs inner join xs_kc on
xs.Sno=xs_kc.Sno (等值連接)
例2:select xs.*,Cno,Grade
from xs inner join xs_kc on
xs.Sno=xs_kc.Sno (自然連接)
自連接:
例:從成績表中得到1號課程的名次及學(xué)號。
SELECT xs_kc.Sno,count(*) AS 名次
FROM xs_kc inner join xs_kc xs_kc_1 on xs_kc.Grade<=xs_kc_1.Grade
WHERE (xs_kc.Cno=1) AND (xs_kc_1.Cno=1)
GROUP BY xs_kc.Sno
ORDER BY 名次
多表連接: 兩個以上的表進(jìn)行的連接。
例:SELECT xs.Sno,Sname,Cname,Grade
FROM xs,kc,xs_kc
WHERE xs.Sno=xs_kc.Sno and kc.Cno=xs_kc.Cno
等價于:
SELECT xs.Sno,Sname,Cname,Grade
FROM xs inner join
xs_kc on xs.Sno=xs_kc.Sno
inner join
kc on xs_kc.Cno=kc.Cno
------------------------------------------------------------------------
(1)使用INSERT…Values插入行
INSERT INTO XS_KC(Sno,Cno,Grade) Values(‘6’,’4’,86)
(2)使用SELECT INTO插入行
SELECT * INTO XS_KC_1 FROM XS_KC WHERE(Grade>=60)
(3)使用INSERT…SELECT插入行
INSERT INTO XS_KC_1(Sno,Cno,Grade)
SELECT Sno,Cno,Grade FROM XS_KC
WHERE (Grade>70)
使用SET子句更改數(shù)據(jù):UPDATE XS_KC
SET Grade=90
使用WHERE子句更改數(shù)據(jù):UPDATE XS_KC SET Grade=95
WHERE Cno=‘1’
使用FROM子句更改數(shù)據(jù):
UPDATE XS_KC_1
SET Grade=XS_KC.Grade
FROM XS_KC
WHERE XS_KC_1.Sno=XS_KC.Sno AND XS_KC_1.Cno
=XS_KC.Cno AND XS_KC.Grade=90
**********************存儲過程************************************************
創(chuàng)建存儲過程:
CREATE PROC[EDURE] 存儲過程名 [;number]
[{ @parameter data_type}[VARYING][=default]
[OUTPUT]][,...n]
[WITH{ RECOMPILE|ENCRYPTION|RECOMPILE,
[FOR REPLICATION]
AS
sql_statement[...n]
例:
USE master
GO
CREATE PROC PROCEDURE1
AS
SELECT Sno,Sname FROM xs
GO
修改存儲過程:
ALTER PROC[EDURE]存儲過程名[;number]
[{ @parameter data_type }[ VARYING ] [= default ] [ OUTPUT ] ] [ ,...n ]
[WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION }]
[FOR REPLICATION]
AS
sql_statement [ ...n ]
執(zhí)行存儲過程:
[EXEC[UTE]]{[@返回狀態(tài)碼=]{過程名[:分組號數(shù)]|@過程名變量}}[[@參數(shù)名=]{參數(shù)值|@參數(shù)變量}[[OUTPUT]|[DEFAULT]][,…]]
[WITH RECOMPILE]
例:
use master
EXEC PROCEDURE1
GO
刪除存儲過程:
DROP PROC[EDURE]{存儲過程名}[,…]
例:
USE master
GO
DROP PROCEDURE PROCEDURE2
************************觸發(fā)器************************************************
創(chuàng)建觸發(fā)器
CREATE TRIGGER 觸發(fā)器名
ON{表名|視圖名}
[ WITH ENCRYPTION]
{{FOR|AFTER|INSTEAD OF}{[DELETE][,][INSERT][,][UPDATE]}
[WITH APPEND]
[NOT FOR REPLICATION]
AS
[{IF UPDATE(列名)[{AND|OR}UPDATE(列名)][...n]
|IF(COLUMNS_UPDATED(){位運算符}位掩碼){比較運算符}檢驗值[ ...n ]}]
sql_statement [ ...n ]
}
例如:
USE testdb2
IF EXISTS (SELECT name FROM sysobjects --判斷要創(chuàng)建的觸發(fā)器名是否存在
WHERE name = 'XS_IU' AND type = 'TR')
DROP TRIGGER XS_IU --刪除觸發(fā)器
GO
CREATE TRIGGER XS_IU --觸發(fā)器名
ON xx --關(guān)聯(lián)的表
FOR INSERT,UPDATE --激活觸發(fā)器條件
AS PRINT '插入或更新了XS庫' --應(yīng)完成的操作
GO
使用ALTER TRIGGER命令修改觸發(fā)器正文
使用系統(tǒng)命令DROP TRIGGER刪除指定的觸發(fā)器:
DROP TRIGGER{觸發(fā)器名}[ ,...n]
例:刪除名為XS_IU的觸發(fā)器。
USE pubs
GO
DROP TRIGGER XS_IU
--------------------存儲過程的應(yīng)用----------------------------
例1、
IF EXISTS(SELECT name FROM sysobjects --判斷要創(chuàng)建的存儲過程名是否存在
WHERE name= ‘gjxbxsxx’AND type= ‘P’)
DROP PROCEDURE gjxbxsxx --刪除存儲過程
GO
--創(chuàng)建存儲過程
CREATE PROC gjxbxsxx @xb char(4)= ‘nan’ --建立參數(shù)@xb
AS SELECT Sno,Sname FROM XS WHERE Ssex=@xb
RETURN
執(zhí)行:
gjxbxsxx ‘nv’
GO
例2、
IF EXISTS(SELECT name FROM sysobjects
WHERE name=‘gjxbxsxx'AND type='P')
DROP PROCEDURE gjxbxsxx
GO
CREATE PROC gjxbxsxx @xb char(4)=‘nan'
AS SELECT Sno,Sname FROM XS WHERE Ssex=@xb
RETURN
例3、
IF EXISTS (SELECT name FROM sysobjects
WHERE name=‘gjxhfhcj’
AND type = 'P')
DROP PROCEDURE gjxhfhcj
GO
CREATE PROC gjxhfhcj @xh char(6), @cj NUMERIC OUTPUT, --@cj輸出參數(shù)
AS SELECT @cj=Grade FROM XS_KC
WHERE Cno=‘1' AND Sno=@xh
RETURN
執(zhí)行:
DECLARE @Grade numeric
EXECUTE gjxhfhcj ‘1',@cj = @Grade OUTPUT
PRINT CONVERT(varchar(6), @Grade)
GO
例4、
CREATE TABLE 測試局部變量表
(列1 int,列2 char(8))
GO
CREATE PROCEDURE 插入行 @初始值 int
AS
DECLARE @循環(huán)計數(shù) int, @循環(huán)變量 int --包含局部變量的存儲過程
SET @循環(huán)變量 = @初始值 - 1
SET @循環(huán)計數(shù) = 0
WHILE ( @循環(huán)計數(shù) < 3)
BEGIN
INSERT INTO 測試局部變量表 VALUES (@循環(huán)變量 + 1, '新增一行‘)
PRINT (@循環(huán)變量)
SET @循環(huán)變量 = @循環(huán)變量 + 1
SET @循環(huán)計數(shù) = @循環(huán)計數(shù) + 1
END
GO
例5、
ALTER PROC gjxbxsxx @xb char(4)= NULL
AS
IF @xb is NULL
BEGIN
PRINT '請輸入一個xb作為存儲過程的參數(shù)'
RETURN --存儲過程執(zhí)行到RETURN語句即停止執(zhí)行
END
ELSE
BEGIN
SELECT Sno,Sname FROM XS WHERE Ssex=@xb
END
GO
例6、
CREATE PROC jccj @xh char(6)
AS
IF (SELECT Grade FROM XS_KC WHERE Sno=@xh)<85
RETURN 0 --RETURN也可傳回整數(shù)值
ELSE
RETURN 1
GO
執(zhí)行:
DECLARE @返回值 int
EXECUTE @返回值 = jccj ‘1'
IF(@返回值=1)PRINT '恭喜你, 成績優(yōu)秀!'
GO
使用 SELECT 回傳值
CREATE PROC gjxhfh @xh char(6)
AS SELECT Sno,Grade FROM XS_KC
WHERE Sno=@xh
GO
ALTER PROC jccj @xh char(6)
AS
DECLARE @var1 int
IF (SELECT Grade FROM XS_KC WHERE Sno=@xh)<85
SET @var1 = 0
ELSE
SET @var1 = 1
SELECT '優(yōu)秀否' = @var1
PRINT '這里可以添加其它T_SQL語句'
GO
注:當(dāng)調(diào)用 RETURN 時,存儲過程跟著結(jié)束;當(dāng)調(diào)用 SELECT 時,存儲過程則在 SELECT 傳
回結(jié)果集后,繼續(xù)執(zhí)行。
*********************觸發(fā)器的應(yīng)用*****************************************
deleted表:儲存因 DELETE 及 UPDATE 語句而受影響的行副本。當(dāng)行因觸發(fā)器被刪除或更
新時,舊的行會傳送到delete表;
inserted表:儲存因INSERT 及 UPDATE 語句影響的行副本,在插入或更新事務(wù)時,新的
行會同時被加至觸發(fā)器表與inserted表。
DELETE 觸發(fā)器:
IF EXISTS (SELECT name FROM sysobjects
WHERE name = ‘sccj’ AND type = ‘TR’)
DROP TRIGGER sccj
GO
CREATE TRIGGER sccj
ON xs_kc
FOR DELETE
AS
PRINT’使用DELETE觸發(fā)器從成績庫中刪除相關(guān)行—開始’
DELETE xs --級聯(lián)刪除 xs表
FROM xs,deleted
WHERE xs.Sno = deleted.Sno
PRINT’使用DELETE觸發(fā)器從成績庫中刪除相關(guān)行—結(jié)束’
SELECT * FROM deleted
恢復(fù)備份:
DELETE xs_kc
INSERT INTO xs_kc SELECT * FROM cj
DELETE xs
INSERT INTO xs SELECT * FROM student
GO
CREATE TABLE cjbf
(Sno char(6) NOT NULL,Cno char(6) NOT NULL,
Grade numeric(18,1) NULL)
GO
CREATE TRIGGER cjbfcfq
ON xs_kc
FOR DELETE
AS
INSERT INTO cjbf SELECT * FROM deleted --將被刪除的列存入cjbf表中
GO
INSERT 觸發(fā)器:
CREATE TRIGGER cjcrcfq
ON xs_kc
FOR INSERT
AS
SELECT * FROM inserted
PRINT '可以在這里插入其它T-SQL語句,可以使用inserted表'
Go
UPDATE 觸發(fā)器:
CREATE TRIGGER cjgxcfq
ON xs_kc
FOR UPDATE
AS
DECLARE @更改前成績 numeric,@更改后成績 numeric
SELECT @更改前成績 = Grade from deleted
PRINT '更改前成績 ='
PRINT CONVERT(varchar(6),@更改前成績)
SELECT @更改后成績 = Grade from inserted
PRINT '更改后成績 ='
PRINT CONVERT(varchar(6),@更改后成績)
IF(@更改后成績 > (@更改前成績 * 1.10))
BEGIN
PRINT '成績更改升幅太大,更改失敗'
ROLLBACK
END
ELSE
PRINT '成績更改成功'
GO
執(zhí)行以下UPDATE的語句,會觸發(fā)觸發(fā)器:
UPDATE xs_kc
SET Grade= Grade *1.2 WHERE Sno=‘3'
GO
CREATE TRIGGER cjgxcfq
ON xs_kc
FOR UPDATE
AS
IF UPDATE(Grade) --設(shè)定只有在Grade行被更新時,觸發(fā)器正確觸發(fā)
BEGIN
DECLARE @更改前成績 numeric,@更改后成績 numeric
SELECT @更改前成績 = Grade from deleted
PRINT '更改前成績 ='
PRINT CONVERT(varchar(6),@更改前成績)
SELECT @更改后成績 = Grade from inserted
PRINT '更改后成績 ='
PRINT CONVERT(varchar(6),@更改后成績)
IF(@更改后成績 > (@更改前成績 * 1.10))
BEGIN
PRINT ‘成績更改升幅太大,更改失敗’
ROLLBACK
END
ELSE
PRINT ‘成績更改成功’
END
GO
觸發(fā)器嵌套:
在 SQL Server 2000 中, nested trigger服務(wù)器設(shè)定參數(shù)用來控制觸發(fā)器能否嵌套觸發(fā).
要激活觸發(fā)器嵌套,可執(zhí)行以下的指令:
sp_configure "nested triggers", 1
go
將nested triggers設(shè)成0時,則不激活觸發(fā)器嵌套;
將nested triggers設(shè)成1時,則可激活觸發(fā)器嵌套。
例:建立一個基于‘刪除’觸發(fā)的嵌套觸發(fā)器。
IF EXISTS (SELECT name FROM sysobjects WHERE name =‘scxs' AND type ='TR')
DROP TRIGGER scxs
GO
CREATE TRIGGER scxs
ON xs
FOR DELETE
AS
PRINT ‘用DELETE觸發(fā)器從成績庫中刪除相關(guān)行—開始’
DELETE xs_kc
FROM xs_kc,deleted
WHERE xs_kc.Sno = deleted.Sno
PRINT ‘用DELETE觸發(fā)器從成績庫中刪除相關(guān)行—結(jié)束’
GO
CREATE TRIGGER sccj
ON xs_kc
FOR DELETE
AS
PRINT ‘用存儲過程從課程庫中刪除相關(guān)行—開始’
DELETE kc
FROM kc,deleted
WHERE kc.Cno = deleted.Cno
PRINT ‘用存儲過程從課程庫中刪除相關(guān)行—結(jié)束’
SELECT * FROM deleted
GO
執(zhí)行以下的語句:
DELETE xs WHERE Sno=‘2'
GO
--------------------------------------------------------------------------
************************ 游標(biāo) ******************************************
游標(biāo)(Cursor):能對結(jié)果集的部分行記錄進(jìn)行處理,不但允許定位在結(jié)果集的特定行記錄
上,而且還可從結(jié)果集的當(dāng)前位置檢索若干條行記錄,并可實施對相應(yīng)的數(shù)據(jù)修改。
游標(biāo)分類:
1、Transact_SQL游標(biāo)、
2、API服務(wù)器游標(biāo)
3、客戶機(jī)游標(biāo)
游標(biāo)使用步驟:
(1)用DECLARE語句聲明,定義游標(biāo)的類型和屬性。
(2)用OPEN語句打開和填充游標(biāo)。
(3)執(zhí)行FETCH語句,從一個游標(biāo)中獲取信息(即從結(jié)果集中提取若干行數(shù)據(jù)庫)。可按
需使用UPDATE、DELETE語句在游標(biāo)當(dāng)前位置上進(jìn)行操作。
(4)用CLOSE語句關(guān)閉游標(biāo)。
(5)用DEALLOCATE語句釋放游標(biāo)。
例:建立一游標(biāo),用于訪問pubs數(shù)據(jù)庫中authors表。
use pubs
DECLARE authors_cursor CURSOR --聲明游標(biāo)
FOR SELECT * FROM authors
OPEN authors_cursor
--從游標(biāo)中提取一記錄行,由于沒指定SCROLL選項,
--那么FETCH NEXT是唯一的提取選項。
FETCH NEXT FROM authors_cursor
Close authors_cursor --關(guān)閉游標(biāo)
例:建立一個只讀游標(biāo)
declare cur_authors cursor
For select au_lname, au_fname, phone, address, city from authors
for read only
游標(biāo)變量
declare @pan cursor --先聲明一個游標(biāo)
declare yu_cur scroll cursor
For select * from titleauthor
set @pan = yu_cur --將一游標(biāo)賦值給游標(biāo)變量
全局變量@@CURSOR_ROWS 變量返回值說明:
返回值
返 回 值 說 明
-m
表示從基礎(chǔ)表向游標(biāo)讀入數(shù)據(jù)的處理仍在進(jìn)行,(-m) 表示當(dāng)前在游標(biāo)中的數(shù)據(jù)行數(shù)。
-1
表示該游標(biāo)是動態(tài)的。由于動態(tài)游標(biāo)可反映基礎(chǔ)表的所有變化,因此符合游標(biāo)定義的數(shù)據(jù)行經(jīng)常變動,故無法確定。
0
表示無符合條件的記錄或游標(biāo)已被關(guān)閉.
n
表示從基礎(chǔ)表讀入數(shù)據(jù)已經(jīng)結(jié)束,n即為游標(biāo)中已有數(shù)據(jù)記錄的行數(shù)據(jù).
@@FETCH_STATUS 變量有三個不同的返回值:
0:FETCH 語句執(zhí)行成功。
-1:FETCH 語句執(zhí)行失敗或者行數(shù)據(jù)超出游標(biāo)數(shù)據(jù)結(jié)果集的范圍。
-2:表示提取的數(shù)據(jù)不存在。
例:建立一“xs_cursor”游標(biāo),用于循環(huán)提取master數(shù)據(jù)庫中“xs”表數(shù)據(jù)
USE master
declare xs_cursor cursor --聲明游標(biāo)
for select Sno,Sname,Sdept from xs
open xs_cursor --打開游標(biāo)
fetch next from xs_cursor --循環(huán)提取游標(biāo)數(shù)據(jù)
while @@FETCH_STATUS=0
--檢測@@FETCH_STATUS,若仍有記錄行,則繼續(xù)循環(huán)
begin
fetch next from xs_cursor
end
close xs_cursor --關(guān)閉游標(biāo)
deallocate xs_cursor --釋放游標(biāo)
例1:
use pubs
go
declare titleauthor_cur cursor global scroll
For select * from titleauthor
open titleauthor_cur
go
declare @cur_ta1 cursor
set @cur_ta1 = titleauthor_cur
deallocate @cur_ta1
fetch next from titleauthor_cur
go
declare @cur_ta2 cursor
set @cur_ta2 = titleauthor_cur
deallocate titleauthor_cur
fetch next from @cur_ta2
go
declare @cur_ta cursor
set @cur_ta = cursor local scroll
For select * from titles
deallocate @cur_ta
go
例2:使用游標(biāo)語句修改master數(shù)據(jù)庫下“xs_kc”中Sno=‘1’記錄的Grade數(shù)值。
USE master
declare @xh nvarchar(6),@kch nvarchar(8),
@cj decimal
declare cj_cur cursor
for select Sno,Cno,Grade from xs_kc
where Sno=‘1'
open cj_cur --提取游標(biāo)數(shù)據(jù)
fetch NEXT from cj_cur into @xh,@kch,@cj
print ‘修改前:’+@xh+@kch+
‘同學(xué)成績?yōu)?’+convert(varchar,@cj)
update xs_kc set Grade=Grade+2
where current of cj_cur
close cj_cur
open cj_cur
fetch NEXT from cj_cur into @xh,@kch,@cj
print ‘修改后:’+@xh+@kch+
‘同學(xué)成績?yōu)?’+convert(varchar,@cj)
close cj_cur --關(guān)閉游標(biāo)
deallocate cj_cur --釋放游標(biāo)
go
/* 備份數(shù)據(jù)庫的命令 */
BACKUP DATABASE test /* test指的是數(shù)據(jù)庫名稱 */
TO disk = 'E:\test' /* 'E:\test' 指數(shù)據(jù)庫備份的路徑及文件名 */
WITH FORMAT,
NAME = '備份的備注說明' /* 備份的備注說明 */
/* 還原數(shù)據(jù)庫的命令 */
USE master
GO /* 還原時企業(yè)管理器必須關(guān)閉 */
RESTORE DATABASE test /* test指的是被還原的數(shù)據(jù)庫名稱 */
FROM disk = 'E:\test' /* 'E:\test' 指備份文件的的路徑及文件名 */
GO
/***************************************
//create databse
CREATE DATABASE test1 ON (NAME='test_Data_bak',FILENAME='E:\test_Data_bak.MDF',
SIZE = 10MB, FILEGROWTH = 10% )
LOG ON ( NAME = 'test_Log_bak',
FILENAME = 'E:\test_Log_bak.LDF',
SIZE = 4MB, FILEGROWTH = 10% )
//Restore the tables and sp from template to new database
RESTORE DATABASE test
FROM DISK = 'E:\test_Data.MDF'
WITH REPLACE,
MOVE 'test_Data.MDF' TO 'E:\test_Data_bak.MDF',
MOVE 'test_Log.LDF' TO 'E:\test_Log_bak.LDF'
IF EXISTS(SELECT name FROM sysobjects --判斷要創(chuàng)建的存儲過程名是否存在
WHERE name= 'pams_datasafe' AND type= 'P')
DROP PROCEDURE pams_datasafe --刪除存儲過程
GO
--創(chuàng)建存儲過程
CREATE PROC pams_datasafe @path_filename char(40) --建立參數(shù)@xb
AS
BACKUP DATABASE test TO disk = @path_filename WITH FORMAT, NAME =''
RETURN