SQK学习笔记
?
創建數據庫Sales,指定數據庫文件和日志文件 create database Sales on (name='sales_dat',filename='d:\database\Salesdat.mdf', size=10, maxsize=50, filegrowth=5) log on (name='Sales_log',filename='d:\database\salelog.ldf', size=5MB, MAXSIZE=25MB, FILEGROWTH=5MB) 修改數據庫并立即分配空間 alter database Sales add file ( name=Salestest, filename='d:\database\Salestest.mdf', size=5mb, maxsize=100mb, filegrowth=5mb ) 刪除數據庫 drop database Sales 使用變量聲明方式創建臨時表 declare @tablevar table (Cno int,Cname char(3)) insert into @tablevar values(1,'abc') select * from @tablevar select @@SERVERNAME --顯示當前服務器名 exec sp_dropserver 'shenymce\shenymce' --刪除當前服務器名 exec sp_addserver 'shenymce',’local’ --新建數據庫服務器名只針對于以機器命名的服務器 create database one --創建數據庫 use one --打開數據庫 create table tt (id int,name char(10))--創建表 create table #T (id int,name char(10)) --創建本地臨時表 create table ##T (id int,name char(10)) --創建全局臨時表 select * from tt --顯示表信息 exec sp_rename 'tt','ttt' --修改表名 exec sp_help ttt --顯示表結構 alter table ttt add sex bit --添加新列 alter table ttt alter column sex char(2)--修改列 select * from ttt alter table ttt drop column sex --刪除列 exec sp_rename 'ttt.name',username --更改列名 判斷表是否存在 if not exists(select * from sysobjects where [name] = 'ttt' and xtype='U') begin select '測試' end 修改數據庫名稱 use one go alter database one modify name=測試 查看數據庫詳細信息 exec sp_helpdb 測試 創建數據庫快照 create database test_snap on (name=test,filename='D:\Program Files\Microsoft SQL Server\MSSQL10.SHENYMCE\MSSQL\DATA\test_!.mdf') as snapshot of test name后的test和of 后的test都是源數據庫锃 filename后跟的是新建快照的文件路徑不可以與源數據庫的路徑相同 還原快照 restore database test--數據庫名 from database_snapshot = 'test_snap'--快照名 刪除數據庫快照 drop database test_snap --刪除數據庫快照與刪除數據庫類似 創建臨時表 CREATE TABLE #MyTempTable (cola INT PRIMARY KEY);--本地臨時表,表名前加‘#’ INSERT INTO #MyTempTable VALUES (1);--全局臨時表,表名前加‘##’ 除非使用 DROP TABLE 顯式刪除臨時表,否則臨時表將在退出其作用域時由系統自動刪除: --創建規則 create rule age as @age between 0 and 100 --綁定規則 sp_bindrule age,'tt.shuxue'--參數:規則名,參數:對應表的列名 解除綁定 sp_unbindrule 'tt.shuxue'--對指定列解除規則綁定 刪除規則 drop rule age--刪除規則,只有不綁定任何列的規則才可以被刪除 創建視圖 create view v_info as select a.name,b.shuxue,b.yuwen,b.zongfeng from info as a,tt as b where a.id=b.id 創建索引(下面創建的是一個唯一非聚集索引) create unique nonclustered index i_info on info(xuehao) 創建架構 create schema one authorization [guest] --one架構名guest所有者 分組 id?sx yw?zf?sex 110??? 20??? 30??? boy?????? 230??? 40??? 70??? girle???? 344??? 33??? 77??? boy?????? 455??? 66??? 121?boy?????? 577??? 88??? 165?girle???? select sum(shuxue) as sxzf,sex from tt group by rollup (sex) sxzf?sex 109boy?????? 107girle???? 216NULL Group by 有二個關鍵字rollup和 cube Having 子句 select sum(shuxue) as sxzf,sex from tt group by (sex) having sum(shuxue)>=108 update 中的from 子句 update info set zongfeng=b.shuxue+b.yuwen from info a join tt b on a.id=b.id 上面語句的含義是,當info表中的id=tt表中的id時從tt表中更新info表中的zongfeng, (join on 對二表進行關聯) compute by 子句 (統計) select * from tt order by sex compute sum(zongfeng),avg(zongfeng),max(zongfeng),min(zongfeng) by sex 上面是對TT表中的zongfeng字段按sex分類,分別進行求和,平均值,最大值,最小值進行統計 注意:在使用by子句時,需要先使用ORDER BY進行排序 select top 10 percent * from tt --顯示前百分之十的記錄 使用變量 declare @i int set @i=2 select top (@i) * from tt with ties 子句(只有使用了order by 子句才可以使用) select top 1 with ties * from tt order by sex—如果滿足條件的最后一條記錄有重復記錄,那么重復的記錄也將顯示 基本的多表連接 select b.name,a.shuxue,a.yuwen,a.zongfeng from tt a, info b where a.id=b.id 內連接(全匹配,不匹配的不顯示) select b.name,a.shuxue,a.yuwen,a.zongfeng from tt a join info b on a.id=b.id--后可以接where子句,條件放大on與放在where后面結果一樣 where a.zongfeng > 40 左外連接--左表為主表(外連接分為左,右,全三種外連接,按主表匹配,不匹配的補空) select b.name,a.shuxue,a.yuwen,a.zongfeng from tt a left join info b on a.id=b.id--后可以接where子句,條件放大on與放在where后面結果不同 where a.zongfeng > 40 右外連接—右表為主表使用right outer join on(左外連接與右外連接只是主從表互換) 全連接 full outer join on 交叉連接(返回二表中記錄的秉積,功能與基本連接類似,cross join) 自連接 聯合查詢(相當于將多個查詢語句統一到一個查詢語句中) select shuxue,yuwen,'' from tt where sex='boy' union select sum(shuxue),sum(yuwen),'總分' from tt where sex='boy' 子查詢 select a.name,b.zongfeng,b.sex from info a, tt b where a.id=b.id and a.zongfeng=(select MIN(zongfeng) from tt) EXISTS關鍵字,判斷查詢的結果是否為真 declare @username varchar(10) declare @pwd varchar(10) set @username='shen' set @pwd='boy' if exists(select * from tt a,info b where b.name=@username and a.sex=@pwd and a.id=b.id) print'登錄成功!' else print'登錄失敗' 交查詢(查詢二個查詢語句中的交集 intersect ,第一個查詢語句后不可以跟order by子句,第二個不用嵌套進行查詢的話,將對整個查詢語句進行排序) select a.zongfeng,a.sex,b.name,b.xuehao from tt a, info b where a.sex='girle'?and a.id=b.id intersect select c.zongfeng,c.sex,c.name,c.xuehao from( select top 3 a.zongfeng,a.sex,b.name,b.xuehao from tt a, info b where a.id=b.id order by a.zongfeng desc )c 差查詢(先對第一個查詢語句進行查詢,在第一個查詢結果的基礎上再減去第二個查詢語句與之相交的記錄) select a.zongfeng,a.sex,b.name,b.xuehao from tt a, info b where a.sex='girle'?and a.id=b.id EXCEPT select c.zongfeng,c.sex,c.name,c.xuehao from( select top 3 a.zongfeng,a.sex,b.name,b.xuehao from tt a, info b where a.id=b.id order by a.zongfeng desc )c XML查詢 create table xml_table ( s_id int, s_data xml ) insert into xml_table values ( 1, '<學生信息><姓名>陳苗</姓名><性別>男</性別><班級>計算機應用班</班級></學生信息>' ) select * from xml_table declare @date xml set @date = (select s_data from xml_table where s_id=1) select @date.query('學生信息/姓名') 姓名 ,@date.query('學生信息/性別') 性別,@date.query('學生信息/班級') 班級 FOR XML(將查詢結果保存到表中,有四種模式,分別是RAW,AUTO,EXPLICIT,PATH) select a.zongfeng,a.sex,b.name,b.xuehao from tt a, info b where?a.id=b.id for xml path T-SQL中的邏輯運算符 ALL/ANY/AND/NOT/BETWEEN/SOME/LIKE/IN/EXISTS/OR T-SQL中的基本運算符 + / - / * / / / % T-SQL中的注釋 單選注釋--這是單行注釋 多行注釋 /* 這里是多行注釋的內容 */ 在嵌套語句中包含多條語句 可以使用 begin end 將多條語句包括在其中 Case語句必須有一個變量來接受他的結果 declare @one int declare @two varchar(20) set @one=3 select @two = case @one when 1 then '結果是' when 2 then '結果是' else '不知道是什么' end print @two declare @num int ,@i int set @i=1 set @num=0 while (@i<100) begin if @i%2=1 begin set @num=@num+@i set @i=@i+1 print '@i=' print @i print '@num=' print @num continue end else begin if @i>10 break set @i=@i+1 print @i continue end end print @num 等待執行命令 WAITFOR waitfor delay '00:00:05'--跟間隙時間 print '5秒后執行了' waitfor time '11:07:00' --跟具體時間 print '11:07分執行的' goto 跳轉語句 declare @i int set @i=1 while @i<110 begin if @i=1 goto one--跳轉到指定標記 if @i>1 and @i<5?goto two end one: print '等于' two:--定義一個標記 print '大于小于' goto three three: print'下一次就要大于五了' try catch 錯誤處理語句 declare @i int begin try set @i=1/0 end try begin catch print ERROR_LINE() print ERROR_MESSAGE() print '除數不可以為0' end catch 結果 3 遇到以零作除數錯誤。 除數不可以為0 數學函數 declare @i float,@a int set @i=12.234 set @a=100 select round(@i,2)as 保留位小數,CEILING(@i) as 大于@I的最小整數, FLOOR(@i)as 小于@I的最大整數,SQUARE(@a) as 平方 ,SQRT(@a) as 開方, POWER(@a,3) as 三次冪 字符串函數 declare @str varchar(44) set @str='happy a life' select UPPER(@str) 變大寫, ASCII('a') 求ASCII, CHAR(55)查看對應字符, STR(10)+'12' 變字符, REPLACE(@str,' a' ,' all') 替換,REPLICATE('a',5)重復, CHARINDEX('a',@str) 查找字符串起始位置 ,PATINDEX('a%p',@str+'a') 使用通配符 聚合函數 AVG SUM MAX MIN COUNT 日期函數 SELECT GETDATE() 現在日期, YEAR(GETDATE())年 ,month(GETDATE())月 ,day(GETDATE())日,DATEADD(dd,30,GETDATE())相差, DATEDIFF(DD,GETDATE(),'2011-1-25')距離 元數據 declare @a varchar(10) set @a='10' print Isnumeric(@a)--判斷是否為數字 print convert(int,@a*12)--強制類型轉換 print isnull(@a,'為空時返回的值')--是否為空值 標量值函數 CREATE FUNCTION onefun(@a int) --定義函數 RETURNS int--返回類型 AS BEGIN declare @num int,@sum int set @num=1 set @sum=0 while @num<@a begin set @num=@num+1 set @sum=@sum+@num end return @sum --返回值 END GO 游標的操作 --創建游標 declare one_cursor scroll cursor for select * from tt for read only open one_cursor--打開游標 --檢索游標 FIRST 第一行 LAST 最后行 PRIOR 前一行 NEXT 下一行 ABSOLUTE N 第N行RELATIVE N 當前行后N行 fetch RELATIVE 2 from one_cursor select @@FETCH_STATUS?--返回游標狀態,成功-1失敗-2行不存在 CLOSE?ONE_CURSOR--關閉游標 deallocate one_cursor--釋放游標 事務 事務模式:自動提交事務,顯式事務(以BIGIN TRANSACTION 語句顯式開始),隱式事務,批處理級事務 事務管理語句 BEGIN TRANSACTION?開始事務 COMMIT TRANSACTION?提交事務 ROLLBACK TRANSACTION?回滾事務 SAVE TRANSACTION?保存事務 begin TRANSACTION declare @fight int set @fight=0 delete from info where id=2 if @fight = 0 begin commit transaction --提交事務 end else rollback transaction --回滾事務 XACT_ABORT 選項 錯誤是否自動回滾 set xact_abort on 鎖(封鎖 LOCK 解鎖 UNLOCK) 可封鎖的單位有:行,頁,表,盤區和數據庫 鎖的類型 共享(S)鎖 用于讀操作,多個事務共用 獨占(X)鎖,用于寫操作,僅一個事務使用 更新(U)鎖 用于對頁施加X鎖 死鎖(兩個或多個進程因爭奪資源而造成互相等待的現象) 存儲過程 create procedure proc_1?--創建存儲過程 @one varchar(10) --設置參數,在此賦值可以設置默認值 @two varchar(10)=’boy’ as select * from tt where sex=@one exec proc_1 'boy'?--調用存儲過程 存儲過程中的輸出參數 create procedure proc_1?--創建存儲過程 @one int, --設置參數 @two int output --設置輸出參數 as select @two=zongfeng from tt where?id=@one declare @two int exec proc_1 'boy' ,@two output --調用存儲過程,注意調用方式 select @two exec sp_helptext proc_1 –查看存儲過程內容 create proc #show??? --創建臨時存儲過程 as select * from info create proc #show??? --創建全局臨時存儲過程 as select * from info 使用alter proc關鍵字修改存儲過程 使用drop proc關鍵字刪除存儲過程轉載于:https://blog.51cto.com/shenymce/579754
總結
- 上一篇: 一次前后端分离的实践
- 下一篇: php 游标 上移,jQuery点击in