天天看點

《Oracle PL/SQL必知必會》——第1章 了解SQL

本節書摘來自異步社群出版社《oracle pl/sql必知必會》一書中的第1章,第1.1節,作者:【美】ben forta(本 福達),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

oracle pl/sql必知必會

在本章中,你将學習資料庫和sql的相關知識,它們是學習oracle和pl/sql的前提。

你正在閱讀本書的事實表明你需要以某種方式與資料庫互動。是以,在深入學習oracle及其sql語言的實作(pl/sql)之前,了解一些關于資料庫和資料庫技術的基本概念就很重要。

無論知道與否,你事實上一直都在使用資料庫。每次從電子郵件或智能手機通訊錄中選擇一個名字時,就是在使用資料庫。當在internet搜尋站點上執行搜尋時,也是在使用資料庫。當在工作中登入到網絡時,将對照資料庫驗證你的名字和密碼。甚至在自動取款機上使用atm卡時,同樣在使用資料庫,以進行pin驗證和餘額檢查。

但是,即使我們一直都在使用資料庫,對于資料庫到底是什麼仍然認識不清。事實的确如此,因為不同的人使用“資料庫”一詞來指代不同的事物。是以,一個良好的學習起點是:利用一份清單解釋最重要的資料庫術語。

提示:複習基本概念

 

下面簡要概述了一些基本的資料庫概念。如果你已經具有一些資料庫使用經驗,下面的内容将喚醒你的記憶;如果你是新手,那麼以下内容将給你提供絕對基礎的知識。了解資料庫是掌握oracle的一個重要部分,你可能想要尋找一個關于資料庫基本原理的優秀圖書,以在需要時複習一下相關的主題。

人們以多種不同的方式使用資料庫(database)這個術語,但是在我們看來,資料庫是指以某種有組織的方式存儲的資料集合。了解它的最簡單的方式是把資料庫想象成一個檔案櫃。檔案櫃隻是存儲資料的實體位置,而不管資料是什麼以及它們是怎樣組織的。

資料庫

用于存儲有組織的資料的容器(通常是檔案或檔案集)。

警告:濫用導緻混淆

人們經常使用資料庫(database)這個術語來指代他們正在運作的資料庫軟體。這是不正确的,它是大量混淆之源。資料庫軟體實際上被稱為資料庫管理系統(database management system,dbms)。資料庫是通過dbms建立和操作的容器。資料庫可能是存儲在硬碟驅動器上的檔案,但也可能不是。一般而言,這甚至是不重要的,因為你從來不會以任何方式直接通路資料庫;你總是使用dbms,它會為你通路資料庫。

當在檔案櫃中存儲資訊時,不會把資訊簡單地扔進抽屜裡。相反,将在檔案櫃裡建立檔案,然後把相關的資料歸檔在特定的檔案中。

在資料庫世界裡,這個檔案稱為表(table)。表是結構化的檔案,可以存儲特定類型的資料。表可能包含顧客清單、産品目錄,或者其他任何資訊清單。

特定類型資料的結構化清單。

這裡的關鍵是:存儲在表中的資料是一種資料類型或者一份清單。你永遠不會把顧客清單和訂單清單存儲在同一個資料庫表中。如果這樣做,将使往後的檢索和通路難以進行。相反,你将建立兩個表,每個表用于存儲一份清單。

資料庫中的每個表都具有一個用于辨別它的名稱,這個名稱總是唯一的,意味着該資料庫中沒有其他的表可以具有相同的名稱。

注意:表名稱

使表名稱成為唯一的實際上是幾個内容的組合,包括資料庫名稱和表名稱。這意味着盡管不能在相同的資料庫中多次使用相同的表名稱,但是肯定可以在不同的資料庫中重用表名稱。

表具有一些特征和屬性,定義了怎樣在其中存儲資料。它們包括一些資訊,比如可能存儲什麼資料,如何分解它以及如何命名資訊等。這個描述表的資訊集稱為模式(schema),模式描述了資料庫内的特定表和整個資料庫以及資料庫内的表之間的關系(如果有的話)。

模式

關于資料庫以及表布局和屬性的資訊。

{注意:模式還是資料庫?} 偶爾也把模式(schema或schemata)用作資料庫(database)的同義詞。遺憾的是,通常可以從上下文來清晰得知模式要表達的意思,在本書中,模式是指上述的定義。

表由列組成,列包含表中特定的資訊。

表中的單個字段。所有的表都由一列或多列組成。

了解列的最佳方式是把資料庫表想象成網格,它有點像電子資料表,網格中的每一列都包含特定的資訊。例如,在顧客表中,一列包含顧客編号,另一列包含顧客名字,而位址、城市、州和郵政編碼都存儲在它們各自的列中。

提示:分解資料

正确地把資料分解到多個列中極其重要。例如,城市、州和郵政編碼應該總是存儲在單獨的列中。通過分解它們,就有可能按特定的列排序或篩選資料(例如,查找特定州或特定城市的所有顧客)。如果把城市和州結合進一列中,按州進行排序或篩選将極其困難。

資料庫中的每一列都具有一種關聯的資料類型,它定義了列中可以包含什麼類型的資料。例如,如果列将包含數字(也許是訂單中的商品數量),那麼資料類型将是一種數值資料類型。如果列将包含日期、文本、注釋、貨币金額等,将使用相應的資料類型來指定它們。

資料類型

允許的資料的類型。每個表列都具有一種與之關聯的資料類型,用以限制(或允許)在該列中存儲特定的資料。

資料類型限制了列可以存儲的資料的類型(例如,防止把字母字元輸入到數值字段中)。資料類型的使用還有助于正确地排序資料,并且在優化磁盤使用方面起着重要作用。是以,在建立表時要特别注意選擇适當的資料類型。

表中的資料存儲在行中;儲存的每條記錄都存儲在它自己的行中。同樣,把表想象成電子資料表樣式的網格,網格中的垂直列就是表列,水準行就是表行。

例如,顧客表可能每行存儲一位顧客的資訊。表中的行數就是其中的記錄數。

表中的記錄。

注意:記錄或行?

你可能聽到使用者在提及行(row)時把它們稱為資料庫記錄(record)。一般而言,可以互換使用這兩個術語,但是行是技術上正确的術語。

表中的每一行都應該有某一列(或列集合)唯一地辨別它。包含顧客資訊的表可能為此使用顧客編号列,而包含訂單資訊的表則可能使用訂單id。雇員表可能使用雇員id或雇員社會安全号(social security number)列。

主鍵

其值唯一地辨別表中的每一行的列(或列集合)。

唯一地辨別表中的每一行的這個列(或列集合)稱為主鍵(primary key)。可以使用主鍵指代特定的行。如果沒有主鍵,更新或删除表中的特定行将變得極其困難,因為沒有方法可以保證受影響的行的安全。

提示:總是要定義主鍵

盡管主鍵實際上不是必需的,但是大多數資料庫設計者都會確定他們建立的每個表都具有一個主鍵,以使得将來的資料操作是可能的并且容易管理。

可以把表中的任意列設定為主鍵,隻要它滿足以下條件即可:

任意兩行都不能具有相同的主鍵值;

每一行都必須具有一個主鍵值(主鍵列可能不允許null值)。

提示:主鍵規則

這裡列出的規則是由oracle自身強制執行的。

通常在表中的單獨一列上定義主鍵。但是,這不是必需的,可以把多個列一起用作主鍵。當使用多個列時,前面列出的規則必須适用于組織主鍵的所有列,并且所有列的值組合起來必須是唯一的(單獨的列不需要具有唯一的值)。

提示:主鍵的最佳實踐

除了oracle強制執行的規則外,還應該遵守多個被普遍接受的最佳實踐,包括:

不要更新主鍵列中的值;

不要重用主鍵列中的值;

不要使用主鍵列中可能改變的值(例如,如果使用名字作為主鍵來辨別供應商,當供應商兼并以及更改其名字時,将不得不更改主鍵)。

另一種重要的鍵類型是外鍵,但是将在後面的第15章“連接配接表”中介紹它。