優化MySchool數據庫設計之【巔峯對決】

           優化MySchool數據庫設計程序員

之獨孤九劍web

船舶停靠在港灣是很安全的,但這不是造船的目的面試

By:北大青鳥五道口原玉明老師    ajax

1.學習方法:sql

01.找一本好書shell

初始階段不適合,能夠放到第二個階段,看到知識點時,要進行驗證數據庫

02.查看幫助文檔和搜索引擎的使用編程

藉助網絡上的Blog文章安全

03.不要急功近利服務器

不要抱着速成的想法,不然必然走彎路
學習編程不是一蹴而就的事情
付出的成本高,纔能有一個高薪的收入

04.不要浮躁

不要什麼都學,只學有用的

浮躁的程度和技術水平成反比的
走本身的路,讓別人去浮躁去吧!

天天問問本身,我是否是開始浮躁了,不能人云亦云.

05.學習語言基礎很重要

基礎不紮實,開發出的程序就很危險
將所學的用到開發中去

06.何時去看別人的代碼?

揣摩編寫代碼人的思路,遠比本身寫軟件要可貴多
初學者不要去看別人的代碼

在紙上把調用關係畫出來,抓主線.

07.如何提升?

有主動性。學習的慾望要強。上網找別人的問題,爲本身來提升

08.培養髮現問題、思考問題和解決問題的能力

出錯信息,異常信息
養成發現問題、思考問題和解決問題的能力

這種能力受益一生,且不隨時間變化

09編程的思想

多用心,多動手
程序運行的原理和機制
編程的目的,函數的調用,內存模型

10.先學脈絡,再學枝葉

第一章 數據庫設計

1、Chp01數據庫設計

  01.簡述數據庫完整性及其做用?

解析:數據的準確性,保證數據中數據的準確性。

  02.基本操做語句(DML DDL DCL)有哪些?語法是?

DML(data manipulation language):自動提交的數據庫操做語言
它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字同樣

DDL(data definition language):自動提交的數據庫定義語言
主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定義或改變表(TABLE)的結構,數據類型,表之間的連接和約束等初始化工做上,他們大多在創建表時使用

DCL(Data Control Language):
是數據庫控制功能。是用來設置或更改數據庫用戶或角色權限的語句,包括(grant,deny,revoke等)語句。在默認狀態下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人員纔有權力執行DCL

DQL:數據庫查詢語言,關鍵字:select

Insert、update、delete、select

這裏以student表爲例:

Insert into student(name,age) values(‘張三’,18)

Update student set name=’ 李四’ where id=1

Delete from student where id=2

見到update和delete,必須有where

Select * from student where id=1

  03.經常使用的聚合函數有哪些?

Avg():求平均值

Sum():求和

Max();求最大值

Min():求最小值

Count():求總的記錄數,count(1)和count(*)等價,通常認爲count(1)效率高。

  04.表聯接分爲哪幾種類型?

內鏈接,外鏈接和交叉聯接(數據庫原理)

1、 預習檢查

1. 在數據庫計時,使用什麼方式表示數據庫實體之間的關係?

E-R圖

2. 實體集X和Y存在哪幾種關係?

3. 數據庫三大範式的做用是什麼?

2、 本章目標

1. 瞭解設計數據庫的步驟

2. 掌握如何繪製數據庫的E——R圖

3. 掌握如何繪製數據庫模型圖

4. 使用三大範式實現數據庫設計規範化

3、 數據庫

1. 爲何要設計數據庫?

首先,良好的數據庫設計:

01. 能夠節省數據的存儲空間

02. 可以保證數據的完整性

03. 方便進行數據庫應用系統的開發

糟糕的數據庫設計:

01. 數據冗餘、存儲空間浪費

02. 內存空間浪費

03. 數據更新和插入的異常

由此,咱們得出一個結論,當數據庫比較複雜時,咱們須要設計數據庫

2. 軟件項目開發週期中數據庫設計

wpsC9F4.tmp

從上圖咱們能夠看出,軟件開發中設計數據庫的步驟:

首先,咱們要從現實世界的需求構建出一個模型,這種模型經過E——R圖的方式反映,若是肯定E——R知足了客戶的需求,那麼咱們須要將E-R圖規範化,構建出數據庫模型圖,固然在這個圖表中要反映出各個數據對象之間的關係,最後咱們根據數據庫模型圖構建出符合咱們需求的數據庫。

     需求分析階段:分析客戶的業務和數據處理需求

概要設計階段:設計數據庫的E-R模型圖,確認需求信息的正確和完整

詳細設計階段:應用三大範式審覈數據庫結構

代碼編寫階段:物理實現數據庫,編碼實現應用

軟件測試階段:……

安裝部署:……

3. 設計數據庫的步驟

01. 收集信息

與該系統有關的人員進行交流,座談,充分了解用戶需求,理解數據庫須要完成的任務。

02. 標識實體(Entity)

標識數據庫要管理的關鍵對象或者實體,實體通常都是名詞

03. 標識每一個實體的屬性

04. 標識實體之間的關係

4.E—R圖

wpsCA04.tmp

映射基數:

主要分爲如下幾類:

一對一:一輛車只能對應一個車位

一對多:一個客房能夠入住多個客人

多對一:多個客人能夠入住一個客房

多對多:一本書能夠被多我的接,一我的也能夠借多本書

        或者是一個老師能夠教多個班級,一個班級能夠被多個老師教

一個關係的屬性名的集合稱爲關係模式

Rdbms:

relational database management system 關係型數據庫管理系統

01. 僅有好的RDBMS並不足以免數據冗餘,必須在數據的設計中建立好的表結構

02. Dr  E.F.codd,一個IBM研究員。最初定義了規範化的三個級別,範式是具備最小冗餘的表結構

03. 這些範式是:

第一範式(1ST NF—First  Normal   Form)

第一範式的目標是確保每列的原子性

若是沒列都是不可再分的最小單元(也稱爲最小的原子單元),則知足第一範式(1nf)

第二範式(2nd NF—Second  Normal  Form)

若是一個關係知足1NF,而且除了主鍵之外的其餘列,都依賴於該主鍵,則知足第二範式(2NF),第二範式要求每一個表只描述一件事情。

第三範式(3rd NF—Third  Normal  Form)

若是一個關係知足2NF,而且除了主鍵之外的其餘列都不傳遞依賴於主鍵列,則知足第三範式(3NF)

今天總算理解清楚了一點,:

第二範式是其餘列都要依賴於主鍵列,可是沒有說明是直接依賴仍是間接依賴。也就是直接依賴和間接依賴都可以。可是第三範式明確指出只能是直接依賴。

若是出現間接依賴的狀況,要單獨獨立出來一張表.

5,規範化和性能的關係

爲知足某種商業目標,數據庫性能比規範化數據庫更重要

  具體策略和方法:

01. 經過在給定的表中添加額外字段,以大量減小須要從中搜索信息所需的時間

02. 經過在給定的表中插入計算列(好比成績總分),以方便查詢

        在數據規範化同時,要綜合考慮數據庫的性能。

  05.設計數據庫步驟

第一步:需求分析(收集信息)

第二步:繪製E-R圖 (標示實體 ,找到實體的屬性 , 標註實體間的關係)

第三步:將E-R圖轉換成數據庫模型圖

第四步:將數據庫模型圖轉換成數據表

  06.如何繪製E-R圖

  矩形;實體

  橢圓形:屬性

  菱形:關係

  07.如何繪製數據庫模型圖

PowerDesigner :選擇PhysicalModel

若有有人不當心關掉了Platter,對工具欄點擊右鍵,勾選Platter便可。

當咱們將數據庫模型圖設計完畢後,能夠經過菜單中的database下的

Generate Database來生成對應的sql

  08.三大範式規範數據庫設計

第一範式:保證每列的原子性,不可再被拆分

第二範式:在知足第一範式的基礎上,一張表只能描述一件事情

第三範式:在知足第二範式的基礎上,除了主鍵列以外其餘列都要直接依賴於主鍵

要在規範化和性能之間取一個平衡

4、 課程總結

01. 在需求分析階段,設計數據庫的通常步驟是什麼?

收集信息

標識實體

標識每一個實體的屬性

標識實體之間的關係

02. 在概要設計階段和詳細設計階段,設計數據庫的步驟是什麼?

繪製E——R圖

將E—R圖轉化爲數據庫模型圖

應用三大範式規範化表設計

03. 爲了設計結構良好的數據庫,須要遵照一些專門的規則,稱爲數據庫的設計範式,分別是什麼?

三大範式

wpsCA15.tmp

第二章 數據庫的實現

2、Chp02 數據庫的實現

1.單詞

2.第一章內容回顧

3.T-SQL語句回顧

--重點內容

01.代碼建立數據庫

02.代碼建立數據表

03.代碼建立約束

04.代碼刪除數據庫、表和約束

課程任務:

--若是有些同窗是Win7系統,那麼不要往C盤寫入文件

--*******************************1.建立一個名稱爲S2220的數據庫(王建琦)*   

--第一步執行sp configure 啓用xp_cmddshell

exec sp_configure 'show advanced options',1

go

reconfigure

go

--這個哥們兒很牛X,

--檢測你的密碼多久能被破解

--https://howsecureismypassword.net/

exec sp_configure 'xp_cmdshell',1

go

reconfigure

go

--01.Server版操做系統

--02.殺毒軟件全盤殺毒

--第二步如下字符串表明DOS 命令

exec xp_cmdshell 'mkdir C:\aaaaa'

create database S2218 --新建 數據庫 名稱

on primary --通向

(

name='S2218_data', --邏輯文件名

filename='c:\aaaaa\S2218_data.mdf', --物理文件名--掛盤符,有後綴

size=5mb, --初始大小

filegrowth=15% --文件增加量

)

log on

(

name='S2218_log',

filename='c:\aaaaa\S2218_log.ldf',

size=2mb,

filegrowth=1mb

)

go

create database S2220 --新建 數據庫 名稱

on primary --通向

--*******************************2.建立一個學生表Student(梅新園)***************************************************************    

Student(Sid,Sname,Sage,Sremark,Cid)

use S2218

--如何斷定數據庫中有沒有某張表???sysobjects

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

--刪除表

drop table Student

create table Student1 --建立表的基礎語句‘Student’是表的名稱

(

Sid int identity(1,1) primary key NOT NULL,

Sname nvarchar(32) not null,

Sage int NOT NULL,

Sremark nvarchar(255) not null default('無備註'),

Cid int not null,

address nvarchar(255) not null

)

--*********************************3.建立一個年級表(邢妮萍) Grade(Cid,Cname)

-- 若是表存在,刪除表

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

drop table grade

create table Grade

(

cid int identity(1,1) primary key not null,

cName nvarchar(20) not null

)

--******************************4.代碼方式給Student表中添加條數據(郭楠)*   

use S2218

insert into Grade(cName) values('精英班')

insert into Grade(cName) values('牛X班')

insert into Grade(cName) values('衝刺班')

select* from grade

insert into Student(Sname,Sage,Sremark,Cid,address) values('李小龍',1,'xxxxx',1,'xxxxxx')

--****************************************5.添加主鍵約束(阮羣傑)

給Student表添加主鍵約束,若是有,刪除原約束再添加

給Grade表添加主鍵約束 ,若是有 ,刪除再添加

select * from sysobjects

where type='k' and name='pk_sid'

--Grade表添加一個逐漸

alter table grade

add constraint PK_cid primary key(cid)

alter table Student

add constraint pk_Sid primary key(Sid)

alter table Student

drop constraint PK__Student__CA1E5D7808EA5793

--******************************** 6.添加外鍵約束(張碩)

/*常見的約束:

          1:主鍵約束

          2:惟一約束

          3:檢查約束

          4:外鍵約束

          5:默認約束

          6:非空約束

       */

搞清楚誰是主鍵表誰是外鍵表

alter table student --student表明從表

add constraint FK_foreign

foreign key(cid) references grade(cid)

--*******************7.添加惟一約束,保證學生姓名惟一(李京濤)

use S2218

alter table student

add constraint uq_sname unique (sname)

select * from Student1

insert into Student(Sname,Sage,Sremark,address,Cid)values('小明','20','北京啊','北京',1)

--********************8.添加默認約束(備註默認值爲:無備註)(王承風)

alter table Student

add constraint DF_Sremark default('無備註') for Sremark

insert into Student1(Sname,Sage,address,Cid)values('小明','20','北京',1)

--**********************9.添加檢查約束學生年齡>=18歲(張輝)

alter table Student

add constraint CK_Sage Check(Sage>=18)

update Student set Sage=18

where Sage=20

select * from Student

        10.刪除數據庫,刪除表,刪除約束(高宏兵)

--回閃

--刪除約束

alter table Student

drop constraint PK_SID

--刪除表

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

drop table student1

--刪除數據庫

use master

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

drop database s2218ss

第三章 SQL編程

3、SQL編程

01.全局變量

@@:

全局變量都是系統定義的,程序員不能本身手動定義全局變量

  *01.@@Identity:返回上一條insert語句的主鍵值

  *02.@@rowcount:返回上一條SQL語句受影響的行數

  *03.@@Servername: 返回Server名稱

  *04.@@Version:獲取SQL Server版本信息

  *05.@@error

--全局變量:程序員不會本身定義全局變量,通常使用系統現有的全局變量.

--@@error:特別十分很是極其之強大(能捕獲上一條SQL語句的錯誤號)

未來你們須要作一個存盤操做

可能中間涉及到的業務有至少有3個

若是select @@error,結果>0,確定有一個環節出錯了,那麼我就讓全部的環節通通取消,保證數據庫數據的準確性。

----001 @@Error:獲取最後一條SQL語句的錯誤號,通常用@@Error捕獲約束錯誤,而不是SQL

--語句自己的語法錯誤。

--做用:當咱們處理很是複雜的業務流程的時候,單條SQL語句已經沒法知足要求,因此

--咱們要將一堆SQL語句封裝成一個存儲過程。該存儲過程當中,可能有多個增刪改操做。如

--果其中某一個操做因爲違反約束,形成執行失敗,那麼咱們就須要將存儲過程當中全部的N

---項操做一次性回滾,這個時候@@Error就起到了相當重要的做用。每執行一個操做就獲取一下

--@@Error的值,到最後,看@@Error的值是否大於,若是大於,就證實其中某一個環節(操做)

--出現錯誤,要總體回滾。

02.局部變量

01.語法

Declare @age int

--賦值

Set @age=20

--在屏幕上輸出

Print @age

02.經過select給變量賦值

Declare @stuNo int

Select @stuNo=studentno from student

Where studentno=23270

03.sql server 中常見數據類型的賦值

Int

Nvarchar(32)

Datetime

小數:decimal(18,2)

布爾類型:bit

03.select 和set賦值方式的區別

區別1:set不支持一次性給多個變量賦值,但select支持

區別2:若是給一個變量賦多個值,set報錯,select返回最後一個

區別3:若是結果集爲空值,set方式返回null,而select返回原值

04什麼場景下選用select,什麼場景下選用set

--若是是從某一張表中獲取數據賦值給某個變量,那麼只能用select

--其餘的場景下兩個等價

05.datediff(按年月日計算,小日期,大日期)

   Datepart(按年月日計算,日期)

Dataadd()

select dateadd(yy,2,getdate())

15K/月以上

05.類型轉換

爲何要進行類型轉換?

Cast(要轉換的變量 as 目標類型)

   Convert(目標類型,要轉換的變量,120)

  Ceiling和floor(向下取整)

If --else

回顧:

01.局部變量

Declare @num int  

Set @num=5

Print @num

02.全局變量

@@error:上一條違反約束的SQL語句的錯誤號

@@identity:獲取上條insert語句的自增列的值

@@servername:服務器的名稱

@@version:版本

@@rowcount:返回上一條sql的受影響行數

03.select 和set

01.select能夠一次性對多個變量賦值, 而set不能夠

02.當表達式返回多個值,select返回最後一個,set報錯。

03.當表達式沒有返回值,select保持原值 ,set爲null

04.cast(表達式 as 數據類型)

   Convert(數據類型,表達式,120)

05.if-else

  If(){

} else if(){

}

--2007年

--6.2 ---6.3

/*第三章SQL筆記

回顧:.數據庫的完整性包括哪些內容?

1.域完整性(列)例如:age>=50

2.實體完整性(行)

3.引用完整性(外鍵)

4.自定義完整性(針對業務需求而言)

實體完整性約束 就是主鍵約束

引用完整性約束 就是外鍵約束

02.如何爲數據表添加約束?

解析:*/

--01.非空約束

alter table Student

add constraint Gender check(Gender is not null)

--02.主鍵約束(PK) primary key constraint 惟一且不爲空

alter table Student

add constraint PK_stuNo primary key(stuid)

--03.惟一約束(UQ)unique constraint 惟一,容許爲空,但只能出現一次

alter table Student

add constraint UQ_Address unique(Address)

--04.默認約束(DF)default constraint 默認值

alter table Student

add constraint DF_Address default('地址不詳') for address

--05.檢查約束(CK)check constraint 範圍以及格式限制

alter table Student

add constraint CK_age Check(age>20)

--06.外鍵約束(FK)foreign key constraint 表關係

alter table score

add constraint FK_stuid foreign key(stuid)

references student(stuid)

--03.數據庫的通常實現步驟有哪些(代碼建立數據庫)?

解析:

create database S2218

on primary

(

name='S2218',--邏輯文件名:任意取,能夠

filename='d:\S2218.mdf',--物理文件名:硬盤上的真實文件的名稱

size=50mb,--文件的初始大小

maxsize=100mb,--文件最大的大小(出現數據存取異常)

filegrowth=15%--文件的增加量,能夠用百分比,也能夠用大小(MB)

)

log on

(

name='S2218_log',

filename='d:\S2218_Log.ldf',

size=5mb,

maxsize=10mb,

filegrowth=1mb

)

/*預習檢查

01.使用T-SQL語句如何聲明一個變量?

解析:

1.declare @name int 

set @name=4

02.T-SQL語言中,WHILE循環結構若是包含多條語句,須要使用什麼標識?

解析:begin end

03.T-SQL語言中,Case語句有什麼做用?

解析:跳轉執行SQL語句

*/

精彩課程

1.F1調用幫助文件

2.變量定義

--兩類:局部(@)和全局(@@)

--在SQL Server中咱們也能夠定義變量

--局部變量經過@標識

--

select @@identity

select @@IDENTITY

select @@SERVERNAME

select @@VERSION

insert into admin values('1','1')

select @@ERROR

--全局變量:程序員不會本身定義全局變量,通常使用系統現有的全局變量.

--@@error:特別十分很是極其之強大(能捕獲上一條SQL語句的錯誤號)

----001 @@Error:獲取最後一條SQL語句的錯誤號,通常用@@Error捕獲約束錯誤,而不是SQL

--語句自己的語法錯誤。

--做用:當咱們處理很是複雜的業務流程的時候,單條SQL語句已經沒法知足要求,因此

--咱們要將一堆SQL語句封裝成一個存儲過程。該存儲過程當中,可能有多個增刪改操做。如

--果其中某一個操做因爲違反約束,形成執行失敗,那麼咱們就須要將存儲過程當中全部的N

---項操做一次性回滾,這個時候@@Error就起到了相當重要的做用。每執行一個操做就獲取一下

--@@Error的值,到最後,看@@Error的值是否大於,若是大於,就證實其中某一個環節(操做)

--出現錯誤,要總體回滾。!

--02.@@IDENTITY:返回上一條insert語句的自增列的值

select * from grade

insert into grade values('牛X班')

select @@identity

--03.@@serveraname:獲取服務器名稱

select @@SERVERNAME

--04.@@version:獲取版本號

select @@VERSION

use MySchool

update student set gender='阿達費隨碟附送'

where studentno=23

declare @sum int

select @@ERROR as 錯誤號

課程以前:

--咱們知道在C#中變量分紅兩類:局部變量和成員變量。

--局部變量:在方法中定義的變量

--成員變量:在類中定義的變量,和方法同一級別(出如今方法的花括號以外)

--01.在SQL中如何定義一個變量??

--變量分爲局部變量和全局變量:

局部變量:@做爲前綴,如@age

全局變量以@@做爲前綴,如@@version

所有變量由系統定義和維護,咱們只能讀取,不能修改

--SQL中變量也分紅兩類:局部變量和全局變量

--011.局部變量

--int

declare @num int

set @num=0

print @num

--字符串

declare @name nvarchar(32)

set @name='張三'

print @name

--日期

declare @mydate datetime

set @mydate=getdate()

print @mydate

--小數

declare @price decimal(18,2)

set @price=18.89

print @price

--程序的boolean對應數據庫中的bit   在SQL Server中認爲就是假,非就是真

declare @sex bit

set @sex=-1000

print @sex

insert into admin

values('1112','1112',20.59,1000)

use MySchool

select * from Student

--查詢和微冷的雨相鄰的學生信息

--定義一個變量,保存微冷的雨的學號

declare @stuno int

select @stuno=StudentNo from student

where studentno=23311

print @stuno

--李小龍

select * from student

where studentno=@stuno-41

--張靚穎

select * from student

where studentno=@stuno+5

--局部變量練習一

--set與select區別

--01.set不支持給多個變量賦值的,可是select支持

declare @num1 int,@num2 int

select @num1=studentno,@num2=gradeid from student

where studentno=23270

--02.表達式返回多個值的時候,set會出錯,可是select會將最後一個值賦值給變量

declare @result nvarchar(20)

select @result=studentname from student

print @result

select * from student

declare @myresult nvarchar(20)

set @myresult=(select studentname from student)

print @myresult

--03.當表達式沒有返回值時,set變量會被賦值爲null

declare @myresult nvarchar(20)

set @myresult='李四'

set @myresult=(select studentname from student where 0>100)

if(@myresult is null)

begin

print '是空'

end

USE ajax

select * from admin

where uaddress=null

null--不表明空,表明不知道。

use myschool

declare @myresult nvarchar(20)

set @myresult='張三'

select @myresult=studentname from student where 0>100

select @myresult

--03.什麼場景下選用select,什麼場景下選用set

--若是是從某一張表中獲取數據賦值給某個變量,那麼只能用select

--其餘的場景下兩個等價

declare @tag nvarchar(2)

set @tag='★'

print @tag

print @tag+@tag

print @tag+@tag+@tag

print @tag+@tag+@tag+@tag

print @tag+@tag+@tag+@tag+@tag

--go的位置:結論:若是語句是select,那麼go關鍵字能夠和select語句位於同一行,其餘語句要另起一行.

--go的含義是將go以前全部的語句當作是一個可執行單獨,用白話來講,就是將一堆sql語句,一次性的交給SQL Server引擎處理.

select * from student

select * from grade

go

create table test

(

id int primary key not null,

name nvarchar(20)

)

go

select dateadd(yy,2,getdate())

--*************************1.局部變量案例*********************************************

--**************************練習********************************************

--練習:查詢學號是(李小龍)的學生姓名和年齡,並輸出比他小歲的學員信息(姓名和年齡)

--01.先找出李小龍的年齡@age 

declare @age int

select @age=datediff(yy,birthday,getdate()) from student

where studentno=23270

--02.where 年齡=@age-1

select studentname,datediff(yy,birthday,getdate())

from student

where datediff(yy,birthday,getdate())=@age-1

--**************************3.SQL Server數據類型轉換**********************************

--在SQL Server中數據類型轉換有兩種方式

--方式一:Cast(要轉換的變量as 目標類型)

declare @num int

set @num=20

print '個人年齡是'+cast(@num as nvarchar(20))+'歲'

print '個人年齡是'+convert(nvarchar(20),@num)+'歲'

--日期類型轉字符串

declare @date datetime

set @date=getdate()

print '今天是'+convert(nvarchar(20),@date,120)

--方式二:Convert(目標類型,要轉換的變量,style)

--**************************4.floor和ceiling函數********************************

--floor:

select floor(1.92) --向下取整

--ceiling

select ceiling(1.01) --向上取整

--**************************5.邏輯控制語句********************************************

--********************if else    while     case end************************************************

--如今定義一個變量,判斷該變量的值是否大於

declare @num int

set @num=6

if(@num>=50)

print '請根據您的身體情況選擇性觀看'

else

begin

print '年齡小於,不能觀看'

print '你能看到我嗎'

end

05.if--else的使用

--練習:

--統計並顯示-08-09 的oop考試平均分

--若是平均分在以上,顯示「考試成績優秀」,並顯示前三名學生的考試信息

--若是在如下,顯示「考試成績較差」,並顯示後三名學生的考試信息

--定義一個變量保存oop對應的課程編號

declare @subid int

select @subid=SubjectId from Subject

where subjectname='oop'

--定義一個變量,保存平均分

declare @avg int

--如何求2013-08-09   oop  平均分

select @avg=AVG(StudentResult) from result

where examdate>='2013-08-09' and examdate<'2013-08-10'

and subjectid=@subid

--斷定@avg和的關係

if(@avg>=70)

begin

--01.打印成績優秀

print '成績優秀'

--02.顯示前名學生成績信息

select top 3 studentno,studentresult from result

where examdate>='2013-08-09' and examdate<'2013-08-10'

and subjectid=@subid

order by studentresult desc

end

else

begin

print '成績好爛!罰吃番薯'

end

declare @num int

set @num=5

if(@num=1)

begin

print '1'

end

else if(@num=2)

begin

print '2'

end

else

begin

print 'aa'

end

06.while 循環

--在SQL 中,只有while一種循環,沒有do-while和for循環

--而且沒有while(true)的寫法,可使用while(1=1)替代。

--注意:SQL中比較是否相等,用單等號(=)

--求出到之間全部偶數的和

while(9=9)

begin

print '11'

end

--int count = 0;

--          for (int i = 0; i <= 100; i++)

--          {

--              if (i%2==0)

--              {

--                  count += i;

--              }

--          }

--          Console.WriteLine(count);

--          Console.ReadLine();

--注意點:每一次更改變量值的時候,都要加上set關鍵字

--在SQL Server中不支持++,支持+=

--在SQL Server中,對比變量使用=

01.1到100之間全部偶數的和

--01.定義一個變量,保存總和

declare @sum int

set @sum=0

--02.定義一個初始變量

declare @num int

set @num=1

--03.進行while循環

while(@num<=100)

begin

--斷定

if(@num%2=0) --代碼執行到這裏,證實@num是偶數

begin

set @sum+=@num

end

set @num+=1

end

--出了循環,打印總和sum

print @sum

02.打印直角三角形

*

**

***

****

*****

--用循環的方式打印出直角三角形(不是重點,是難點)

declare @i int

declare @j int

declare @str nvarchar(100)

set @i=1

set @j=1

set @str=''

while(@i<=5)

begin

while(@j<=@i)

begin

set @str+='*'

set @j+=1

end

print @str

set @i+=1

end

declare @str2 nvarchar(200)

declare @count int

declare @result nvarchar(200)

set @str2='*'

set @count=0

set @result=''

while(@count<5)

begin

set @result+=@str2

print @result

set @count+=1

end

print '你好'+char(9)+'吃飯'

07.設置輸出結果的格式

--****************************6.設置輸出結果的格式***************************************

--若是咱們想讓【結果】和【消息】窗口在同一個窗口顯示,那麼咱們能夠

--點擊工具→選項→查詢結果→SQL Server界面,將選項改爲以文本形式顯示結果

--*****************************************************************************

use myschool

select * from student

--內容回顧

/*

   1.局部變量

   declare @num int

   set @num=5

   print @num

   2.全局變量:通常不會本身定義全局變量

   @@error:捕獲上一條SQL宇語句的錯誤號。若是返回證實上一條語句沒有問題

   3.while:

   while(1=1)

   begin

   end

   if --else

   4.類型轉換

   convert(目標數據類型,要轉換的變量,120)  cast(變量as 目標數據類型)

*/

select * from student

--****************** 7.經典while循環加分題目***************************************

--檢查學生「oop」課最近一次考試是否有不及格(分及格)的學生。

--若有,每人加分,高於分的學生再也不加分,直至全部學生此次考試成績均及格

--***********************************************************************

--01.看一下oop課程最近一次考試分如下人數

--準備一個變量,保存不及格人數,科目編號,最近考試時間

--01.科目編號

select * from result

declare @subid int

select @subid=subjectid from subject

where subjectname='oop'

--02.最近一次考試時間

declare @mydate datetime

select @mydate=max(examdate) from result

where subjectid=@subid

--03.不及格人數

declare @num int

select @num=count(1) from result

where subjectid=@subid

and examdate=@mydate

and studentresult<70

--04.

while(@num>0) --有成績低於分的學員,

begin

--每一個人+2分,可是分以上不加分

update result set studentresult+=2

where studentresult<95

and subjectid=@subid

and examdate=@mydate

select @num=count(1) from result

where subjectid=@subid

and examdate=@mydate

and studentresult<70

print @num

end

select * from result

order by subjectid,examdate

08.Case End 經典練習

--Case End在面試的時候,會換一種方式考察,就是行轉列。

--*************************8.Case End 經典練習******************************************

--採用美國ABCDE五級打分制顯示學生oop課最近一次考試成績(姓名等級)

--A級:   90分以上

--B級:80-分

--C級:   70-分

--D級:60-分

--E級:60分如下

--*****************************************************************************

declare @subid int

declare @maxdate datetime

select @subid=subjectid

from subject

where subjectname='oop'

select @maxdate=max(examdate)

from result

where subjectid=@subid

select studentname,等級=

case

when studentresult>=90 then 'A'

when studentresult>=80 then 'B'

when studentresult>=70 then 'C'

when studentresult>=60 then 'D'

else 'E'

end

from student,result

where student.StudentNo=result.StudentNo

and subjectid=@subid

and examdate=@maxdate

select * from result

--方式二

declare @subid int

declare @maxdate datetime

select @subid=subjectid

from subject

where subjectname='oop'

select @maxdate=max(examdate)

from result

where subjectid=@subid

select studentname,等級=

case

StudentResult

when 90 then 'A'

when 80 then 'B'

when 70 then 'C'

when 60 then 'D'

else 'E'

end

from student,result

where student.StudentNo=result.StudentNo

and subjectid=@subid

and examdate=@maxdate

--方式二:when後面不是區間,而是定值的時候

--可使用該方式

declare @subid int

declare @date datetime

select @subid=subjectid from subject

where subjectname='oop'

select @date=max(examdate)

from result

where subjectid=@subid

select studentname,等級=

case studentresult

when 90 then 'A'

when 80 then 'B'

when 70 then 'C'

when 60 then 'D'

else 'E'

end

from student,result

where student.studentno=result.studentno

and subjectid=@subid

and examdate=@date

select * from result

--Go

select * from student

select * from subject

go

--go必須獨佔一行

create table myttttt3

(

id int identity(1,1) primary key not null,

name nvarchar(20)

)

go

select * from sysobjects where name='mm'

/*1.一道SQL語句面試題,關於group by

表內容:

2005-05-09 勝

2005-05-09 勝

2005-05-09 負

2005-05-09 負

2005-05-10 勝

2005-05-10 負

2005-05-10 負

若是要生成下列結果, 該如何寫sql語句?

            勝負

2005-05-09 2 2

2005-05-10 1 2

------------------------------------------

*/

create table tmp(rq varchar(10),shengfu nchar(1))

select * from tmp

insert into tmp values('2005-05-09','勝')

insert into tmp values('2005-05-09','勝')

insert into tmp values('2005-05-09','負')

insert into tmp values('2005-05-09','負')

insert into tmp values('2005-05-10','勝')

insert into tmp values('2005-05-10','負')

insert into tmp values('2005-05-10','負')

select * from tmp

select rq as 日期,sum

(case

when shengfu='勝' then 1 

else 0 

end) as 勝,sum

(

case

when shengfu='負' then 1 

else 0

end

) as 負

from tmp

group by rq

第四章   高級查詢

4、高級查詢

本章依次講解四個問題:

01.簡單子查詢 

02.in/not in 子查詢  

03.Exists子查詢 

04.T-SQL語句的綜合應用

01.簡單子查詢

案例1:查詢學生表中比"美洋洋"小的學員信息(姓名,地址)

--不用變量

--所想即所得

select studentname,address

from Student

where Birthday>(select Birthday from Student where StudentName='美洋洋')

案例2:查詢「oop」課程至少一次考試恰好等於分的學生(姓名,成績)

select Studentname,studentresult

from Student,result,Subject

where Student.StudentNo=Result.StudentNo

and Result.SubjectId=Subject.SubjectId

and SubjectName='oop'

and StudentResult=60

--用子查詢如何實現???

--用到什麼條件,交給子查詢解決

select studentname,studentresult

from Student,Result

where Student.StudentNo=Result.StudentNo

and SubjectId=(select SubjectId from Subject where SubjectName='oop')

and StudentResult=60

--只檢索學生姓名

select studentname

from Student

where StudentNo in

(select StudentNo

from Result

where StudentResult=60 and SubjectId=

(select SubjectId

from Subject

where SubjectName='oop'

)

)

--悲傷,痛苦,折磨,鬱悶,堅韌,忍辱負重。鳳凰涅槃,破繭成蝶

--01.簡單子查詢(嵌套子查詢)的執行機制:

--將子查詢的結果做爲外層父查詢的一個條件。

--也就意味着先執行子查詢,再執行父查詢

--子查詢:子查詢語句必須用小括號括起來,而後經過

--比較運算符:>、<,=等鏈接起來

--注意點:.子查詢必須用小闊號括起來

--2.子查詢先執行出一個結果,而後將該結果做爲父查詢

--的一個條件而存在

select * from Student

where Birthday>

(

select Birthday from Student

where StudentName='張靚穎'

)

--01.查詢參加最近一次「OOP」考試成績最高分和最低分

--人家要什麼數據你就在select後寫什麼

--02.查詢「oop」課程至少一次考試恰好等於分的學生姓名

--分析思路:查詢結果是是什麼,就寫到Select後,

--而後根據須要的條件一步一步往下寫,用到某個變量,須要

--跨表訪問,讓子查詢幫咱們完成。

--子查詢要想用的熟練,必須對錶之間的公共字段(外鍵)特別清晰。

--在腦海中能隨意存取各表之間的對應關係。

--子查詢引用場景要比錶鏈接廣

02.in/not in 子查詢 

案例1:.查詢參加「oop」課程最近一次考試的在讀學生名單(學生姓名,學生編號)

--既然查詢在讀學生名單,必須是成績表中出現的學號

select studentname,studentno

from student

where studentno in

(

select studentno from result

where subjectid in

(

select subjectid from subject

where subjectname='oop'

)

and examdate=

(

select max(examdate) from result

where subjectid in

(

select subjectid from subject

where subjectname='oop'

)

)

)

案例2:.查詢S1開設的課程

select * from subject

select * from grade

select subjectname from subject

where gradeid in

(

select gradeid from grade where gradename='S1'

)

select * from result

order by subjectid,examdate

select * from student

案例3:查詢最近一次未參加oop考試的學生名單(studentname)

select studentname

from student

where studentno not in

(

select studentno from result

where subjectid in

(

select subjectid from subject where subjectname='oop'

)

and examdate=

(

select max(examdate) from result where subjectid in

(

select subjectid from subject where subjectname='oop'

)

)

)

and gradeid= --過濾掉自己就不用參加該門課程考試的學生

(

select gradeid from grade

where gradename='S1'

)

03.Exists和Not  Exists子查詢

use master

if exists (select * from sysdatabases where name='的人工費爲挖墳熱瓦爾五二五二五')

begin

print '你存在!@'

end

else

print '不存在'

--斷定符合條件的數據是否存在,若是存在,執行分支A,若是不存在,執行

--分支B

案例1:檢查「oop」課程最近一次考試。

--若是有80分以上的成績,則每人提分;

--不然,每人提分。最終的成績不得大於分

--01.保證課程是oop

--02.最近一次

--檢查是否有分以上的成績

use myschool

select * from result

order by subjectid ,examdate

if exists

(

select * from result where subjectid=

(

select subjectid from subject

where subjectname='oop'

)

and examdate=

(

select max(examdate) from result

where subjectid=

(

select subjectid from subject

where subjectname='oop'

)

)

and studentresult>=80

)--若是有結果,有分以上的學員,每人加分

begin

--存在,加分

--99

--分狀況,若是分數<=98加分,不然直接update成分   97

--將大於的分數置成

update result set studentresult=100

where studentresult>98

and subjectid=

(

select subjectid from subject

where subjectname='oop'

)

and examdate=

(

select max(examdate) from result

where subjectid=

(

select subjectid from subject

where subjectname='oop'

)

)

update result set studentresult+=2

where studentresult<=98

and subjectid=

(

select subjectid from subject

where subjectname='oop'

)

and examdate=

(

select max(examdate) from result

where subjectid=

(

select subjectid from subject

where subjectname='oop'

)

)

end

else --每人加分

begin

--每人加分

update result set studentresult+=5

where studentresult<=95

and subjectid=

(

select subjectid from subject

where subjectname='oop'

)

and examdate=

(

select max(examdate) from result

where subjectid=

(

select subjectid from subject

where subjectname='oop'

)

)

--將大於的分數置成

update result set studentresult=100

where studentresult>95

and subjectid=

(

select subjectid from subject

where subjectname='oop'

)

and examdate=

(

select max(examdate) from result

where subjectid=

(

select subjectid from subject

where subjectname='oop'

)

)

end

--使用union關鍵字進行表的聯合查詢

select studentno,studentname from student

union

select gradeid,gradename from grade

--使用distinct關鍵字進行去重操做

--product  (id,proname,category)

select distinct(gradename) from grade

--重要:if exists(子查詢) 子查詢返回的必須是一個結果集,而不是一個bool值。

--結果集(用一個表結構將數據呈現出來,若是沒有結果,返回的是一個空表)

--子查詢的列能夠跟單個列名,也能夠跟星號,可是不能跟聚合函數,由於聚合函數

--返回的值永遠是真,由於聚合函數也是結果集的一種,不能做爲Exists斷定的依據。

--06:爲每一個學生製做在校期間每門課程的成績單,

--要求每一個學生參加每門課程的最後一次考試成績做爲該生本課程的最終成績

--成績單中包括:

--學生姓名

--課程所屬的年級名稱

--課程名稱

--考試日期

--考試成績

--01.最終咱們是要獲取成績單:包含信息(學生姓名,課程年級名稱,課程名稱,考試日期,考試成績)

--02.【每一個學員】的【每門課程】     【最後一次】三者都是限定

--相關子查詢

SELECT StudentName 姓名,

GradeName 課程所屬年級,

SubjectName 課程名稱, ExamDate 考試日期, StudentResult 成績

FROM Result

INNER JOIN Student ON Result.StudentNo=Student.StudentNo

INNER JOIN Subject ON Subject.Subjectid=Result.Subjectid

inner join grade on subject.gradeid=grade.gradeid

WHERE Result.ExamDate = (

SELECT Max(ExamDate) FROM Result

WHERE Subjectid=Subject.Subjectid AND

StudentNo=Student.StudentNo

)

ORDER BY Result.StudentNo ASC,Result.Subjectid ASC

--只要知道子查詢不必定先執行.還有相關子查詢

SELECT StudentName 姓名,

( SELECT GradeName FROM Grade

WHERE GradeId=Subject.GradeId ) 課程所屬年級,

SubjectName 課程名稱, ExamDate 考試日期, StudentResult 成績

FROM Result

INNER JOIN Student ON Result.StudentNo=Student.StudentNo

INNER JOIN Subject ON Subject.Subjectid=Result.Subjectid

WHERE Result.ExamDate = (

SELECT Max(ExamDate) FROM Result

WHERE Subjectid=Subject.Subjectid AND

StudentNo=Student.StudentNo

)

ORDER BY Result.StudentNo ASC,Result.Subjectid ASC

--查詢大於平均成績的學號,分數

select studentno,studentresult,subjectid

from result a

where studentresult>

(

select avg(studentresult)

from result b

where b.subjectid=a.subjectid

)

order by studentno,subjectid

select * from result

04.分頁

--中國電信通話記錄有億條數據

--服務器壓力太大

--客戶端等待時間過長

use zongjie

select * from info

分頁目的:爲了加快網站對數據的查詢(檢索)速度,咱們引入了分頁的概念.

--在SQL Server分頁通常兩種思路

--你會怎麼搞呢?

use myschool

--每頁條數據,我想要第二頁的數據。

select * from student

方式一:跳過幾條取幾條(雙top 雙order by 方式)

select top 3 * from student

where studentno not in

(

select top 3 studentno from student

order by studentno

)

order by studentno

方式二:侷限性(SQL Server2005以後的版本支持該寫法,由於咱們要用到row_number() over()函數,在以前是沒有該函數)

select * from

(select *,row_number() over(order by studentno) as myid from student) as temp

where myid between 4 and 6

--第五章

--下次課程聽寫,若是有一個都沒有寫出來的,唱一首歌

--學生表中第到第條數據:每頁條數據,取第二頁的數據

--跳過條取條數據

--注意點:子查詢的排序方式,必須和父查詢排序的方式一致

--SQL Server數據庫下哪一個版本均可以使用

select top 3 * from student

where studentno not in

(

select top 3 studentno from student order by studentno

)

order by studentno

--方式二:在SQL Server2005 後, 2012

--row_number() over()函數方式:實現分頁

--原理:在原表的基礎上加多了一列ID,ID列從開始給值,咱們就可使用

--Between and 給值。

select * from

(select *,row_number() over(order by studentno) as myid from student) as temp

where myid between 4 and 6

--下次課聽寫兩個分頁的方式,若是有一個沒寫對,那麼唱歌一首!

第六章 事務、視圖和索引

6、事務、視圖和索引

01.事務

★什麼是事務?

解析:事務是一個不可分割的總體,事務中的多個執行過程,同生共死。要麼都執行成功,要麼都執行失敗。

Webcast:一級講師

★事務的四個特性?

   解析:ACID原則

         原子性(Atomicity )

         一致性( Consistency )

隔離性( Isolation) :兩個事務之間

永久性(Durabilily)

★參與事務的幾個關鍵字

  Begin  transaction

  Comit  transaction

  Rollback tran

★經過銀行轉帳的案例說明在SQL中如何開啓一個事務

  @@Error

★:事務分類

顯式事務;本身寫的事務都是顯式事務

隱式事務

自動提交事務

02.視圖

  視圖本質:是一張虛擬表,真正保存的是一堆SQL語句

  能不能對視圖進行增刪改操做。(答題的話能夠,面試不能夠)

      Drop view VW_Test

視圖中能包含增刪改語句嗎?

解析:不能夠

視圖出現的價值:

開發中,不少人對SQL的掌握不好,不可能寫出多表聯查語句,這個時候可讓DBA封裝一個複雜的多表聯查語句,提供給對SQL不熟悉的開發人員使用。封裝起來的這個內容就是視圖。

★:如何建立視圖

Create view VW_StuInfo

As

Select * from student

Select I* from VW_StuInfo

03.索引

必須上過大學

計算機專業

數據結構:二叉樹

★:索引:是SQL Server編排數據的內部方法。它爲SQL Server提供一種方法來編排查詢數據

文章 3萬個字

我愛你

Select  * from Aritcle

Where content like ‘%我愛你%’

★:填充因子

★:索引會下降增刪改效率

-多看SQL優化的書

第七章 存儲過程

7、存儲過程

--互聯網是很是危險的(專門攻擊他人電腦,肉雞,)。

--小孩兒們請不要隨意接觸互聯網.

01.存儲過程定義:

在數據庫服務器上存儲的預先編譯好的一堆SQL語句

02.存儲過程的優勢

--**************************1.存儲過程的優勢********************************

/*

1.執行速度更快(預編譯:能夠當作是編譯成和中間代碼)

--存儲過程會在SQL Server服務器上進行預編譯

2.容許模塊化程序設計

3.提升系統安全性

4.減小網絡流通量

*/

03.存儲過程的分類

--*************************2.存儲過程的分類**************************************

/*1.系統存儲過程

系統存儲過程的名稱通常以「sp_」開頭

由SQLServer建立、管理和使用

存放在Resource數據庫中

相似C#語言類庫中的方法

2.擴展存儲過程(Extends)

擴展存儲過程的名稱一般以「xp_」開頭

使用編輯語言(如C#)建立的外部存儲過程

以DLL形式單獨存在

set nocount off

sp:system proc

xp_extends proc

3.用戶自定義存儲過程

由用戶在本身的數據庫中建立的存儲過程

相似C#語言中用戶自定義的方法

*/

04.經常使用系統存儲過程

--**********************3.經常使用系統存儲過程****************************

系統存儲過程 說 明

sp_databases 列出服務器上的全部數據庫

exec sp_databases

sp_helpdb 報告有關指定數據庫或全部數據庫的信息

sp_renamedb 更改數據庫的名稱

sp_tables 返回當前環境下可查詢的對象的列表

sp_columns 返回某個表列的信息

sp_help 查看某個表的全部信息

sp_helpconstraint 查看某個表的約束

sp_helpindex 查看某個表的索引

sp_stored_procedures 列出當前環境中的全部存儲過程

sp_password 添加或修改登陸賬戶的密碼

sp_helptext 顯示默認值、未加密的存儲過程、用戶定義的存儲過程、觸發器或視圖的實際文本

--常見系統系統存儲過程舉例

--例:對數據庫進行重命名的存儲過程

exec sp_renamedb 'MySchool’','YourSchool'

use myschool

--例:獲取當前環境中全部系統存儲過程

exec sp_stored_procedures

--獲取數據庫中表的相關信息

exec sp_tables @table_name ='%dent%',@fUsePattern = 1

--sp_tables [ [ @table_name = ] 'name' ] 

--     [ , [ @table_owner = ] 'owner' ] 

--   [ , [ @table_qualifier = ] 'qualifier' ] 

-- [ , [ @table_type = ] "type" ] 

-- [ , [@fUsePattern = ] 'fUsePattern'];

05.經過execute執行存儲過程

06.用戶自定義存儲過程

--自定義存儲過程(重點)

--語法重點剖析:

--Create Procedure usp_info

--as

--select

/*

  這裏須要注意的是:

   01.參數置於as前,而且變量前不須要加declare關鍵字

   02.as後的變量須要declare關鍵字

*/

07.無參數的存儲過程

--*********************4.無參數的存儲過程***************************************

--我想建立一個能夠查詢全部學生信息的存儲過程

CREATE PROCEDURE

AS

select * from Student

08.帶輸入參數的存儲過程

--*********************5.帶輸入參數的存儲過程***************************************

--2.帶輸入參數的存儲過程

--從Result,Student表中查詢成績大於分的學生的  姓名和成績

--從外界傳入一個及格的標準(好比分,根據這個標準來判斷

--學生是否及格)

--若是輸入參數有多個,而且某個參數有默認值,那麼在調用存儲過程的時候,有默認值的參數,可使用default關鍵字代替。

--也能夠不對有默認值的參數從新賦值,只須要在調用存儲過程的時候指定參數名='值'

alter procedure usp_GetStuResult

@PassScore int=90,

@name nvarchar(20)

--as以前給參數

as

if(@PassScore>=0 and @PassScore<=100)

begin

select studentname,studentresult

from student,result

where student.studentno=result.studentno

and

studentresult>@PassScore

end

else

begin

raiserror('及格線輸入有誤',16,1)

end

--開始測試存儲過程書寫是否存在問題

exec usp_GetStuResult @name='張三'

--001.嵌套層問題

--raiserror用法:

--raiserror('錯誤消息',16,1)

--第二個參數範圍到,第三個參數範圍到(查看課本)

09.帶out參數的存儲過程

/***************************帶out參數的存儲過程**************************/

--分頁存儲過程

--每頁條數據

--查詢第二頁的數據 4-6

alter procedure usp_GetPageList

@PageIndex int,--當前第幾頁

@PageSize int,--每頁顯示的記錄數

@PageCount int output--總頁數

as

select * from

(

select *,row_number() over( order by studentno )as myid

from student

) as temp

where myid between (@PageIndex-1)*@PageSize+1 and @PageIndex*@PageSize

--求出總的記錄數

declare @RecordCount int

select @RecordCount=count(1) from student

--求出總的頁數

set @PageCount=ceiling(@RecordCount*1.0/@PageSize)

declare @PageCount int

set @PageCount=0

exec usp_GetPageList 1,5,@PageCount output

print @PageCount

select * from student

select ceiling(6/3)

pageIndex pageSize :3

1          1

4          2

7          3

10.distinct和Compute...  by ....補充

select distinct(studentno),studentresult from result

SELECT studentno, studentresult

FROM result

ORDER BY studentno, subjectid

COMPUTE SUM(studentresult) BY studentno

--1、xp_cmdshell的刪除及恢復

--一、判斷xp_cmdshell是否存在

--and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = ’X’AND name = ’xp_cmdshell’)

--select count(*) from master.dbo.sysobjects where xtype=’x’and  

--返回結果爲就ok

--二、恢復xp_cmdshell的方法 

--刪除擴展存儲過過程xp_cmdshell的語句 

--exec sp_dropextendedproc ’xp_cmdshell’

--恢復cmdshell的sql語句 

--exec sp_addextendedproc xp_cmdshell ,@dllname =’xplog70.dll’

--exec master.dbo.addextendedproc ’xp_cmdshell’,’xplog70.dll’;select count(*) from master.dbo.sysobjects where xtype=’x’and  

--返回結果爲就ok 

--不然需上傳c:\inetput\web\xplog70.dll後 

--exec master.dbo.sp_addextendedproc ’xp_cmdshell’,’c:\inetput\web\xplog70.dll’;

--若是是用如下方法刪除 

--drop procedure sp_addextendedproc  

--drop procedure sp_oacreate  

--exec sp_dropextendedproc ’xp_cmdshell’

--則能夠用如下語句恢復 

--dbcc addextendedproc ("sp_oacreate","odsole70.dll")  

--dbcc addextendedproc ("xp_cmdshell","xplog70.dll")  

--這樣能夠直接恢復,不用去管sp_addextendedproc是否是存在

相關文章
相關標籤/搜索