posts - 48,  comments - 5,  trackbacks - 0

          *******************逍湘數(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

           

          posted on 2010-01-05 02:36 逍湘 閱讀(310) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          留言簿(2)

          隨筆檔案(49)

          文章檔案(17)

          最新隨筆

          積分與排名

          • 積分 - 26315
          • 排名 - 1495

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 荃湾区| 若尔盖县| 兴义市| 九龙城区| 临城县| 东辽县| 会泽县| 苍山县| 霍邱县| 广安市| 江华| 施甸县| 保定市| 胶州市| 靖远县| 浦城县| 巫溪县| 昭平县| 电白县| 安塞县| 桂阳县| 昌吉市| 南木林县| 横山县| 中方县| 盘锦市| 丹东市| 临夏县| 始兴县| 樟树市| 西贡区| 武平县| 张北县| 华蓥市| 吕梁市| 保靖县| 拜城县| 田阳县| 郓城县| 大埔区| 昆山市|