初學者自學SQL有什麼好書推薦嗎?

作為一名高中生,深知想要玩好sql injection 就一定要學好資料庫。有關於資料庫方面的書籍有適合初學者並且可以有深入學習的好書嗎?


這個問題題主的題目和描述有點不太一致… 題主的問題是SQL的學習,而題主的描述是資料庫方面的書籍。需要指出的是,SQL只是資料庫中的一種語言,而資料庫本身的知識點非常龐大,遠不是SQL本身而已。所以我想應該從這兩個方面分別回答一下。

對於SQL,這本身就是一門資料庫執行語言而已。實際上,對於語言的學習最科學的就是看其說明文檔。所有講解資料庫的書籍本身也會涵蓋SQL語言的講解,只不過講解的內容可能不是很全面,也可能不是很系統。如果要找一個入門級的,neargo推薦的《SQL必知必會》是一個非常棒的書籍。如果想進一步學習的話,SQL官方幫助文檔是必不可少的閱讀內容。

正如前面所說的,SQL本身只是一門語言,如果題主想進一步學習資料庫注入,那麼光懂SQL本身還是不夠的,需要對資料庫有系統的學習。這裡我不打算推薦書籍,而是推薦Coursera中,Stanford大學的一門公開課:《Introduction to Database》(Coursera.org)。這門課系統講解了資料庫的全部內容,可以說對資料庫的入門有著非常大的幫助。另外,課程中推薦的書籍都是著名的資料庫書籍,如:

  • A First Course in Database Systems (3rd edition) by Ullman and Widom

    (same material and sections as Database Systems: The Complete Book (2nd edition) by Garcia-Molina, Ullman, and Widom)
  • Database Management Systems (3rd edition) by Ramakrishnan and Gehrke
  • Fundamentals of Database Systems (6th edition) by Elmasri and Navathe
  • Database System Concepts (6th edition) by Silberschatz, Korth, and Sudarshan

這門課以前是在Stanford的Class2Go上面的,因此當時還有Accomplishment,現在已經沒有了… 在此我也可以展示一下這個Accomplishment,還是很有成就感的~

總之,資料庫的系統學習是一件比較艱辛的工作。在學習資料庫的知識後,也可以進一步閱讀開源資料庫的代碼,如redis,MySQL等等,會進一步加深資料庫的理解以及其有可能出現的漏洞。希望題主能夠成功~


《SQL必知必會》

http://book.douban.com/subject/24250054/


以前寫的回答很隨便,重新推薦一下

入門:sql必知必會

------------------分割線

SQL語句教程

SQL語句教程(01) SELECT...........................................................................................................2

SQL語句教程(02) DISTINCT........................................................................................................2

SQL語句教程(03) WHERE............................................................................................................2

SQL語句教程(04) AND OR...........................................................................................................3

SQL語句教程(05) IN......................................................................................................................3

SQL語句教程(06) BETWEEN.......................................................................................................4

SQL語句教程(07) LIKE.................................................................................................................4

SQL語句教程(08) ORDER BY......................................................................................................5

SQL語句教程(09) 函數..................................................................................................................5

SQL語句教程(10) COUNT............................................................................................................6

SQL語句教程(11) Group By..........................................................................................................6

SQL語句教程(12) HAVING...........................................................................................................7

SQL語句教程(13) ALIAS...............................................................................................................7

SQL語句教程(14) 連接..................................................................................................................8

SQL語句教程(15) 外部連接..........................................................................................................9

SQL語句教程(16) Subquery..........................................................................................................9

SQL語句教程(17) UNION............................................................................................................10

SQL語句教程(18) UNION ALL................................................................................................... 11

SQL語句教程(19) INTERSECT.................................................................................................. 11

SQL語句教程(20) MINUS............................................................................................................12

SQL語句教程(21) Concatenate....................................................................................................12

SQL語句教程(22) Substring........................................................................................................13

SQL語句教程(23) TRIM..............................................................................................................14

SQL語句教程(24) Create Table...................................................................................................14

SQL語句教程(25) Create View....................................................................................................15

SQL語句教程(26) Create Index...................................................................................................16

SQL語句教程(27) Alter Table......................................................................................................16

SQL語句教程(28) 主鍵................................................................................................................18

SQL語句教程(29) 外來鍵............................................................................................................18

SQL語句教程(30) Drop Table......................................................................................................19

SQL語句教程(31) Truncate Table...............................................................................................20

SQL語句教程(32) Insert Into.......................................................................................................20

SQL語句教程(33) Update............................................................................................................20

SQL語句教程(34) Delete..............................................................................................................21

SQL語句教程(01) SELECT

是用來做什麼的呢?一個最常用的方式是將資料從資料庫中的表格內選出。從這一句回答中,我們馬上可

以看到兩個關鍵字: 從(FROM) 資料庫中的表格內選出(SELECT)。(表格是一個資料庫內的結構,它的

目的是儲存資料。在表格處理這一部分中,我們會提到如何使用SQL 來設定表格。) 我們由這裡可以看

到最基本的SQL 架構:

SELECT "欄位名" FROM "表格名"

我們用以下的例子來看看實際上是怎麼用的。假設我們有以下這個表格:

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Diego $250 jan-07-1999

Los Angeles $300 jan-08-1999

Boston $700 jan-08-1999

若要選出所有的店名(store_Name),我們就打入:

SELECT store_name FROM Store_Information

結果:

store_name

Los Angeles

San Diego

Los Angeles

Boston

我們一次可以讀取好幾個欄位,也可以同時由好幾個表格中選資料。

SQL語句教程(02) DISTINCT

SELECT 指令讓我們能夠讀取表格中一個或數個欄位的所有資料。這將把所有的資料都抓出,無論資料值

有無重複。在資料處理中,我們會經常碰到需要找出表格內的不同資料值的情況。換句話說,我們需要知

道這個表格/欄位內有哪些不同的值,而每個值出現的次數並不重要。這要如何達成呢?在SQL 中,這是

很容易做到的。我們只要在SELECT 後加上一個 DISTINCT 就可以了。DISTINCT 的語法如下:

SELECT DISTINCT "欄位名" FROM "表格名"

舉例來說,若要在以下的表格,Store_Information,找出所有不同的店名時,

Store_Information表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Diego $250 jan-07-1999

Los Angeles $300 jan-08-1999

Boston $700 jan-08-1999

我們就打入

SELECT DISTINCT store_name FROM Store_Information

結果:

store_name

Los Angeles

San Diego

Boston

SQL語句教程(03) WHERE

我們並不一定每一次都要將表格內的資料都完全抓出。在許多時候,我們會需要選擇性地抓資料。就我們

的例子來說,我們可能只要抓出營業額超過$1,000 的資料。要做到這一點,我們就需要用到 WHERE 這

個指令。這個指令的語法如下:

SELECT "欄位名" FROM "表格名" WHERE "條件"

若我們要由以下的表格抓出營業額超過$1,000 的資料

Store_Information表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Diego $250 jan-07-1999

Los Angeles $300 jan-08-1999

Boston $700 jan-08-1999

我們就打入

SELECT store_name FROM Store_Information WHERE Sales &> 1000

結果:

store_name

Los Angeles

SQL語句教程(04) AND OR

在上一頁中,我們看到WHERE 指令可以被用來由表格中 有條件地選取資料。 這個條件可能是簡單的

(像上一頁的例子),也可能是複雜的。複雜條件是由二或多個簡單條件透過AND 或是OR 的連接而成。

一個SQL 語句中可以有無限多個簡單條件的存在。

複雜條件的語法如下:

SELECT "欄位名" FROM "表格名" WHERE "簡單條件" {[AND|OR] "簡單條件"}+

{}+ 代表{}之內的情況會發生一或多次。在這裡的意思就是AND 加簡單條件及OR加簡單條件的情況可

以發生一或多次。另外,我們可以用() 來代表條件的先後次序。

舉例來說,我們若要在Store_Information表格中選出所有Sales 高於$1,000 或是Sales 在$500 及

$275 之間的資料的話

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Diego $250 jan-07-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

我們就打入

SELECT store_name FROM Store_Information WHERE Sales &> 1000 OR (Sales &< 500 AND Sales &> 275)

結果:

store_name

Los Angeles

San Francisco

SQL語句教程(05) IN

在SQL 中,在兩個情況下會用到 IN 這個指令;這一頁將介紹其中之一━━與WHERE 有關的那一個情

況。在這個用法下,我們事先已知道至少一個我們需要的值,而我們將這些知道的值都放入 IN 這個子句。

IN 指令的語法為下:

SELECT "欄位名" FROM "表格名" WHERE "欄位名" IN ("值一", "值二", ...)

在括弧內可以有一或多個值,而不同值之間由逗點分開。值可以是數目或是文字。若在括弧內只有一個值,

那這個子句就等於

WHERE "欄位名" = "值一"

舉例來說,若我們要在Store_Information 表格中找出所有含蓋Los Angeles 或San Diego 的資料

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Diego $250 jan-07-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

我們就打入

SELECT * FROM Store_Information WHERE store_name IN ("Los Angeles", "San Diego")

結果:

store_name sales date

Los Angeles $1500 jan-05-1999

San Diego $250 jan-07-1999

SQL語句教程(06) BETWEEN

IN 這個指令可以讓我們依照一或數個不連續(discrete) 的值的限制之內抓出資料庫中的值,而

BETWEEN 則是讓我們可以運用一個範圍(range) 內抓出資料庫中的值。BETWEEN這個子句的語法如下:

SELECT "欄位名" FROM " 表格名" WHERE "欄位名" BETWEEN "值一" AND "值二"

這將選出欄位值包含在值一及值二之間的每一筆資料。

舉例來說,若我們要由Store_Information 表格中找出所有介於January 6, 1999 及January 10, 1999 中

的資料

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Diego $250 jan-07-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

我們就打入

SELECT * FROM Store_Information WHERE Date BETWEEN "Jan-06-1999" AND "Jan-10-1999"

請讀者注意:在不同的資料庫中,日期的儲存法可能會有所不同。在這裡我們選擇了其中一種儲存法。

結果:

store_name sales date

San Diego $250 jan-07-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

SQL語句教程(07) LIKE

LIKE 是另一個在 WHERE 子句中會用到的指令。基本上,LIKE 能讓我們依據一個套式(pattern) 來找出

我們要的資料。相對來說,在運用 IN 的時候,我們完全地知道我們需要的條件;在運用 BETWEEN 的時

候,我們則是列出一個範圍。LIKE 的語法如下:

SELECT "欄位名" FROM "表格名" WHERE "欄位名" LIKE {套式}

{套式} 經常包括野卡(wildcard). 以下是幾個例子:

? "A_Z": 所有以"A" 起頭,另一個任何值的字原,且以"Z" 為結尾的字串。"ABZ" 和"A2Z" 都符合

這一個模式,而"AKKZ" 並不符合(因為在A 和Z 之間有兩個字原,而不是一個字原)。

? "ABC%": 所有以"ABC" 起頭的字串。舉例來說,"ABCD" 和"ABCABC" 都符合這個套式。

? "%XYZ": 所有以"XYZ" 結尾的字串。舉例來說,"WXYZ" 和"ZZXYZ" 都符合這個套式。

? "%AN%": 所有含有"AN" 這個套式的字串。舉例來說,"LOS ANGELES" 和"SAN FRANCISCO" 都

符合這個套式。

我們將以上最後一個例子用在我們的Store_Information 表格上:

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Diego $250 jan-07-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

我們就打入

SELECT * FROM Store_Information WHERE store_name LIKE "%AN%"

結果:

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

San Diego $250 jan-07-1999

SQL語句教程(08) ORDER BY

到目前為止,我們已學到如何藉由 SELECT 及 WHERE這兩個指令將資料由表格中抓出。不過我們尚未提

到這些資料要如何排列。這其實是一個很重要的問題。事實上,我們經常需要能夠將抓出的資料做一個有

系統的顯示。這可能是由小往大(ascending) 或是由大往小(descending)。在這種情況下,我們就可以運

用 ORDER BY這個指令來達到我們的目的。

ORDER BY 的語法如下:

SELECT "欄位名" FROM "表格名" [WHERE "條件"] ORDER BY "欄位名" [ASC, DESC]

[] 代表WHERE 是不一定需要的。不過,如果WHERE 子句存在的話,它是在ORDER BY 子句之前。 ASC

代表結果會以由小往大的順序列出,而 DESC 代表結果會以由大往小的順序列出。如果兩者皆沒有被寫出

的話,那我們就會用ASC。

我們可以照好幾個不同的欄位來排順序。在這個情況下,ORDER BY 子句的語法如下(假設有兩個欄位):

ORDER BY "欄位一" [ASC, DESC], "欄位二" [ASC, DESC]

若我們對這兩個欄位都選擇由小往大的話,那這個子句就會造成結果是依據"欄位一" 由小往大排。若有

好幾筆資料"欄位一" 的值相等,那這幾筆資料就依據"欄位二" 由小往大排。

舉例來說,若我們要依照Sales 欄位的由大往小列出Store_Information 表格中的資料

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Diego $250 jan-07-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

我們就打入

SELECT store_name, Sales, Date FROM Store_Information ORDER BY Sales DESC

結果:

store_name sales date

Los Angeles $1500 jan-05-1999

Boston $700 jan-08-1999

San Francisco $300 jan-08-1999

San Diego $250 jan-07-1999

在以上的例子中,我們用欄位名來指定排列順序的依據。除了欄位名外,我們也可以用欄位的順序(依據

SQL 句中的順序)。在SELECT 後的第一個欄位為1,第二個欄位為2,以此類推。在上面這個例子中,

我們打以下這一句SQL 可以達到完全一樣的效果:

SELECT store_name, Sales, Date FROM Store_Information ORDER BY 2 DESC

SQL語句教程(09) 函數

既然資料庫中有許多資料都是已數字的型態存在,一個很重要的用途就是要能夠對這些數字做一些運算,

例如將它們總合起來,或是找出它們的平均值。SQL 有提供一些這一類的函數。它們是:

AVG (平均)

COUNT (計數)

MAX (最大值)

MIN (最小值)

SUM (總合)

運用函數的語法是:

SELECT "函數名"("欄位名") FROM "表格名"

舉例來說,若我們要由我們的示範表格中求出Sales 欄位的總合

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

我們就打入

SELECT SUM(Sales) FROM Store_Information

結果:

SUM(Sales)

$2750

$2750 代表所有Sales 欄位的總合: $1500 + $250 + $300 + $700.

除了函數的運用外,SQL 也可以做簡單的數學運算,例如加(+)和減(-)。對於文字類的資料,SQL 也有好

幾個文字處理方面的函數,例如文字相連(concatenation),文字修整(trim),以及子字串(substring)。

不同的資料庫對這些函數有不同的語法,所以最好是參考您所用資料庫的信息,來確定在那個資料庫中,

這些函數是如何被運用的。

SQL語句教程(10) COUNT

在上一頁有提到,COUNT 是函數之一。由於它的使用廣泛,我們在這裡特別提出來討論。基本上,COUNT

讓我們能夠數出在表格中有多少筆資料被選出來。它的語法是:

SELECT COUNT("欄位名") FROM "表格名"

舉例來說,若我們要找出我們的示範表格中有幾筆store_name 欄不是空白的資料時

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

我們就打入

SELECT COUNT(store_name) FROM Store_Information WHERE store_name is not NULL

結果:

Count(store_name)

4

"is not NULL" 是"這個欄位不是空白" 的意思。

COUNT 和DISTINCT 經常被合起來使用,目的是找出表格中有多少筆不同的資料(至於這些資料實際上

是什麼並不重要)。舉例來說,如果我們要找出我們的表格中有多少個不同的store_name,我們就打入,

SELECT COUNT(DISTINCT store_name) FROM Store_Information

結果:

Count(DISTINCT store_name)

3

SQL語句教程(11) Group By

我們現在回到函數上。記得我們用 SUM 這個指令來算出所有的Sales (營業額)吧!如果我們的需求變成

是要算出每一間店(store_name) 的營業額(sales),那怎麼辦呢?在這個情況下,我們要做到兩件事:第

一,我們對於store_name 及Sales 這兩個欄位都要選出。第二,我們需要確認所有的sales 都要依照

各個store_name 來分開算。這個語法為:

SELECT "欄位1", SUM("欄位2") FROM "表格名" GROUP BY "欄位1"

在我們的示範上

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

我們就打入

SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name

結果:

store_name SUM(Sales)

Los Angeles $1800

San Diego $250

Boston $700

當我們選不只一個欄位,且其中至少一個欄位有包含函數的運用時,我們就需要用到GROUP BY 這個指

令。在這個情況下,我們需要確定我們有GROUP BY 所有其他的欄位。換句話說,除了有包括函數的欄

位外,我們都需要將其放在GROUP BY 的子句中。

SQL語句教程(12) HAVING

那我們如何對函數產生的值來設定條件呢?舉例來說,我們可能只需要知道哪些店的營業額有超過

$1,500。在這個情況下,我們不能使用 WHERE 的指令。那要怎麼辦呢?很幸運地,SQL 有提供一個

HAVING 的指令,而我們就可以用這個指令來達到這個目標。 HAVING 子句通常是在一個SQL 句子的最

後。一個含有HAVING 子句的SQL 並不一定要包含 GROUP BY 子句。HAVING 的語法如下:

SELECT "欄位1", SUM("欄位2") FROM "表格名" GROUP BY "欄位1" HAVING (函數條件)

請讀者注意:GROUP BY 子句並不是一定需要的。

在我們Store_Information 表格這個例子中

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

我們打入

SELECT store_name, SUM(sales) FROM Store_Information GROUP BY store_name HAVING SUM(sales) &>

1500

結果:

store_name SUM(Sales)

Los Angeles $1800

SQL語句教程(13) ALIAS

接下來,我們討論 alias (別名) 在SQL 上的用處。最常用到的別名有兩種: 欄位別名及表格別名。

簡單地來說,欄位別名的目的是為了讓SQL 產生的結果易讀。在之前的例子中, 每當我們有營業額總合

時,欄位名都是SUM(sales)。雖然在這個情況下沒有什麼問題,可是如果這個欄位不是一個簡單的總合,

而是一個複雜的計算,那欄位名就沒有這麼易懂了。若我們用欄位別名的話,就可以確認結果中的欄位名

是簡單易懂的。

第二種別名是表格別名。要給一個表格取一個別名,只要在FROM 子句中的表格名後空一格,然後再列出

要用的表格別名就可以了。這在我們要用SQL 由數個不同的表格中獲取資料時是很方便的。這一點我們

在之後談到連接(join) 時會看到。

我們先來看一下欄位別名和表格別名的語法:

SELECT "表格別名"."欄位1" "欄位別名" FROM "表格名" "表格別名"

基本上,這兩種別名都是放在它們要替代的物件後面,而它們中間由一個空白分開。我們繼續使用

Store_Information這個表格來做例子:

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

我們用跟 SQL GROUP BY 那一頁一樣的例子。這裡的不同處是我們加上了欄位別名以及表格別名:

SELECT A1.store_name Store, SUM(A1.Sales) "TotalSales" FROM Store_Information A1 GROUP BY

A1.store_name

結果:

Store Total Sales

Los Angeles $1800

San Diego $250

Boston $700

在結果中,資料本身沒有不同。不同的是欄位的標題。這是運用欄位別名的結果。在第二個欄位上,原本

我們的標題是"Sum(Sales)",而現在我們有一個很清楚的"Total Sales"。很明顯地,"Total Sales" 能夠比

"Sum(Sales)" 更精確地闡述這個欄位的含意。用表格別名的好處在這裡並沒有顯現出來,不過這在下一頁

(SQL Join) 就會很清楚了。

SQL語句教程(14) 連接

現在我們介紹連接(join)的概念。要了解連接,我們需要用到許多我們之前已介紹過的指令。我們先假設我

們有以下的兩個表格

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

Geography 表格

region_name store_name

East Boston

East New York

West Los Angeles

West San Diego

而我們要知道每一區(region_name) 的營業額(sales)。Geography 這個表格告訴我們每一區有哪些店,

而Store_Information 告訴我們每一個店的營業額。若我們要知道每一區的營業額,我們需要將這兩個不

同表格中的資料串聯起來。當我們仔細了解這兩個表格後,我們會發現它們可經由一個相同的欄位,

store_name,連接起來。我們先將SQL 句列出, 之後再討論每一個子句的意義:

SELECT A1.region_name REGION, SUM(A2.Sales) SALES FROM Geography A1, Store_Information A2

WHERE A1.store_name = A2.store_name GROUP BY A1.region_name

結果:

REGION SALES

East $700

West $2050

在第一行中,我們告訴SQL 去選出兩個欄位:第一個欄位是Geography 表格中的Region_name 欄位

(我們取了一個別名叫做REGION);第二個欄位是Store_Information 表格中的sales 欄位(別名為

SALES)。請注意在這裡我們有用到表格別名:Geography 表格的別名是A1,Store_Information 表格的別

名是A2。若我們沒有用表格別名的話, 第一行就會變成

SELECT Geography.region_name REGION, SUM(Store_Information.Sales) SALES

很明顯地,這就複雜多了。在這裡我們可以看到表格別名的功用:它能讓SQL 句容易被了解,尤其是這

個SQL 句含蓋好幾個不同的表格時。

接下來我們看第三行,就是WHERE 子句。 這是我們闡述連接條件的地方。在這裡,我們要確認Geography

表格中Store_name 欄位的值與Store_Information 表格中store_name 欄位的值是相等的。這個

WHERE 子句是一個連接的靈魂人物,因為它的角色是確定兩個表格之間的連接是正確的。如果WHERE

子句是錯誤的,我們就極可能得到一個笛卡兒連接(Cartesian join)。笛卡兒連接會造成我們得到所有兩個

表格每兩行之間所有可能的組合。在這個例子中,笛卡兒連接會讓我們得到4 x 4 = 16 行的結果。

SQL語句教程(15) 外部連接

之前我們看到的左連接(left join),又稱內部連接(inner join)。在這個情況下,要兩個表格內都有同樣的

值,那一筆資料才會被選出。那如果我們想要列出一個表格中每一筆的資料,無論它的值在另一個表格中

有沒有出現,那該怎麼辦呢?在這個時候,我們就需要用到 SQL OUTER JOIN (外部連接) 的指令。

外部連接的語法是依資料庫的不同而有所不同的。舉例來說,在Oracle 上,我們會在WHERE 子句中要

選出所有資料的那個表格之後加上一個"(+)" 來代表說這個表格中的所有資料我們都要。

假設我們有以下的兩個表格:

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

Geography 表格

region_name store_name

East Boston

East New York

West Los Angeles

West San Diego

我們需要知道每一間店的營業額。如果我們用一個普通的連接,我們將會漏失掉"New York"這個店,因為

它並不存在於Store_Information 這個表格。所以,在這個情況下,我們需要用外部連接來串聯這兩個表

格:

SELECT A1.store_name, SUM(A2.Sales) SALES FROM Georgraphy A1, Store_Information A2 WHERE

A1.store_name = A2.store_name (+) GROUP BY A1.store_name

我們在這裡是使用了Oracle 的外部連接語法。

結果:

store_name SALES

Boston $700

New York

Los Angeles $1800

San Diego $250

請注意: 當第二個表格沒有相對的資料時,SQL 會傳回NULL 值。在這一個例子中,"New York" 並不

存在於Store_Information 表格,所以它的"SALES" 欄位是NULL。

SQL語句教程(16) Subquery

我們可以在一個SQL 語句中放入另一個SQL 語句。當我們在WHERE 子句或WHERE 子句或HAVING

子句中插入另一個SQL 語句時,我們就有一個 subquery 的架構。Subquery 的作用是什麼呢?第一,

它可以被用來連接表格。另外,有的時候subquery 是唯一能夠連接兩個表格的方式。

Subquery 的語法如下:

SELECT "欄位1" FROM "表格" WHERE "欄位2" [比較運算素] (SELECT "欄位1" FROM "表格" WHERE [條

件])

[比較運算素] 可以是相等的運算素,例如=, &>, &<, &>=, &<=. 這也可以是一個對文字的運算素,例如

"LIKE."

我們就用剛剛在闡述SQL 連接時用過的例子:

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

Geography 表格

region_name store_name

East Boston

East New York

West Los Angeles

West San Diego

我們要運用subquery 來找出所有在西部的店的營業額。我們可以用下面的SQL 來達到我們的目的:

SELECT SUM(Sales) FROM Store_Information WHERE Store_name IN (SELECT store_name FROM

Geography WHERE region_name = "West")

結果:

SUM(Sales)

2050

在這個例子中,我們並沒有直接將兩個表格連接起來,然後由此直接算出每一間西區店面的營業額。我們

做的是先找出哪些店是在西區的,然後再算出這些店的營業額總共是多少。

SQL語句教程(17) UNION

UNION 指令的目的是將兩個SQL 語句的結果合併起來。從這個角度來看,UNION 跟JOIN 有些許類似,

因為這兩個指令都可以由多個表格中擷取資料。UNION 的一個限制是兩個SQL 語句所產生的欄位需要

是同樣的資料種類。另外,當我們用UNION這個指令時,我們只會看到不同的資料值(類似SELECT

DISTINCT)。

UNION 的語法如下:

[SQL 語句1] UNION [SQL 語句2]

假設我們有以下的兩個表格

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

Internet Sales 表格

Date Sales

Jan-07-1999 $250

Jan-10-1999 $535

Jan-11-1999 $320

Jan-12-1999 $750

而我們要找出來所有有營業額(sales) 的日子。要達到這個目的,我們用以下的SQL 語句:

SELECT Date FROM Store_Information

UNION

SELECT Date FROM Internet_Sales

結果:

Date

Jan-05-1999

Jan-07-1999

Jan-08-1999

Jan-10-1999

Jan-11-1999

Jan-12-1999

有一點值得注意的是,如果我們在任何一個SQL 語句(或是兩句都一起) 用"SELECT DISTINCT Date"

的話,那我們會得到完全一樣的結果。

SQL語句教程(18) UNION ALL

UNION ALL 這個指令的目的也是要將兩個SQL 語句的結果合併在一起。 UNION ALL 和 UNION 不同之

處在於 UNION ALL 會將每一筆符合條件的資料都列出來,無論資料值有無重複。

UNION ALL 的語法如下:

[SQL 語句1] UNION ALL [SQL 語句2]

我們用和上一頁同樣的例子來顯示出UNION ALL 和UNION 的不同。同樣假設我們有以下兩個表格

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

Internet Sales 表格

Date Sales

Jan-07-1999 $250

Jan-10-1999 $535

Jan-11-1999 $320

Jan-12-1999 $750

而我們要找出有店面營業額以及網路營業額的日子。要達到這個目的,我們用以下的SQL 語句:

SELECT Date FROM Store_Information

UNION ALL

SELECT Date FROM Internet_Sales

結果:

Date

Jan-05-1999

Jan-07-1999

Jan-08-1999

Jan-08-1999

Jan-07-1999

Jan-10-1999

Jan-11-1999

Jan-12-1999

SQL語句教程(19) INTERSECT

和UNION 指令類似,INTERSECT 也是對兩個SQL 語句所產生的結果做處理的。不同的地方是,UNION

基本上是一個OR (如果這個值存在於第一句或是第二句,它就會被選出),而INTERSECT 則比較像AND

( 這個值要存在於第一句和第二句才會被選出)。 UNION 是聯集,而INTERSECT 是交集。

INTERSECT 的語法如下:

[SQL語句1] INTERSECT [SQL語句2]

假設我們有以下的兩個表格

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

Internet Sales 表格

Date Sales

Jan-07-1999 $250

Jan-10-1999 $535

Jan-11-1999 $320

Jan-12-1999 $750

而我們要找出哪幾天有店面交易和網路交易。要達到這個目的,我們用以下的SQL 語句:

SELECT Date FROM Store_Information

INTERSECT

SELECT Date FROM Internet_Sales

結果:

Date

Jan-07-1999

請注意,在INTERSECT 指令下,不同的值只會被列出一次。

SQL語句教程(20) MINUS

MINUS 指令是運用在兩個SQL 語句上。它先找出第一個SQL 語句所產生的結果,然後看這些結果有沒

有在第二個SQL 語句的結果中。如果有的話,那這一筆資料就被去除,而不會在最後的結果中出現。如

果第二個SQL 語句所產生的結果並沒有存在於第一個SQL 語句所產生的結果內,那這筆資料就被拋棄。

MINUS 的語法如下:

[SQL 語句1] MINUS [SQL 語句2]

我們繼續使用一樣的例子:

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

Internet Sales 表格

Date Sales

Jan-07-1999 $250

Jan-10-1999 $535

Jan-11-1999 $320

Jan-12-1999 $750

而我們要知道有哪幾天是有店面營業額而沒有網路營業額的。要達到這個目的,我們用以下的SQL 語句:

SELECT Date FROM Store_Information

MINUS

SELECT Date FROM Internet_Sales

結果:

Date

Jan-05-1999

Jan-08-1999

"Jan-05-1999", "Jan-07-1999", and "Jan-08-1999" 是"SELECT Date FROM Store_Information" 所產生的

結果。在這裡面,"Jan-07-1999" 是存在於"SELECT Date FROM Internet_Sales" 所產生的結果中。因此

"Jan-07-1999" 並不在最後的結果中。

請注意,在MINUS 指令下,不同的值只會被列出一次。

SQL語句教程(21) Concatenate

有的時候,我們有需要將由不同欄位獲得的資料串連在一起。每一種資料庫都有提供方法來達到這個目的:

MySQL: CONCAT()

Oracle: CONCAT(), ||

SQL Server: +

CONCAT() 的語法如下:

CONCAT(字串1, 字串2, 字串3, ...): 將字串1、字串2、字串3,等字串連在一起。請注意,Oracle的

CONCAT()只允許兩個參數;換言之,一次只能將兩個字串串連起來。不過,在Oracle中,我們可以用"||"

來一次串連多個字串。

來看幾個例子。假設我們有以下的表格:

Geography 表格

region_name store_name

East Boston

East New York

West Los Angeles

West San Diego

例子1:

MySQL/Oracle:

SELECT CONCAT(region_name,store_name) FROM Geography WHERE store_name = "Boston";

結果:

"EastBoston"

例子2:

Oracle:

SELECT region_name || " " || store_name FROMGeography WHERE store_name = "Boston";

結果:

"East Boston"

例子3:

SQL Server:

SELECT region_name + " " + store_name FROM Geography WHERE store_name = "Boston";

結果:

"East Boston"

SQL語句教程(22) Substring

SQL 中的 substring 函數是用來抓出一個欄位資料中的其中一部分。這個函數的名稱在不同的資料庫中不

完全一樣:

MySQL: SUBSTR(), SUBSTRING()

Oracle: SUBSTR()

SQL Server: SUBSTRING()

最常用到的方式如下(在這裡我們用SUBSTR()為例):

SUBSTR(str,pos): 由中,選出所有從第位置開始的字元。請注意,這個語法不適用於SQL Server上。

SUBSTR(str,pos,len): 由中的第位置開始,選出接下去的個字元。

假設我們有以下的表格:

Geography 表格

region_name store_name

East Boston

East New York

West Los Angeles

West San Diego

例1:

SELECT SUBSTR(store_name, 3) FROM Geography WHERE store_name = "Los Angeles";

結果:

"s Angeles"

例2:

SELECT SUBSTR(store_name,2,4) FROM Geography WHERE store_name = "San Diego";

結果:

"an D"

SQL語句教程(23) TRIM

SQL 中的 TRIM 函數是用來移除掉一個字串中的字頭或字尾。最常見的用途是移除字首或字尾的空白。這

個函數在不同的資料庫中有不同的名稱:

MySQL: TRIM(), RTRIM(), LTRIM()

Oracle: RTRIM(), LTRIM()

SQL Server: RTRIM(), LTRIM()

各種trim 函數的語法如下:

TRIM([[位置] [要移除的字串] FROM ] 字串): [位置] 的可能值為LEADING (起頭), TRAILING (結尾), or

BOTH (起頭及結尾)。 這個函數將把[要移除的字串] 從字串的起頭、結尾,或是起頭及結尾移除。如果

我們沒有列出[要移除的字串] 是什麼的話,那空白就會被移除。

LTRIM(字串): 將所有字串起頭的空白移除。

RTRIM(字串): 將所有字串結尾的空白移除。

例1:

SELECT TRIM(" Sample ");

結果:

"Sample"

例2:

SELECT LTRIM(" Sample ");

結果:

"Sample "

例3:

SELECT RTRIM(" Sample ");

結果:

" Sample"

SQL語句教程(24) Create Table

表格是資料庫中儲存資料的基本架構。在絕大部份的情況下,資料庫廠商不可能知道您需要如何儲存您的

資料,所以通常您會需要自己在資料庫中建立表格。雖然許多資料庫工具可以讓您在不需用到SQL 的情

況下建立表格,不過由於表格是一個最基本的架構,我們決定包括 CREATE TABLE 的語法在這個網站中。

在我們跳入 CREATE TABLE 的語法之前,我們最好先對表格這個東西有些多一點的了解。表格被分為欄位

(column) 及列位(row)。每一列代表一筆資料,而每一欄代表一筆資料的一部份。舉例來說,如果我們有

一個記載顧客資料的表格,那欄位就有可能包括姓、名、地址、城市、國家、生日...等等。當我們對錶

格下定義時,我們需要註明欄位的標題,以及那個欄位的資料種類。

那,資料種類是什麼呢?資料可能是以許多不同的形式存在的。它可能是一個整數(例如1),、一個實數(例

如0.55)、一個字串(例如"sql")、一個日期/時間(例如"2000-JAN-25 03:22:22")、或甚至是以二進法

(binary) 的狀態存在。當我們在對一個表格下定義時,我們需要對每一個欄位的資料種類下定義。(例如"

姓" 這個欄位的資料種類是char(50)━━代表這是一個50 個字元的字串)。我們需要注意的一點是不同的

資料庫有不同的資料種類,所以在對表格做出定義之前最好先參考一下資料庫本身的說明。

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)

SQL語句教程(25) Create View

視觀表(Views) 可以被當作是虛擬表格。它跟表格的不同是,表格中有實際儲存資料,而視觀表是建立在

表格之上的一個架構,它本身並不實際儲存資料。

建立一個視觀表的語法如下:

CREATE VIEW "VIEW_NAME" AS "SQL 語句"

"SQL 語句" 可以是任何一個我們在這個教材中有提到的SQL。

來看一個例子。假設我們有以下的表格:

TABLE Customer

(First_Name char(50),

Last_Name char(50),

Address char(50),

City char(50),

Country char(25),

Birth_Date date)

若要在這個表格上建立一個包括First_Name,Last_Name, 和Country 這三個欄位的視觀表,我們就

打入,

CREATE VIEW V_Customer

AS SELECT First_Name, Last_Name, Country

FROM Customer

現在,我們就有一個叫做V_Customer 的視觀表:

View V_Customer

(First_Name char(50),

Last_Name char(50),

Country char(25))

我們也可以用視觀表來連接兩個表格。在這個情況下,使用者就可以直接由一個視觀表中找出她要的資訊,

而不需要由兩個不同的表格中去做一次連接的動作。假設有以下的兩個表格:

Store_Information 表格

store_name sales date

Los Angeles $1500 jan-05-1999

San Francisco $300 jan-08-1999

Boston $700 jan-08-1999

Geography 表格

region_name store_name

East Boston

East New York

West Los Angeles

West San Diego

我們就可以用以下的指令來建一個包括每個地區(region) 銷售額(sales) 的視觀表:

CREATE VIEW V_REGION_SALES

AS SELECT A1.region_name REGION, SUM(A2.Sales) SALES

FROM Geography A1, Store_Information A2

WHERE A1.store_name = A2.store_name

GROUP BY A1.region_name

這就給我們有一個名為V_REGION_SALES 的視觀表。這個視觀表包含不同地區的銷售哦。如果我們要從

這個視觀表中獲取資料,我們就打入,

SELECT * FROM V_REGION_SALES

結果:

REGION SALES

East $700

West $2050

SQL語句教程(26) Create Index

索引(Index) 可以幫助我們從表格中快速地找到需要的資料。舉例來說,假設我們要在一本園藝書中找如

何種植青椒的訊息。若這本書沒有索引的話,那我們是必須要從頭開始讀,直到我們找到有關種直青椒的

地方為止。若這本書有索引的話,我們就可以先去索引找出種植青椒的資訊是在哪一頁,然後直接到那一

頁去閱讀。很明顯地,運用索引是一種有效且省時的方式。

從資料庫表格中尋找資料也是同樣的原理。如果一個表格沒有索引的話,資料庫系統就需要將整個表

格的資料讀出(這個過程叫做"table scan")。若有適當的索引存在,資料庫系統就可以先由這個索引去找出

需要的資料是在表格的什麼地方,然後直接去那些地方抓資料。這樣子速度就快多了。

因此,在表格上建立索引是一件有利於系統效率的事。一個索引可以涵蓋一或多個欄位。建立索引的語法

如下:

CREATE INDEX "INDEX_NAME" ON "TABLE_NAME" (COLUMN_NAME)

現在假設我們有以下這個表格,

TABLE Customer

(First_Name char(50),

Last_Name char(50),

Address char(50),

City char(50),

Country char(25),

Birth_Date date)

若我們要在Last_Name 這個欄位上建一個索引,我們就打入以下的指令,

CREATE INDEX IDX_CUSTOMER_LAST_NAME on CUSTOMER (Last_Name)

若我們要在Last_Name 這個欄位上建一個索引,我們就打入以下的指令,

CREATE INDEX IDX_CUSTOMER_LOCATION

on CUSTOMER (City, Country)

索引的命名並沒有一個固定的方式。通常會用的方式是在名稱前加一個字首,例如"IDX_" ,來避免與資

料庫中的其他物件混淆。另外,在索引名之內包括表格名及欄位名也是一個好的方式。

請讀者注意,每個資料庫會有它本身的CREATE INDEX 語法,而不同資料庫的語法會有不同。因此,在下

指令前,請先由資料庫使用手冊中確認正確的語法。

SQL語句教程(27) Alter Table

在表格被建立在資料庫中後,我們常常會發現,這個表格的結構需要有所改變。常見的改變如下:

? 加一個欄位

? 刪去一個欄位

? 改變欄位名稱

? 改變欄位的資料種類

以上列出的改變並不是所有可能的改變。ALTER TABLE 也可以被用來作其他的改變,例如改變主鍵定義。

ALTER TABLE 的語法如下:

ALTER TABLE "table_name"

[改變方式]

[改變方式] 的詳細寫法會依我們想要達到的目標而有所不同。再以上列出的改變中,[改變方式] 如下:

? 加一個欄位: ADD "欄位1" "欄位1 資料種類"

? 刪去一個欄位: DROP "欄位1"

? 改變欄位名稱: CHANGE "原本欄位名" "新欄位名" "新欄位名資料種類"

? 改變欄位的資料種類: MODIFY "欄位1" "新資料種類"

以下我們用在CREATE TABLE 一頁建出的customer 表格來當作例子:

customer 表格

欄位名稱 資料種類

First_Name char(50)

Last_Name char(50)

Address char(50)

City char(50)

Country char(25)

Birth_Date date

第一,我們要加入一個叫做"gender" 的欄位。這可以用以下的指令達成:

ALTER table customer add Gender char(1)

這個指令執行後的表格架構是:

customer 表格

欄位名稱 資料種類

First_Name char(50)

Last_Name char(50)

Address char(50)

City char(50)

Country char(25)

Birth_Date date

Gender char(1)

接下來,我們要把"Address" 欄位改名為"Addr"。這可以用以下的指令達成:

ALTER table customer change Address Addr char(50)

這個指令執行後的表格架構是:

customer 表格

欄位名稱 資料種類

First_Name char(50)

Last_Name char(50)

Addr char(50)

City char(50)

Country char(25)

Birth_Date date

Gender char(1)

再來,我們要將"Addr" 欄位的資料種類改為char(30)。這可以用以下的指令達成:

ALTER table customer modify Addr char(30)

這個指令執行後的表格架構是:

customer 表格

欄位名稱 資料種類

First_Name char(50)

Last_Name char(50)

Addr char(50)

City char(50)

Country char(25)

Birth_Date date

Gender char(1)

最後,我們要刪除"Gender" 欄位。這可以用以下的指令達成:

ALTER table customer drop Gender

這個指令執行後的表格架構是:

customer 表格

欄位名稱 資料種類

First_Name char(50)

Last_Name char(50)

Addr char(30)

City char(50)

Country char(25)

Birth_Date date

SQL語句教程(28) 主鍵

主鍵(Primary Key) 中的每一筆資料都是表格中的唯一值。換言之,它是用來獨一無二地確認一個表格中

的每一行資料。主鍵可以是原本資料內的一個欄位,或是一個人造欄位(與原本資料沒有關係的欄位)。主

鍵可以包含一或多個欄位。當主鍵包含多個欄位時,稱為組合鍵(Composite Key)。

主鍵可以在建置新表格時設定(運用CREATE TABLE 語句),或是以改變現有的表格架構方式設定(運用

ALTER TABLE)。

以下舉幾個在建置新表格時設定主鍵的方式:

MySQL:

CREATE TABLE Customer

(SID integer,

Last_Name varchar(30),

First_Name varchar(30),

PRIMARY KEY (SID));

Oracle:

CREATE TABLE Customer

(SID integer PRIMARY KEY,

Last_Name varchar(30),

First_Name varchar(30));

SQL Server:

CREATE TABLE Customer

(SID integer PRIMARY KEY,

Last_Name varchar(30),

First_Name varchar(30));

以下則是以改變現有表格架構來設定主鍵的方式:

MySQL:

ALTER TABLE Customer ADD PRIMARY KEY (SID);

Oracle:

ALTER TABLE Customer ADD PRIMARY KEY (SID);

SQL Server:

ALTER TABLE Customer ADD PRIMARY KEY (SID);

請注意,在用ALTER TABLE語句來添加主鍵之前,我們需要確認被用來當做主鍵的欄位是設定為『NOT

NULL』;也就是說,那個欄位一定不能沒有資料。

SQL語句教程(29) 外來鍵

外來鍵是一個(或數個)指向另外一個表格主鍵的欄位。外來鍵的目的是確定資料的參考完整性(referential

integrity)。換言之,只有被准許的資料值才會被存入資料庫內。

舉例來說,假設我們有兩個表格:一個CUSTOMER 表格,裡面記錄了所有顧客的資料;另一個ORDERS

表格,裡面記錄了所有顧客訂購的資料。在這裡的一個限制,就是所有的訂購資料中的顧客,都一定是要

跟在CUSTOMER 表格中存在。在這裡,我們就會在ORDERS 表格中設定一個外來鍵,而這個外來鍵是

指向CUSTOMER 表格中的主鍵。這樣一來,我們就可以確定所有在ORDERS 表格中的顧客都存在

CUSTOMER 表格中。換句話說,ORDERS表格之中,不能有任何顧客是不存在於CUSTOMER 表格中的資

料。

這兩個表格的結構將會是如下:

CUSTOMER 表格

欄位名 性質

SID 主鍵

Last_Name

First_Name

ORDERS 表格

欄位名 性質

Order_ID 主鍵

Order_Date

Customer_SID 外來鍵

Amount

在以上的例子中,ORDERS 表格中的customer_SID 欄位是一個指向CUSTOMERS 表格中SID 欄位的

外來鍵。

以下列出幾個在建置ORDERS 表格時指定外來鍵的方式:

MySQL:

CREATE TABLE ORDERS

(Order_ID integer,

Order_Date date,

Customer_SID integer,

Amount double,

Primary Key (Order_ID),

Foreign Key (Customer_SID) references CUSTOMER(SID));

Oracle:

CREATE TABLE ORDERS

(Order_ID integer primary key,

Order_Date date,

Customer_SID integer references CUSTOMER(SID),

Amount double);

SQL Server:

CREATE TABLE ORDERS

(Order_ID integer primary key,

Order_Date datetime,

Customer_SID integer references CUSTOMER(SID),

Amount double);

以下的例子則是藉著改變表格架構來指定外來鍵。這裡假設ORDERS 表格已經被建置,而外來鍵尚未被

指定:

MySQL:

ALTER TABLE ORDERS

ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);

Oracle:

ALTER TABLE ORDERS

ADD (CONSTRAINT fk_orders1) FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);

SQL Server:

ALTER TABLE ORDERS

ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);

SQL語句教程(30) Drop Table

有時候我們會決定我們需要從資料庫中清除一個表格。事實上,如果我們不能這樣做的話,那將會是一個

很大的問題,因為資料庫管理師(Database Administrator -- DBA) 勢必無法對資料庫做有效率的管理。還

好,SQL 有提供一個DROP TABLE的語法來讓我們清除表格。 DROP TABLE 的語法是:

DROP TABLE "表格名"

我們如果要清除在SQL CREATE 中建立的顧客表格,我們就打入:

DROP TABLE customer.

SQL語句教程(31) Truncate Table

有時候我們會需要清除一個表格中的所有資料。要達到這個目的,一種方式是我們在SQL DROP 那一頁 看

到的DROP TABLE 指令。不過這樣整個表格就消失,而無法再被用了。另一種方式就是運用TRUNCATE

TABLE 的指令。在這個指令之下,表格中的資料會完全消失,可是表格本身會繼續存在。TRUNCATE TABLE

的語法為下:

TRUNCATE TABLE "表格名"

所以,我們如果要清除在SQL Create 那一頁建立的顧客表格之內的資料,我們就打入:

TRUNCATE TABLE customer.

SQL語句教程(32) Insert Into

到目前為止,我們學到了將如何把資料由表格中取出。但是這些資料是如何進入這些表格的呢?這就是這

一頁(INSERT INTO) 和下一頁(UPDATE) 要討論的。

基本上,我們有兩種作法可以將資料輸入表格中內。一種是一次輸入一筆,另一種是一次輸入好幾筆。我

們先來看一次輸入一筆的方式。

依照慣例,我們先介紹語法。一次輸入一筆資料的語法如下:

INSERT INTO "表格名" ("欄位1", "欄位2", ...) VALUES ("值1", "值2", ...)

假設我們有一個架構如下的表格:

Store_Information 表格

Column Name Data Type

store_name char(50)

Sales float

Date datetime

而我們要加以下的這一筆資料進去這個表格:在January 10, 1999,Los Angeles 店有$900 的營業額。

我們就打入以下的SQL 語句:

INSERT INTO Store_Information (store_name, Sales, Date) VALUES ("Los Angeles", 900, "Jan-10-1999")

第二種INSERT INTO 能夠讓我們一次輸入多筆的資料。跟上面剛的例子不同的是,現在我們要用SELECT

指令來指明要輸入表格的資料。如果您想說,這是不是說資料是從另一個表格來的,那您就想對了。一次

輸入多筆的資料的語法是:

INSERT INTO "表格1" ("欄位1", "欄位2", ...)

SELECT "欄位3", "欄位4", ...

FROM "表格2"

以上的語法是最基本的。這整句SQL 也可以含有WHERE、GROUP BY、 及HAVING 等子句,以及表

格連接及別名等等。

舉例來說,若我們想要將1998 年的營業額資料放入Store_Information 表格,而我們知道資料的來源是

可以由Sales_Information 表格取得的話,那我們就可以打入以下的SQL:

INSERT INTO Store_Information (store_name, Sales, Date)

SELECT store_name, Sales, Date

FROM Sales_Information

WHERE Year(Date) = 1998

在這裡,我用了SQL Server 中的函數來由日期中找出年。不同的資料庫會有不同的語法。舉個例來說,

在Oracle 上,您將會使用WHERE to_char(date,"yyyy")=1998。

SQL語句教程(33) Update

我們有時候可能會需要修改表格中的資料。在這個時候,我們就需要用到UPDATE 指令。這個指令的語法

是:

UPDATE "表格名"

SET "欄位1" = [新值]

WHERE {條件}

最容易了解這個語法的方式是透過一個例子。假設我們有以下的表格:

Store_Information 表格

store_name Sales Date

Los Angeles $1500 Jan-05-1999

San Diego $250 Jan-07-1999

Los Angeles $300 Jan-08-1999

Boston $700 Jan-08-1999

我們發現說Los Angeles 在01/08/1999 的營業額實際上是$500,而不是表格中所儲存的$300,因此

我們用以下的SQL 來修改那一筆資料:

UPDATE Store_Information

SET Sales = 500

WHERE store_name = "Los Angeles"

AND Date = "Jan-08-1999"

現在表格的內容變成:

Store_Information 表格

store_name Sales Date

Los Angeles $1500 Jan-05-1999

San Diego $250 Jan-07-1999

Los Angeles $500 Jan-08-1999

Boston $700 Jan-08-1999

在這個例子中,只有一筆資料符合WHERE 子句中的條件。如果有多筆資料符合條件的話,每一筆符合條

件的資料都會被修改的。

我們也可以同時修改好幾個欄位。這語法如下:

UPDATE "表格"

SET "欄位1" = [值1], "欄位2" = [值2]

WHERE {條件}

SQL語句教程(34) Delete

在某些情況下,我們會需要直接由資料庫中去除一些資料。這可以藉由DELETE FROM 指令來達成。它的

語法是:

DELETE FROM "表格名" WHERE {條件}

以下我們用個實例說明。假設我們有以下這個表格:

Store_Information 表格

store_name Sales Date

Los Angeles $1500 Jan-05-1999

San Diego $250 Jan-07-1999

Los Angeles $300 Jan-08-1999

Boston $700 Jan-08-1999

而我們需要將有關Los Angeles 的資料全部去除。在這裡我們可以用以下的SQL 來達到這個目的:

DELETE FROM Store_Information WHERE store_name = "Los Angeles"

現在表格的內容變成:

Store_Information 表格

store_name Sales Date

San Diego $250 Jan-07-1999

Boston $700 Jan-08-1999


整理了下周周的教程

有道雲筆記


只推薦一本 注重實效程序員《SQL反模式》,講解了各種SQL建模使用的模式與反模式,讀過之後受益匪淺呀。


推薦閱讀:

加了「一個想入侵我的人」的 QQ,會有什麼樣的風險(前提是不接受遠程,不接受他給我的任何文件)?
為什麼有人當黑客?
黑客哪來的時間和動力去挖系統軟體的漏洞?
如果你能實時查看世界上所有的資料庫,而不能讓其他人知道你有這項能力,你會怎麼用?

TAG:網路安全 | 計算機 | 黑客Hacker |