【正文】
Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 若我們要找出 Sales 大于 $1,500 的 store_name,我們就鍵入,SELECT store_name, SUM(sales) FROM Store_Information GROUP BY store_nameHAVING SUM(sales) 1500 結(jié)果: store_name SUM(Sales) Los Angeles $1800 ALIAS接下來,我們討論 alias (別名) 在 SQL 上的用處。雖然在這個(gè)情況下沒有什么問題,可是如果這個(gè)欄位不是一個(gè)簡(jiǎn)單的總合,而是一個(gè)復(fù)雜的計(jì)算,那欄位名就沒有這么易懂了。這在我們要用 SQL 由數(shù)個(gè)不同的表格中獲取資料時(shí)是很方便的。這里的不同處是我們加上了欄位別名以及表格別名: SELECT Store, SUM() Total Sales FROM Store_Information A1GROUP BY 結(jié)果: Store Total Sales Los Angeles $1800 San Diego $250 Boston $700 在結(jié)果中,資料本身沒有不同。很明顯地, Total Sales 能夠比 Sum(Sales) 更精確地闡述這個(gè)欄位的含意。我們先假設(shè)我們有以下的兩個(gè)表格, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 Geography 表格 region_name store_name East Boston East New York West Los Angeles West San Diego 而我們要知道每一區(qū) (region_name) 的營(yíng)業(yè)額 (sales)。我們先將 SQL 句列出,之后再討論每一個(gè)子句的意義: SELECT REGION, SUM() SALES FROM Geography A1, Store_Information A2 WHERE = GROUP BY 結(jié)果: REGION SALES East $700 West $2050 在第一行中,我們告訴 SQL 去選出兩個(gè)欄位:第一個(gè)欄位是 Geography 表格中的 region_name 欄位 (我們?nèi)×艘粋€(gè)別名叫做 REGION);第二個(gè)欄位是 Store_Information 表格中的 sales 欄位 (別名為 SALES)。 接下來我們看第三行,就是 WHERE 子句。如果 WHERE 子句是錯(cuò)誤的,我們就極可能得到一個(gè)笛卡兒連接 (Cartesian join)。在這個(gè)情況下,要兩個(gè)表格內(nèi)都有同樣的值,那一筆資料才會(huì)被選出。 假設(shè)我們有以下的兩個(gè)表格: Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 Geography 表格 region_name store_name East Boston East New York West Los Angeles West San Diego 我們需要知道每一間店的營(yíng)業(yè)額。所以,在這個(gè)情況下,我們需要用外部連接來串聯(lián)這兩個(gè)表格: SELECT , SUM() SALES FROM Georgraphy A1, Store_Information A2 WHERE = (+) GROUP BY 我們?cè)谶@里是使用了 Oracle 的外部連接語法。 并不存在于 Store_Information 表格,所以它的 SALES 欄位是 NULL. CONCATENATE有的時(shí)候,我們有需要將由不同欄位獲得的資料串連在一起。||39。Boston39。 39。East Boston39。Boston39。這個(gè)函數(shù)的名稱在不同的數(shù)據(jù)庫中不完全一樣: MySQL: SUBSTR(), SUBSTRING() Oracle: SUBSTR() SQL Server: SUBSTRING() 最常用到的方式如下 (在這里我們用SUBSTR()為例): SUBSTR(str,pos): 由str中,選出所有從第pos位置開始的字符。Los Angeles39。San Diego39。最常見的用途是移除字首或字尾的空白。 LTRIM(字符串): 將所有字符串起頭的空白移除。)。 Sample 39。 例 3: SELECT RTRIM(39。 Sample39。 在我們跳入 CREATE TABLE 的語法之前,我們最好先對(duì)表格這個(gè)東西有些多一點(diǎn)的了解。當(dāng)我們對(duì)表格下定義時(shí),我們需要注明欄位的標(biāo)題,以及那個(gè)欄位的資料種類。)、一個(gè)日期/時(shí)間 (例如 39。 (例如 39。 CREATE TABLE 的語法是: CREATE TABLE 表格名(欄位 1 欄位 1 資料種類,欄位 2 欄位 2 資料種類,... ) 若我們要建立我們上面提過的顧客表格,我們就鍵入以下的 SQL: CREATE TABLE customer(First_Name char(50),Last_Name char(50),Address char(50),City char(50),Country char(25),Birth_Date date) CONSTRAINT我們可以限制哪一些資料可以存入表格中。 舉例來說,在以下的語句中, CREATE TABLE Customer (SID integer NOT NULL, Last_Name varchar (30) NOT NULL, First_Name varchar(30))。 SID 欄位不能有重復(fù)值存在,而 Last_Name 及 First_Name 這兩個(gè)欄位則是允許有重復(fù)值存在。 舉例來說,在以下的語句中, CREATE TABLE Customer (SID integer CHECK (SID 0), Last_Name varchar (30), First_Name varchar(30))。 主鍵主鍵 (Primary Key) 中的每一筆資料都是表格中的唯一值。當(dāng)主鍵包含多個(gè)欄位時(shí),稱為組合鍵 (Composite Key)。 SQL Server: CREATE TABLE Customer (SID integer PRIMARY KEY, Last_Name varchar(30), First_Name varchar(30))。 請(qǐng)注意,在用ALTER TABLE語句來添加主鍵之前,我們需要確認(rèn)被用來當(dāng)做主鍵的欄位是設(shè)定為 『NOT NULL』 ;也就是說,那個(gè)欄位一定不能沒有資料。 舉例來說,假設(shè)我們有兩個(gè)表格:一個(gè) CUSTOMER 表格,里面記錄了所有顧客的資料;另一個(gè) ORDERS 表格,里面記錄了所有顧客訂購(gòu)的資料。換句話說,ORDERS表格之中,不能有任何顧客是不存在于 CUSTOMER 表格中的資料。 SQL Server: CREATE TABLE ORDERS (Order_ID integer primary key, Order_Date datetime, Customer_SID integer references CUSTOMER(SID), Amount double)。 SQL Server: ALTER TABLE ORDERS ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid)。來看一個(gè)例子。這個(gè)視觀表包含不同地區(qū)的銷售哦。若這本書有索引的話,我們就可以先去索引找出種植青椒的信息是在哪一頁,然后直接到那一頁去閱讀。table scan39。 因此,在表格上建立索引是一件有利于系統(tǒng)效率的事。另外,在索引名之內(nèi)包括表格名及欄位名也是一個(gè)好的方式。常見的改變?nèi)缦拢?加一個(gè)欄位 刪去一個(gè)欄位 改變欄位名稱 改變欄位的資料種類 以上列出的改變并不是所有可能的改變。這可以用以下的指令達(dá)成: ALTER table customer add Gender char(1) 這個(gè)指令執(zhí)行后的表格架構(gòu)是: customer 表格 欄位名稱資料種類First_Namechar(50)Last_Namechar(50)Addresschar(50)Citychar(50)Countrychar(25)Birth_DatedateGenderchar(1)接下來,我們要把 Address 欄位改名為 Addr。事實(shí)上,如果我們不能這樣做的話,那將會(huì)是一個(gè)很大的問題,因?yàn)閿?shù)據(jù)庫管理師 (Database Administrator DBA) 勢(shì)必?zé)o法對(duì)數(shù)據(jù)庫做有效率的管理。不過這樣整個(gè)表格就消失,而無法再被用了。但是這些資料是如果進(jìn)入這些表格的呢?這就是這一頁 (INSERT INTO) 和下一頁 (UPDATE) 要討論的。 依照慣例,我們先介紹語法。, 900, 39。如果您想說,這是不是說資料是從另一個(gè)表格來的,那您就想對(duì)了。不同的數(shù)據(jù)庫會(huì)有不同的語法。 UPDATE我們有時(shí)候可能會(huì)需要修改表格中的資料。如果有多筆資料符合條件的話,每一筆符合條件的資料都會(huì)被修改的。它的語法是: DELETE FROM 表格名WHERE {條件} 以下我們用個(gè)實(shí)例說明。 UNION 的一個(gè)限制是兩個(gè) SQL 語句所產(chǎn)生的欄位需要是同樣的資料種類。 UNION ALLUNION ALL 這個(gè)指令的目的也是要將兩個(gè) SQL 語句的結(jié)果合并在一起。要達(dá)到這個(gè)目的,我們用以下的 SQL 語句: SELECT Date FROM Store_InformationUNION ALLSELECT Date FROM Internet_Sales 結(jié)果: Date Jan051999 Jan071999 Jan081999 Jan081999 Jan071999 Jan101999 Jan111999 Jan121999 INTERSECT 和 UNION 指令類似, INTERSECT 也是對(duì)兩個(gè) SQL 語句所產(chǎn)生的結(jié)果做處理的。要達(dá)到這個(gè)目的,我們用以下的 SQL 語句: SELECT Date FROM Store_InformationINTERSECTSELECT Date FROM Internet_Sales 結(jié)果: Date Jan071999 請(qǐng)注意,在 INTERSECT 指令下,不同的值只會(huì)被列出一次。如果第二個(gè) SQL 語句所產(chǎn)生的結(jié)果并沒有存在于第一個(gè) SQL 語句所產(chǎn)生的結(jié)果內(nèi),那這筆資料就被拋棄。它先找出第一個(gè) SQL 語句所產(chǎn)生的結(jié)果,然后看這些結(jié)果有沒有在第二個(gè) SQL 語句的結(jié)果中。 UNION 是聯(lián)集,而 INTERSECT 是交集。 UNION ALL 的語法如下: [SQL 語句 1]UNION ALL[SQL 語句 2] 我們用和上一頁同樣的例子來顯示出 UNION ALL 和 UNION 的不同。 UNION 的語法如下: [SQL 語句 1]UNION[SQL 語句 2] 假設(shè)我們有以下的兩個(gè)表格, Store_Information 表格 store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999Internet_Sales 表格 Date Sales Jan071999 $250 Jan101999 $535 Jan111999 $320 Jan121999 $750而我們要找出來所有有營(yíng)業(yè)額 (sales) 的日子。在這里我們可以用以下的 SQL 來達(dá)到這個(gè)目的: DELETE FROM Store_InformationWHERE store_name = Los Angeles 現(xiàn)在表格的內(nèi)容變成: Stor