數據庫學習筆記

CREATE TABLE dbo.po_details (
OrderID int NOT NULL, ProductID int NOT NULL, UnitPrice money NOT NULL DEFAULT (0),
Quantity smallint NOT NULL DEFAULT (1), Discount real NOT NULL DEFAULT (0) ,
CONSTRAINT PK_po_details PRIMARY KEY CLUSTERED (OrderID, ProductID)
CONSTRAINT FK_po_details_Orders FOREIGN KEY (OrderID) REFERENCES dbo.Orders
CONSTRAINT FK_po_details_Products FOREIGN KEY (ProductID) REFERENCES dbo.Products ) ;
CREATE INDEX OrderID ON dbo.po_details (OrderID ) ;
CREATE INDEX Orderspo_details ON dbo.po_details (OrderID ) ;
CREATE INDEX ProductID ON dbo.po_details (ProductID ) ;
CREATE INDEX Productspo_details ON dbo.po_details (ProductID ) ;
 
 
 
create table dbo.po_orders
(
orderid int not null,
unitprice money default (0),
quantity smallint default(1),
discount real default(0.0),
constraint pk_po_orders primary key clustered (orderid)
)
 
create table dbo.po_products
(
productid int not null,
unitprice money default (0),
quantity smallint default(1),
discount real default(0.0),
constraint pk_po_products primary key clustered (productid)
)
 

create table dbo.po_details
(
orderid int not null,
productid int not null,
unitprice money default (0),
quantity smallint default(1),
discount real default(0.0)
)
alter  table po_details
add constraint pk_po_details primary key clustered (orderid,productid)
 
alter  table po_details
add constraint fk_po_details_order foreign key (orderid)references dbo.orders
alter  table po_details
add constraint fk_po_details_products foreign key (productid)references dbo.products
 

以上創建的表
下面兩行是設兩個外建,但前提是要有dbo.orders dbo.products這兩個表,
而設的這兩個orderid,productid剛一定要是dbo.orders dbo.products這兩個表的主建
 

sql
 
6.1select sql
sytan:
select columnname1,columnname1...
from tablename
 
sample:
select customerid,city,companyname,contactname
from customers
where city='london'
order by customerid desc
 
select customerid,city,companyname,contactname
from customers
where city='london'
order by customerid asc
 
study no1
select customerid,companyname,city,region
from customers
where city='london'
order by customerid desc ,companyname asc
 

select '2' as cat, avg(unitprice) as avgprice,avg(unitsinstock) as avgqty
from products
where categoryid=1
 
select
categoryid,
productname,
unitprice,
unitsinstock,
unitprice * unitsinstock as amount
from products
order by categoryid
 

select orderid,customerid,
year(orderdate) as years,
month(orderdate) as months,
day(orderdate)as dates
from orders
 
.distinct
select categoryid
from products
 

select distinct categoryid
from products
where categoryid  between 1 and 5/where categoryid  between '1' and '5'
 

select distinct categoryid
from products
where categoryid in (1,3,5)
 

select distinct categoryid
from products
where categoryid not between 1 and 5
 
select productname
from products
where productname like 'c%'
 
select productname
from products
where productname like '%s'
 
select productname
from products
where productname like '%f%'
 
select productname
from products
where productname in ('chai')
 

.not/is null
select count(*) as trow
from  customers
where region is null
 
select count(*) as trow
from  customers
91 rows
 
select count(*) as trow
from  customers
where region is null
61 rows
 
select count(*) as trow
from  customers
where region is not null
 
30 rows
 
multy table select
parenet:products
childer:orders
 
select count(*)
from products,order_detail
where products.productid=order_detail.productid
 
 
 
select distinct products.categoryid,categories.categoryname
from products,categories
where products.categoryid=categories.categoryid
order by products.categoryid
 

select sum(unitsinstock)
from products
group by categoryid
 

select *
from products
where (((unitsinstock>20)and (productname between 'chai'and 'pavlova'))
or categoryid in ('1'))and productname like '%an%'
 

insert into shippers (companyname,phone)
values ('dddd','(053) 555-5268')
 

update shippers set companyname='speedy express'
where companyname='ccty'and phone ='(050) 555-5455';
 

create table sum(name char(25),nianling int)
 
create table tb_userlist(
id int not null,
age int not null check(age >=1 and age <=200),
userid char(10) not null default '',
username char(20) default '',
modifydate char(20) not null default (getdate()),
)
alter table tb_userlist add primary key(id)
 

組合查詢結果(union)一個或多個查詢結果放到一個表裏
 
注意:兩個表必須包含同樣數目字段
      第一個表裏與第二個表裏的數據類型一定要相同
      兩個表裏不能用ORDER BY子句排列
 
select  userid,username
from db_userorder1
where username=23
union
select  userid,username
from db_userorder
where username='123'
 
select  userid,username
from db_userorder1
where username=23
union  all                出現兩個重複的結果
select  userid,username
from db_userorder
where username='123'
 
select  userid,username
from db_userorder1
where username=23
union
select  userid,username
from db_userorder
where username='123'
order by 1,2              沒有多大的意思
 

select *
from a
union(select*
      from b
      union
      select*
      from c
)
多個union的重複查詢
 

create table tb_namelist1
(aa int primary key ,
bb char(10),
cc int ,
dd char(20),
ss datetime default (getdate()))
 
create table tb_namelist2
(aa int primary key ,
bb char(10),
cc int ,
dd char(20),
ss char(20) default (getdate()))
 
insert into table_name(name,no,username)
vlaues('dfdf',11,'ddddd')(主健不用高值)
 
insert into table_name
vlaues('dfdf',11,'ddddd')(主健不用高值)
 

delete  
from table_name
where name='ddd'
 

update 的使用
 
update tb_namelist1
set cc=10000
where cc='3'
 
update tb_namelist1
set cc=cc+1
3 row updated.
 
權限的設置
 
grant/revoke insert on tb_namelist1
to li(用戶)
 
grant/revoke all on tb_namelist1
to li
 
grant/revoke update,select,delete,alter on tb_namelist1
to li
 

sp_addlogin 'test','test','db'
 
1 >
 
創建數據庫登陸用戶 如 “用戶名”,‘密碼’,‘數據庫名’
go
sp_addsrvrolemember 'test','sysadmin'
分配權限
go
sp_addrolemember 'db_owner','test'
 
增加數據庫角色 
 
SQL Server用戶aa添加到當前數據庫中的  test角色。 
  EXEC  sp_addrolemember  'test',  'aa' 
 
數據類型
 
integer 整數類型                            
        數量 年齡 編號 訂單號
 
decimal number 小數                     
        分數部分 必須精確的數  比率和百分號
 
floating point number 浮點數               
        重量,距離 小數更大的範圍(會出現四捨五入的錯誤)
 
fixed-length character string 固定長度字符串       
        人名,公司名,通訊地址 描述 
 
variable-length character string  變長字符串  
        每行長度可變成最大長度
 
money amount資金數額                        
        money與currency類型,表現出小數和浮點數
 
date and time 日期和時間
        時間.日期.時間間隔..etc 計算的組合sql2裏的標準 date,time,timestamp和interval數據類型的
精確規範。時區(time zooe)時間精度(10秒,100秒)。
                         
boolean data 布爾數據
        支持邏輯值作爲顯示類型(true或false),還有邏輯運算(and/or,比較)。
 
long text 長文本
        可以存儲整個文本,產品說明,技術文本,簡歷。交互式查詢和查找中,DBMS通常限制這些字段的使用。
 
unstructured byte stream 無結構字節流
        存儲壓縮視頻圖像,可執行代碼,其他類型的無結婚數據。
 
non-roman character 非羅馬字符
        支持其它亞洲和阿拉伯字符
 
 
 
七章    多表查詢(連接)
 
1.  通過匹配相關字段的內容來形成一對一對的記錄的過程連接表。
   
    1>用記錄選擇標準進行連接
    2>多個匹配字段
     select order_num,amount,description
     from orders,products
     where mfr=mfr_id
           and products=product_id
    3>三個或更多表的查詢
 
2.  其它等連接
    1>匹配主鍵和外鍵字的連接總是創建一對多的父/子關係。
    2>至少一個表中的匹配字段對於表的所以有記錄有唯一值,那麼其它連接可以生成一對多的關係。
    3>通常,在任意匹配字段上的連接生成多對多關係。
 
 
3   不等連接
     select name,quota,city,target
     from salesreps,offices
     where quota>/<target 使用符號來表達不等連接。
 
4   SQL對多表查詢要考慮的因素
    1>在多表查詢中有時需要限定段名,用以消除含糊的字段引用。
     select city,sales,name
     from salesreps,offices
     where rep_office=office
error:ambiguous column name'sales'系統不知道你要的是salesreps表,還是offices
的seles
 
改正如下,
     select city,offices.sales,name
     from salesreps,offices
     where rep_office=office
 
    2>對多查詢而言,選擇所有字段(select*)具有特殊的意義
    3>可以使用自連接來創建把一個表關聯到其自身的多表查詢
     select emps.name,mgrs,name
     from emps, mgrs
     where emps.manager=mgrs.empl_num
 
 表emps 與表mgrs是相同的一個表,只是表名不一樣。
虛構的重複表,方法來把一個表和它自身連接起來。
 
    4>FROM子句中可以使用表的別名來簡化限定字段名,並允許自連接中的明確的字段引用。
    給表啓一個別名,在FROM 一定要註名
    select s.name,quota,o.number
    from salesreps s,offices o
    where s.name=o.name
 
5   多表查詢的性能
6   連接的結構 
     1>表的乘積
    連接是對兩個表的數據的通用組合(稱爲笛卡兒積,或積)
     2>多表查詢的處理原則
    查詢結果一個集的過程
7   外連接
  是一個信息保留連接,有你想查到的也結果,也會保留空的也會保留。
    select*
    from girls,boys
    where girls.city *=* boys.city
   1.按正常匹配字段生成兩個表的連接。
   2.對於第一個表中不被第二個表匹配的任何記錄,查詢結果只是第一個表的字段的值。假定第二個表的字段都會null值.
   3.對於第二個表中不被第一個表匹配的任何記錄,查詢結果只是第二個表的字段的值。假定第一個表的字段都會null值.
   4.所得的結果表是兩個表的外連接。
 
  1>左外連接和右外連接
   左外連接:select*
             from girls,boys
             where girls.city *=boys.city
   右外連接:select*
             from girls,boys
             where girls.city =* boys.city
 
  2>外連接的符號是: *
 
如果是多表外連接  tel1 outer-join tel2 outer-join tel3
 
8    連接和SQL2標準
     sql的標準制訂的規範放到FROM子句中,並使用了準確的語法。
  
    1>SQL2中的內連接
    select *
    from girls inner join boys
    on girls.city=boy.city
    using子句指定了用逗號分隔的匹配字段名列表,在個匹配字段在兩個表中必須是相同的,
 它等價於ON,不過用ON可以在兩個表裏出現不同的兩個匹配字段。
    select *
    from girls inner join boys
    using(city,age)
 如果指定了natural關健字,那麼連接說明中不能使用on或using子句。
    SELECT*
    FROM GIRLS NATURAL INNER JOIN BOYS
 
    2>SQL2中的外連接
    全外連接 
    SELECT *
    FROM GIRLS FULL OUTER JOIN BOYS
    ON GIRLS.CITY=BOY.CITY
    OUTER 字句可以省略不寫。
   
    3>SQL2中的交叉連接和合並接連
     兩個表的完全乘積
     SELECT *
     FROM GIRLS CROSS JOIN BOYS
     等於 SELECT *
     RROM GIRLS,BOYS
     合併連接,使用 UNION
     SELECT *
     FROM GIRLS
     UNION JOIN BOYS
  -----------------------------------------------------------------------------
     左外連接 left join              合併連接                 右外連接 right join
      匹配的                         匹配的                    匹配的
   TBL1 ROWS                       TBL1/TBL2                   TBL2 ROWS
  WITH NULL VALUES                 ROW PAIRS                 WITH NULL VALUES                   
  FOR TBL2 COLUMNS                 內連接                     FOR TBL1 COLUMNS
     未匹配的                        未匹配的                   未匹配的
   TBL1 ROWS                       TBL1/TBL2                   TBL2 ROWS
  WITH NULL VALUES                 ROW PAIRS                 WITH NULL VALUES                   
  FOR TBL2 COLUMNS                 交叉連接                   FOR TBL1 COLUMNS
 TBL1,NULL值擴展的               所以有TBL1*TBL2對            TBL2,NULL值擴展的
 
  4>SQL2中的多表連接
 
  第八章 彙總查詢
 
  8.1 字段函數
      ` SUM()計算字段的總和
        AVG()計算字段的平均值
        MIN()查找字段中的最小值
        COUNT()計算字段中值的數目
        COUNT(*)計算查詢結果的記錄數
  GROUP BY 與  HAVING 子句支持這些彙總數據的請求。
 
  8.1.2 NULL的值和字段函數
     SELECT COUNT(*),COUNT(SALES),COUNT(QUOTA)
     FROM SALESREPS
     結果COUNT(*) 10,COUNT(SALES)10 ,COUNT(QUOTA)9
   因QUOTA 有一個NULL值,所以只返回9個。
 
  注意:1>如果字段中任何數據值是NULL,那麼計算函數時就會將他們忽略。
        2>如果字段中每個數據項都是NULL,那麼除COUNT()返回0值以外,都返回NULL。
        3>如字段是空的,那麼除COUNT()返回0值以外,都返回NULL。
        4>COUNT(*)記錄時,不理會字段裏是否NULL值存在都會返回0
 
  8.1.3 清除重複記錄(DISTINCT)
        SELECT COUNT(DISTINCT TITLE)
        FROM SALESPEPS
 
  8.1.4 分組查詢(GROUP BY 子句)
        SELECT ERP,AVG(AMOUNT)
        FROM ORDERS
        GROUP BY ERP
  8.1.5 多個分組查詢
        SELECT ERP ,CUST,SUM(AMOUNT)
        FROM ORDERS
        GROUP BY CUST,ERP
        ORDER BY CUST,ERP
      注意:不能從一個查詢中同時獲得詳細和彙總查詢結果。
     COMPUTE子句可以排除這個難點,它可以計算小計和子小計。
        SELECT ERP,CUST,AMOUNT
        FROM ORDERS
        ORDER BY ERP,CUST
        COMPUTE SUM(AMOUNT)BY ERP,CUST
        COMPUTE SUM(AMOUNT),AVG(AMOUNT)BY ERP
  8.2.1 分組查詢的限制
        一個常量。
        一個字段函數,此函數生成一個值,值爲彙總組中的記錄。
        一個分組字段,這個分組字段在組中的每個記錄有同樣的值。
        涉及上述各項組合的表達式。
  8.2.3 分組字段中的NULL值
        如果兩條記錄在同一分組字段有NULL,並在其它非NULL分組字段有同樣地的
       值,那麼它們就放到同一記錄組中。
  8.3   分組搜索條件(HAVING 子句)
       HAVING=WHERE, HAVING子句與GROUP BY 子句一起使用。HAVING 單獨使用就只表示一個查詢組。
      
       SELECT ERP,AVG(AMOUNT)            語句運行每三步,
       FROM ORDERS                          語句運行每三步,
       GROUP BY ERP                         語句運行每一步,
       HAVING SUM(AMOUNT)>30000           語句運行每二步,
    
 九章  子查詢和查詢表達式
 
  9.1   什麼是子查詢
        子查詢是一個查詢中的查詢,出現在WHERE、HAVING 子句裏的一個小子查詢搜索條件內。
  9.1.2  WHERE 字句中的子查詢
        SELECT NAME
        FROM SALESREPS
        WHERE QUOTA>(0.1*(SELECT SUM(TARGET)FROM OFFICES))
  9.1.3  外部引用
        當DBMS檢查子查詢中的搜索條件時,外部引用中的字段值從主查詢檢測的當前記錄中提取。
 
  9.2   子查詢搜索條件
          
  9.2.1 子查詢比較測試(=,<>,<,<=,>,>=)
         把一個表達式的值與一個子查詢的生成的值做比較。
  9.2.2 組成員測試 (IN)
        檢查一個表達式的值是否匹配由一個子查詢生成的一組值中的一個。
  9.2.3 存在測試(EXISTS)
        測試子查詢是否生成任何查詢結果記錄.
        SELECT QUOTA
        FROM SALESREPS
        WHERE EXISTS (0.1*(SELECT SUM(TARGET)FROM OFFICES))
  9.2.4 限定測試(ANY和ALL)
        檢查一個表達式的值一由一個子查詢生成的一組值中的每一個比較。
 
9.3    子查詢和連接
       子查詢也可以寫成多表查詢或連接
       第一種:SELECT NAME,AGE
               FROM SALESREPS
               WHERE ERP_OFFICE IN(SELECT OFFICE
                             FROM OFFICES
                             WHERE REGION=‘WESTERN’)
       第二種: SELECT NAME,AGE
               FROM SALESREPS,OFFICE
               WHERE REP_OFFICE=OFFICE
               AND REGION='WESTERN'
       兩種結果是一樣的,第一種是運用了子查詢,第二種是連接
 
9.4    嵌套的子查詢
      
       主查詢與子查詢是二級查詢,如果出現更多的子查詢就會是三級查詢
       如:SELECT *
           FROM TABLE1
           WHERE ID IN(SELECT *
                         FROM TABLE2
                         WHERE PRODUCT IN(SELECT *
                                           FROM TABLE3
                                           WHERE NAME IN))
 
9.5    關聯子查詢
      
        對多子查詢來說主查詢的結果,子查詢也會生成對應的一個或是一組結果。
        所以在關聯的子查詢的過程中是用來主查詢與子查詢做對比。
 
9.6    HAVING子句中的子查詢
      
       當查詢結果是一組的時候或是主查詢一組數據與子查詢的一組數據做對比時就會用HAVING
       稱爲記錄組
 
  前面幾章的總結:在SELECT子句中的字段選擇,在FORM子句中的多表連接,WHERE子句中的記錄選擇條件。
  HAVING、GROUP BY子句中的彙總查詢
 
9.8   SQL2 中的高級查詢
 
      `1在查詢中沒有決策制度功能
      `2子查詢的限制使用
        SELECT OFFICE
        FROM OFFICES
        WHERE(SELECT SUM(QUOTA)
                FROM SALESREPS
                WHERE ERP_OFFICE=OFFICE)> TARGET
  這個是不合法的SQL1語句,不等號要反過來,
  因WHERE子句中比較測試在於右過。
        SELECT OFFICE
        FROM OFFICES
        WHERE TARGET>(SELECT SUM(QUOTA)
                FROM SALESREPS
                WHERE ERP_OFFICE=OFFICE)
這樣是合法的
 
      `3受限制的記錄表達式
       
      `4受限制的表的表達式
      
 
9.8.1  標量值表達式(SQL2)
 
      1 CAST 表達式
 
       用途之一處理數據庫裏的NULL值
      在SQL1 轉換來自一個數據庫表的數據,其中在這個表中字段定義了錯誤的數據類型。
             轉換數據類型,不爲宿主編程語言支持的DBMS支持.
             清除在兩個不同的表中數據類型之間的差別。
 
         SELECT PRODUCT,QTY AMOUNT
         FROM    ORDERS
         WHERE CUST=CAST‘2107’AS INTEGER
 
      CAST 表達式
      在SQL2 中的查詢是按,第一個搜索條件爲正解的,就是CASE表達式的值,如第一個搜索條件不正解就會到第二個搜索條件。
      如此下去。
     
       SELECT COMPANY,CASE WHEN CREDIT_LIMIT>6000 THEN 'A'
                            WHEN CREDIT_LIMIT>3000 THEN 'B'
                            ELSE 'C'
          FROM CUSTOMERS
    
      2  COALESCE 表達式(SQL2)
 
       檢查是否有NULL如有就會向下查詢,如沒有就會變成表達式的值
 
       SELECT NAME,COALESCE(QUOTA,SALES,0.00)              
        FROM SALESREPS
      
      3  NULLIF表達式(SQL2)
         它檢測兩個值是否相等,如相同就會生成一個NULL
 
        SELECT CITY,SUM(SALES)
        FROM OFFICES,SALESREPS
        WHERE OFFICE=(NULLIF REP_OFFICE,0)
        GROUP BY CITY
 
9.8.2   記錄值的表達式(SQL2)
      
      `1 記錄值的結構
      `2 記錄值子查詢
      `3 記錄值做比較
 
9.8.3   表值表達式
      `1 表的結構
      `2 表值子查詢
          查詢規範
 
9.8.4 查詢表達式
    
     連接(JOIN) 交叉連接,處連接,內連接,所有類型的外連接 ,
        
     並(UNION)  合併兩個兼容表的記錄
    
     差(DIFFERENCE) 像兩個表的減法一樣
 
     交(INTERSECT)包含出現在兩個表中的記錄
 

            第三部分
 
                               更新數據
 
      第十章         數據庫更新
 
 
 
 
 
 
 
 
 
 
 
 
 

      第十一章       數據庫完整性
   
 
 
 
 
 
    11.6.1 斷言
         
   因爲斷言是數據庫中的一個對象(如表或字段)所以有必須有一個名字,當違反的時候DBMS出錯。
  
   例如: 保證客戶訂單的資金總量不超過他們的信用額度
 
       CREATE ASSERTRON credit_orders
            CHECK (CUSTOMER.CREDIT_LIMIT <=
                       SELECT SUM (ORDERS.AMOUNT)
                           FROM ORDERS
                        WHERE ORDERS.CUST = CUSTOMER.CUST_NUM)
 
    11.6.2 SQL2 約束類型
    
           NOT NULL(非空)約束             約束僅出現在字段約束中
 
           PRIMARY KEY(主鍵字)約束        出現在字段或是表約束中
 
           UNIQUE(惟一性)約束             可以出現在字段約束或表約束中。
      
           FOREIGN KEY (外鍵字)約束       可以出現在字段約束或表約束中  
 
           CHECK(檢驗)約束                可以出現在字段約束或表約束中,它也是惟一的形成域或斷言定義的約束。
   
   11.6.3 延期約束檢驗
 
          當服務器對數據庫的更新必須立即執行,以保持數據的一致性,延期約束檢驗就很重要。
       
          例如:  保證銷售點的定額目標精確地與各個銷售人員的銷售定額總和相等
                
           CREATE ASSERTION QUOTA _TOTALS
             CHECK ((OFFICES.QUOTA = SUM(SALESREPS.QUOTA))AND
                       (SALSREPS.ERP_OFFICE = OFFICES.OFFICE))
 
           如果在一個表中用INSERT 而不更新另一個表,斷言不爲TURE。 或 UPDATE一個表時,另一個表不插入這個數據
           斷言也不爲TURE.
          
    所以: DEFERRABLE(可延期執行)約束                
                
                   INTIALLY IMMEDIATE(初始立即執行)約束     它將立即檢驗每一個SQL語句  
  
                   INITIALLY DEFERRDE (初始延時執行)約束     被延期檢驗,直到事務結束。
          
          NOT DEFERRABLE (不可延期執行)約束          不能被延期檢驗的約束,如主鍵字約束,惟一性約束 等。
 
         
          例如:  CREATE ASSERTION QUOTA _TOTALS
                     CHECK ((OFFICES.QUOTA = SUM(SALESREPS.QUOTA))AND
                       (SALSREPS.ERP_OFFICE = OFFICES.OFFICE))
                      DEFERRABLE INITIALLY IMMEDIATE
 
                         
        手工設置約束爲IMMEDIATE模式
 
             SET CONSTRAINTS QUOTA_TOTALS IMMEDIATE
        也可以用逗號分隔的列表把幾種不同的約束設置爲同樣的模式。
             SET CONSTRAINTS QUOTA_TOTALS,REP_TOTALS IMMEDIATE
        最後,可以用單獨一條語句爲所有約束設置處理模式。
             SET CONSTRAINTS ALL DEFERRED
 

  11.7 商業規則
      
       1. 不允許客戶給出超出客戶信用額度的訂單。
       2. 無論何時要指定某個客戶的信用度高於50000美元,必須通知銷售副總裁。
       3. 訂單登記之後,僅可以保留半年,訂單超過半年時,必須被撤銷和重新輸入。
       4. 無論何時獲得一份新訂單,獲得訂單的人員和人員工作的銷售點的SALES字段,應按訂單的訂購數量而增加。
       5. 無論何時獲得一份新訂單,訂單上產品的QTY_ON_HAND字段應該按產品訂購的數量而減小。
     
     商業規則缺點
 
       1. 重複工作    幾個不同的程序處理各種對ORDERS表的更新,它們中的每一個必須包含實施與ORDERS更新有關的規則代碼。
       2. 缺乏一致性  幾個程序員對某個表做更新,它們會實施規則,但方式會有所不同。
       3. 維護問題    如修改商業規則,程序員必須識別每個實施規則的程序,然後定位代碼並正確修改它。
       4. 複雜性      有許多規則要記住。
 
    11.7.1  什麼是觸發器
 
        例如:當添加一個新訂單到ORDERS表時,下面兩個對數據庫的修改也應該發生。
 
              1. 獲得訂單的銷售人員的SALES 字段應該根據訂單的數量面增加。
              2. 被訂購的產品的QTY_ON_HAND數量應該根據訂購數量而減少。
 
        
        用SQL SERVER觸發器定義
 
              CREATE TRIGGER NEWORDER------------NEWORDER 新表名
                 ON ORDERS
                 FOR INSERT
              AS UPDATE SALSREPS
                  SET SALES = SALES + INSERTED.AMOUNT
                  FROM SALESREPS,INSERTED
                  WHERE SALESREPS.EMPL_NUM = INSERTED.ERP
                 UPDATE PRODUCTS
                   SET QTY_ON_HAND = QTY_ON_HAND - INSERTED.QTY
                   FROM FRODUCTS,INSERTED
                   WHERE PRODUCTS.MFR_ID = INSERTED.MFR
                    AND PRODUCTS.PRODUCTS_ID = INSERTED.PRODUCT
  
         用DB2語法定義
 
                
             CREATE TRIGGER NEWORDER
                 AFTER INSERT ON ORDERS
               REFERENCING NEW AS NEW_ORD ----------------NEW_ORDG 一個表的另名
                FOR EACH ROW MODE DB2 SQL
                   BEGIN ATOMIC  -------------------------
                 UPDATE SALSREPS
                  SET SALES = SALES + NEW_ORD.AMOUNT
                  WHERE SALESREPS.EMPL_NUM = NEW_ORD.ERP;
                  UPDATE PRODUCTS
                    SET QTY_ON_HAND = QTY_ON_HAND - NEW_ORD.QTY
                   WHERE PRODUCTS.MFR_ID = NEW_ORD.MFR;
                    AND PRODUCTS.PRODUCTS_ID = NEW_ORD.PRODUCT
                    END
                  
    11.7.2 觸發器與引用完整性
 
          觸發器也可以被用來提供引用完整性的擴展形式。
        
          1 引用完整性的的觸發器
            更新失敗時
           create trigger erp_update
            on salesreps
               for insert,update
                 as if ((select count(*)
                            from office ,inserted
                           where offices.office=inserted.erp_office)=0)
                begin
                     print"invalid office number specified"
                     rollback transction
                end
          2 db2最初通過CASCADE級聯更新,如主健字值改變,則不運動支持層疊更新。
       但SQL SERVER 的觸發器可以完成層疊更新。
        例如:層疊更新OFFICE 表中的OFFICE字段爲SALESREPS表的REP_OFFICE 字段  
 
          create trigger change_erp_office
               on offices
              for update
               as if update(office)
               begin
                    update salesreps
                    set salesreps.erp_office = inserted.office
                    from salesreps,inserted,deleted
                    where salesreps.erp_office = deleted.office
          
 
    11.7.3 觸發器的優缺點
           
          
          1. 數據庫複雜性:觸發器編程使任務變的複雜
          2. 隱藏規則:    規則隱藏在數據庫裏,更新時,就會不在程序員的控制下產生大量的數據庫動作。
          3. 隱藏性能的暗示: 用存儲在數據庫裏的觸發器,執行SQL語句的結果不在爲程序員完全可見。
 
    禁用或開啓觸發器
           語法:alter table <表名> enable/disable trigger 觸發器名
 
           例如:alter table tb_hr_gz enable/disable trigger tg_tb_hr_gz
           
             
 
 
 
                        第十二章  事務處理
 
   
 
       
 
         如:增加一個訂單:
             1.查詢PRODUCTS表,確定庫中有相應產品
             2.插入訂單到ORDERS表
             3.更新PRODUCTS表,從現有產品數量減去已訂購的數量。
             4.更新SALESREPS表,把訂單上所標的產品訂購數量添加到取得訂單的銷售人員的銷售總量中。
             5.更新OFFICES表,增加訂單上所標的產品訂購數量到銷售人員工作的銷售點的銷售總量中。
          
             取消訂單
 
             1.從ORDERS表中刪除訂單
             2.插入訂單到ORDERS表
             3.更新SALESREPS表,把訂單上所標的產品訂購數量得到取得訂單的銷售人員的銷售總量中刪除。
             4.更新OFFICES表,刪除訂單上所標的產品訂購數量到銷售人員工作的銷售點的銷售總量中
   
    12.1 什麼是事務
        
         事務(transaction)是一條或多條SQL語句序列,它們組合在一起形成一個邏輯工作單元。
   按先後順序完成任務。
 
    12.1.1
         COMMIT(提交)  COMMIT語句 表示事務成功結束
         ROLLBACK(回滾) ROLLBACK語句 表示事務沒有成功結束
      例如:編號113051的訂單量從4改爲10 總銷售額從1458改爲3550 訂單上的產品是QAS-XK47減壓器,
           工作在LOS ANGELES 銷售編號爲21 的LARRY FITCH 僱員編號爲108
          
         UPDATE ORDERS
           SET QTY = 10,AMOUNT =3550.00
         WHERE ORDER_NR =113051
         UPDATE SALESREPS
           SET SALES = SALES -1458.00+3350.00
         WHERE EMPL_NUM = 108
         UPDATE OFFICES
           SET SALES = SALES -1458.00+3350.00
         WHERE OFFICE= 21
         UPDATE PRODUCTS
           SET QTY_ON_HAND = QTY_ON_HAND + 4 -10
         WHERE MFR_ID = 'QSA'
         AND PRODUCT_ID='XK47'
        .......確認最後一個關於客戶的修改寫成........
          COMMIT WORK
       
       對比, 假如這個用戶錯誤的輸入了產品編號 
         
         UPDATE ORDERS
           SET QTY = 10,AMOUNT =3550.00
         WHERE ORDER_NR =113051
         UPDATE SALESREPS
           SET SALES = SALES -1458.00+3350.00
         WHERE EMPL_NUM = 108
         UPDATE OFFICES
           SET SALES = SALES -1458.00+3350.00
         WHERE OFFICE= 21
         UPDATE PRODUCTS
           SET QTY_ON_HAND = QTY_ON_HAND + 4 -10
         WHERE MFR_ID = 'QAS'
         AND PRODUCT_ID='XK47'
        .......噢!生產廠家是“QSA”不是“QAS”........
          ROLLBACK WORK
  
      12.1.2 ANSI/ISO 事務模型
        
         COMMIT(提交)  COMMIT語句 表示事務成功結束,它使數據庫永久被修改,COMMIT後立即開始下個新事務
         ROLLBACK(回滾) ROLLBACK語句 表示事務沒有成功結束,回腿對數據庫的修改,ROLLBACK 後立即開始下個新事務
         SUCCESSFUL PROGRAM TERMAINATION(成功地終止程序)事務成功結束,但之後沒有新事務。
         ABNORMAL PRGRAM TERMINATION (非正常地終止程序) 務沒有成功結束,但之後沒有新事務。
     
      12.1.3 其它事務模型
        
          SYBASE 作用的TRANSACT-SQL方言包括4條事務處理語句
 
           BEGIN TRANSACTION(開始事務)表示事務開始。ANSI/ISO模型暗示在前一個事務結束,後個事務開始。而SYBASE需要
                                        一條明確的語句來開始一個事務。        
           COMMIT TRANSACTION(提交事務) 事務成功結束,與ANSI/ISO模型一樣對數據庫永久被修改,但是,瓣的事務不會自動開始。
           SAVE TRANSACTION (保存事務)  在事務的中間建立一個保存點(SAVEPOINT),SYBASE 在事務中的當前點保存數據庫的狀態,
                                          並且給保存狀態賦一個保存點的名,該保存點名在語句中指定。
           ROLLBACK TRANSACTION(回滾事務)該事務有兩個角色,如保存點在ROLLBACK語句中命名,SYBASE自保存點撤銷所做的數據修改
                                           回到保存點(SAVE TRANSACTION),如沒有命名保存點,ROLLBACE反回到BEGIN TRANSACTION
                                           開始,撤銷所以對數據的修改。
         
    12.2 事務的內幕
         
         
    12.3 事務和多用戶處
      
      12.3.1 丟失更新的問題
      12.3.2 未提交數據的問題
      12.3.3 不一致數據的問題
      12.3.4 虛幻插入的問題
      12.3.5 併發事務 
 
 

    12.4 鎖定
 
       12.4.1 鎖定級別
       12.4.2 共享獨佔鎖
       12.4.3 死鎖 DEADLOCK
       12.4.4 高級鎖定技術
           明鎖  
           絕緣鎖   
           鎖定參數  
              鎖的尺寸  鎖定的數量    擴大鎖   鎖定超時
           獨佔模式   
           共享模式
          
    12.5 版本化
     
 

                                        第四部分
 
            第十三章 創建數據庫
 
   13.1 數據定義語言
       
       DATA DEFINITION LANGUAGE,DDL
    能夠知道:
       1.定義和創建新表。
       2.刪除不再需要的表。
       3.修改已有表的定義。
       4.定義數據的虛表(視圖)。
       5.建立數據庫安全控制。
       6.建立索引,以便可以快速訪問表。
       7.用DBMS 控制數據的物理存儲。
   
   13.2 表定義
   
     13.2.1 創建表
     
       字段定義
 
          字段名:表中的字段必有要有一個名字,其它表裏可以相同
          數據類型: VARCHAR、DECIMAL 需要附加數據長度和小數點的位置,放圓括號裏面。
          要求的數據: 是爲NULL或NOT NULL
          默認值:     當INSERT時沒有指定字段值時,這個字段使用默認值。
     
       主鍵字和外鍵字
           FOREIGN KEY 子句指明表中的外鍵字和表與數據庫中另一個(父表)的關係,子句指明:
          1.形成外鍵字的字段或字段組,所有這些字段都是所創建的表的字段。
          2.被外鍵字引用的表,這是關係中的父表,被定義的表是子表。
          3.關係的可選名,在SQL數據操作語言中都不使用這個名字中,但是它可以出現在錯誤信息中,如果以後想要停止
            使用外鍵字,要用到該名字。
          4.當將它與父表中的記錄匹配時,DBMS怎麼處理外鍵字的一個或多個字段中的NULL值。
          5.關係的可選的刪除規則
          6.關係的可選更新規則
          7.可選的檢驗約束它限制表中的數據,以便它的各個記錄符合指定的搜索條件。
  
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章