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 ) ;
(
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)
)
(
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)
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
sytan:
select columnname1,columnname1...
from tablename
select customerid,city,companyname,contactname
from customers
where city='london'
order by customerid desc
from customers
where city='london'
order by customerid asc
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
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
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
from products
where productname like 'c%'
from products
where productname like '%s'
from products
where productname like '%f%'
from products
where productname in ('chai')
.not/is null
select count(*) as trow
from customers
where region is null
from customers
91 rows
from customers
where region is null
61 rows
from customers
where region is not null
parenet:products
childer:orders
from products,order_detail
where products.productid=order_detail.productid
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)
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子句排列
from db_userorder1
where username=23
union
select userid,username
from db_userorder
where username='123'
from db_userorder1
where username=23
union all 出現兩個重複的結果
select userid,username
from db_userorder
where username='123'
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()))
(aa int primary key ,
bb char(10),
cc int ,
dd char(20),
ss char(20) default (getdate()))
vlaues('dfdf',11,'ddddd')(主健不用高值)
vlaues('dfdf',11,'ddddd')(主健不用高值)
delete
from table_name
where name='ddd'
update 的使用
set cc=10000
where cc='3'
set cc=cc+1
3 row updated.
to li(用戶)
to li
to li
sp_addlogin 'test','test','db'
1 >
go
sp_addsrvrolemember 'test','sysadmin'
分配權限
go
sp_addrolemember 'db_owner','test'
EXEC sp_addrolemember 'test', 'aa'
數量 年齡 編號 訂單號
分數部分 必須精確的數 比率和百分號
重量,距離 小數更大的範圍(會出現四捨五入的錯誤)
人名,公司名,通訊地址 描述
每行長度可變成最大長度
money與currency類型,表現出小數和浮點數
時間.日期.時間間隔..etc 計算的組合sql2裏的標準 date,time,timestamp和interval數據類型的
精確規範。時區(time zooe)時間精度(10秒,100秒)。
boolean data 布爾數據
支持邏輯值作爲顯示類型(true或false),還有邏輯運算(and/or,比較)。
可以存儲整個文本,產品說明,技術文本,簡歷。交互式查詢和查找中,DBMS通常限制這些字段的使用。
存儲壓縮視頻圖像,可執行代碼,其他類型的無結婚數據。
支持其它亞洲和阿拉伯字符
1>用記錄選擇標準進行連接
2>多個匹配字段
select order_num,amount,description
from orders,products
where mfr=mfr_id
and products=product_id
3>三個或更多表的查詢
1>匹配主鍵和外鍵字的連接總是創建一對多的父/子關係。
2>至少一個表中的匹配字段對於表的所以有記錄有唯一值,那麼其它連接可以生成一對多的關係。
3>通常,在任意匹配字段上的連接生成多對多關係。
3 不等連接
select name,quota,city,target
from salesreps,offices
where quota>/<target 使用符號來表達不等連接。
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
3>可以使用自連接來創建把一個表關聯到其自身的多表查詢
select emps.name,mgrs,name
from emps, mgrs
where emps.manager=mgrs.empl_num
虛構的重複表,方法來把一個表和它自身連接起來。
給表啓一個別名,在FROM 一定要註名
select s.name,quota,o.number
from salesreps s,offices o
where s.name=o.name
6 連接的結構
1>表的乘積
連接是對兩個表的數據的通用組合(稱爲笛卡兒積,或積)
2>多表查詢的處理原則
查詢結果一個集的過程
7 外連接
是一個信息保留連接,有你想查到的也結果,也會保留空的也會保留。
select*
from girls,boys
where girls.city *=* boys.city
1.按正常匹配字段生成兩個表的連接。
2.對於第一個表中不被第二個表匹配的任何記錄,查詢結果只是第一個表的字段的值。假定第二個表的字段都會null值.
3.對於第二個表中不被第一個表匹配的任何記錄,查詢結果只是第二個表的字段的值。假定第一個表的字段都會null值.
4.所得的結果表是兩個表的外連接。
左外連接:select*
from girls,boys
where girls.city *=boys.city
右外連接:select*
from girls,boys
where girls.city =* boys.city
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
全外連接
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中的多表連接
第八章 彙總查詢
` SUM()計算字段的總和
AVG()計算字段的平均值
MIN()查找字段中的最小值
COUNT()計算字段中值的數目
COUNT(*)計算查詢結果的記錄數
GROUP BY 與 HAVING 子句支持這些彙總數據的請求。
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
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'
兩種結果是一樣的,第一種是運用了子查詢,第二種是連接
主查詢與子查詢是二級查詢,如果出現更多的子查詢就會是三級查詢
如:SELECT *
FROM TABLE1
WHERE ID IN(SELECT *
FROM TABLE2
WHERE PRODUCT IN(SELECT *
FROM TABLE3
WHERE NAME IN))
對多子查詢來說主查詢的結果,子查詢也會生成對應的一個或是一組結果。
所以在關聯的子查詢的過程中是用來主查詢與子查詢做對比。
當查詢結果是一組的時候或是主查詢一組數據與子查詢的一組數據做對比時就會用HAVING
稱爲記錄組
HAVING、GROUP BY子句中的彙總查詢
`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)
這樣是合法的
`4受限制的表的表達式
在SQL1 轉換來自一個數據庫表的數據,其中在這個表中字段定義了錯誤的數據類型。
轉換數據類型,不爲宿主編程語言支持的DBMS支持.
清除在兩個不同的表中數據類型之間的差別。
FROM ORDERS
WHERE CUST=CAST‘2107’AS INTEGER
在SQL2 中的查詢是按,第一個搜索條件爲正解的,就是CASE表達式的值,如第一個搜索條件不正解就會到第二個搜索條件。
如此下去。
SELECT COMPANY,CASE WHEN CREDIT_LIMIT>6000 THEN 'A'
WHEN CREDIT_LIMIT>3000 THEN 'B'
ELSE 'C'
FROM CUSTOMERS
2 COALESCE 表達式(SQL2)
FROM SALESREPS
3 NULLIF表達式(SQL2)
它檢測兩個值是否相等,如相同就會生成一個NULL
FROM OFFICES,SALESREPS
WHERE OFFICE=(NULLIF REP_OFFICE,0)
GROUP BY CITY
`1 記錄值的結構
`2 記錄值子查詢
`3 記錄值做比較
`1 表的結構
`2 表值子查詢
查詢規範
連接(JOIN) 交叉連接,處連接,內連接,所有類型的外連接 ,
並(UNION) 合併兩個兼容表的記錄
差(DIFFERENCE) 像兩個表的減法一樣
第三部分
第十一章 數據庫完整性
因爲斷言是數據庫中的一個對象(如表或字段)所以有必須有一個名字,當違反的時候DBMS出錯。
例如: 保證客戶訂單的資金總量不超過他們的信用額度
CREATE ASSERTRON credit_orders
CHECK (CUSTOMER.CREDIT_LIMIT <=
SELECT SUM (ORDERS.AMOUNT)
FROM ORDERS
WHERE ORDERS.CUST = CUSTOMER.CUST_NUM)
NOT NULL(非空)約束 約束僅出現在字段約束中
PRIMARY KEY(主鍵字)約束 出現在字段或是表約束中
FOREIGN KEY (外鍵字)約束 可以出現在字段約束或表約束中
CHECK(檢驗)約束 可以出現在字段約束或表約束中,它也是惟一的形成域或斷言定義的約束。
11.6.3 延期約束檢驗
例如: 保證銷售點的定額目標精確地與各個銷售人員的銷售定額總和相等
CREATE ASSERTION QUOTA _TOTALS
CHECK ((OFFICES.QUOTA = SUM(SALESREPS.QUOTA))AND
(SALSREPS.ERP_OFFICE = OFFICES.OFFICE))
斷言也不爲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,REP_TOTALS IMMEDIATE
最後,可以用單獨一條語句爲所有約束設置處理模式。
SET CONSTRAINTS ALL DEFERRED
11.7 商業規則
1. 不允許客戶給出超出客戶信用額度的訂單。
2. 無論何時要指定某個客戶的信用度高於50000美元,必須通知銷售副總裁。
3. 訂單登記之後,僅可以保留半年,訂單超過半年時,必須被撤銷和重新輸入。
4. 無論何時獲得一份新訂單,獲得訂單的人員和人員工作的銷售點的SALES字段,應按訂單的訂購數量而增加。
5. 無論何時獲得一份新訂單,訂單上產品的QTY_ON_HAND字段應該按產品訂購的數量而減小。
商業規則缺點
2. 缺乏一致性 幾個程序員對某個表做更新,它們會實施規則,但方式會有所不同。
3. 維護問題 如修改商業規則,程序員必須識別每個實施規則的程序,然後定位代碼並正確修改它。
4. 複雜性 有許多規則要記住。
1. 獲得訂單的銷售人員的SALES 字段應該根據訂單的數量面增加。
2. 被訂購的產品的QTY_ON_HAND數量應該根據訂購數量而減少。
用SQL SERVER觸發器定義
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 字段
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
1. 數據庫複雜性:觸發器編程使任務變的複雜
2. 隱藏規則: 規則隱藏在數據庫裏,更新時,就會不在程序員的控制下產生大量的數據庫動作。
3. 隱藏性能的暗示: 用存儲在數據庫裏的觸發器,執行SQL語句的結果不在爲程序員完全可見。
語法:alter table <表名> enable/disable trigger 觸發器名
1.查詢PRODUCTS表,確定庫中有相應產品
2.插入訂單到ORDERS表
3.更新PRODUCTS表,從現有產品數量減去已訂購的數量。
4.更新SALESREPS表,把訂單上所標的產品訂購數量添加到取得訂單的銷售人員的銷售總量中。
5.更新OFFICES表,增加訂單上所標的產品訂購數量到銷售人員工作的銷售點的銷售總量中。
取消訂單
2.插入訂單到ORDERS表
3.更新SALESREPS表,把訂單上所標的產品訂購數量得到取得訂單的銷售人員的銷售總量中刪除。
4.更新OFFICES表,刪除訂單上所標的產品訂購數量到銷售人員工作的銷售點的銷售總量中
12.1 什麼是事務
事務(transaction)是一條或多條SQL語句序列,它們組合在一起形成一個邏輯工作單元。
按先後順序完成任務。
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條事務處理語句
一條明確的語句來開始一個事務。
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.2 共享獨佔鎖
12.4.3 死鎖 DEADLOCK
12.4.4 高級鎖定技術
明鎖
絕緣鎖
鎖定參數
鎖的尺寸 鎖定的數量 擴大鎖 鎖定超時
獨佔模式
共享模式
12.5 版本化
第四部分
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.可選的檢驗約束它限制表中的數據,以便它的各個記錄符合指定的搜索條件。