
1. 精心設計的應用程式通常會在保持實現細節私有的同時公然公有介面,以便未來在不影響終端使用者的情況下修改設計
2. 檢視
2.1. 不同於資料表,檢視並不涉及資料儲存,不用擔心檢視會填滿你的磁碟空間
2.2. 一種資料查詢機制
2.3. 從使用者的視角來看,檢視和資料表沒什麼兩樣
3. 為什麼要使用檢視
3.1. 資料安全
3.1.1. 假如你建立了資料表並答應使用者查詢,使用者就可以訪問資料表中的每一行和每一列3.1.2. 保持資料表的私有性(不授權任何使用者select許可),然後建立一個或多個檢視,忽略或模糊化(好比customer_vw.email列採用的"*"方法)敏感列3.1.3. 虛擬私有資料庫(virtual private database,VPD)3.1.3.1. Oracle Database使用者另一種選擇可以保護資料表的行列資料安全3.1.3.2. VPD答應使用者對資料表施加策略,伺服器據此對使用者的查詢進行修改
3.2. 資料聚合
3.2.1. 天生報表的應用程式通常需要聚合資料3.2.2. 將資料預先在資料表中聚合而不是使用檢視乞降以極大地提高查詢機能
3.3. 隱藏複雜性
3.3.1. 為了使終端使用者免受複雜性的影響
3.4. 連線分割槽資料
3.4.1. 為了晉升機能會將較大的資料表拆分為多個部門3.4.2. 設計職員可以在無須強制資料庫使用者修改查詢的情況下改動底層資料的結構
4. 可更新檢視
4.1. MySQL、Oracle Database和SQL Server都答應使用者在遵守特定限制的條件下透過檢視修改資料
4.2. MySQL滿意下列前提,檢視就是可更新的
4.2.1. 沒有使用聚合函式(max()、min()、avg()等)4.2.2. 檢視沒有使用group by或having子句4.2.3. select或from子句中不存在子查詢,並且where子句中的任何子查詢都不引用from子句中的資料表4.2.4. 檢視沒有使用union、union all或distinct4.2.5. from子句至少包括一個數據表或可更新檢視4.2.6. 假如有不止一個數據表或檢視,from子句只使用內連線
5. 索引
5.1. 查詢資源內特定項的一種機制
5.2. 資料庫伺服器也使用索引來定位資料表中的行
5.3. 與普通的資料表不同,索引是一種以特定順序留存的專用資料表
5.4. 索引並不包含實體的所有相關資料,而是隻包含那些可用於定位資料表中行的列,以及描述這些行所在的物理位置資訊
5.5. 索引的作用就是使檢索資料表中行和列的子集實現便捷化,無須再檢查資料表中的每一行
5.6. MySQL 5.0版也提供了create index,但該命令被對映到alter table命令,仍舊必需使用alter table命令建立主鍵索引
5.6.1. mysql-
-> ALTER TABLE customer -> ADD INDEX idx_email (email);
5.6.2. sql
CREATE INDEX dept_name_idx ON department (name);
5.7. MySQL也支援drop index命令,不外同樣是被對映到alter table命令
5.7.1. mysql
-> ALTER TABLE customer -> DROP INDEX idx_email;
5.7.2. sql
DROP INDEX idx_email; (Oracle)DROP INDEX idx_email ON customer; (SQL Server)
5.8. MySQL使用者可以使用show命令檢視特定資料表的所有索引
5.9. 所有的資料庫伺服器都答應檢視可用的索引
5.10. 獨一索引
5.10.1. 提供普通索引所能提供的所有便利5.10.2. 避免索引列泛起重複值5.10.3. 只要有行插入或是索引列被修改,資料庫伺服器就會檢查獨一索引,以檢視該值是否已經在資料表中的其他行存在5.10.4. SQL Server和Oracle Database使用者只需在建立索引時加入unique關鍵字5.10.4.1. sql
CREATE UNIQUE INDEX idx_email ON customer (email);
5.10.5. mysql
-> ALTER TABLE customer -> ADD UNIQUE idx_email (email);
5.11. 多列索引
5.11.1. 在建立多列索引時,必需仔細考慮哪一列在前,哪一列在後,這樣才能使索引儘可能地發揮作用5.11.2. 假如需要確保充分的響應時間,完全可以基於不同順序為列的統一集合建立多個索引5.11.3. mysql
-> ALTER TABLE customer -> ADD INDEX idx_full_name (last_name, first_name);
5.12. 索引型別
5.12.1. B樹索引5.12.1.1. 平衡樹索引(balanced-tree index)5.12.1.1.1. B樹索引(B-tree index)5.12.1.2. MySQL、Oracle Database和SQL Server均預設採用B樹索引5.12.1.3. B樹索引擅長處理包含大量不同值的列5.12.2. 點陣圖索引5.12.2.1. 對於那些只包含少量值卻佔據了大量行的列(所謂的低基數資料)5.12.2.2. 對於低基數資料而言,點陣圖索引是一種友好且緊湊的索引解決方案5.12.2.3. 假如列中儲存的值的數目相較於行數攀升得過高(所謂的高基數資料),這種索引策略就不適合了,由於伺服器需要維護太多的點陣圖5.12.2.4. Oracle Database引入了點陣圖索引(bitmap index),其為儲存在列中的每個值天生一個位圖5.12.2.4.1. CREATE BITMAP INDEX idx_active ON customer (active);5.12.2.5. 通常用於資料倉庫環境,其中大量資料通常在包含相對較少值的列(例如銷售季度、地輿區域、產品、銷售職員)上進行索引5.12.3. 文字索引5.12.3.1. MySQL和SQL Server提供的是全文索引(full-text index)5.12.3.2. Oracle Database提供了一套稱為Oracle Text的強盛工具集
5.13. 答應使用者檢視查詢最佳化器是如何處理SQL語句的
5.13.1. SQL Server使用者可以在執行SQL 語句之前透過發出set showplan_text on語句檢視該語句的執行計劃5.13.2. Oracle Database提供了explain plan語句,透過執行該語句可以將執行計劃寫入專用的資料表plan_table
5.14. 索引的不足
5.14.1. 索引並不是越多越好5.14.1.1. 每個索引實在都是一個數據表(特殊型別的表)5.14.1.2. 索引越多,伺服器就需要做越多的工作來保持所有模式物件都處於最新狀態,這會使伺服器的執行速度減慢5.14.2. 索引需要磁碟空間,同時也需要管理員花費精力進行治理,因此對於索引的最佳策略就是僅當有明確需求時才新增索引5.14.2.1. 假如出於一些特殊目的要用到索引,好比每月的例行維護工作,可以先新增索引,例行維護,然後再刪除索引,下次需要例行維護時再如斯重複5.14.2.2. 資料被連夜載入到資料倉庫時就會泛起問題,常見做法是在資料被載入之前撤銷索引,然後在資料倉庫開放業務之前重新建立索引
5.15. 索引不能太多,也不能太少
5.15.1. 確保所有主鍵列被索引5.15.2. 對於多列主鍵,可以考慮為主鍵列的子集或是以不同於主鍵約束定義的順序為所有主鍵列建立額外的索引5.15.3. 為所有被外來鍵約束引用的列建立索引5.15.4. 為被用於頻繁檢索資料的列建立索引5.15.5. 除了短字串(2~50個字元)列,大多數日期列也是不錯的候選物件
6. 約束
6.1. 施加於資料表中一列或多列的限制
6.1.1. 假如沒有約束,資料庫的一致性就會存疑
6.2. 主鍵約束
6.2.1. 標識一列或多列,保證其值在資料表中的唯一性
6.3. 外來鍵約束
6.3.1. 限制一列或多列只能包含其他資料表的主鍵列中的值6.3.2. on delete restrict6.3.2.1. on delete restrict,假如刪除了父表(address或store)中被子表(customer)引用的行,伺服器會引發錯誤6.3.3. on delete cascade6.3.4. on delete set null6.3.5. on update restrict6.3.6. on update cascade6.3.6.1. on update cascade,使伺服器將父表(address或store)主鍵值的改動傳播到子表(customer)6.3.7. on update set null
6.4. 獨一約束
6.4.1. 限制一列或多列的值,保證其在資料表中的唯一性
6.5. 檢查約束
6.5.1. 限制列的可用值範圍
6.6. sql
ALTER TABLE customerADD CONSTRAINT fk_customer_address FOREIGN KEY (address_id)REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE;ALTER TABLE customerADD CONSTRAINT fk_customer_store FOREIGN KEY (store_id)REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE;
6.7. 假如想刪除主鍵約束或外來鍵約束,也可以使用alter table語句,只不過要將add改為drop

1. 精心設計的應用程式通常會在保持實現細節私有的同時公然公有介面,以便未來在不影響終端使用者的情況下修改設計
2. 檢視
2.1. 不同於資料表,檢視並不涉及資料儲存,不用擔心檢視會填滿你的磁碟空間
2.2. 一種資料查詢機制
2.3. 從使用者的視角來看,檢視和資料表沒什麼兩樣
3. 為什麼要使用檢視
3.1. 資料安全
3.1.1. 假如你建立了資料表並答應使用者查詢,使用者就可以訪問資料表中的每一行和每一列3.1.2. 保持資料表的私有性(不授權任何使用者select許可),然後建立一個或多個檢視,忽略或模糊化(好比customer_vw.email列採用的"*"方法)敏感列3.1.3. 虛擬私有資料庫(virtual private database,VPD)3.1.3.1. Oracle Database使用者另一種選擇可以保護資料表的行列資料安全3.1.3.2. VPD答應使用者對資料表施加策略,伺服器據此對使用者的查詢進行修改
3.2. 資料聚合
3.2.1. 天生報表的應用程式通常需要聚合資料3.2.2. 將資料預先在資料表中聚合而不是使用檢視乞降以極大地提高查詢機能
3.3. 隱藏複雜性
3.3.1. 為了使終端使用者免受複雜性的影響
3.4. 連線分割槽資料
3.4.1. 為了晉升機能會將較大的資料表拆分為多個部門3.4.2. 設計職員可以在無須強制資料庫使用者修改查詢的情況下改動底層資料的結構
4. 可更新檢視
4.1. MySQL、Oracle Database和SQL Server都答應使用者在遵守特定限制的條件下透過檢視修改資料
4.2. MySQL滿意下列前提,檢視就是可更新的
4.2.1. 沒有使用聚合函式(max()、min()、avg()等)4.2.2. 檢視沒有使用group by或having子句4.2.3. select或from子句中不存在子查詢,並且where子句中的任何子查詢都不引用from子句中的資料表4.2.4. 檢視沒有使用union、union all或distinct4.2.5. from子句至少包括一個數據表或可更新檢視4.2.6. 假如有不止一個數據表或檢視,from子句只使用內連線
5. 索引
5.1. 查詢資源內特定項的一種機制
5.2. 資料庫伺服器也使用索引來定位資料表中的行
5.3. 與普通的資料表不同,索引是一種以特定順序留存的專用資料表
5.4. 索引並不包含實體的所有相關資料,而是隻包含那些可用於定位資料表中行的列,以及描述這些行所在的物理位置資訊
5.5. 索引的作用就是使檢索資料表中行和列的子集實現便捷化,無須再檢查資料表中的每一行
5.6. MySQL 5.0版也提供了create index,但該命令被對映到alter table命令,仍舊必需使用alter table命令建立主鍵索引
5.6.1. mysql-
-> ALTER TABLE customer -> ADD INDEX idx_email (email);
5.6.2. sql
CREATE INDEX dept_name_idx ON department (name);
5.7. MySQL也支援drop index命令,不外同樣是被對映到alter table命令
5.7.1. mysql
-> ALTER TABLE customer -> DROP INDEX idx_email;
5.7.2. sql
DROP INDEX idx_email; (Oracle)DROP INDEX idx_email ON customer; (SQL Server)
5.8. MySQL使用者可以使用show命令檢視特定資料表的所有索引
5.9. 所有的資料庫伺服器都答應檢視可用的索引
5.10. 獨一索引
5.10.1. 提供普通索引所能提供的所有便利5.10.2. 避免索引列泛起重複值5.10.3. 只要有行插入或是索引列被修改,資料庫伺服器就會檢查獨一索引,以檢視該值是否已經在資料表中的其他行存在5.10.4. SQL Server和Oracle Database使用者只需在建立索引時加入unique關鍵字5.10.4.1. sql
CREATE UNIQUE INDEX idx_email ON customer (email);
5.10.5. mysql
-> ALTER TABLE customer -> ADD UNIQUE idx_email (email);
5.11. 多列索引
5.11.1. 在建立多列索引時,必需仔細考慮哪一列在前,哪一列在後,這樣才能使索引儘可能地發揮作用5.11.2. 假如需要確保充分的響應時間,完全可以基於不同順序為列的統一集合建立多個索引5.11.3. mysql
-> ALTER TABLE customer -> ADD INDEX idx_full_name (last_name, first_name);
5.12. 索引型別
5.12.1. B樹索引5.12.1.1. 平衡樹索引(balanced-tree index)5.12.1.1.1. B樹索引(B-tree index)5.12.1.2. MySQL、Oracle Database和SQL Server均預設採用B樹索引5.12.1.3. B樹索引擅長處理包含大量不同值的列5.12.2. 點陣圖索引5.12.2.1. 對於那些只包含少量值卻佔據了大量行的列(所謂的低基數資料)5.12.2.2. 對於低基數資料而言,點陣圖索引是一種友好且緊湊的索引解決方案5.12.2.3. 假如列中儲存的值的數目相較於行數攀升得過高(所謂的高基數資料),這種索引策略就不適合了,由於伺服器需要維護太多的點陣圖5.12.2.4. Oracle Database引入了點陣圖索引(bitmap index),其為儲存在列中的每個值天生一個位圖5.12.2.4.1. CREATE BITMAP INDEX idx_active ON customer (active);5.12.2.5. 通常用於資料倉庫環境,其中大量資料通常在包含相對較少值的列(例如銷售季度、地輿區域、產品、銷售職員)上進行索引5.12.3. 文字索引5.12.3.1. MySQL和SQL Server提供的是全文索引(full-text index)5.12.3.2. Oracle Database提供了一套稱為Oracle Text的強盛工具集
5.13. 答應使用者檢視查詢最佳化器是如何處理SQL語句的
5.13.1. SQL Server使用者可以在執行SQL 語句之前透過發出set showplan_text on語句檢視該語句的執行計劃5.13.2. Oracle Database提供了explain plan語句,透過執行該語句可以將執行計劃寫入專用的資料表plan_table
5.14. 索引的不足
5.14.1. 索引並不是越多越好5.14.1.1. 每個索引實在都是一個數據表(特殊型別的表)5.14.1.2. 索引越多,伺服器就需要做越多的工作來保持所有模式物件都處於最新狀態,這會使伺服器的執行速度減慢5.14.2. 索引需要磁碟空間,同時也需要管理員花費精力進行治理,因此對於索引的最佳策略就是僅當有明確需求時才新增索引5.14.2.1. 假如出於一些特殊目的要用到索引,好比每月的例行維護工作,可以先新增索引,例行維護,然後再刪除索引,下次需要例行維護時再如斯重複5.14.2.2. 資料被連夜載入到資料倉庫時就會泛起問題,常見做法是在資料被載入之前撤銷索引,然後在資料倉庫開放業務之前重新建立索引
5.15. 索引不能太多,也不能太少
5.15.1. 確保所有主鍵列被索引5.15.2. 對於多列主鍵,可以考慮為主鍵列的子集或是以不同於主鍵約束定義的順序為所有主鍵列建立額外的索引5.15.3. 為所有被外來鍵約束引用的列建立索引5.15.4. 為被用於頻繁檢索資料的列建立索引5.15.5. 除了短字串(2~50個字元)列,大多數日期列也是不錯的候選物件
6. 約束
6.1. 施加於資料表中一列或多列的限制
6.1.1. 假如沒有約束,資料庫的一致性就會存疑
6.2. 主鍵約束
6.2.1. 標識一列或多列,保證其值在資料表中的唯一性
6.3. 外來鍵約束
6.3.1. 限制一列或多列只能包含其他資料表的主鍵列中的值6.3.2. on delete restrict6.3.2.1. on delete restrict,假如刪除了父表(address或store)中被子表(customer)引用的行,伺服器會引發錯誤6.3.3. on delete cascade6.3.4. on delete set null6.3.5. on update restrict6.3.6. on update cascade6.3.6.1. on update cascade,使伺服器將父表(address或store)主鍵值的改動傳播到子表(customer)6.3.7. on update set null
6.4. 獨一約束
6.4.1. 限制一列或多列的值,保證其在資料表中的唯一性
6.5. 檢查約束
6.5.1. 限制列的可用值範圍
6.6. sql
ALTER TABLE customerADD CONSTRAINT fk_customer_address FOREIGN KEY (address_id)REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE;ALTER TABLE customerADD CONSTRAINT fk_customer_store FOREIGN KEY (store_id)REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE;
6.7. 假如想刪除主鍵約束或外來鍵約束,也可以使用alter table語句,只不過要將add改為drop

1. 精心設計的應用程式通常會在保持實現細節私有的同時公然公有介面,以便未來在不影響終端使用者的情況下修改設計
2. 檢視
2.1. 不同於資料表,檢視並不涉及資料儲存,不用擔心檢視會填滿你的磁碟空間
2.2. 一種資料查詢機制
2.3. 從使用者的視角來看,檢視和資料表沒什麼兩樣
3. 為什麼要使用檢視
3.1. 資料安全
3.1.1. 假如你建立了資料表並答應使用者查詢,使用者就可以訪問資料表中的每一行和每一列3.1.2. 保持資料表的私有性(不授權任何使用者select許可),然後建立一個或多個檢視,忽略或模糊化(好比customer_vw.email列採用的"*"方法)敏感列3.1.3. 虛擬私有資料庫(virtual private database,VPD)3.1.3.1. Oracle Database使用者另一種選擇可以保護資料表的行列資料安全3.1.3.2. VPD答應使用者對資料表施加策略,伺服器據此對使用者的查詢進行修改
3.2. 資料聚合
3.2.1. 天生報表的應用程式通常需要聚合資料3.2.2. 將資料預先在資料表中聚合而不是使用檢視乞降以極大地提高查詢機能
3.3. 隱藏複雜性
3.3.1. 為了使終端使用者免受複雜性的影響
3.4. 連線分割槽資料
3.4.1. 為了晉升機能會將較大的資料表拆分為多個部門3.4.2. 設計職員可以在無須強制資料庫使用者修改查詢的情況下改動底層資料的結構
4. 可更新檢視
4.1. MySQL、Oracle Database和SQL Server都答應使用者在遵守特定限制的條件下透過檢視修改資料
4.2. MySQL滿意下列前提,檢視就是可更新的
4.2.1. 沒有使用聚合函式(max()、min()、avg()等)4.2.2. 檢視沒有使用group by或having子句4.2.3. select或from子句中不存在子查詢,並且where子句中的任何子查詢都不引用from子句中的資料表4.2.4. 檢視沒有使用union、union all或distinct4.2.5. from子句至少包括一個數據表或可更新檢視4.2.6. 假如有不止一個數據表或檢視,from子句只使用內連線
5. 索引
5.1. 查詢資源內特定項的一種機制
5.2. 資料庫伺服器也使用索引來定位資料表中的行
5.3. 與普通的資料表不同,索引是一種以特定順序留存的專用資料表
5.4. 索引並不包含實體的所有相關資料,而是隻包含那些可用於定位資料表中行的列,以及描述這些行所在的物理位置資訊
5.5. 索引的作用就是使檢索資料表中行和列的子集實現便捷化,無須再檢查資料表中的每一行
5.6. MySQL 5.0版也提供了create index,但該命令被對映到alter table命令,仍舊必需使用alter table命令建立主鍵索引
5.6.1. mysql-
-> ALTER TABLE customer -> ADD INDEX idx_email (email);
5.6.2. sql
CREATE INDEX dept_name_idx ON department (name);
5.7. MySQL也支援drop index命令,不外同樣是被對映到alter table命令
5.7.1. mysql
-> ALTER TABLE customer -> DROP INDEX idx_email;
5.7.2. sql
DROP INDEX idx_email; (Oracle)DROP INDEX idx_email ON customer; (SQL Server)
5.8. MySQL使用者可以使用show命令檢視特定資料表的所有索引
5.9. 所有的資料庫伺服器都答應檢視可用的索引
5.10. 獨一索引
5.10.1. 提供普通索引所能提供的所有便利5.10.2. 避免索引列泛起重複值5.10.3. 只要有行插入或是索引列被修改,資料庫伺服器就會檢查獨一索引,以檢視該值是否已經在資料表中的其他行存在5.10.4. SQL Server和Oracle Database使用者只需在建立索引時加入unique關鍵字5.10.4.1. sql
CREATE UNIQUE INDEX idx_email ON customer (email);
5.10.5. mysql
-> ALTER TABLE customer -> ADD UNIQUE idx_email (email);
5.11. 多列索引
5.11.1. 在建立多列索引時,必需仔細考慮哪一列在前,哪一列在後,這樣才能使索引儘可能地發揮作用5.11.2. 假如需要確保充分的響應時間,完全可以基於不同順序為列的統一集合建立多個索引5.11.3. mysql
-> ALTER TABLE customer -> ADD INDEX idx_full_name (last_name, first_name);
5.12. 索引型別
5.12.1. B樹索引5.12.1.1. 平衡樹索引(balanced-tree index)5.12.1.1.1. B樹索引(B-tree index)5.12.1.2. MySQL、Oracle Database和SQL Server均預設採用B樹索引5.12.1.3. B樹索引擅長處理包含大量不同值的列5.12.2. 點陣圖索引5.12.2.1. 對於那些只包含少量值卻佔據了大量行的列(所謂的低基數資料)5.12.2.2. 對於低基數資料而言,點陣圖索引是一種友好且緊湊的索引解決方案5.12.2.3. 假如列中儲存的值的數目相較於行數攀升得過高(所謂的高基數資料),這種索引策略就不適合了,由於伺服器需要維護太多的點陣圖5.12.2.4. Oracle Database引入了點陣圖索引(bitmap index),其為儲存在列中的每個值天生一個位圖5.12.2.4.1. CREATE BITMAP INDEX idx_active ON customer (active);5.12.2.5. 通常用於資料倉庫環境,其中大量資料通常在包含相對較少值的列(例如銷售季度、地輿區域、產品、銷售職員)上進行索引5.12.3. 文字索引5.12.3.1. MySQL和SQL Server提供的是全文索引(full-text index)5.12.3.2. Oracle Database提供了一套稱為Oracle Text的強盛工具集
5.13. 答應使用者檢視查詢最佳化器是如何處理SQL語句的
5.13.1. SQL Server使用者可以在執行SQL 語句之前透過發出set showplan_text on語句檢視該語句的執行計劃5.13.2. Oracle Database提供了explain plan語句,透過執行該語句可以將執行計劃寫入專用的資料表plan_table
5.14. 索引的不足
5.14.1. 索引並不是越多越好5.14.1.1. 每個索引實在都是一個數據表(特殊型別的表)5.14.1.2. 索引越多,伺服器就需要做越多的工作來保持所有模式物件都處於最新狀態,這會使伺服器的執行速度減慢5.14.2. 索引需要磁碟空間,同時也需要管理員花費精力進行治理,因此對於索引的最佳策略就是僅當有明確需求時才新增索引5.14.2.1. 假如出於一些特殊目的要用到索引,好比每月的例行維護工作,可以先新增索引,例行維護,然後再刪除索引,下次需要例行維護時再如斯重複5.14.2.2. 資料被連夜載入到資料倉庫時就會泛起問題,常見做法是在資料被載入之前撤銷索引,然後在資料倉庫開放業務之前重新建立索引
5.15. 索引不能太多,也不能太少
5.15.1. 確保所有主鍵列被索引5.15.2. 對於多列主鍵,可以考慮為主鍵列的子集或是以不同於主鍵約束定義的順序為所有主鍵列建立額外的索引5.15.3. 為所有被外來鍵約束引用的列建立索引5.15.4. 為被用於頻繁檢索資料的列建立索引5.15.5. 除了短字串(2~50個字元)列,大多數日期列也是不錯的候選物件
6. 約束
6.1. 施加於資料表中一列或多列的限制
6.1.1. 假如沒有約束,資料庫的一致性就會存疑
6.2. 主鍵約束
6.2.1. 標識一列或多列,保證其值在資料表中的唯一性
6.3. 外來鍵約束
6.3.1. 限制一列或多列只能包含其他資料表的主鍵列中的值6.3.2. on delete restrict6.3.2.1. on delete restrict,假如刪除了父表(address或store)中被子表(customer)引用的行,伺服器會引發錯誤6.3.3. on delete cascade6.3.4. on delete set null6.3.5. on update restrict6.3.6. on update cascade6.3.6.1. on update cascade,使伺服器將父表(address或store)主鍵值的改動傳播到子表(customer)6.3.7. on update set null
6.4. 獨一約束
6.4.1. 限制一列或多列的值,保證其在資料表中的唯一性
6.5. 檢查約束
6.5.1. 限制列的可用值範圍
6.6. sql
ALTER TABLE customerADD CONSTRAINT fk_customer_address FOREIGN KEY (address_id)REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE;ALTER TABLE customerADD CONSTRAINT fk_customer_store FOREIGN KEY (store_id)REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE;
6.7. 假如想刪除主鍵約束或外來鍵約束,也可以使用alter table語句,只不過要將add改為drop

1. 精心設計的應用程式通常會在保持實現細節私有的同時公然公有介面,以便未來在不影響終端使用者的情況下修改設計
2. 檢視
2.1. 不同於資料表,檢視並不涉及資料儲存,不用擔心檢視會填滿你的磁碟空間
2.2. 一種資料查詢機制
2.3. 從使用者的視角來看,檢視和資料表沒什麼兩樣
3. 為什麼要使用檢視
3.1. 資料安全
3.1.1. 假如你建立了資料表並答應使用者查詢,使用者就可以訪問資料表中的每一行和每一列3.1.2. 保持資料表的私有性(不授權任何使用者select許可),然後建立一個或多個檢視,忽略或模糊化(好比customer_vw.email列採用的"*"方法)敏感列3.1.3. 虛擬私有資料庫(virtual private database,VPD)3.1.3.1. Oracle Database使用者另一種選擇可以保護資料表的行列資料安全3.1.3.2. VPD答應使用者對資料表施加策略,伺服器據此對使用者的查詢進行修改
3.2. 資料聚合
3.2.1. 天生報表的應用程式通常需要聚合資料3.2.2. 將資料預先在資料表中聚合而不是使用檢視乞降以極大地提高查詢機能
3.3. 隱藏複雜性
3.3.1. 為了使終端使用者免受複雜性的影響
3.4. 連線分割槽資料
3.4.1. 為了晉升機能會將較大的資料表拆分為多個部門3.4.2. 設計職員可以在無須強制資料庫使用者修改查詢的情況下改動底層資料的結構
4. 可更新檢視
4.1. MySQL、Oracle Database和SQL Server都答應使用者在遵守特定限制的條件下透過檢視修改資料
4.2. MySQL滿意下列前提,檢視就是可更新的
4.2.1. 沒有使用聚合函式(max()、min()、avg()等)4.2.2. 檢視沒有使用group by或having子句4.2.3. select或from子句中不存在子查詢,並且where子句中的任何子查詢都不引用from子句中的資料表4.2.4. 檢視沒有使用union、union all或distinct4.2.5. from子句至少包括一個數據表或可更新檢視4.2.6. 假如有不止一個數據表或檢視,from子句只使用內連線
5. 索引
5.1. 查詢資源內特定項的一種機制
5.2. 資料庫伺服器也使用索引來定位資料表中的行
5.3. 與普通的資料表不同,索引是一種以特定順序留存的專用資料表
5.4. 索引並不包含實體的所有相關資料,而是隻包含那些可用於定位資料表中行的列,以及描述這些行所在的物理位置資訊
5.5. 索引的作用就是使檢索資料表中行和列的子集實現便捷化,無須再檢查資料表中的每一行
5.6. MySQL 5.0版也提供了create index,但該命令被對映到alter table命令,仍舊必需使用alter table命令建立主鍵索引
5.6.1. mysql-
-> ALTER TABLE customer -> ADD INDEX idx_email (email);
5.6.2. sql
CREATE INDEX dept_name_idx ON department (name);
5.7. MySQL也支援drop index命令,不外同樣是被對映到alter table命令
5.7.1. mysql
-> ALTER TABLE customer -> DROP INDEX idx_email;
5.7.2. sql
DROP INDEX idx_email; (Oracle)DROP INDEX idx_email ON customer; (SQL Server)
5.8. MySQL使用者可以使用show命令檢視特定資料表的所有索引
5.9. 所有的資料庫伺服器都答應檢視可用的索引
5.10. 獨一索引
5.10.1. 提供普通索引所能提供的所有便利5.10.2. 避免索引列泛起重複值5.10.3. 只要有行插入或是索引列被修改,資料庫伺服器就會檢查獨一索引,以檢視該值是否已經在資料表中的其他行存在5.10.4. SQL Server和Oracle Database使用者只需在建立索引時加入unique關鍵字5.10.4.1. sql
CREATE UNIQUE INDEX idx_email ON customer (email);
5.10.5. mysql
-> ALTER TABLE customer -> ADD UNIQUE idx_email (email);
5.11. 多列索引
5.11.1. 在建立多列索引時,必需仔細考慮哪一列在前,哪一列在後,這樣才能使索引儘可能地發揮作用5.11.2. 假如需要確保充分的響應時間,完全可以基於不同順序為列的統一集合建立多個索引5.11.3. mysql
-> ALTER TABLE customer -> ADD INDEX idx_full_name (last_name, first_name);
5.12. 索引型別
5.12.1. B樹索引5.12.1.1. 平衡樹索引(balanced-tree index)5.12.1.1.1. B樹索引(B-tree index)5.12.1.2. MySQL、Oracle Database和SQL Server均預設採用B樹索引5.12.1.3. B樹索引擅長處理包含大量不同值的列5.12.2. 點陣圖索引5.12.2.1. 對於那些只包含少量值卻佔據了大量行的列(所謂的低基數資料)5.12.2.2. 對於低基數資料而言,點陣圖索引是一種友好且緊湊的索引解決方案5.12.2.3. 假如列中儲存的值的數目相較於行數攀升得過高(所謂的高基數資料),這種索引策略就不適合了,由於伺服器需要維護太多的點陣圖5.12.2.4. Oracle Database引入了點陣圖索引(bitmap index),其為儲存在列中的每個值天生一個位圖5.12.2.4.1. CREATE BITMAP INDEX idx_active ON customer (active);5.12.2.5. 通常用於資料倉庫環境,其中大量資料通常在包含相對較少值的列(例如銷售季度、地輿區域、產品、銷售職員)上進行索引5.12.3. 文字索引5.12.3.1. MySQL和SQL Server提供的是全文索引(full-text index)5.12.3.2. Oracle Database提供了一套稱為Oracle Text的強盛工具集
5.13. 答應使用者檢視查詢最佳化器是如何處理SQL語句的
5.13.1. SQL Server使用者可以在執行SQL 語句之前透過發出set showplan_text on語句檢視該語句的執行計劃5.13.2. Oracle Database提供了explain plan語句,透過執行該語句可以將執行計劃寫入專用的資料表plan_table
5.14. 索引的不足
5.14.1. 索引並不是越多越好5.14.1.1. 每個索引實在都是一個數據表(特殊型別的表)5.14.1.2. 索引越多,伺服器就需要做越多的工作來保持所有模式物件都處於最新狀態,這會使伺服器的執行速度減慢5.14.2. 索引需要磁碟空間,同時也需要管理員花費精力進行治理,因此對於索引的最佳策略就是僅當有明確需求時才新增索引5.14.2.1. 假如出於一些特殊目的要用到索引,好比每月的例行維護工作,可以先新增索引,例行維護,然後再刪除索引,下次需要例行維護時再如斯重複5.14.2.2. 資料被連夜載入到資料倉庫時就會泛起問題,常見做法是在資料被載入之前撤銷索引,然後在資料倉庫開放業務之前重新建立索引
5.15. 索引不能太多,也不能太少
5.15.1. 確保所有主鍵列被索引5.15.2. 對於多列主鍵,可以考慮為主鍵列的子集或是以不同於主鍵約束定義的順序為所有主鍵列建立額外的索引5.15.3. 為所有被外來鍵約束引用的列建立索引5.15.4. 為被用於頻繁檢索資料的列建立索引5.15.5. 除了短字串(2~50個字元)列,大多數日期列也是不錯的候選物件
6. 約束
6.1. 施加於資料表中一列或多列的限制
6.1.1. 假如沒有約束,資料庫的一致性就會存疑
6.2. 主鍵約束
6.2.1. 標識一列或多列,保證其值在資料表中的唯一性
6.3. 外來鍵約束
6.3.1. 限制一列或多列只能包含其他資料表的主鍵列中的值6.3.2. on delete restrict6.3.2.1. on delete restrict,假如刪除了父表(address或store)中被子表(customer)引用的行,伺服器會引發錯誤6.3.3. on delete cascade6.3.4. on delete set null6.3.5. on update restrict6.3.6. on update cascade6.3.6.1. on update cascade,使伺服器將父表(address或store)主鍵值的改動傳播到子表(customer)6.3.7. on update set null
6.4. 獨一約束
6.4.1. 限制一列或多列的值,保證其在資料表中的唯一性
6.5. 檢查約束
6.5.1. 限制列的可用值範圍
6.6. sql
ALTER TABLE customerADD CONSTRAINT fk_customer_address FOREIGN KEY (address_id)REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE;ALTER TABLE customerADD CONSTRAINT fk_customer_store FOREIGN KEY (store_id)REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE;
6.7. 假如想刪除主鍵約束或外來鍵約束,也可以使用alter table語句,只不過要將add改為drop

1. 精心設計的應用程式通常會在保持實現細節私有的同時公然公有介面,以便未來在不影響終端使用者的情況下修改設計
2. 檢視
2.1. 不同於資料表,檢視並不涉及資料儲存,不用擔心檢視會填滿你的磁碟空間
2.2. 一種資料查詢機制
2.3. 從使用者的視角來看,檢視和資料表沒什麼兩樣
3. 為什麼要使用檢視
3.1. 資料安全
3.1.1. 假如你建立了資料表並答應使用者查詢,使用者就可以訪問資料表中的每一行和每一列3.1.2. 保持資料表的私有性(不授權任何使用者select許可),然後建立一個或多個檢視,忽略或模糊化(好比customer_vw.email列採用的"*"方法)敏感列3.1.3. 虛擬私有資料庫(virtual private database,VPD)3.1.3.1. Oracle Database使用者另一種選擇可以保護資料表的行列資料安全3.1.3.2. VPD答應使用者對資料表施加策略,伺服器據此對使用者的查詢進行修改
3.2. 資料聚合
3.2.1. 天生報表的應用程式通常需要聚合資料3.2.2. 將資料預先在資料表中聚合而不是使用檢視乞降以極大地提高查詢機能
3.3. 隱藏複雜性
3.3.1. 為了使終端使用者免受複雜性的影響
3.4. 連線分割槽資料
3.4.1. 為了晉升機能會將較大的資料表拆分為多個部門3.4.2. 設計職員可以在無須強制資料庫使用者修改查詢的情況下改動底層資料的結構
4. 可更新檢視
4.1. MySQL、Oracle Database和SQL Server都答應使用者在遵守特定限制的條件下透過檢視修改資料
4.2. MySQL滿意下列前提,檢視就是可更新的
4.2.1. 沒有使用聚合函式(max()、min()、avg()等)4.2.2. 檢視沒有使用group by或having子句4.2.3. select或from子句中不存在子查詢,並且where子句中的任何子查詢都不引用from子句中的資料表4.2.4. 檢視沒有使用union、union all或distinct4.2.5. from子句至少包括一個數據表或可更新檢視4.2.6. 假如有不止一個數據表或檢視,from子句只使用內連線
5. 索引
5.1. 查詢資源內特定項的一種機制
5.2. 資料庫伺服器也使用索引來定位資料表中的行
5.3. 與普通的資料表不同,索引是一種以特定順序留存的專用資料表
5.4. 索引並不包含實體的所有相關資料,而是隻包含那些可用於定位資料表中行的列,以及描述這些行所在的物理位置資訊
5.5. 索引的作用就是使檢索資料表中行和列的子集實現便捷化,無須再檢查資料表中的每一行
5.6. MySQL 5.0版也提供了create index,但該命令被對映到alter table命令,仍舊必需使用alter table命令建立主鍵索引
5.6.1. mysql-
-> ALTER TABLE customer -> ADD INDEX idx_email (email);
5.6.2. sql
CREATE INDEX dept_name_idx ON department (name);
5.7. MySQL也支援drop index命令,不外同樣是被對映到alter table命令
5.7.1. mysql
-> ALTER TABLE customer -> DROP INDEX idx_email;
5.7.2. sql
DROP INDEX idx_email; (Oracle)DROP INDEX idx_email ON customer; (SQL Server)
5.8. MySQL使用者可以使用show命令檢視特定資料表的所有索引
5.9. 所有的資料庫伺服器都答應檢視可用的索引
5.10. 獨一索引
5.10.1. 提供普通索引所能提供的所有便利5.10.2. 避免索引列泛起重複值5.10.3. 只要有行插入或是索引列被修改,資料庫伺服器就會檢查獨一索引,以檢視該值是否已經在資料表中的其他行存在5.10.4. SQL Server和Oracle Database使用者只需在建立索引時加入unique關鍵字5.10.4.1. sql
CREATE UNIQUE INDEX idx_email ON customer (email);
5.10.5. mysql
-> ALTER TABLE customer -> ADD UNIQUE idx_email (email);
5.11. 多列索引
5.11.1. 在建立多列索引時,必需仔細考慮哪一列在前,哪一列在後,這樣才能使索引儘可能地發揮作用5.11.2. 假如需要確保充分的響應時間,完全可以基於不同順序為列的統一集合建立多個索引5.11.3. mysql
-> ALTER TABLE customer -> ADD INDEX idx_full_name (last_name, first_name);
5.12. 索引型別
5.12.1. B樹索引5.12.1.1. 平衡樹索引(balanced-tree index)5.12.1.1.1. B樹索引(B-tree index)5.12.1.2. MySQL、Oracle Database和SQL Server均預設採用B樹索引5.12.1.3. B樹索引擅長處理包含大量不同值的列5.12.2. 點陣圖索引5.12.2.1. 對於那些只包含少量值卻佔據了大量行的列(所謂的低基數資料)5.12.2.2. 對於低基數資料而言,點陣圖索引是一種友好且緊湊的索引解決方案5.12.2.3. 假如列中儲存的值的數目相較於行數攀升得過高(所謂的高基數資料),這種索引策略就不適合了,由於伺服器需要維護太多的點陣圖5.12.2.4. Oracle Database引入了點陣圖索引(bitmap index),其為儲存在列中的每個值天生一個位圖5.12.2.4.1. CREATE BITMAP INDEX idx_active ON customer (active);5.12.2.5. 通常用於資料倉庫環境,其中大量資料通常在包含相對較少值的列(例如銷售季度、地輿區域、產品、銷售職員)上進行索引5.12.3. 文字索引5.12.3.1. MySQL和SQL Server提供的是全文索引(full-text index)5.12.3.2. Oracle Database提供了一套稱為Oracle Text的強盛工具集
5.13. 答應使用者檢視查詢最佳化器是如何處理SQL語句的
5.13.1. SQL Server使用者可以在執行SQL 語句之前透過發出set showplan_text on語句檢視該語句的執行計劃5.13.2. Oracle Database提供了explain plan語句,透過執行該語句可以將執行計劃寫入專用的資料表plan_table
5.14. 索引的不足
5.14.1. 索引並不是越多越好5.14.1.1. 每個索引實在都是一個數據表(特殊型別的表)5.14.1.2. 索引越多,伺服器就需要做越多的工作來保持所有模式物件都處於最新狀態,這會使伺服器的執行速度減慢5.14.2. 索引需要磁碟空間,同時也需要管理員花費精力進行治理,因此對於索引的最佳策略就是僅當有明確需求時才新增索引5.14.2.1. 假如出於一些特殊目的要用到索引,好比每月的例行維護工作,可以先新增索引,例行維護,然後再刪除索引,下次需要例行維護時再如斯重複5.14.2.2. 資料被連夜載入到資料倉庫時就會泛起問題,常見做法是在資料被載入之前撤銷索引,然後在資料倉庫開放業務之前重新建立索引
5.15. 索引不能太多,也不能太少
5.15.1. 確保所有主鍵列被索引5.15.2. 對於多列主鍵,可以考慮為主鍵列的子集或是以不同於主鍵約束定義的順序為所有主鍵列建立額外的索引5.15.3. 為所有被外來鍵約束引用的列建立索引5.15.4. 為被用於頻繁檢索資料的列建立索引5.15.5. 除了短字串(2~50個字元)列,大多數日期列也是不錯的候選物件
6. 約束
6.1. 施加於資料表中一列或多列的限制
6.1.1. 假如沒有約束,資料庫的一致性就會存疑
6.2. 主鍵約束
6.2.1. 標識一列或多列,保證其值在資料表中的唯一性
6.3. 外來鍵約束
6.3.1. 限制一列或多列只能包含其他資料表的主鍵列中的值6.3.2. on delete restrict6.3.2.1. on delete restrict,假如刪除了父表(address或store)中被子表(customer)引用的行,伺服器會引發錯誤6.3.3. on delete cascade6.3.4. on delete set null6.3.5. on update restrict6.3.6. on update cascade6.3.6.1. on update cascade,使伺服器將父表(address或store)主鍵值的改動傳播到子表(customer)6.3.7. on update set null
6.4. 獨一約束
6.4.1. 限制一列或多列的值,保證其在資料表中的唯一性
6.5. 檢查約束
6.5.1. 限制列的可用值範圍
6.6. sql
ALTER TABLE customerADD CONSTRAINT fk_customer_address FOREIGN KEY (address_id)REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE;ALTER TABLE customerADD CONSTRAINT fk_customer_store FOREIGN KEY (store_id)REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE;
6.7. 假如想刪除主鍵約束或外來鍵約束,也可以使用alter table語句,只不過要將add改為drop