SQL 必知必會—筆記

目錄
第1章 瞭解SQL
第2章 檢索數據
第3章 排序檢索數據
第4章 過濾數據
第5章 高級數據過濾
第6章 用通配符進行過濾
第7章 創建計算字段
第8章 使用數據處理函數
第9章 彙總數據
第10章 分組數據
第11章 使用子查詢
第12章 聯結表
第13章 創建高級聯結
第14章 組合查詢
第15章 插入數據
第16章 更新和刪除數據
第17章 創建和操作表
第18章 使用視圖
第19章 使用存儲過程
第20章 管理實務處理
第21章 使用遊標
第22章 瞭解高級SQL特性


第1章 瞭解SQL
1. 數據庫(database)保存有組織的數據的容器(一個/一組文件)。
2. 表(table)某種特定類型的結構化清單。
3. 模式(schema)關於數據庫和表的部署及特性的信息。
4. 列(colomn)表中的一個字段。所有表都由一個或多個列組成。
5. 行(row)表中的一個記錄。
6. 主鍵(primary key)一列(或一組列),其值能夠唯一標識表中每個行。
①任意兩行都不具有相同的主鍵值;
②每個行都必須具有一個主鍵值(主鍵列不允許NULL值);
③主鍵列中的值不允許修改或更新;
④主鍵值不能重用(如果某行從表中刪除,它主鍵不能賦給以後的新行)。
7. SQL(Structured Query Language,結構化查詢語句)是一門專門用來與數據庫通信的語言。

第2章 檢索數據
1. SELECCT語句用途是從一個或多個表中檢索信息。
2. 關鍵字(Keyword)作爲SQL組成部分的保留字,不能用作表或列的名字。
3. 檢索列:SELECT列名 FROM 表名;
4. SQL關鍵字不分大小寫,建議關鍵字大寫。結束語句用分號;

第3章 排序檢索數據
1. 子句(clause)SQL語句由子句構成,通常由一個關鍵字加上所提供的數據組成。
2. 可用ORDER BY子句明確地排序用SELECT語句檢索出的數據。應保證ORDER BY子句是SELECT語句中最後一條子句。
3. 按列名排序:ORDER BY列名,列名;(按多個列排序)
4. 按列位置排序:ORDER BY 2,3;按SELECT中第2、3個列名排序。
5. 進行降序排序,DESC關鍵字只應用到直接位於其前面的列名。ORDER BY prod_price DESC, prod_name;

第4章 過濾數據
1. 只檢索所需數據需要制定搜索條件(search criteria),也稱過濾條件(filter condition)。
2. 數據根據WHERE子句中指定的搜索條件進行過濾,WHERE子句在表名(FROM子句)之後給出。
3. WHERE子句操作符:
<>(不等於)
!=(不等於)
=(等於)
<(小於)
<=(小於等於)
!<(不小於)

(大於)
=(大於等於)
!>(不大於)
BETWEEN … AND …(指定值間)
IS NULL(爲NULL值)
4. 限定條件中出現字符或字符串,需要單引號括起來,如:’HELLO’
5. 範圍檢索例:WHERE prod_price BETWEEN 5 AND 10;
6. NULL無值(no value),區別於0、空字符、空格。
7. 檢查NULL值列例:WHERE prod_price IS NULL;

第5章 高級數據過濾
1. 更強過濾控制,給出多個WHERE子句,這些子句以兩種方式使用,即以AND子句方式或OR子句方式使用。
2. 爲了通過不止一個列進行過濾,可使用AND操作符給WHERE子句附加條件。WHERE vend_id = ‘DLL01’ AND prod_price <= 4;
3. OR用於WHERE子句中,用來表示檢索匹配任意給定條件的行。WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’;
4. AND操作符的優先級高於OR,爲避免條件匹配錯誤或歧義,都應該使用圓括號明確地分組操作符。
5. IN操作符用來指定條件範圍,範圍中的每個條件都可以進行匹配。IN取合法值得有逗號分隔的清單,全都在圓括號中。功能與OR相當。WHERE vend_id IN(‘DLL01’,’BRS01’)
優點:
①使用長的合法選項清單時,IN操作符的語法更清楚、直觀。
②在用IN時,計算次序更容易管理(操作符更少)。
③IN操作符一般比OR操作符清單執行更快。
④IN最大優點是可包含其他SELECT語句,使得更能動態地建立WHERE子句。
6. NOT操作符有且只有一個功能,那就是否定它之後所跟的任何條件。WHERE NOT vend_id = ‘DLL01’

第6章 用通配符進行過濾
1. 通配符(wildcard)用來匹配值的一部分的特殊字符。
2. 搜索模式(Search Pattern):由字面值、通配符或者兩者組合構成的搜索條件。
3. 爲在搜索句子中使用通配符,必須使用LIKE操作符,以指示DBMS,後跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較。
4. 通配符搜索只能用於文本字段(串),非文本數據類型字段不能使用通配符搜索。
5. 百分號通配符(%)可匹配任何字符出現任意次數。(在MS Access中符號爲*) WHERE prod_name LIKE ‘Fish%’;
6. 下劃線通配符(_)只匹配一個字符。(MS Access中符號爲?)
7. 方括號通配符([])用來指定一個字符集,必須匹配指定位置(即通配符位置)的一個字符。僅少數DBMS支持:MS Access、MS SQL和Sybase Adaptive Server。此通配符可以用前綴字符^(脫字號)來否定。(MS Access用!)
8. 使用通配符技巧:
①不要過分使用通配符。能不用盡量不用。
②除非必要。否則通配符勿用於搜索模式開始處。(會導致性能下降)
③注意正確放置通配符位置。

第7章 創建計算字段
1. 字段(field)基本上與列(column)的意思相同,常互換使用,不過數據庫一般稱爲“列”,而術語“字段”通常用在計算字段的連接上。
2. 拼接(concatenate)將值聯結到一起構成單個值,可用加號(+)或兩個豎槓(||)表示,這依賴於具體的DBMS。
3. TRIM函數(大多數DBMS支持),RTRIM()去掉串右邊空格、LTRIM()去掉串左邊空格以及TRIM()去掉串左右兩邊的空格。
4. 一個未命名的列不能用於客戶機應用中,因爲客戶機沒有辦法引用它。須用列別名(alias)解決。
5. 列別名(alias)是一個字段或值的替換名,使用AS關鍵字賦予:
SELECT RTRIM(vend_name) || ‘(’ || RTRIM(vend_country) || ‘)’ AS vend_title
6. 計算字段用途:字符串拼接、算術計算。
7. 計算字段執行算術運算示例:
SELECT prod_id,
quantity,
Item_price,
quantity*item_price AS expanded_price
FROM …
WHERE…

第8章 使用數據處理函數
1. SQL支持利用函數來處理數據,不同的DBMS函數名與功能有所差異,難以移植。
2. 大多數SQL實現支持一下類型的函數:
①用於處理文本串(如刪除、填充值,轉換值爲大/小寫)的文本函數。
②用於在數值數據上進行算術操作的數值函數。
③用於處理日期和時間值並從這些值中提取特定成分的日期和時間的函數。
④返回DBMS正使用的特殊信息(如返回用戶登錄信息)的系統函數。

第9章 彙總數據
1. 聚集函數(aggregate function)運行在行組上,計算和返回單個值的函數。(得到的是彙總信息而非實際數據本身)
①AVG()返回某列平均值
②COUNT()返回列行數
③MAX()返回某列最大值
④MIN()返回某列最小值
⑤SUM()返回某列值之和
2. AVG()通過對對錶中行數計數並計算特定列值之和,得到列平均值。
3. COUNT()確定表中行數的數目或符合特定條件的行的數目。
①使用COUNT(*)對錶中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值。
②使用COUNT(column)對特定列中具有值的進行計數,忽略NULL。
4. 利用標準的算術操作符,所有聚集函數都可用來執行多個列上計算。
5. 聚集不同值
①對所有的行執行計算,指定ALL參數或不給參數。(ALL爲默認)
②只包含不同的值,指定DISTINCT函數。
6. SELECT語句可包含多個聚集函數。(組合聚合函數)

第10章 分組數據
1. 分組允許把數據分爲多個邏輯組,以便能對每個組進行聚集計算。
2. GROUP BY子句指示DBMS分組數據。一些該子句重要規定:
①~子句可以包含任意數目的列
②如果在G~子句中嵌套了分組,數據將在最後規定的分組上進行彙總。
③GROUP BY子句列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數)。如在SELECT中用表達式,則需在GROUP BY子句指定相同表達式。不能使用別名。
④大多數SQL實現不允許G~B~列帶有長度可變數據類型(文本或備註)。
⑤除聚集計算語句外,SELECT語句中每個列都必須在GROUP BY子句中給出。
⑥如分組列中具有NULL值,則NULL將作爲一個分組返回。如列中有很多行NULL值,它們將分爲一組。
⑦G~B~子句必須在WHERE子句之後,ORDER BY子句之前。
3. HAVING用於過濾分組(可以取代WHERE過濾行),WHERE用於過濾行(不能在GROUP BY後過濾分組)。
4. WHERE在數據分組前進行過濾,HAVING在數據分組後進行過濾。不指定GROUP BY,多數DBMD將兩者同等對待。良好習慣:應僅在與GROUP BY子句結合時才用HAVING,而WHERE子句用於標準的行級過濾。
5. 使用ORDER BY對GROUP BY分組數據排序。
6. SELECT子句順序:(括號內布爾值表示是否必須使用)
SELECT(是)→FROM(僅在從表選擇數據時)→WHERE(否)→GROUP BY(僅在按組計算聚集時)→HAVING(否)→ORDER BY(否)

第11章 使用子查詢
1. SQL允許創建子查詢(Subquery),即:嵌套在其他查詢中的查詢。
2. 作爲子查詢的SELECT語句只能查詢單個列。
3. 使用子查詢的另一個方法是創建計算字段。

第12章 聯結表
1. 關係表的設計是要保證把信息分解成多個表,一類數據一個表。各個表通過某些常用的值(即關係設計中的關係(relational))相互關聯。
2. 可伸縮性(Scale)能適應不斷增加的工作量而不失敗。設計良好的數據庫或應用程序稱之爲可伸縮性好(scale well)。
3. 聯結是一種機制,用來在一條SELECT語句中關聯表,因此稱之爲聯結。使用特殊的語法,可以聯結多個表返回一組輸出,聯結在運行時關聯表中正確的行。
4. 聯結的創建:規定要聯結的所有表以及它們如何關聯即可。
如:SELECT vend_name, prod_name, prod_price
FROM Vendors, Products (要聯結的表)
WHERE Vendors.vend_id = Product.vend_id;(聯結方式)
5. 完全限定名(用一個句點分隔的表明和列名),在引用的列可能出現二義性時,必須使用完全限定名。
6. DBMS不能自行聯結,需使用WHERE子句作過濾條件匹配聯結。
7. 笛卡兒積(cartesian product)由沒有聯結條件的表關係返回的結果爲笛卡兒積。檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數。
8. 等值聯結(equijoin)即內部聯結,基於兩個表之間的相等測試。
9. 創建聯結的另一種語法:INNER JOIN … ON
SELECT vend_name, pro_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;
(ANSI SQL規範首選INNER JOIN語法)
10. SQL對一條SELECT語句中可以聯結的表的數目沒有限制。創建聯結的基本規則也相同。首先列出所有表,然後定義表間關係。

第13章 創建高級聯結
1. 使用表別名:除了用於列名和計算字段外,SQL還允許給表名起別名。
原因:①縮短SQL語句
②允許在單條SELECT語句中多次使用相同的表。
例:SELECT cust_name, cust_contact
FROME Customer AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.order_num AND …
2. 表別名可用於SELECT列表,WHERE、ORDER BY子句及語句的其他部分。
3. 表別名只在查詢執行中使用。與列別名不一樣,表別名不返回到客戶機。
4. 自聯結:使用表別名多次引用同一個表。通常作爲外部語句用來替代相同表中檢索數據的使用子查詢語句。
5. 自然聯結:排除多次出現,使每個列值返回一次。(重複列不返回)
6. 外部聯結:聯結包含了那些在相關表中沒有關聯行的行。
例1:
SELECT Customers.cust_id, Orders.Order_num
FROM Customer LEFT OUTER JOIN Orders
ON Customers.cust_id = Order.cust_id;
(LEFT或RIGHT關鍵字指定包括其所有行的表。(OUTER JOIN)
例2:
SELECT Customers.cust_id, Orders.order_num
FROM Customers, Orders
WHERE Customers.cust_id *= Orders.cust_id
(在Oracle中用“(+)”代替例子中的*
7. 全部外部聯結關鍵字: FULL、OUTER、JOIN
8. 可在聯結中使用聚集函數。
9. 關於聯結使用的要點
①注意所使用的聯結類型
②各DBMS支持語法盡不相同,應查看具體文檔
③保證使用正確的聯結條件。
④應該總是提供聯結條件,否則會得到笛卡兒積。
⑤分別測試每個聯結。

第14章 組合查詢
1. 複合查詢(compound query)或並(union):執行多個查詢(SELECT語句)並將結果作爲單個查詢結果集返回。
使用情況:
①在單個查詢中從不同的表類似返回結構數據。
②對單個表執行多個查詢,按單個查詢返回數據。
2. 複合查詢操作符UNION,放置於兩條SELECT語句之間即可。
3. UNION使用規則:
①UNION必須由兩條或兩條以上的SELECT語句組成,語句間用UNION分隔。
②UNION中的每個查詢必須包含相同的列、表達式或聚集函數。
③列數據類型必須兼容:類型不必完全相同,但必須是DBMS可以隱含地轉換的類型。
4. UNION從查詢結果集中自動去除了重複的行。
使用UNION ALL代替UNION,則返回所有匹配行。
5. 對組合查詢結果排序,用ORDER BY放在最後一條SELECT語句之後,只能用一個ORDER BY。
6. 其他類型的UNION:
①EXCEPT:檢索第一個表中存在,第二個表不存在的行。
②INTERSECT:檢索兩個表中都存在的行。

第15章 插入數據
1. INSERT語句,用來插入(或添加)行到數據庫表的。
方式:
①插入完整的行
②插入行的一部分
③插入某些查詢的結果(使用INSERT需DBMS中特定安全權限)
2. 插入完整的行:
◇不安全方式:
INSERT INTO Customers
VALUES( ‘10000006’
‘ToyLand’
‘123 Any Street’,
‘New York’,
NULL,
NuLL);
◇安全方式:
INSERT INTO Customers (
Cust_id,
Cust_name,
Cust_address)
VALUES(
‘10000006’,
‘Toy Land’,
‘123 Any Street’);
3. 插入部分行,在INSERT中給出要加入列的名字,並提供值(如上安全方式)。
省略的列必須滿足一下某個條件:
①該列定義爲允許NULL值(無值或空值)。
②在表定義中給出默認值。這表示如果不給出值,將使用默認值。
4. 插入檢索出的數據,使用INSERT…SELECT…語法。
INSERT INTO Customers (
Cust_id,
Cust_contact)
SELECT Cust_id,
Cust_contact
FROM CustNew;
5. 將一個表的內容複製到一個全新的表(在運行中創建的表),可以使用SELECT INTO語句。
6. INSERT SELECT與SELECT INTO重要區別:前者導出數據,而後者導入表。
7. SELECT INTO用法:
◇例子1
SELECT *
INTO CustCopy
FORM Customers;
◇例子2
CREATE TABLE CustCopy AS
SELECT *
FROM Customers;(MySQL與Oracle用法)
8. SELECT INTO使用須知:
①任何SELECT選項和子句都可以使用,包括WHERE和GROUP BY。
②可以用聯結從多個表插入數據。
③不管從多少個表中檢索數據,數據都只能插入單個表中。

第16章 更新和刪除數據
1. 爲了更新(修改)表中的數據,可以使用UPDATE語句。
兩種方式:
①更新表中特定行
②更新表中所有行
2. UPDATE語句使用:
①要更新的表
②列名和他們的新值
③確定更新行過濾條件
UPDATE Customers
SET cust_email = ‘[email protected]’,
cust_contact = ‘Sam Roberts’ (也可以用於刪除某個列值,設爲NULL)
WHERE cust_id = ‘1000006’;
3. 爲了從一個表中刪除(去掉)數據,使用DELETE語句。
兩種方式:
①從表中刪除特定的行
②從表中刪除所有行
4. DELETE使用:(刪除行而非表本身)
DELETE FROM Customers
WHERE cust_id = ‘1000006’;
5. 若要刪除表中所有行,使用TRUNCATE TABLE更快(不記錄Data變動)
6. DELETE刪除整行而不是刪除列。要刪除指定的列,請使用UPDATE語句。
7. 更新和刪除的指導原則:
①除非確定打算更新和刪除每一行,否則絕對不要使用不帶WHERE子句的UPDATE或DELETE語句
②保證每個表都有主鍵,儘可能像WHERE子句那樣使用它(可以指定各主鍵、多個值或值的範圍)。
③在對UPDATE或DELETE語句使用WHERE子句前,應該先用SELECT進行測試,保證它過濾的是正確的記錄,以防止編寫的WHERE子句不正確。
④使用強制實施引用完整性的數據庫,這樣DBMS將不允許刪除具有與其他表相關聯的數據的行。
⑤有的DBMS允許數據庫管理員施加約束,以防止不帶WHERE子句的UPDATE或DELETE。
8. SQL沒有撤銷(undo)按鈕,須小心使用UPDATE和DELETE。

第17章 創建和操作表
1. 兩種創建表的方法:
①多數DBMS都具有交互式創建和管理表的工具
②表也可以直接用SQL語句來操縱。
2. 利用CREATE TALBE創建表,必須給出下列信息:
①新表的名字,在關鍵字CREATE TABLE之後給出;
②表列的名字和定義,用逗號分隔;
③有的DBMS還要求指定表的位置。
CREATE TABLE Products
(
prod_id CHAR(10) Not NULL,
prod_desc VARCHAR(1000) NULL,
quantity INTEGER NOT NULL DEFAULT 1
);
3. 每個表的列或者是NULL列,或者是NOT NULL列,這種狀態在創建時由表的定義規定。
4. NOT NULL會阻止插入沒有值的列。如果試圖插入沒有值的列,將返回錯誤,且插入失敗。
5. 主鍵是其唯一標識表中每一行的列,其列必爲NOT NULL列。
6. SQL允許指定默認值,在插入行時如果不給出值,DBMS將自動採用默認值。默認值在CREATE TABLE語句的列定義中用關鍵字DEFAULT指定。
7. 爲更新表定義,可使用ALTER TABLE語句。各DBMS允許更新內容差別大,應考慮下面幾點:
①一般來說在表中包含數據時不要對其進行更新。應在設計表是做充分考慮。
②所有DBMS都允許給現有的表增加列,不過對所增加列的數據類型(以及NULL和DEFAULT的使用)有所限制。
③許多DBMS不允許刪除或更改表中的列。
④許多DBMS對已經填有數據的列的更改有限制,對未填有數據的列幾乎沒有限制。
⑤多數DBMS允許重命名錶中的列。
8. 爲使用ALTER TABLE更改表結構,必須給出下面的信息:
①在ALTER TABLE之後給出要更改的表名
②所做更改的列表
◇例子1
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
◇例子2
ALTER TABLE Vendors
DROP COLUMN vend_phone;
9. 複雜的表結構一般需要手動刪除過程,涉及步驟:
①用新的列布局創建一個新表
②使用INSERT SELECT語句從舊錶複製數據到新表。如果有必要可使用轉換函數和計算字段。
③檢驗包含所需數據的新表;
④重命名舊錶(如果確定,可以刪除它);
⑤用舊錶原來的名字重命名新表;
⑥根據需要,重新創建觸發器、存儲過程、索引和外鍵。
10. 刪除表(刪除整個表而不是其內容):使用DROP TABLE語句:
DROP TABLE CustCopy;
11. 重命名錶,DB2、MySQL、Oracle和PostgreSQL用Rename語句;SQL Server、Sybase用sp_rename語句。

第18章 使用視圖
1. 視圖是虛擬的表。與包含數據的表不一樣,視圖只包含使用時動態檢索數據的查詢。
2. 使用視圖的原因:
①重用SQL語句
②簡化複雜的SQL操作。在編寫查詢後,可方便地重用它而不必知道它的基本查詢細節。
③使用表的組成部分而不是整個表。
④保護數據。可以給用戶授予表的特定部分的訪問權限而不是整個表的訪問權限。
⑤更改數據格式和表示。視圖可返回與底層表的表示和格式不同的數據。
3. 視圖僅僅是用來查看存儲在別處的一種設施,其本身不包含數據,因此他們返回的數據是從其他表中檢索出來的。
4. 視圖的規則和限制:
①與表一樣,視圖必須唯一命名。
②對於可以創建的視圖數目沒有限制。
③爲了創建視圖,必須具有足夠的訪問權限。這些限制通常由數據庫管理員授予。
④視圖可以嵌套,即:可以利用從其他視圖中檢索數據的查詢來構造一個視圖。
⑤許多DBMS禁止視圖查詢中使用ORDER BY子句。
⑥有的DMBS要求命名返回的所有列,如果是計算字段,則需用別名。
⑦視圖不能索引,也不能有關聯的觸發器或默認值。
⑧有的DBMS把視圖作爲只讀的查詢。
⑨有的DBMS允許創建這樣的視圖,它不允許進行導致行不在屬於視圖的插入和更新。
5. 視圖用CREATE VIEW語句創建,用DROP刪除、覆蓋或更新。
6. 視圖最常見應用之一是隱藏複雜的SQL,這通常涉及聯結。
CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Orders.order_num;
7. 視圖的另一常見用途是重新格式化檢索出的數據。
CREATE VIEW VendLocation AS
SELECT RTRIM(vend_name) + ‘(’ + RTRIM(vend_country) + ‘)’ AS vend_title
FROM Vendors;
8. 用視圖過濾不想要的數據,用WHERE子句於視圖創建中。
9. 視圖對於簡化計算字段的使用特別有用。
CREATE VIEW OrderItemsExpanded AS
SELECT order_num, prod_id, quantity, item_price, quantity * item_price AS expanded_price
FROM OrderItems;

第19章 使用存儲過程
1. 存儲過程:爲以後的使用而保存的一條或多條SQL語句的集合。
2. 使用存儲過程的原因:
①通過把處理封裝在容易使用的單元中,簡化複雜的操作。
②由於不要求反覆建立一系列處理步驟,而防止錯誤保證了數據一致性。
③簡化對變動的管理,安全性。
④存儲過程通常以編譯過的形式存儲,提高了性能。
△綜上所述,優點:簡單、安全、高性能
△缺點如下:
①不同DBMS中存儲過程語法有所不同。
②存儲過程的編寫比基本SQL語句複雜,需要更高的技能、經驗。
3. 用EXECUTE執行存儲過程,它接受存儲過程名和需要傳遞給它的任何參數。
4. 對於不同DBMS,可能有以下存儲過程的執行選擇:
①參數可選,具有不提供參數時的默認值。
②不按次序給出參數,以“參數二值”的方式給出參數。
③輸出參數,允許在存儲過程在正執行的應用程序中更新所用的參數。
④用SELECT語句檢索數據。
⑤返回代碼,允許存儲過程返回一個值到正在執行的應用程序。
5. SQL中進行註釋的標準方式是在句首放置– (連個連字符)。

第20章 管理實務處理
1. 事務管理(transaction processing)可以用來維護數據庫的完整性,它保證成批的SQL操作要麼完全執行,要麼完全不執行。
術語:事務(transaction)指一組SQL語句;
回退(rollback)指撤銷指定SQL語句的過程;
提交(commit)指將未存儲的SQL語句結果寫入數據庫表;
保留點(save point)指事務處理中設置的臨時佔位符(placeholder),你可以對它發佈回退(注意與回退整個事務處理不同)。
2. 事務處理可回退INSERT、UPDATE和DELETE,不能回退SELECT、CREATE和DROP操作。
3. 各DBMS有不同方法標識事務處理塊。
◇SQL Server:
BEGIN TRANSACTION

COMMIT TRANSACTION
◇MySQL
START TAANSACTION

◇PostgreSQL
BEGIN;

4. SQL的ROLLBACK命令用來回退(撤銷)SQL語句:
DELETE FROM Orders; ROLLBACK;
5. 一般的SQL語句都是直接針對數據庫表執行和編寫的。這就是所謂的隱含提交(implicit commit),即提交(寫或保存)操作是自動進行的。
6. 在事務處理塊中,提交不會隱含地進行。但不同DBMS做法不一。
SQL Server:
BEGIN TRANSATION
DELETE OrderItems WHERE order_num = 12345
DELETE Orders WHERE order_num = 12345
COMMIT TRANSACTION
7. 使用保留點,支持回退部分事務處理,必須能在事務處理塊中合適的位置放置佔位符。如需回退,可退至某佔位符。
SAVEPOINT deletel;
(在SQL Server和Sybase中)
SAVE TRANSACTION deletel;

ROLLBACK TRANSACTION deletel;
8. 保留點越多越好,這樣就能按自己的意願靈活地進行回退。

第21章 使用遊標
1. 結果集(result set)SQL查詢所檢索出的結果。
2. 遊標(cursor)是一個存儲在DBMS服務器上的數據查詢,它不是一條SELECT語句,而是被該語句檢索出來的結果集。
3. 不同DBMS支持不同遊標選項和特性。常見選項和特性:
①能夠標記遊標爲只讀,使數據能讀取,但不能更新和刪除。
②能控制可以執行的定向操作(向前、向後、第一、最後、絕對位置、相對位置等)。
③能標記某些列爲可編輯的,某些列爲不可編輯的。
④規定範圍,使遊標對創建它的特定請求(如存儲過程)或對所有請求可訪問。
⑤指示DBMS對檢索出的數據(而不是指表中活動數據)做複製,使在遊標打開和訪問期間數據不變化。
4. 使用遊標涉及步驟
①在能夠使用遊標前,必須聲明(定義)它。
②一旦聲明後,必須打開遊標以供使用。用前面定義的SELECT語句,把實際數據檢索出來。
③對於填有數據的遊標,根據需要取出(檢索)各行。
④在結束遊標使用時,必須關閉遊標,可能的話,釋放遊標。
5. 遊標用DECLARE語句創建,這條語句在不同DBMS中有所不同。
◇DB2、SQL Server、Sybase中
DECLARE CustCursor CURSOR
FOR
SELECT * FROM Customers
WHERE cust_email IS NULL
◇Oracle、Postgre SQL中
DECLARE CURSOR CustCursor
IS
SELECT * FROM Customers
WHERE cust_email IS NULL
6. 用OPEN CURSOR語句打開遊標執行查詢,存儲檢查出的數據以供瀏覽和滾動。
7. 用FETCH語句訪問遊標數據。指出要檢索的行,從何處檢索它們以及將它們放於何處(如變量名)。
8. 遊標在使用完畢時需要關閉,部分DBMS要求明確釋放遊標所佔資源(CLOSE語句)。

第22章 瞭解高級SQL特性
1. 約束(constraint)管理如何插入或處理數據庫數據的規則。
2. 主鍵是一種特殊的約束,表中的一個(組)列的值唯一標識表中的行。
①任意兩行的主鍵值都不相同
②每行都具有一個主鍵值(即列中不允許NULL值)
③包含主鍵值的列不修改或更新
④主鍵值不能重用。如果從表中刪除某一行,其主鍵不分配給新行。
創建主鍵:
CREATE TABLE Vendors
(
vend_id CHAR(10) NOT NULL PRIMARY KEY,
vend_name CHAR(50) NOT NULL
);
——————
ALERT TABLE Vendors
ADD CONSTRAINT PRIMARY KEY(vend_id);
3. 外鍵是表中的一個列,其值必須在另一表的主鍵中列出。用於關聯其他表,保證引用完整性。
例子:
CREATE TABLE Orders
(
Order_num INTEGER NOT NULL PRIMARY KEY,
Order_date DATETIME NOT NULL,
Cust_id CHAR(10) NOT NULL REFERENCES Customers(cust_id)
);

ALTER TABLE Customers
ADD CONSTRAINT
FOREIGN KEY(cust_id) REFERENCES Customers(cust_id)
4. 唯一約束用來保證一個列(或一組列)中的數據唯一。區別於主鍵:
①表可包含多個唯一約束,但每個表只允許一個主鍵。
②唯一約束列可包含NULL值。
③唯一約束列可修改或更新。
④唯一約束列的值可重複使用。
⑤與主鍵不同,唯一約束不能用來定義外鍵。
5. 唯一約束可以用UNIQUE關鍵字在表定義中定義,也可用單獨的CONSTRAINT定義。
6. 檢查約束用來保證一個列(或一組列)中的數據滿足一組指定的條件。
①檢查最小或最大
②指定範圍
③只允許特定的值
△數據類型限制了列中可保存的數據類型。檢查約束在數據類型內又進一步的限制。
例1:
CREATE TABLE OrderItems
(
Order_num INTEGER NOT NULL,
Quantity INTEGER NOT NULL CHECK(quantity > 0)
);
例2:
ADD CONSTRAINT CHECK(gender LIKE ‘[MF]’)
7. 索引用來排序數據以加快搜索和排序操作的速度。
①索引改善檢索操作的性能,但降低數據插入、修改和刪除的性能。
②索引數據可能要佔用大量的存儲空間。
③並非所有數據都適合於索引(如唯一性不好的數據)。
④索引用於數據過濾和數據排序。
⑤可以在索引中定義多個列。
△索引用CREATE INDEX語句創建(不同DBMS語法差異大)
CREATE INDEX pro_name_ind
ON PRODUCTS(prod_name);
8. 觸發器是特殊的存儲過程,它在特定的數據庫活動發生時自動執行。可與特定表上的INSERT、UPDATE和DELETE操作相關聯。
◇觸發器內代碼具有以下數據訪問權:
①INSERT操作中的所有新數據;
②UPDATE操作中的所有新數據和舊數據;
③DELETE操作中刪除的數據。
◇觸發器一些常見用途:
①保持數據一致。
②基於某個表的變動在其他表上執行活動。
③進行額外的驗證並根據需要回退數據。
④計算計算列的值或更新時間戳。
例子(SQL Sever版):
CREATE TRIGGER customer_state
ON Customers
FOR INSERT,UPDATE
AS
UPDATE Customers
SET cust_state = Upper(cust_state)
WHERE Customers.cust = inserted.cust_id;
◇約束比觸發器快,應該儘量使用約束。
9. 數據庫安全性通過SQL的GRANT和REVOKE語句管理。
需要保護的某些操作:
①對數據庫管理功能(創建表、更改或刪除已存在的表等)的訪問;
②對特定數據庫或表的訪問;
③訪問的類型(只讀、對特定列的訪問等);
④僅通過視圖或存儲過程對錶進行訪問;
⑤創建多層次的安全措施,從而允許多種基於登錄的訪問和控制。
⑥限制管理用戶賬戶的能力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章