這些是比較常用的命令操作,事先聲明,這些命令是不區分大小寫的,我按照我的課本來總結用法和知識點,無用的章節自動省略。
如果這篇博客的知識點你全部看完掌握了,那你就SQL數據庫入門了,一定要認真看並且自己手打幾次!祝你好運~
這篇博客很長很長,大概是我目前最長的博客了,不要被長度嚇到,內容簡單的嚇尿你😨
第二章:創建和管理數據庫
這里是一個創建數據庫並初始化的例子,先大致看一下,接下來我們慢慢講😀
創建數據庫並初始化:
create database Student4 --創建數據庫,名稱為Student4--
--下面是數據庫的初始化,可以不寫,了解就行-- on primary ( name=Student4_dat1, filename='E:\DataBase\Student4_dat1.mdf', --主數據文件,起始大小100M,最大200M,超出100M后每次增加20M-- size=100mb, maxsize=200, filegrowth=20), ( name=Student4_dat2, filename='E:\DataBase\Student4_dat1.ndf', --次數據文件,同上-- size=100mb, maxsize=200, filegrowth=20 ) log on ( name =Student4_log1, filename='E:\DataBase\Student4_log1.ldf', --日志文件,增長5%-- size=100mb, maxsize=200, filegrowth=5% ), ( name =Student4_log2, filename='E:\DataBase\Student4_log2.ldf', --日志文件2,超出容量后每次增長20M-- size=100mb, maxsize=200, filegrowth=20 )
ok,看完上面的例子是不是感覺很麻煩?沒關系,接下來我們一步一步的講咯。注意!數據庫中的注釋符號是-- 而不是 // 還有在數據庫中是不分大小寫的
1.創建數據庫
create database student --創建了一了數據庫,這是最簡單的方式了
2.刪除數據庫:
DROP DATABASE name --name是數據庫的名字 DROP DATABASE name1,name2 -- 刪除多個以逗號分隔
3.更改數據庫名稱:
ALTER DATABASE name --這個name是數據庫的名稱
MODIFY NAME=name1
還有另外一種方法:
EXEC sp_renamedb 'name','name1' --把name改成name1
4.備份數據庫:
升級數據之前通常要備份一下,就算出問題了也能還原回來不是?
BACKUP DATABASE name TO DISK='E:\name.bak'
5.還原數據庫:
尷尬了,你的數據升級的時候出問題了,不過沒關系,我們還原回來就好了
RESTORE DATABASE name FROM DISK='E:\name.bak'
6.分離數據庫
你在操作數據庫的時候想把你的工程拷走又不想關閉數據庫怎么辦?很簡單,分離一下就好了,這個也有代碼不過最常用的是鼠標操作,所以我就不貼代碼了(懶🙄)
當前數據庫→單機右鍵→任務→分離
7.附加數據庫
你已經把你做的工程拷回來了,想在自己的電腦上打開玩玩,這個時候我們選擇附加數據庫(附加數據庫的時候可能出現問題,這個參見我的另一篇博客,專門有寫這件事http://www.cnblogs.com/yunquan/p/6217122.html)
數據庫→單機右鍵→附加
然后找到你的mdf文件直接附加上去
到此第二章關於數據庫的就結束了,其實數據庫這個東西最重要的部分在於數據,接下來重點要開始咯。
第三章:創建和管理表
表是承載數據的東東,其重要性不言而喻
1.創建表
use Student --你在哪個數據庫下面操作就引用哪個數據庫-- create table 學生 --創建一個表,表名是 學生 (學號 char(12) , 姓名 nchar(3) , 性別 nchar(1) , )
這是最簡單的一個表了,她的列我都沒有加約束,我會在這一章的最后放出一個完整的表來講。
2.查看表
如果是查看表的結構:
當前表→單擊右鍵→設計
如果是查看表的數據:
當前表→單擊右鍵→編輯表的前200行
寫到這里包括下面的一些數據的操作其實都是差不多的,無非就是四個字:增刪改查 下面我就直接講增刪改查了
1.增(格式用alter,add 數據用insert)
表里插入數據
insert student values('201408090022','張泉','男')
插入新列
alter table student add 聯系電話 char(15) null
2.改 (格式用alter,數據用update)
將學生表的聯系電話改為char(50)
alter table student alter column 聯系電話 char(50)
將所有課程的學分加1
update 課程 set 學分=學分+1 where 課程類別='必修'
3.查
這個大有講頭,一般都是通過鼠標操作,不過代碼也有,而且是重點內容,關於這部分在第五章介紹。
往下拉到第五章,在那見😲
4.刪(刪除數據一般用delete,刪除列和表這些架構用drop)
終於到刪除這個重頭戲了
刪除表中所有行
delete student
刪除表中特定行
delete from student where 名字='蜀雲泉'
刪除表中的某一個列
alter table student drop column 聯系電話
清空表(其實和刪除表中所有行差不多,不過這個的區別大家自己去查吧)
truncate table student
刪除表
drop table student
嗯,說好了在最后放出幾個例子來的,下面就是咯,看過了上面的內容看看你能不能看懂下面的例子。
創建三個表,分別是學生表,課程表和選課表。學生表的主鍵是學號,課程表里有一個層級關系,主鍵是課程編號,選課表里是一個聯合主鍵,分別是參考的學生表的學號和課程表的課程編號,這是一種約束關系,這就導致了如果你想刪除學生表里面的某個學生就必須先解除約束關系,否則你刪不了的。
創建 “學生” 表 (大家不要學我打漢字,我為了方便。。。)
use Student --我引用一個已經創建好的數據庫-- create table 學生 (學號 char(12) primary key, --這里我給列加上了約束,關於約束重點在第四章講--
姓名 nchar(3) not null,
性別 nchar(1) check(性別 in('男','女')),
)
創建 “課程” 表
create table 課程 ( 課程編號 char(4) primary key, 課程名稱 nvarchar(20) not null , 層級關系 char(4) references 課程(課程編號), --層級關系的意思是必須學了上一個才能學下一個,比如必須學了c語言才能學數據結構-- 學分 tinyint not null default 4 )
創建 “選課” 表
create table 選課 ( 學號char(12) references 學生(學號), --這就是外鍵約束-- 課程編號 char(4) references 課程(課程編號), 成績 tinyint check(成績 between 0 and 100), --成績在0~100之間-- primary key (學號,課程編號) --聯合主鍵寫在這里,單個的可以寫在語句后面-- )
在學生表里插入數據
use(想操作的數據庫名稱) insert 學生表 values('201408090001','趙雲','男'); insert 學生表 values('201408090002','許嵩','男');
在課程表里插入數據
use (想操作的數據庫名稱) insert 課程表 values('0001','c語言基礎',null,2); insert 課程表 values('0002','數據庫','0001',2);//不學c語言就無法學數據庫,這是一種遞進的層級關系
在選課表里插入數據
use 想操作的數據庫名稱 insert 選課表 values('201408090001','0001',80); insert 選課表 values('201408090002','0002',82);
更新選課表里面學號為1和2兩位同學的成績
use 想操作的數據庫名稱 update 選課表 set 成績=成績*0.7+20 where 學號='201408090001' update 選課表 set 成績=成績*0.7+20 where 學號='201408090002'
現在我們講了插入和更新,現在來解決刪除的問題,我現在想刪除趙雲這個同學的信息,可以嗎?答案是不行的,因為趙雲同學的學號是選課表的外鍵,他們之間具有約束關系,所以你是刪除不了的,那怎么辦呢?解除約束關系就好了
解除約束關系
use 想操作的數據庫名稱 alter table 選課表 drop constraint FK__選課表__學號__0EA330E9//這個是約束關系,每個人應該不一樣,在列表里面自己找哦
現在已經解除趙雲同學的約束啦,現在我們來刪除他的信息,嗚嗚~
刪除趙雲同學的信息
use 想操作的數據庫名稱 delete from Student where 姓名='趙雲'
故事已經說完,懶得圓滿。
第四章:索引與數據完整性
這一章我會講 規則,默認值,6大約束 這三個部分,其中規則和默認值差不多,6大約束是重點😏
索引
索引是一個很重要的知識點,其實索引就相當於目錄。比如我要在一本介紹數據庫的書中查找關於索引這一塊的知識點,如果沒有目錄的話我要一頁一頁的查找,其實是翻遍整本書去找,這樣的效率可是真的很低很低了,但是如果有了目錄,那我直接翻目錄,找到索引所在的頁數,直接翻過去看就行了,效率提升了很多。所以這就是索引的好處。當然索引也有缺點,就是占據了物理空間,而且索引也需要維護成本,你添加或者刪除數據,索引也是要跟着變的,這樣在數據庫語句的執行速度上就有點慢了。
索引大致是分為聚集索引和非聚集索引,至於更為詳細的信息請參考這篇文章。
規則
1.創建規則
創建課程類別規則
create rule course_rule as @sort='選修' or @sort='必修'
創建學分規則
create rule credit_rule as @value>0
2.查看規則
exec sp_helptext course_rule
3.綁定規則
將創建的課程規則course_rule 綁定到課程表的課程類別上
exec sp_bindrule course_rule,'課程.課程類別'
將創建的學分規則credit_rule 綁定到課程表的學分列上
exec sp_bindrule credit_rule,'課程.學分'
4.解綁規則
exec sp_unbindrule '課程.課程類別'
5.刪除規則
drop rule course_rule,credit_rule
默認值
1.創建默認值
創建民族默認值
create default nationality_default
as '漢族'
2.查看默認值
exec sp_helptext nationality_default
3.綁定默認值
綁定默認值nationality_default到學生表的民族列上
exec sp_binddefault nationality,'學生.民族'
4.解綁規則
exec sp_unbinddefault '學生.民族'
5.刪除規則
drop default nationality_default
規則和默認值已經講完了,他倆是不是很像很像,接下來是重點!6大約束
6大約束
咱們先來明確概念,4大完整性對應6大約束,下面的表格很直觀
4大完整性 | 6大約束 |
實體完整性 | 主鍵約束 |
參照完整性 | 外鍵約束 |
域完整性 | |
用戶自定義完整性 | 非空值約束,默認約束,唯一性約束,檢查約束 |
1.主鍵約束
主鍵具有唯一標識,一個表里面只能有一個主鍵,主鍵分為兩種:列級和表級
比如下面這張學生表,學號和身份證都是唯一的,都能區分你的身份,所以都有當主鍵的資格:
create table 學生 (學號 char(12) , 身份證號 char(18) , 姓名 nchar(3) , 性別 nchar(1) , )
列級的主鍵:
--列級主鍵-- create table 學生 (學號 char(12) primary key, 身份證號 char(18) , 姓名 nchar(3) , 性別 nchar(1) , )
直接寫在列后面的,就叫列級主鍵,由於主鍵只能有一個,所以學號是主鍵,身份證號就沒辦法作為主鍵了。
表級的主鍵:
--表級主鍵-- create table 學生 (學號 char(12) , 身份證號 char(18) , 姓名 nchar(3) , 性別 nchar(1) , constraint pk_xuehao_shenfenzheng primary key(學號,身份證號) --那個大長串是約束名,constraint pk_xuehao_shenfenzheng可以不寫-- )
如果我想學號和身份證號都作為主鍵,那就把主鍵約束寫在表的最后,這樣就是表級約束了,表級約束里面主鍵的主鍵值可以多個,但是主鍵只能有一個!
表級約束需要寫約束名
2.外鍵約束
外鍵約束定義了表與表之間的關系,外鍵約束可以參考其他表也可以參考自己表。也分為列級和表級,不過外鍵約束沒有唯一性,所以都寫列級上也沒關系,但是列級和表級的外鍵約束是不一樣的,在選課表里我會說明。好了,我講了這么多是什么意思呢?看下面的三個表還有我的注釋。
學生表
use Student
create table 學生
(學號 char(12) primary key, --列級主鍵約束--
姓名 nchar(3) not null, --非空值約束,下面講--
性別 nchar(1) check(性別 in('男','女')), --檢查約束,下面講--
)
課程表
create table 課程
(
課程編號 char(4) primary key, --列級主鍵約束-- 課程名稱 nvarchar(20) not null , --非空值約束,你應該會了。。。-- 層級關系 char(4) references 課程(課程編號), --參考自己表內的外鍵約束-- 學分 int not null default 4 --非空值約束和默認約束-- )
選課表
create table 選課
(
學號char(12) references 學生(學號), --這就是列級外鍵約束的格式-- 課程編號 char(4) , 成績 tinyint check(成績 between 0 and 100), --檢查約束,檢查成績是否在0~100之間-- primary key (學號,課程編號) --聯合主鍵又叫表級主鍵--
constraint fk_kecheng foreign key(課程編號) references 課程(課程編號) --表級外鍵約束,constraint fk_kecheng 這些東西都可以不寫--
)
3.非空值約束
這個在外鍵約束的例子里已經有過例子了
為課程表的課程名稱 字段設置非空值約束
alter table 課程 alter column 課程名稱 varchar(30) not null
4.唯一性約束
比如我把學生表的姓名定義為唯一的(我就不讓你們班有重名的,哼😎)
use Student create table 學生 (學號 char(12) primary key, --列級主鍵約束-- 姓名 nchar(3) not null, --非空值約束-- 性別 nchar(1) check(性別 in('男','女')), --檢查約束-- constraint uk_name unique (姓名) --唯一性約束,姓名唯一了,同樣constraint uk_name 可以省略不寫
)
5.檢查約束
檢查約束通常是設置條件范圍,比如性別只能是男女,年齡必須是正數
為學生表的性別加上檢查約束
use Student alter table 學生 add check(性別 in('男','女'))
6.默認約束
比如我把學生表的身份證號都設置的默認為0
use student alter table 學生 add default '0' for 身份證號 --我省略了constraint 約束名 這些東西,不寫也沒啥,寫了你也記不住,到時候用鼠標看看就知道了
7.刪除約束
6大約束講完了,現在終於到了尾聲,我們來講講怎么刪除約束,如果是鼠標直接找到那個約束,單機右鍵刪除了事。如果是代碼,看下面的例子
從學生表刪除默認約束
alter table 學生
drop constraint 約束名 --這個約束名,如果你在定義約束的時候寫了那就朝抄下來,如果你懶沒有寫省略了,那就用鼠標在左面的操作欄找到這個約束,復制名字就好
終於寫完這一章了,容我歇會,呼呼~
第五章:查詢與視圖
先來講查詢,查詢呢分為三個部分來講,分別是基本查詢,嵌套查詢,聯結查詢
1.基本查詢
基本查詢這一章主要就是select語句,與select語句配合最多的就是from語句和where語句,其中where和select語句所搭配的子句也是蠻多的。
先來了解一下select,from,where這三個語句的用法
查找學生表中性別是男的所有學生的信息:
select * from 學生 where 姓別='男'
where語句的子句
--between子句:字段的內容在制定的范圍內--
select * from 課程 where 學分 between 2 and 5
--like子句:對字符串進行比較提供兩種通配符,即下划線“_”和百分號“%”,下划線表示一個字符,百分號表示0個或多個字符-- select * from 課程 where 課程名稱 like '%數據庫%'
--In子句:字段內容是結果合集或者子查詢中的內容-- select 學號 , 課程編號 , 成績 from 選課 where 課程編號 IN('C606','C607' )
--Is子句:數據一般是'=' 而'Null'這種類型就不能用等號了得使用Is-- select 專業名稱 ,成立年份 from 專業 where 專業簡介 IS null
select語句的子句
--排序輸出:order by默認按升序排序,asc是升序,desc是降序--
--按專業名稱升序排列學生表里的學號,姓名,性別,入學成績,專業名稱,專業名稱相同的就按入學成績的降序排列--
select 學號 , 姓名 , 性別 , 入學成績 , 專業名稱 from 學生 order by 專業名稱 asc ,入學成績 desc
--into子句:把查詢的結果放入一個新建的表中--
--將學生表里面有獎學金的學生的所有信息存放到新建表st_new中-- select 學生 .* into st_new from 學生 where 有否獎學金 = 'ture'
--union將不同的查詢數據結合起來,會自動的將重復的數據行刪除--
--在學生表里列出專業名稱為工程管理或工程力學的所有同學的學號,姓名,專業名稱-- select 學號 , 姓名 , 專業名稱 from 學生 where 專業名稱 ='工程管理' union select 學號 , 姓名 , 專業名稱 from 學生 where 專業名稱 ='工程力學'
--group by 將一個或多個列或者表達式的值將結果集中的行分成若干組--
--在選課表,查詢每門課程的最高分-- select 課程編號 , MAX (成績) as 最高分 from 選課 group by 課程編號
group by這里有一點是需要注意的,否則你將不能使用它,參見這篇博客的第3條知識點
另外還有其他很多的子句,這里就不一一介紹了,因為我感覺沒啥大用處,考試估計也不會考,有需要的請自己去查詢吧
2.嵌套查詢
嵌套查詢分為兩種類型:單值嵌套查詢和多值嵌套查詢
單值嵌套查詢:子查詢的返回值是一個值,由於返回值是一個所以可以使用'=' ‘>’ ‘<’等符號
--對學生表列出和李思思相同專業的所有同學的學號和姓名--
select 學號, 姓名 from 學生 where 專業名稱 =(select 專業名稱 from 學生 where 姓名 ='李思思')
多值嵌套查詢:子查詢的返回值是多個值,是一個結果集,通常使用any,all,in此類運算符
--列出選C901課程的學生的成績比C902課程的最低成績還要高的學生的學號,成績--
select 學號 , 成績 from 選課
where 課程編號 ='C901'
and 成績 > any (select 成績 from 選課 where 課程編號 ='C902') --這里需要說明的是,由於any返回的是一個結果集所以比較的時候會比到最低分的,以下同理--
--列出選C901課程的學生的成績比C902課程的最高成績還要高的學生的學號,成績--
select 學號 , 成績 from 選課 where 課程編號 ='C901' and 成績 > all (select 成績 from 選課 where 課程編號 ='C902') --再次強調,這是結果集--
--選課表,查詢選修C901或C902課程的學生的學號和姓名(包括任意選一門或者選兩門的情況) --我感覺下面的方法真雞肋,明明一條語句就行了,還多此一舉,畫蛇添足。-- select 學號, 姓名 from 學生 where 學號 in (select 學號 from 選課 where 課程編號 ='C901' or 課程編號 ='C902') --方法1--
select 學號, 姓名 from 學生 where 學號 in (select 學號 from 選課 where 課程編號 in ('C901' , 'C902')) --方法2--
3.聯結查詢
聯結查詢分為內聯結,外聯結,交叉聯結三種
內聯結:包括等值聯結和不等值聯結
--內聯結的等值聯結,就是'='了-- --將課程表和選課表按課程編號相等值進行聯結,並統計每門課程的選課人數-- select 課程名稱,count(*) 選課人數 from 課程 inner join 選課 on 課程.課程編號=選課.課程編號 group by 課程名稱 --內聯結的不等值聯結-- --在選修C901課程的學生中,查詢成績高於學號為S0101的學生選修該門課程成績的同學的學號和成績-- select a.學號,a.成績 from 選課 a inner join 選課 b on a.課程編號=b.課程編號 and a.成績>b.成績 where(a.課程編號='C901') and (b.學號='S0101')
外聯結:包括左外聯結,右外聯結和全外聯結
--外聯結的左外聯結,就是左面的全都顯示右邊沒有就顯示null-- --學生表左外聯結選課表-- select a.學號,a.姓名,b.課程編號,b.成績 from 學生 a left outer join 選課 b on a.學號=b.學號 --外聯結的右外聯結,就是右面的全都顯示左邊沒有就顯示null-- --選課表右外聯結課程表-- select a.學號,a.成績,b.課程編號,b.課程名稱,b.課程類別,b.學分 from 選課 a right outer join 選課 b on a.課程編號=b.課程編號 --外聯結的全外聯結,沒有就顯示null-- --學生表全外聯結選課表-- select a.學號,a.姓名,b.課程編號,b.成績 from 學生 a full outer join 選課 b on a.學號=b.學號
交叉聯結:沒有where子句
--學生表交叉聯結選課表-- select a.學號,a.姓名,b.學號,b.課程編號,b.成績 from 學生 a cross join 選課 b
查詢到這里就已經講完了,外聯結需要重點看一下,接下來我們來講視圖
視圖
這就是視圖的可視化界面,但是這個我們一般不用,寫視圖代碼就是了。
1.創建視圖
use 教學管理 --先選中執行use再選中執行下面的命令-- create view score_view as select 學生.學號,學生.姓名,選課.課程編號,選課.成績 from 學生 inner join 選課 on 學生.學號=選課.學號
2.刪除視圖
drop view score_view
那么我現在來講一講視圖是干什么的?為什么存在這個東西?
如果你很頻繁的去連表查詢,例如連接3個表或者更多的表去查詢你想要的數據,注意是很頻繁的操作,下面介紹兩種方法:
1.把一大串sql語句寫完之后保存就可以了,但是sql語句保存之后你還得找,說不定哪天刪了或者找不到了豈不是要重寫?而且你在執行的時候那么大一串子語句很麻煩的,有時候要復制粘貼再選中執行.....(優點:占用硬盤空間小 缺點:sql語句太長了,麻煩)
2.有人說我可以把這多個表之中我想要的數據都存到一個新表里面,這樣我以后直接查詢這個新表不就簡單一些了?這是一個好想法,但是!你新建新表不占空間啊?浪費硬盤占有量啊! (優點:sql語句短了 缺點:占用硬盤空間大)
還有沒有什么更好的方法,更簡單的方法,更無腦的方法呢?我們的視圖閃亮登場!解決一個問題的方法有很多很多,總有一個相對來說更簡單的方法
視圖:把你寫的一大串sql語句存起來,保存成為一個視圖,參考我上面的創建視圖,就是那樣寫的,這樣以后你再去查詢多表得到數據的時候,可以直接select視圖了,又短又幾乎不占硬盤空間,結合了上面介紹的兩種方法的優點。這就是視圖的意義所在了。
第六章:T-SQL程序設計
這一章我們來重點講解變量,函數,游標
1.變量
我們來自己定義變量,舉三個例子大家一看就明白了
--6.1 //定義一個局部變量並顯示 declare @num int select @num=16 select @num --6.2 declare @credit float update 課程 set @credit=學分 where 課程編號='C501' --6.3 declare @sum int set @sum=(select COUNT(*) from 學生) select @sum
2.函數
--6.17 函數1,平均函數 create function course_avg(@course_id varchar(10)) --定義一個函數,函數名是course_avg,參數是課程編號 returns float --確定函數的返回值類型為float as begin return (select avg(成績) from 選課 where 課程編號=@course_id ) --根據這個課程編號計算出平均值並返回 end select dbo.course_avg('C501') as 平均成績 --這里是這個函數的調用,as是重命名的意思,可以省略
下面來一個函數,這個函數用到了IF語句,也用到了遞歸。
ALTER function [dbo].[GetAddress](@EqAddress varchar(10)) returns varchar(10) as begin declare @ParentClassID varchar(15) --變量父ID declare @ID varchar(15) SELECT @ParentClassID = ParentID FROM Address where ID = @EqAddress if (@ParentClassID <> '0')--如果不是根節點 begin select @ID = dbo.GetAddress(@ParentClassID) select @ID = @ParentClassID end return @ID end
3.游標
游標:就是用來看一些數據的共同信息的
--創建游標來訪問學號,姓名,專業 declare cur_student Cursor for select 學號,姓名,專業名稱 from 學生 --打開游標 open cur_student --讀取游標 fetch next from cur_student while @@FETCH_STATUS=0 begin fetch next from cur_student end --關閉游標 close cur_student --釋放游標 deallocate cur_student
第七章:存儲過程與觸發器
存儲過程:
存儲過程的優點:1.編譯后在服務器端 2.一次編譯多次調用 3.具有一定的數據安全性
這個是靜態的SQL寫的存儲過程,可以看看這個動態的SQL寫的存儲過程:戳我
--創建存儲過程--
create proc pro @xuehao varchar(10)=null --創建存儲過程pro 一個參數@xuehao 后面是它的類型 as --這個as超重要,不能漏寫 if @xuehao=null --如果是null,返回10 return 10 if not exists(select * from 學生 where 學號=@xuehao) --如果找不到就返回-10 return -10 select 姓名 from 學生 where 學號=@xuehao --找到這個人,返回0(不知道你們有沒有注意到,這些是按照順序排列的,不能變順序) return 0 --執行存儲過程-- declare @num int --定義一個變量來接收結果 exec @num=pro 'S0101' --調用存儲過程 if @num=10 --如果是10,那就說明你輸入的不對 select '輸入錯誤' else if @num=-10 --10就是沒有這個人,0就是有這個人 select '沒有這個人' if @num=0 select '找到了'
這里我用的返回值是return,需要注意的是return只能返回int類型的數字。如果想返回其他形式的答案,請使用out參數,比如:
USE [XXX] GO /****** Object: StoredProcedure [dbo].[OneTable] Script Date: 2018/1/13 16:04:19 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [dbo].[OneTable] @TableName nvarchar(50), @sqlstr varchar(1000) output as begin declare @sql nvarchar(1000) select @sql=isnull(@sql+',','')+quotename(Name) from syscolumns where id=object_id(@TableName) and name not in ('DATE','TIME') set @sqlstr='SELECT rtrim(convert(varchar,replace([Date],''/'',''-'')))+'' ''+ ltrim(convert(varchar,[Time])) [DateTime] ,P.SupplyNum,p.Supplier FROM ( SELECT top 1 * FROM '+@TableName+' )T UNPIVOT ( SupplyNum FOR Supplier IN ('+@sql+') ) P' exec (@sqlstr) end
相較於觸發器,存儲過程在你以后的工作中會用的更多,所以一定要好好寫存儲過程。
存儲過程講完了,超簡單吧,下面的觸發器,嗚嗚嗚~更是簡單的沒天理呀😂
觸發器:
創建一個觸發器之后,只要被觸發就會執行相應的操作,就是這么簡單,而觸發條件也很簡單,無非就是三種,增刪改create trigger tr_test --創建觸發器
create trigger chufaqi
on 學生 for insert,update,delete --觸發條件,增刪改 as select * from inserted --inserted和deleted是數據庫系統在觸發的時候自動創建的兩個表,inserted表存放了插入和更新數據時的變化 select * from deleted --deleted存放了刪除的時候的信息 insert into 學生(學號,姓名,性別) --插入數據,增 values('S1112','李三','男')
delete from 學生 --刪 where 姓名 = '李三'
update 學生 set 性別='女' where 姓名='李三' --改
故事到此忽然~了結~