【正文】
無(wú)論您是一位 SQL 的新手,或是一位只是需要對(duì) SQL 復(fù)習(xí)一下的資料倉(cāng)儲(chǔ)業(yè)界老將,您就來(lái)對(duì)地方了。這個(gè) SQL 教材網(wǎng)站列出常用的 SQL 指令,包含以下幾個(gè)部分: ? SQL 指令: SQL 如何被用來(lái)儲(chǔ)存、讀取、以及處理數(shù)據(jù)庫(kù)之中的資料。 ? 表格處理: SQL 如何被用來(lái)處理數(shù)據(jù)庫(kù)中的表格。 ? 進(jìn)階 SQL: 介紹 SQL 進(jìn)階概念,以及如何用 SQL 來(lái)執(zhí)行一些較復(fù)雜的運(yùn)算。 ? SQL 語(yǔ)法: 這一頁(yè)列出所有在這個(gè)教材中被提到的 SQL 語(yǔ)法。 對(duì)于每一個(gè)指令,我們將會(huì)先列出及解釋這個(gè)指令的語(yǔ)法,然后用一個(gè)例子來(lái)讓讀者了解這個(gè)指令是如何被運(yùn)用的。當(dāng)您讀完了這個(gè)網(wǎng)站的所有教材后,您將對(duì) SQL 的語(yǔ)法會(huì)有一個(gè)大致上的了解。另外,您將能夠正確地運(yùn)用 SQL 來(lái)由數(shù)據(jù)庫(kù)中獲取信息。筆者本身的經(jīng)驗(yàn)是,雖然要對(duì) SQL 有很透徹的了解并不是一朝一夕可以完成的,可是要對(duì) SQL 有個(gè)基本的了解并不難。希望在看完這個(gè)網(wǎng)站后,您也會(huì)有同樣的想法。 SQL指令SELECT是用來(lái)做什么的呢?一個(gè)最常用的方式是將資料從數(shù)據(jù)庫(kù)中的表格內(nèi)選出。從這一句回答中,我們馬上可以看到兩個(gè)關(guān)鍵字: 從 (FROM) 數(shù)據(jù)庫(kù)中的表格內(nèi)選出 (SELECT)。(表格是一個(gè)數(shù)據(jù)庫(kù)內(nèi)的結(jié)構(gòu),它的目的是儲(chǔ)存資料。在表格處理這一部分中,我們會(huì)提到如何使用 SQL 來(lái)設(shè)定表格。) 我們由這里可以看到最基本的 SQL 架構(gòu): SELECT 欄位名 FROM 表格名 我們用以下的例子來(lái)看看實(shí)際上是怎么用的。假設(shè)我們有以下這個(gè)表格: store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 若要選出所有的店名 (store_Name),我們就打入: SELECT store_name FROM Store_Information 結(jié)果:store_nameLos AngelesSan DiegoLos AngelesBoston我們一次可以讀取好幾個(gè)欄位,也可以同時(shí)由好幾個(gè)表格中選資料。 DISTINCTSELECT 指令讓我們能夠讀取表格中一個(gè)或數(shù)個(gè)欄位的所有資料。這將把所有的資料都抓出,無(wú)論資料值有無(wú)重復(fù)。在資料處理中,我們會(huì)經(jīng)常碰到需要找出表格內(nèi)的不同資料值的情況。換句話說(shuō),我們需要知道這個(gè)表格/欄位內(nèi)有哪些不同的值,而每個(gè)值出現(xiàn)的次數(shù)并不重要。這要如何達(dá)成呢?在 SQL 中,這是很容易做到的。我們只要在 SELECT 后加上一個(gè) DISTINCT 就可以了。DISTINCT 的語(yǔ)法如下: SELECT DISTINCT 欄位名 FROM 表格名 舉例來(lái)說(shuō),若要在以下的表格,Store_Information,找出所有不同的店名時(shí), Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 我們就鍵入,SELECT DISTINCT store_name FROM Store_Information結(jié)果: store_name Los Angeles San Diego Boston WHERE我們并不一定每一次都要將表格內(nèi)的資料都完全抓出。在許多時(shí)候,我們會(huì)需要選擇性地抓資料。就我們的例子來(lái)說(shuō),我們可能只要抓出營(yíng)業(yè)額超過(guò) $1,000 的資料。要做到這一點(diǎn),我們就需要用到 WHERE 這個(gè)指令。這個(gè)指令的語(yǔ)法如下:SELECT 欄位名 FROM 表格名 WHERE 條件 若我們要由以下的表格抓出營(yíng)業(yè)額超過(guò) $1,000 的資料, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 我們就鍵入,SELECT store_name FROM Store_Information WHERE Sales 1000 結(jié)果: store_name Los Angeles AND OR在上一頁(yè)中,我們看到 WHERE 指令可以被用來(lái)由表格中有條件地選取資料。 這個(gè)條件可能是簡(jiǎn)單的 (像上一頁(yè)的例子),也可能是復(fù)雜的。復(fù)雜條件是由二或多個(gè)簡(jiǎn)單條件透過(guò) AND 或是 OR 的連接而成。一個(gè) SQL 語(yǔ)句中可以有無(wú)限多個(gè)簡(jiǎn)單條件的存在。 復(fù)雜條件的語(yǔ)法如下: SELECT 欄位名 FROM 表格名 WHERE 簡(jiǎn)單條件 {[AND|OR] 簡(jiǎn)單條件}+ {}+ 代表{}之內(nèi)的情況會(huì)發(fā)生一或多次。在這里的意思就是 AND 加簡(jiǎn)單條件及 OR 加簡(jiǎn)單條件的情況可以發(fā)生一或多次。另外,我們可以用 () 來(lái)代表?xiàng)l件的先后次序。 舉例來(lái)說(shuō),我們?nèi)粢?Store_Information 表格中選出所有 Sales 高于 $1,000 或是 Sales 在 $500 及 $275 之間的資料的話, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 San Francisco $300 Jan081999 Boston $700 Jan081999我們就鍵入,SELECT store_name FROM Store_Information WHERE Sales 1000 OR (Sales 500 AND Sales 275) 結(jié)果: store_name Los Angeles San Francisco IN在 SQL 中,在兩個(gè)情況下會(huì)用到 IN 這個(gè)指令;這一頁(yè)將介紹其中之一:與 WHERE 有關(guān)的那一個(gè)情況。在這個(gè)用法下,我們事先已知道至少一個(gè)我們需要的值,而我們將這些知道的值都放入 IN 這個(gè)子句。 IN 指令的語(yǔ)法為下: SELECT 欄位名 FROM 表格名 WHERE 欄位名 IN (39。值一39。, 39。值二39。, ...) 在括號(hào)內(nèi)可以有一或多個(gè)值,而不同值之間由逗點(diǎn)分開(kāi)。值可以是數(shù)目或是文字。若在括號(hào)內(nèi)只有一個(gè)值,那這個(gè)子句就等于 WHERE 欄位名 = 39。值一39。 舉例來(lái)說(shuō),若我們要在 Store_Information 表格中找出所有含蓋 Los Angeles 或 San Diego 的資料, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 San Francisco $300 Jan081999 Boston $700 Jan081999 我們就鍵入,SELECT * FROM Store_Information WHERE store_name IN (39。Los Angeles39。, 39。San Diego39。) 結(jié)果: store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 BETWEENIN 這個(gè)指令可以讓我們依照一或數(shù)個(gè)不連續(xù) (discrete) 的值的限制之內(nèi)抓出資料庫(kù)中的值,而 BETWEEN 則是讓我們可以運(yùn)用一個(gè)范圍 (range) 內(nèi)抓出資料庫(kù)中的值。BETWEEN 這個(gè)子句的語(yǔ)法如下: SELECT 欄位名 FROM 表格名 WHERE 欄位名 BETWEEN 39。值一39。 AND 39。值二39。 這將選出欄位值包含在值一及值二之間的每一筆資料。 舉例來(lái)說(shuō),若我們要由 Store_Information 表格中找出所有介于 January 6, 1999 及 January 10, 1999 中的資料, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 San Francisco $300 Jan081999 Boston $700 Jan081999 我們就鍵入,SELECT * FROM Store_Information WHERE Date BETWEEN 39。Jan06199939。 AND 39。Jan10199939。請(qǐng)讀者注意:在不同的數(shù)據(jù)庫(kù)中,日期的儲(chǔ)存法可能會(huì)有所不同。在這里我們選擇了其中一種儲(chǔ)存法。 結(jié)果: store_name Sales Date San Diego $250 Jan071999 San Francisco $300 Jan081999 Boston $700 Jan081999 LIKELIKE 是另一個(gè)在 WHERE 子句中會(huì)用到的指令。基本上, LIKE 能讓我們依據(jù)一個(gè)模式 (pattern) 來(lái)找出我們要的資料。相對(duì)來(lái)說(shuō),在運(yùn)用 IN 的時(shí)候,我們完全地知道我們需要的條件;在運(yùn)用 BETWEEN 的時(shí)候,我們則是列出一個(gè)范圍。 LIKE 的語(yǔ)法如下: SELECT 欄位名 FROM 表格名 WHERE 欄位名 LIKE {模式} {模式} 經(jīng)常包括野卡 (wildcard). 以下是幾個(gè)例子: 39。A_Z39。: 所有以 39。A39。 起頭,另一個(gè)任何值的字原,且以 39。Z39。 為結(jié)尾的字符串。 39。ABZ39。 和 39。A2Z39。 都符合這一個(gè)模式,而 39。AKKZ39。 并不符合 (因?yàn)樵?A 和 Z 之間有兩個(gè)字原,而不是一個(gè)字原)。 39。ABC%39。: 所有以 39。ABC39。 起頭的字符串。舉例來(lái)說(shuō),39。ABCD39。 和 39。ABCABC39。 都符合這個(gè)模式。 39。%XYZ39。: 所有以 39。XYZ39。 結(jié)尾的字符串。舉例來(lái)說(shuō),39。WXYZ39。 和 39。ZZXYZ39。 都符合這個(gè)模式。 39。%AN%39。: 所有含有 39。AN39。這個(gè)模式的字符串。舉例來(lái)說(shuō), 39。LOS ANGELES39。 和 39。SAN FRANCISCO39。 都符合這個(gè)模式。 我們將以上最后一個(gè)例子用在我們的 Store_Information 表格上: Store_Information 表格store_name Sales Date LOS ANGELES $1500 Jan051999 SAN DIEGO $250 Jan071999 SAN FRANCISCO $300 Jan081999 BOSTON $700 Jan081999 我們就鍵入,SELECT * FROM Store_Information WHERE store_name LIKE 39。%AN%39。結(jié)果: store_name Sales Date LOS ANGELES $1500 Jan051999 SAN FRANCISCO $300 Jan081999 SAN DIEGO $250 Jan071999 ORDER BY到目前為止,我們已學(xué)到如何藉由 SELECT 及 WHERE 這兩個(gè)指令將資料由表格中抓出。不過(guò)我們尚未提到這些資料要如何排列。這其實(shí)是一個(gè)很重要的問(wèn)題。事實(shí)上,我們經(jīng)常需要能夠?qū)⒆コ龅馁Y料做一個(gè)有系統(tǒng)的顯示。這可能是由小往大 (ascending) 或是由大往小(descending)。在這種情況下,我們就可以運(yùn)用 ORDER BY 這個(gè)指令來(lái)達(dá)到我們的目的。 ORDER BY 的語(yǔ)法如下: SELECT 欄位名 FROM 表格名 [WHERE 條件]ORDER BY 欄位名 [ASC, DESC] [] 代表 WHERE 子句不是一定需要的。不過(guò),如果 WHERE 子句存在的話,它是在 ORDER BY 子句之前。 ASC 代表結(jié)果會(huì)以由小往大的順序列出,而 DESC 代表結(jié)果會(huì)以由大往小的順序列出。如果兩者皆沒(méi)有被寫(xiě)出的話,那我們就會(huì)用 ASC。 我們可以照好幾個(gè)不同的欄位來(lái)排順序。在這個(gè)情況下, ORDER BY 子句的語(yǔ)法如下(假設(shè)有兩個(gè)欄位): ORDER BY 欄位一 [ASC, DESC