久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

?。?轉(zhuǎn))SQL Server使用總結(jié)

 quasiceo 2016-10-31

(轉(zhuǎn))SQL Server使用總結(jié)

Posted on 2011-08-16 20:59 Eter 閱讀(1349) 評論(0) 編輯 收藏

作者:水之原

SQL Server

基本數(shù)據(jù)類型:

clip_image002

1.1 簡介

1.1.1 SQL分類

<!--[if !supportLists]-->l <!--[endif]-->DDL(Data Define Language):數(shù)據(jù)定義語言:

<!--[if !supportLists]-->n <!--[endif]-->create [table,index,view,procedure]

<!--[if !supportLists]-->n <!--[endif]-->drop [table,index,view,procedure]

<!--[if !supportLists]-->n <!--[endif]-->alter [table,index,view,procedure]

<!--[if !supportLists]-->l <!--[endif]-->DML(Data Management Language)數(shù)據(jù)操作語言

<!--[if !supportLists]-->n <!--[endif]-->insert

<!--[if !supportLists]-->n <!--[endif]-->update

<!--[if !supportLists]-->n <!--[endif]-->delete

<!--[if !supportLists]-->n <!--[endif]-->select

<!--[if !supportLists]-->l <!--[endif]-->DCL(Data Control Language)數(shù)據(jù)控制語言

<!--[if !supportLists]-->n <!--[endif]-->Grant insert,select,update

On stuInfo

To zhangsan

<!--[if !supportLists]-->n <!--[endif]-->revoke all

on stuInfo

to zhangsan

1.1.2 SQL Server介紹,,安裝

1.2 基本知識

1.2.1 默認(rèn)數(shù)據(jù)庫

系統(tǒng)庫:master(sysdatabases) model msdb tempdb

用戶庫:northwind

兩張?zhí)厥獗恚ㄒ晥D)

◆Sysdatabases:系統(tǒng)視圖,,存儲當(dāng)前數(shù)據(jù)庫的詳細(xì)信息,包括創(chuàng)建時間,,創(chuàng)建人,,主數(shù)據(jù)文件位置等信息,整個數(shù)據(jù)庫只有一個,,在master下,。

◆Sysobjects,每個數(shù)據(jù)庫一張,,存儲當(dāng)前數(shù)據(jù)庫對象信息,,對象包括表,視圖,,約束,。

特殊的函數(shù):exists參數(shù)是一個select類別的sql語句,如果有結(jié)果返回true,否則返回false.

1.2.2 建庫

create database stuDB

exists函數(shù)的使用

文件分類

◆數(shù)據(jù)文件:

主數(shù)據(jù)文件:有且只有一個

次數(shù)據(jù)文件:0個到多個

◆日志文件:0個到多個

use master--設(shè)置當(dāng)前數(shù)據(jù)庫為master,,以便訪問sysdatabases表

go

if exists (select * from sysdatabases where name='stuDB')

Drop database stuDB

go

create database stuDB

on primary--默認(rèn)就屬于primary主文件組,,可省略

(

name='stuDB_data',--主數(shù)據(jù)文件的邏輯名

filename='D:\我的文檔\SQL Server Management Studio\Projects\stuDB_data.mdf',--主數(shù)據(jù)文件的物理名

size=5mb,--主數(shù)據(jù)文件的初始大小

maxsize=100mb,--主數(shù)據(jù)文件增長的最大值

filegrowth=15%--主數(shù)據(jù)文件的增長率

)

log on

(

name='stuDB_log',

filename='D:\我的文檔\SQL Server Management Studio\Projects\stuDB_log.ldf',

size=2mb,

filegrowth=1mb

)

1.2.3 建表

要用到一張視圖sysobjects,用于查看數(shù)據(jù)庫中的所有表(包括其他的存儲過程,主鍵,,外鍵等,。)

create table tablename

(

列名 數(shù)據(jù)類型 約束(一般為非空約束)

)

use stuDB

go

create table class

(

clsId int identity not null,

clsName varchar(20) not null

)

go

create table student

(

stuId int not null,

clsId int not null,

stuName varchar(20) not null,

stuAge int not null,

stuAddress varchar(20) not null

context varchar(20) not null

)

go

identity(種子,自增量):表示從種子開始,每次自增自增量個,。默認(rèn)為identity(1,1)

約束類別

◆主鍵約束(primary key constraint):要求主鍵列數(shù)據(jù)唯一,,并且不允許為空。

◆唯一約束(unique constraint):要求該列唯一,,允許為空,,但只能出現(xiàn)一個空值。

◆檢查約束(check constraint):某列取值范圍,、格式限制等,,如有關(guān)年齡的約束。

◆默認(rèn)約束(default constraint):某列的默認(rèn)值,,如我們的男生學(xué)員較多,,性別默認(rèn)為男。

◆外鍵約束(foregin key constraint):用于兩表間建立關(guān)系,,需要指定引用主表的那列,,哪個表是外鍵表,就修改哪個表,。

alter table tablename

add constraint 約束名 約束類型 具體的約束說明

alter table class

add constraint PK_clsId primary key (clsId)

alter table student

add constraint PK_sutId primary key(stuId)

alter table student

add constraint FK_clsId foreign key(clsId) references class(clsId)

alter table student

add constraint CK_stuAge check(stuAge between 18 and 35)

alter table student

add constraint DF_stuAddress default('地址不詳') for stuAddress

alter table student

add constraint UQ_stuName unique(stuName)

go

建表同時加約束:不建議使用,。

create table exam

(

examId int identity primary key,

stuId int foreign key references student(stuId),

exam int not null check(exam between 0 and 100)

)

go

使用select * from sysobjects查看時,,會出現(xiàn)下面這樣的情況:

clip_image004

不清晰,不容易理解

較好的情況是:

clip_image006

這樣清晰明了,。

1.2.4 列的操作

◆增加列

alter table student

add context varchar(20)

◆修改列

alter table student

alter column context varchar(20)

◆刪除列

alter table student

drop column context

1.3 新增數(shù)據(jù)

1.3.1 插入單行數(shù)據(jù)

insert into class(clsName) values('一班')

insert into class(clsName) values('二班')

insert into class(clsName) values('三班')

go

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(1,'zhangsan1',18,default,'good')

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(2,'zhangsan2',19,default,'good')

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(3,'zhangsan3',20,default,'good')

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(1,'zhangsan4',21,default,'good')

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(1,'zhangsan5',22,default,'good')

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(1,'zhangsan6',23,default,'good')

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(1,'zhangsan7',24,default,'good')

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(2,'zhangsan8',25,default,'good')

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(2,'zhangsan9',26,default,'good')

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(2,'zhangsan10',27,default,null)

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(2,'zhangsan11',28,default,null)

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(3,'zhangsan12',35,default,null)

insert into student(clsId,stuName,stuAge,stuAddress,context)

values(3,'zhangsan13',30,default,null)

go

1.3.2 插入多行數(shù)據(jù)

◆方式一:創(chuàng)建新表,,把舊表中的數(shù)據(jù)放入到新表中,一般練習(xí)時使用,,只復(fù)制表結(jié)構(gòu)和數(shù)據(jù)(標(biāo)識列規(guī)范也復(fù)制),,并沒有復(fù)制約束。

select * into newtable from class

select * from newtable

go

◆方式二:以查詢的某個結(jié)果作為源放入表中,,保證列個數(shù),,數(shù)據(jù)類型,具體長度統(tǒng)一,。

insert into newtable(clsId,clsName)

select stuId,context from student

go

◆方式三:

insert into class(clsName)

select 'aa' union

select 'aa1' union

select 'aa2' union

select 'aa'

go

1.4 查詢

1.4.1 聚合函數(shù)

◆Count: 求總個數(shù),,不包括null列。

select count(context),count(*) from student

◆Sum : 求總和

select sum(stuAge) from student

◆Avg: 求平均值

select avg(stuAge) from student

◆Max: 求最大值

select max(stuAge) from student

◆Min: 求最小值

select min(stuAge) from student

1.4.2 排序

◆Order by [asc/desc] 默認(rèn)asc

select clsId,avg(stuAge) from student

group by clsId

order by avg(stuAge) desc

1.4.3 分組

◆Group by

select clsId,avg(stuAge) from student

group by clsId

1.4.4 完整查詢結(jié)構(gòu)

select clsId,avg(stuAge) from student

where stuAge >=20

group by clsId

having avg(stuAge) >= 22

order by avg(stuAge) desc

1.4.5 where having

Where 與 having 都是條件篩選,,請問他們的區(qū)別:

<!--[if !supportLists]-->l <!--[endif]-->Where是對表里原始數(shù)據(jù)進(jìn)行篩選,,一般最先執(zhí)行

<!--[if !supportLists]-->l <!--[endif]-->Having是對表中數(shù)據(jù)分組使用聚合函數(shù)計算后(經(jīng)過加工)的數(shù)據(jù)進(jìn)行篩選,having在where之后,,有having就一定有g(shù)roup by,通常兩者配合使用,。

1.4.6 模糊查詢

◆like

select * from student

where stuName like '%1_'

◆% : 表示匹配0-n個字符

◆_ : 表示匹配1個字符

1.4.7 幾個關(guān)鍵字

◆top

select top 5 * from student

select top 50 percent * from student

 

◆District: 去掉重復(fù)值

select distinct context from student

◆In

select * from student

where stuName='zhangsan1' or stuName='zhangsan2' or stuName='zhangsan3'

等價于

select * from student

where stuName in ('zhangsan1','zhangsan2','zhangsan3')

◆between

1.5 子查詢

1.5.1 定義

一個查詢的結(jié)果作為另一查詢的結(jié)果

1.5.2 要點

如果用=、!=,、<,、<=、>,、>=等時,,要保證子查詢結(jié)果只返回一行一列

1.5.3 in子查詢

當(dāng)返回一列多行時,可以使用in子查詢,。

1.5.4 子查詢應(yīng)用,,分頁查詢

分頁思想

第一步:子查詢,找出已經(jīng)顯示的數(shù)據(jù)(之前的)

第二步:父查詢,,除去已經(jīng)顯示的數(shù)據(jù),,在剩下的里面使用top顯示某幾行。

重點:必須確保按照某個規(guī)則排序,,既每次查詢時每行數(shù)據(jù)的索引不變,,或者說子查詢與父查詢采用相同的排序規(guī)則。一般簡寫,,是因為默認(rèn)是按主鍵升序排序,。

基本語法:

/*

一頁顯示幾條 pageSize

當(dāng)前是第幾頁 nowPage

*/

select top pageSize * from 表名

where 主鍵名

not in

(select top (nowPage-1)*pageSize 主鍵名from 表名 order by 排序規(guī)則)

order by 排序規(guī)則

比如:一頁顯示3條,在第二頁

select top 3 * from student

where stuId not in

(select top 6 stuId from student order by stuId)

order by stuId

1.6 聯(lián)接查詢

當(dāng)在一個結(jié)果中要顯示多個表的列時,,使用表聯(lián)接

select stu.stuName,cls.clsName from student as stu

inner join class as cls

on (cls.clsId = stu.clsId)

1.6.1 內(nèi)聯(lián)接(99.9%

改變出現(xiàn)順序沒有影響

select cls.clsName,stu.stuName,exam.exam from

exam

inner join student stu

on (stu.stuId = exam.stuId)

inner join class cls

on (cls.clsId = stu.clsId)

<!--[if !supportLists]-->1.6.2 <!--[endif]-->外聯(lián)接(0.1%

◆a.左外聯(lián)接

改變出現(xiàn)的順序有影響,,因為前面出現(xiàn)的是左表

select * from

student stu--左表

left join exam--右表

on (stu.stuId = exam.stuId)

<!--[if !supportLists]-->1 <!--[endif]-->首先列出內(nèi)連接數(shù)據(jù)

<!--[if !supportLists]-->2 <!--[endif]-->看左表是否沒有沒匹配的,,有的話原樣列出,否則用null補齊,。

<!--[if !supportLists]-->3 <!--[endif]-->總結(jié):左聯(lián)接顯示左表的所有數(shù)據(jù)

列出沒有參加考試的學(xué)生

select stu.* from

student stu

left join exam

on (stu.stuId = exam.stuId)

where exam.examId is null

◆b.右外聯(lián)接

select * from

exam--左表

right join student stu--右表

on (stu.stuId = exam.stuId)

規(guī)則和左外聯(lián)接一樣,。

◆完全內(nèi)連接?。健∽笸饴?lián)接 + 右外聯(lián)接

select * from

exam--左表

right join student stu--右表

on (stu.stuId = exam.stuId)

left join class cls--右表

on (stu.clsId = cls.clsId)

1.6.3交叉聯(lián)接(基本不用)

一般不使用,,返回數(shù)據(jù)的行數(shù)=左表行數(shù)*右表行數(shù)

select * from student,class

1.7 常用函數(shù)

1.7.1 日期和時間函數(shù)

clip_image008

1.7.2 字符串函數(shù)

clip_image010

1.7.3 其他函數(shù)

◆cast(@age as varchar(2))

◆convert(varchar(2),@age)

◆getdate()

◆newid()

1.8 T-SQL編程

T-SQL SqlServer

PL/SQL Oracle

1.8.1 變量

局部變量:用戶自定義的變量,變量名以@開頭

賦值:

<!--[if !supportLists]-->1. <!--[endif]-->set @變量名=數(shù)值

declare @age int

set @age = 12

select @age as '年齡'

print '年齡=' + cast(@age as varchar(2))

declare @age int

set @age = 12

select @age as '年齡'

print '年齡=' + convert(varchar(2),@age)

<!--[if !supportLists]-->2. <!--[endif]-->以查詢結(jié)果為值

declare @age int

select @age=stuAge

from student

where stuId=13

print '年齡=' + convert(varchar(2),@age)

declare @stuId int

select @stuId = stuId from student where stuName='zhangsan7'

select * from student where stuId in (@stuId-1,@stuId+1)

Select在網(wǎng)格窗口顯示結(jié)果,,print在消息窗口顯示結(jié)果,。

全局變量:系統(tǒng)提供,以@@開頭,,只讀的,,也就是由系統(tǒng)賦值,我們?nèi)≈怠?

clip_image012

select @@version

select @@identity

select @@error

select @@language

select @@rowcount

select @@servername

select @@trancount

select @@max_connections

<!--[if !supportLists]-->1.8.2 <!--[endif]-->流程控制語句

把{}換成begin end

多重判斷:嵌套if,,階梯式if(可以是區(qū)間范圍,,也可以是定值),switch(只可以是定值)

declare @avgExam int

select @avgExam = avg(exam)

from exam

print '平均分為:' + cast(@avgExam as varchar(2))

if (@avgExam >= 70)

begin

print '成績優(yōu)秀'

select top 3 * from exam order by exam asc

end

else

begin

print '成績不好'

select top 3 * from exam order by exam desc

end

select stuId,exam,'等級'=

case

when exam <60 then 'E'

when exam between 60 and 69 then 'D'

when exam between 70 and 79 then 'C'

when exam between 80 and 89 then 'B'

else 'A'

end

from exam

1.8.3 循環(huán)

declare @minExam int

declare @index int

set @index = 1

select @minExam = min(exam) from exam

while(@minExam >= 60)

begin

print '開始第' + cast(@index as varchar(2)) + '次減分'

update exam set exam = exam - 3

select @minExam = min(exam) from exam

print '第' + cast(@index as varchar(2)) + '次減分后為:' + cast(@minExam as varchar(2))

set @index = @index + 1

end

declare @avgExam int

declare @index int

set @index = 1

select @avgExam = exam from exam

while(@avgExam <= 85)

begin

print '開始第' + cast(@index as varchar(2)) + '次加分'

update exam set exam =

case

when exam >= 90 then exam

when exam between 80 and 89 then exam + 1

when exam between 70 and 79 then exam + 2

when exam between 60 and 69 then exam + 3

else exam + 4

end

select @avgExam = avg(exam) from exam

print '第' + cast(@index as varchar(2)) + '次加分后為:' + cast(@avgExam as varchar(2))

set @index = @index + 1

end

1.9 視圖

1.9.1 定義

視圖是一張?zhí)摂M表,它表示一張表的部分?jǐn)?shù)據(jù)或多張數(shù)據(jù),,其結(jié)構(gòu)和數(shù)據(jù)是建立在對表的查詢基礎(chǔ)上

視圖并不存放數(shù)據(jù),,而是存放在視圖所引用的原始表(基表)中,同一張原始表,,根據(jù)不同用戶的需求主,,可以創(chuàng)建不同的視圖。

1.9.2 優(yōu)點

◆篩選表中的行

◆防止未經(jīng)許可的用戶訪問敏感數(shù)據(jù)

create view stuview1

as

select stuId as sid,stuName as sname from student

go

select * from stuview1

◆降低數(shù)據(jù)庫的復(fù)雜程序

create view examview

as

select cls.clsName,stu.stuName,exam.exam from

exam

inner join student stu

on (stu.stuId = exam.stuId)

inner join class cls

on (cls.clsId = stu.clsId)

select * from examview

◆將多個物理數(shù)據(jù)庫抽象為一個邏輯數(shù)據(jù)庫

create view examview2

as

select a.stuId,b.stuName,a.exam from fuxidb.dbo.exam as a

inner join testdb.dbo.student as b

on (a.stuId = b.stuId)

go

1.9.3 缺點

◆視圖是為查詢服務(wù)的,,不能通過視圖新增,,修改,刪除數(shù)據(jù),,同一張表可以根據(jù)需求創(chuàng)建不同的視圖,。

1.10 事務(wù)

1.10.1 簡介

同時執(zhí)行多個insert,update,delete等sql語句時使用。事務(wù)(transation)是作為單個邏輯工作單元執(zhí)行的一系列操作,,這些操作作為一個整體一起向系統(tǒng)提交,,要么都執(zhí)行,要么都不執(zhí)行,,事務(wù)是一個不可分割的工作邏輯單元,。

1.10.2 事務(wù)特點

事務(wù)必須具備以下四個屬性,簡稱ACID屬性:

◆原子性(Atomicity):事務(wù)是一個完整的操作,。事務(wù)的各步操作是不可分的(原子的),,要么都執(zhí)行,要么都不執(zhí)行,。

◆一致性(Consistency):當(dāng)事務(wù)完成時,,數(shù)據(jù)必須處于一致狀態(tài),。

◆隔離性 (Isolation):對數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)是彼此隔離的,這表明事務(wù)必須是獨立的,,它不應(yīng)以任何方式依賴于或影響其他事務(wù),。

◆永久性(Durability):事務(wù)完成后,它對數(shù)據(jù)庫的修改被永久保存,,事務(wù)日志能夠保持事務(wù)的永久性,。

1.10.3 T-SQL中的事務(wù)

◆開始事務(wù):begin transation

◆提交事務(wù):commit transation

◆回滾事務(wù):rollback transation

一旦事務(wù)提交或回滾,則事務(wù)結(jié)束,。

declare @errorcount int

set @errorcount = 0

begin transaction

update back set currentMoney = currentMondy + 100 where cid = 1

select * from bank

set @errorcount = @errorcount + @@error

update bank set currentMoney = currentMondy - 100 where cid = 2

set @errorcount = @errorcount + @@error

if(@errorcount <> 0)

begin

print '沒有異常,,提交'

commit transaction

end

else

begin

print '發(fā)生異常,回滾'

rollback transaction

end

判斷某條語句執(zhí)行是否出錯:

◆使用全局變量@@error;

◆@@error只能判斷當(dāng)前一條T-SQL語句執(zhí)行是否有錯,,為了判斷事務(wù)中所有T-SQL語句是否有錯,,我們需要對錯誤進(jìn)行累計。

如:set @errorSum = @errorSum + @error

1.10.4 事務(wù)類別

◆顯示事務(wù):用begin transation 明確指定事務(wù)的開始,,這是最常用的事務(wù)類型,。

◆隱性事務(wù):通過設(shè)置set implicit_transation語句,將隱性事務(wù)模式設(shè)置為打開,,下一個語句自動啟動一個新事務(wù),。當(dāng)該事務(wù)完成時,再下一個T-SQL語句又將啟動一個新事務(wù),。

◆自動提交事務(wù):這是SQL Server的默認(rèn)模式,,它將每條單獨的T-SQL語句視為一個事務(wù),如果成功執(zhí)行,,則自動提交,;如果錯誤,則自動回滾,。

1.10.5 JAVA程序中如何做事務(wù)

在Connection對象上做事務(wù),,autoCommit的屬性默認(rèn)為true,可以手工修改為false,,如果無異常,,則調(diào)用con.commit(),否則調(diào)用con.rollback();

package com.anllin.network;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;

public class TransactionTEst

{

public static void main(String[] args) throws Exception

{

String sql1= "update back set currentMoney = currentMondy + 100 where cid = 1";

String sql2= "update bank set currentMoney = currentMondy - 100 where cid = 2";

Connection con = null;

Statement sta = null;

try

{

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=testdb","sa","");

System.out.println("autoCommit = " + con.getAutoCommit() );

con.setAutoCommit(false);

sta = con.createStatement();

sta.executeUpdate(sql1);

sta.executeQuery(sql2);

con.commit();

}

catch (Exception e)

{

con.rollback();

e.printStackTrace();

}

finally

{

sta.close();

con.close();

}

}

}

小問題:暫時只能在一條con上做事務(wù),一般借助框架或容器,,使用JTI(Java Transaction Api)

1.11 索引

1.11.1 簡介

<!--[if !supportLists]-->l <!--[endif]-->漢語字典中的漢字按頁存放,,一般都有漢語拼音目錄(索引)、偏旁部首目錄等,。

<!--[if !supportLists]-->l <!--[endif]-->我們可以根據(jù)拼音或偏旁部首,,快速查找某個字詞。

<!--[if !supportLists]-->l <!--[endif]-->SQLServer中的數(shù)據(jù)也是按頁(4kb)存放的。

<!--[if !supportLists]-->l <!--[endif]-->索引:是SQLServer編排數(shù)據(jù)的內(nèi)部方法,,它為SQLServer提供一種方法來編排查詢的數(shù)據(jù),。

<!--[if !supportLists]-->l <!--[endif]-->索引頁:數(shù)據(jù)庫存放的數(shù)據(jù)頁,索引頁類似于漢語字典中按拼音或筆畫排序的目錄頁,。

<!--[if !supportLists]-->l <!--[endif]-->索引的作用:通過使用索引,,可以大大提高數(shù)據(jù)庫的檢索速度,改善數(shù)據(jù)庫

性能,。

1.11.2 類型

<!--[if !supportLists]-->l <!--[endif]-->唯一索引:唯一索引不允許兩行具有相同的索引值,。

<!--[if !supportLists]-->l <!--[endif]-->主鍵索引:為表定義一個主鍵將自動創(chuàng)建主鍵索引,主鍵索引是唯一的特殊類型,,主鍵索引要求主鍵中的每個值是唯一的,,并且不能為空,。

<!--[if !supportLists]-->l <!--[endif]-->聚焦索引(clustered):表中各行的物理順序與健值的邏輯(索引)順序相同,,每個表只能有一個。

<!--[if !supportLists]-->l <!--[endif]-->非聚焦索引(non-clustered):非聚焦索引指定表的邏輯順序,,數(shù)據(jù)存儲在一個位置,,索引存儲在另一個位置,索引中包含指向數(shù)據(jù)存儲位置的指針,,可以有多個,,小于249個。

1.11.3 語法 

create [unique/clustered/nonclustered]

index indexName

on tableName(columnName)

[with fillfactor=x]

<!--[if !supportLists]-->l <!--[endif]-->Unique:表示唯一索引,,可選

<!--[if !supportLists]-->l <!--[endif]-->clustered/nonclustered:表示聚焦索引還是非聚焦索引,,可選。

<!--[if !supportLists]-->l <!--[endif]-->Fillfactor:表示填充因子,,指定一個0到100之間的值,,該值指示索引頁填滿的空間所占的百分比。

if exists (select name from sysindexes where name = 'IX_name')

drop index bank.IX_name

create nonclustered index IX_name

on bank(customerName)

where fillfactor=30

go

select * from bank with(index=IX_name)

where customerName = 'zhangsan'

1.11.4 優(yōu)缺點

<!--[if !supportLists]-->l <!--[endif]-->優(yōu)點:

<!--[if !supportLists]-->n <!--[endif]-->加快訪問速度

<!--[if !supportLists]-->n <!--[endif]-->加強行的唯一性

<!--[if !supportLists]-->l <!--[endif]-->缺點:

<!--[if !supportLists]-->n <!--[endif]-->帶索引的表在數(shù)據(jù)庫中需要更多的存儲空間,。

<!--[if !supportLists]-->n <!--[endif]-->操縱數(shù)據(jù)的命令需要更長的處理時間,,因為它們需要對索引進(jìn)行更新。

1.11.5 創(chuàng)建索引的原則

<!--[if !supportLists]-->l <!--[endif]-->請按照下列標(biāo)準(zhǔn)選擇建立索引的列:

<!--[if !supportLists]-->n <!--[endif]-->該列用于頻繁探索

<!--[if !supportLists]-->n <!--[endif]-->該列用于對數(shù)據(jù)進(jìn)行排序

<!--[if !supportLists]-->l <!--[endif]-->請不要使用下面的列創(chuàng)建索引

<!--[if !supportLists]-->n <!--[endif]-->列中僅包含幾個不同的值,。

<!--[if !supportLists]-->n <!--[endif]-->表中包含幾行,。為小型表創(chuàng)建索引可能不太劃算,因為SQLServer在索引中搜索數(shù)據(jù)所花的時間比在表中逐行搜索所花的時間還要長,。

1.12 存儲過程

1.12.1 簡介

◆存儲過程在業(yè)界以前常常作為衡量程序員水平的標(biāo)準(zhǔn),,大蝦們喜歡吹噓自己寫過幾千行的存儲過,但現(xiàn)在作為java程序員,,些功能被弱化,,因為java程序講究的是與具體的數(shù)據(jù)庫相分離,但作為.net程序員,依然要掌握好此知識,。

◆存儲過程(Procedure)類似于C語言中的函數(shù),,用于執(zhí)行管理任務(wù)或應(yīng)用復(fù)雜的業(yè)務(wù)規(guī)則,存儲過程可以帶參數(shù),,也可以返回結(jié)果,。

◆存儲過程可以包含數(shù)據(jù)操縱語句、變量,、邏輯,、控制語句等。

1.12.2 語法

create proc[edure] procName

@param[1] dataType = value,

...

@param[n] dataType = defualt value [output]

as

T-SQL編程,,定義變量,,流程控制等

◆和C語言的函數(shù)一樣,參數(shù)可選

◆參數(shù)分為輸入?yún)?shù)(按值傳遞),、輸出參數(shù)(按引用傳遞),。

create proc test

@a int=100,

@b int output

as

print '傳遞來的a = ' + cast(@a as varchar(4))

print '傳遞來的b = ' + cast(@b as varchar(4))

set @a = @a +10

set @b = @b + 10

print '修改后的a = ' + cast(@a as varchar(4))

print '修改后的b = ' + cast(@b as varchar(4))

go

declare @c int

declare @d int

set @c = 100

set @d = 100

execute test @a=@c,@b=@d output

print @c

print @d

go

◆輸入?yún)?shù)允許有默認(rèn)值

◆創(chuàng)建存儲過程

create proc sp_transfer

@inId int,

@outId int,

@money int,

@inMoney int output,

@outMoney int output

as

update back set currentMoney = currentMondy + @money where cid = @inId

update back set currentMoney = currentMondy + @money where cid = @outId

select @inMoney = currentMoney from bank where cid = @inId

select @outMoney = currentMoney from bank where cid = @outId

go

◆執(zhí)行存儲過程

declare @a int

declare @b int

exec sp_transfer @inId=2,@outId=1,@money=100,@inMoney=@a output,@outMoney=@b output

print @a

print @b

◆在java中使用存儲過程

package com.anllin.proc;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.Types;

public class TestProc

{

public static void main(String[] args) throws Exception

{

int outId = 1;

int inId = 2;

int money = 100;

Connection con = null;

try

{

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

con = DriverManager.getConnection(

"jdbc:sqlserver://localhost:1433;databaseName=testdb",

"sa", "");

CallableStatement csta = con.prepareCall("{call sp_transfer()}");

csta.setInt(1,inId);

csta.setInt(2,outId);

csta.setInt(3,money);

csta.registerOutParameter(4,Types.INTEGER);

csta.registerOutParameter(5,Types.INTEGER);

csta.execute();

System.out.println(csta.getInt(4));

System.out.println(csta.getInt(5));

}

catch (Exception e)

{

e.printStackTrace();

}

finally

{

con.close();

}

}

}

1.12.3 優(yōu)點

◆執(zhí)行速度更快

◆允許模塊化程序設(shè)計

◆提高系統(tǒng)安全性

◆減少網(wǎng)絡(luò)流量

1.13 觸發(fā)器

1.13.1 簡介

◆觸發(fā)器是在對表進(jìn)行插入、更新或刪除操作時自動執(zhí)行的存儲過程

◆觸發(fā)器通常用于強制業(yè)務(wù)規(guī)則

◆觸發(fā)器是一種高級約束,,可以定義比用check約束更為復(fù)雜的約束

a)可執(zhí)行復(fù)雜的SQL語句(if/while/case)

b)可引用其它表中的列

◆觸發(fā)器定義在特定的表上,,與表相關(guān)。

◆自動觸發(fā)執(zhí)行

◆不能直接調(diào)用

◆是一個事務(wù)(可回滾)

練習(xí)用的表

create table bank

(

cid int identity primary key,

customerName char(10),

currentMoney money

)

go

alter table bank

add constraint CK_currentMoney

check(currentMoney >= 1)

go

insert into bank(customerName,currentMoney)

values('zhangsan',1000)

insert into bank(customerName,currentMoney)

values('lisi',1)

go

create table transInfo

(

tid int identity primary key,

cid int not null,

tdate datetime not null,

transType varchar(20) not null,

transMoney money not null

)

go

1.13.2 觸發(fā)器類型

◆Delete 觸發(fā)器

create trigger transInfoDeleteTrigger

on transInfo

for delete

as

if(not exists (select * from sysobjects where name='transInfoBackup'))

select * into transInfoBackup from deleted

else

insert into transInfoBackup select * from deleted

go

delete from transInfo where tid = 1

go

select * from transInfoBackup

go

◆Insert觸發(fā)器

create trigger backTrigger1

on bank

for insert

as

print '新增觸發(fā)器觸發(fā)了,,看看插入的數(shù)據(jù)'

select * from inserted

go

insert into bank(customerName,currentMoney)

values('wangwu',1000)

go

◆Update觸發(fā)器

create trigger backTrigger2

on bank

for update

as

select * from deleted

print '新增觸發(fā)器觸發(fā)了,,看看插入的數(shù)據(jù)'

select * from inserted

go

update bank set currentMoney = currentMoney + 150

go

1.13.3 兩張表

◆在觸發(fā)器觸發(fā)時:

系統(tǒng)自動在內(nèi)存中創(chuàng)建兩張臨時表,deleted表或inserted表,。

這兩張表為只讀,,不允許修改,觸發(fā)器執(zhí)行完成后,,自動刪除,。

◆Inserted表

臨時保存了插入或更新后的記錄行

可以從inserted表中檢查插入的數(shù)據(jù)是否滿足業(yè)務(wù)需求

如果不滿足,則向用戶報告錯誤,,并回滾插入操作

◆Deleted表

臨時保存了刪除或更新前的記錄行

可以從表中檢查被刪除的數(shù)據(jù)是否滿足業(yè)務(wù)需求

如果不滿足,,則向用戶報告錯誤,并回滾插入操作

修改操作

Inserted

Deleted

增加(insert)記錄

存放新增的記錄

----------

刪除(delete)記錄

-----------

存放被刪除的記錄

修改(update)記錄

存放更新后的記錄

存放更新前的記錄

1.13.4 創(chuàng)建觸發(fā)器的語法

create trigger triggerName

on tableName

[with encryption]--表示加密觸發(fā)器定義的SQL文本

for [delete,insert,update]--指定觸發(fā)器類型

as

T-SQL語句

go

應(yīng)用示例1

當(dāng)往交易信息表中插入一條數(shù)據(jù)時,,同時更新帳戶表中的金額

create trigger transInfoTrigger

on transInfo

for insert

as

declare @type varchar(20)

declare @money money

declare @cardId int

select @type=transType,@money=transMoney,@cardId=cid from inserted

if(@type = '存')

update bank set currentMoney = currentMoney + @money where cid = @cardId

else

update bank set currentMoney = currentMoney - @money where cid = @cardId

go

insert into transInfo(cid,tdate,transType,transMoney)

values(1,getdate(),'存',100)

go

select * from bank

select * from transInfo

應(yīng)用示例2

當(dāng)在交易信息表中刪除一條數(shù)據(jù)時,,備份這條數(shù)據(jù)到transInfoBackup表中

create trigger transInfoDeleteTrigger

on transInfo

for delete

as

if(not exists (select * from sysobjects where name='transInfoBackup'))

select * into transInfoBackup from deleted

else

insert into transInfoBackup select * from deleted

go

delete from transInfo where tid = 1

go

select * from transInfoBackup

go

應(yīng)用示例3

當(dāng)用戶交易金額大于20000時,不讓用戶操作,,并提示錯誤

alter trigger bankUpdateTrigger

on bank

for update

as

declare @oldMoney money

declare @newMoney money

declare @amount money

select @newMoney=currentMoney from inserted

select @oldMoney=currentMoney from deleted

set @amount = @oldMoney - @newMoney

if(@amount>=20000 or @amount <=-20000)

begin

print '交易錯誤,,金額最多為萬'

select * from bank

rollback transaction

end

go

insert into transInfo(cid,tdate,transType,transMoney)

values(1,getdate(),'存',10000)

go

select * from bank

1.13.5 列級update觸發(fā)器

Update 觸發(fā)器除了跟蹤數(shù)據(jù)的變化(修改)外,還可以檢查是否修改了某列的數(shù)據(jù),。

使用update(列)函數(shù)檢測是否修改了某列

問題:交易日期一般由系統(tǒng)自動產(chǎn)生,,默認(rèn)為當(dāng)前日期,,為了安全起見,,一般禁止修改,,以防舞弊,。(注意:時間分DB服務(wù)器時間和Web服務(wù)器時間)

分析:

Update(列名)函數(shù)可以檢測是否修改了某列

create trigger TG_updateTransInfo

on transInfo

for update

as

if update(tdate)

begin

print '交易失敗...'

raiserror ('安全警告:交易日期不能修改,由系統(tǒng)自動產(chǎn)生',16,1)

rollback transaction

end

go

update transInfo set tdate = getdate() where tid = 1

   ===========================================

分類: SQL Server
1
0
上一篇:查詢數(shù)據(jù)庫里所有表名和字段名
下一篇:SQL Server文章目錄

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多