SQL查询语句教程(浅显易懂)

来源:互联网 发布:omnifocus是什么软件 编辑:程序博客网 时间:2024/05/16 07:19
【前言 1】
Select指令是SQL中唯一的一個Data Query Language,在SQL中佔有很高的地位,作用是查詢資料庫的資料,而不會更變資料庫的架構。它提供

了非常強大的查詢功能。這篇,筆者將會教大家基本的Select用法,以及關鍵字Where。這次的教學對於初學者比較難一些,大家留心看啊。如

果大家有看過我的文章「SQL簡介」,你該會對資料庫有一個明確的觀念:資料庫可以擁有一個或多個資料表,而資料表中又有一個或很多個欄

。把這些欄位填上資料便是一筆資料。


【範例資料表 】

現在先假設有一個資料表,呵,這是國際某大銀行使用的資料庫(來源不便透露),如下所示:

          資料表──「Bank」

ID(自動編號) Name(字串)  Money(數字)  AccountCreated(日期時間)
   1     小白      200     16-4-2003 23:12:25
   2     大文      195     17-4-2003 18:13:20
   3     小芳      200     15-2-2002 16:59:45
   4     小娟      350     18-8-1999 11:30:32


【範例語法 】

我們要對這個資料作出查詢。

1. 選取所有紀錄的所有欄位。
標準語法:Select * from 資料表名稱
實例語法:Select * from Bank
語法解說:「Select」表示要使用SQL的Select指令。
     「*」表示要所有欄位,注意並不是所有紀錄而且所有欄位。
     「from 資料表名稱」表示要從哪個資料表選取。由於沒有條件(下篇會說明)的限制,因此選回來的資料會是所有資料。
資料傳回:整個資料表的所有紀錄。

2. 只選取所有紀錄的Name和Money欄位。
標準語法:Select 欄位1,欄位2,…… from 資料表名稱
實例語法:Select Name,Money from Bank
語法解說:「欄位1,欄位2,……」表示選取什麼欄位。若是一個欄位則無須加上逗號,多個欄位則要用逗號分隔。
資料傳回:傳回所有紀錄,但只有Name及Money的資料。

3. 選取所有紀錄的所有欄位,並依ID由大至小排序。
標準語法:Select * from 資料表名稱 order by 欄位 DESC
實例語法:Select * from Bank order by id DESC
語法解說:「order by」表示依後面的兩個附加條件排序,是關係咚阕又弧?
     「欄位」表示要排序的欄位。
     「DESC」表示以降冪(大至小)排序。當然也可以由升冪(小至大)排序,且看下文。
     雖然根據某欄位排序,但傳回來的東西仍是所有資料。這就好比要同學們依高度排隊,排隊後他們不會死掉的。
資料傳回:整個資料表所有紀錄,並依ID作出了降冪排序。

4. 選取所有紀錄的Money欄位,並依AccountCreated由小至大(先至後)排序。
標準語法:Select 欄位 from 資料表名稱 order by 欄位 ASC
實例語法:Select Money from Bank order by AccountCreated ASC
語法解說:「ASC」表示以升冪(小至大),由於是日期欄位,因此依先至後排列。
資料傳回:傳回所有紀錄的Money欄位資料,並依AccountCreated由先至後排列。

5. 選取所有紀錄的所有欄位,先根據Money升冪排序,然後再根據AccountCreated降冪排序。
標準語法:Select * from 資料表名稱 order by 欄位 首排序方式, 欄位 次排序方式
實例語法:Select * from Bank order by Money ASC, AccountCreated DESC
語法解說:當主排序方式的資料相同時,以次排序方式區分先後。使用逗號分隔多種排序方式。
資料傳回:傳回Money先是較少的資料,若兩者相同以AccountCreated為後者先排。


【資料增值站 (本欄內容不一定要明白) 】

‧如何註明字串、日期及數字
在SQL語法中,字串、日期及數字會有不同的標示方式。上面已提到字串要使用單引號包住,那麼日期及時間該用什麼方式標註?
在不同的資料庫系統,這裏將會有一個分別。MySQL及Oracle,依舊用單引號包住日期及時間,但是Microsoft的SQL Server及Access,是使用

井號(#)來包住日期的。這點請大家注意。

‧關係咚阕?
關係咚阕邮荢QL的Select語法中的一個頗重要元素,通常是用於查詢資料架構,但這並不會更變資料架構,只是更改傳回的方式。SQL中有四

個重要的關係咚阕樱厦嬲f的Order By是其中一個。
1. Order By ── 根據某排序方式取得資料。
2. Intersect ── 取得兩個資料表中完全相同的資料,兩個資料表的結構必須相同。
3. Except ── Except 剛好跟Intersect相反,它只會取出兩個資料表中不同的資料,但是兩個資料表的架構也必須相同。
4. Union ── 結合兩個資料表。兩個資料表必須有一個欄位相同,例如資料表A中有ID及其他兩個欄位,資料表B中也有ID及一個不同的欄位

,使用Union兩個資料表相同ID的便會合併成2+1=3個欄位。
第四期文章將會詳細說明這個關係咚阕印?


【課後小測 】

看過上面的解釋後,你明白了嗎?先給大家一個問題:如何從Bank資料表選取ID、Name和Money欄位,而根據ID大至小排列?請把SQL語法寫出

來吧 (提示:請留意範例語法2的解說)。課後小測答案將於下期貼出來。

這次先教導大家使用Select的基本語法,以及Order By關鍵字。下一期,筆者將會教大家如何篩選資料。順帶一提,SQL語法是不分大小寫的。


【前言 2】

上一期,筆者說了Select及Where的用法,未知大家都理解沒有?若未能理解,慢慢來,把上期的文章多看幾次,你一定會明白的。接著下來,

筆者將會說明 Where 這個關鍵字,這是用作篩選資料,還有一些邏輯咚阕雍完P係咚阕樱蠹乙辞宄 O劝焉弦黄诘馁Y料庫搬過來,繼

續教學。


【範例資料表 】


          資料表──「Bank」

ID(自動編號) Name(字串)  Money(數字)  AccountCreated(日期時間)
   1     小白      200     16-4-2003 23:12:25
   2     大文      195     17-4-2003 18:13:20
   3     小芳      200     15-2-2002 16:59:45
   4     小娟      350     18-8-1999 11:30:32


【範例語法 】


1. 選取所有欄位,但Money欄位一定要是200。
標準語法:Select * from 資料表名稱 where 欄位=數值
實例語法:Select * from Bank where Money=200
語法解說:「where」表示開始條件篩選。
     「欄位」表示要進行篩選的欄位。
     「=」代表只傳回所有資料中某欄位內容等於以下的數值的資料,是比較咚阕又弧?
     「數值」表示數字資料。字串資料需要特別區別,稍後將會說明。
資料傳回:兩筆紀錄,包括ID為1及3的資料,因為只有它們的Money欄位才是200。

2. 選取ID欄位,Name可以是「小芳」,或者Money是350也可以,要根據ID降冪排序。
標準語法:Select 欄位 from 資料表名稱
     where 欄位1=數值1 or 欄位2=數值2
     order by 欄位 排序方式
實例語法:Select ID from Bank where Name='小芳' or Money=350 order by ID DESC
語法解說:「小芳」要用單引號包起來,因為資料表中Name欄位為字串。所有字串必須用單引號包起來。
     「or」必須在使用「where」關鍵字後使用,意義為「或」,是邏輯咚阕又唬?
     代表只要資料符合某一個條件便會被傳回。
     多個條件之間必須用邏輯咚阕臃指簟?
     排序必須在整個SQL語法的最後。SQL允許分行下達SQL語法,但不可以使用全形空白分隔。
資料傳回:兩筆紀錄的ID欄位,分別是ID為3及4的ID,因為ID為3的紀錄符合第一個條件、ID為4的紀錄符合第二個條件。它們會根據ID由大至

小排列。

3. 選取ID、Name及Money欄位,條件是Money必須大於195以及ID小於等如2,再根據Money升冪排列。
標準語法:Select 欄位1,欄位2,欄位3
     from 資料表名稱
     where 欄位1>數值1 and 欄位2195 and ID數值」表比只傳回在所有資料中該欄位比某數值大的資料回來(不包括等於),是比較咚阕又弧?
     「欄位=比較咚阕?,以及ID是小於或等於2的。

4. 選取所有欄位,條件是Money小於200,以及ID是大於1(不包括1)或者Name是「小白」的也可以。要根據ID升冪排序。
標準語法:Select * from 資料表名稱 where 欄位1>數值 and 欄位2>數值 or 欄位3='字串'
實例語法:Select * from Bank where Money>195 and ID>1 or Name='小白'
語法解說:這是開始使用三個條件的SQL語法。
     傳回的資料的第一個條件,以及符合其後兩個條件之一。
資料傳回:ID為1、3及4的資料,因為這三筆資料皆符合Money>195,而他們又各自符合ID>1或者Name='小白'其中一個的條件。


【資料增值站 】


‧比較咚阕?
上面已說到三個比較咚阕樱梅ù蠹乙苍S明白了。現在筆者告訴你更多的比較咚阕印?
1. >  大於   2. >=  大於或等於
3.   不等如

‧邏輯咚阕?
邏輯咚阕悠鋵嵵挥袃蓚€:and 和 or 。上面的文章也已提到。這兩個是在where條件中常用的啊,大家一定要牢記。在多個邏輯咚阕又校?

們的關係必須搞清楚,以下為一個實例:
Select * from TableA where ColumnA='value' and ColumnB='value' or ColumnC='value'
在這句SQL中,ColumnA='value'是跟ColumnB='value' or ColumnC='value'一起處理的,例只只要符合ColumnB或ColumnC的其中一個條件,再

符合ColumnA的條件,這些資料就會被傳回。

‧Between …… And ……
這個語法中的 And 跟邏輯咚阕硬煌H粑覀円襂D範圍在2-4,我們要用比較咚阕舆@樣寫:
Select * from Bank where ID>2 and ID195 order by ID DESC」的結果是什麼?
A. 傳回所有欄位、ID為2的紀錄。
B. 傳回ID欄位、ID為1、3及4的紀錄。
C. 傳回所有欄位的所有紀錄。
D. 沒有紀錄傳回。

下一期,我們將會使用到一些在SQL中的函數,是更進階的課程哦。請務必先明白這篇文章及上一篇文章才閱讀下一篇。




【前言 3】
上一期,我們說了Where、比較咚阕蛹斑壿嬤算子,連同第一期的Order By,大家都該明白了Select的基本用法吧?這次筆者將會說明SQL中

的一些常用的函數該如何使用,以及as關鍵字。由於已「借用」某大國際銀行的資料庫兩期了,這次更改一下格式,是某間學校儲存同學資料

的資料庫。


【範例資料表 】

          資料表──「Student」

ID(自動編號) Name(字串)  Age(數字)  Height(數字)  BirthDate(日期時間)
   1     張三     15      163     19-2-1988 15:32:19
   2     李四     14      159     16-8-1989 18:43:24
   3     王五     15      146     7-10-1988 23:59:56
   4     小明     16      162     10-9-1987 14:17:20
   5     小美     13      129     31-12-1990 9:18:36


【範例語法 】

1a. 使用 Count() 函數,取出資料庫的資料筆數。
標準語法:Select Count(*) from 資料表名稱
實例語法:Select Count(*) from Student
語法解說:「Count(*)」表示要取出資料筆數,函數內的 * 代表所有欄位。當然,鍵入一個欄位亦可,但一般來說都會使用 * 。
資料傳回:一個欄位儲存著紀錄筆數 5 ,但是該欄位名稱是以Expr起始的。

1b. 使用 Count() 函數及 as 關鍵字,自定資料筆數欄位名稱為Records。
標準語法:Select Count(*) as 欄位別名 from 資料表名稱
實例語法:Select Count(*) as Records from Student
語法解說:「as 欄位別名」是指替該欄位設定別名哦。在傳回來的資料,欄位名稱會是被更改了的,但是資料庫的欄位名稱沒有被更改。
資料傳回:欄位 Records 儲存著紀錄筆數 5 。

1c. 使用 Count() 函數,取出Age是大於或等於14的紀錄筆數。要求傳回的欄位名稱是RC。
標準語法:Select Count(*) as 欄位別名 from 資料表名稱 where 條件
實例語法:Select Count(*) as RC from Student where Age>=14
語法解說:在Count函數後加上Where條件,只統計符合該條件的紀錄筆數。
資料傳回:欄位RC中存著資料庫中Age欄位大於或等於14的資料筆數,一共是4。

注意,這裏並不需要用到 order by ,因為傳回的資料只有一筆,那就是資料筆數,因此沒需要用到 order by 排序。

2a. 取出Age的最大值,欄位名稱要是MaximumAge。
標準語法:Select Max(欄位名稱) as 欄位別名 from 資料表名稱
實例語法:Select Max(Age) as MaximumAge from Student
語法解說:「Max(欄位名稱)」表示要找出最大值的的欄位名稱。
資料傳回:欄位MaximumAge中存有所有資料中的Age欄位的最大值──16。

2b. 取出Height的最小值,欄位名稱要是MinimumHeight。
標準語法:Select Min(欄位名稱) as 欄位別名 from 資料表名稱
實例語法:Select Min(Height) as MinimumHeight from Student
語法解說:「Min(欄位名稱)」表示要在欄位找出最小的值。
資料傳回:欄位MinimumHeight中存有所有資料中的Height欄位的最大值──129。

2c. 找出Age的最小值,欄位要設定成MinAge,但條件是ID必須在1-4內。
標準語法:Select Min(欄位名稱) as 欄位別名 from 資料表名稱 where 條件
實例語法:Select Min(ID) as MinAge from Student where ID Between 1 and 4 或
     Select Min(ID) as MinAge from Student where ID>1 and ID=15」,真的很簡

單哦。下期將會是這個課程的最後一期,將會詳細說明第二種聯合資料表的方式──Join。



【前言 5】
上一期,我們開始說到使用兩個資料表的觀念了,包括簡單的子查詢及結合資料表,還有搜尋的做法。這期,筆者會繼續解說兩個資料表的連

結,這是更進階的 Join 。

Join共有六種:Inner Join 、 Left Outer Join 、 Right Outer Join 、 Full Outer Join 、 Cross Join 以及Natural Join 。由於Join

過於複雜,因此,筆者只會著重講解Inner Join 及 Left Outer Join 的語法。 Join 可以說是整個Select語法的精華所在,但是複雜度也相

對提高,各位讀者要留心看了。先拿回上次的「小白上網公司」的資料庫,但這次Fares資料表少了一筆資料。


【範例資料表 】

          資料表──「Accounts」

ID(自動編號) Username(字串)  LimitHours(數字)  Password(字串)
   1     陳小明        5        12345
   2     張小黑        8        123abc
   3     王大文        6        WTaiMan
   4     李小珍        9        LeeFamily
   5     陳大文        4        CTaiMan

          資料表──「Fares」

ID2(自動編號) Username(字串)  MonthlyFee(數字)
   5     陳小明        25
   6     張小黑        40
   7     王大文        30
   8     李小珍        45


【範例語法 】

1a. 從Accounts資料表的Password找出Fares資料表的Monthly Fee。已知Password是「LeeFamily」。
標準語法:Select 資料表1.欄位1 from 資料表1,資料表2 where
     資料表1.欄位2=資料表2.欄位2 and 條件
實例語法:Select Fares.MonthlyFee from Accounts,Fares where
     Accounts.Username=Fares.Username and Accounts.Password='LeeFamily'
語法解說:「資料表1.欄位1」代表第一個資料表的某個欄位,若用 * 代替,
     則會傳回兩個資料表所有的欄位。
     「資料表1.欄位2=資料表2.欄位2」代表使用Inner Join的方式連接兩個資料表,
     並且只要剩下兩個資料表中有相同欄位值的資料,這裏只有UserName可以使用。
     由於Fares中刪了一筆資料,因此,Accounts中ID為5的資料便被篩走了。
     再來是要一個條件,這裏指定為要符合Accounts的Password為LeeFamily。
     整個過程是先篩走只有一個資料表有的紀錄,再篩走Password不是LeeFamily的紀錄,
     最後用Join到Fares資料表取得MonthlyFee。
資料傳回:只有一筆資料,欄位MonthlyFee內的數值45。

1b. 已知Fares資料表中的MonthlyFee是30,請找出Accounts的LimitHours數值。
標準語法:Select 資料表1.欄位1 from 資料表1,資料表2 where
     資料表1.欄位2=資料表2.欄位2 and 條件
實例語法:Select Accounts.LimitHours from Accounts,Fares where
     Accounts.Username=Fares.Username and Fares.MonthlyFee=30
語法解說:請參考 1a 。
資料傳回:一筆紀錄,LimitHours是6。

接著下來的是Left Outer Join的語法。它的用法是以左邊的資料表作根據建立第一個資料集,並透過左邊資料表的其中一個欄位,逐筆取出右

邊資料表某欄位擁有相同的值的資料成為另一個資料集,最後結合兩個資料集。最糟糕的是,不同的資料庫系統竟然有不同的語法,真是很煩

啊,這裏只說一般的語法,Oracle及Sybase需另找語法,但可以參考這裏的概念。這裏只可以使用Username作串連。

2a. 利用Left Outer Join串連兩個資料表。
標準語法:Select * from 資料表1 資料表別名1 Left Outer Join
     資料表2 資料表別名2 On 資料表別名1.欄位1=資料表別名2.欄位2
實例語法:Select * from Accounts A Left Outer Join
     Fares B On A.Username=B.UserName
語法解說:「資料表1 資料表別名1」表示這裏要為資料表設定另一個名字方便在語法中使用,也可以不設別名。
     不設別名的話即是默認資料表別名是資料表名稱。一般會用A和B。
     「On」是指要把下列兩個欄位作連結條件。
     這裏把兩個資料表合併,只要其中一個資料表有該筆資料,即使另一個資料表沒有,也

會作串連。
資料傳回:由於比較抽象,這裏使用圖解說明資料傳回。
     ID,Username,LimitHours,Password,ID2,MonthlyFee
     Null,陳小明,Null,Null,5,25
     2,張小黑,8,123abc,6,40
     3,王大文,6,WTaiMan,7,30
     4,李小珍,9,LeeFamily,8,45
     5,陳大文,4,CTaiMan,Null,Null
     由於陳大文這筆資料只是出現在其中一個資料表,因此,另一個資料表得不到相關資料,傳回值變成Null。

至於Right Outer Join,則是跟Left Outer Join 剛好相反。Right Outer Join是以右邊的資料表作為根據的,一樣是結合兩個資料集。

2b. 利用Right Outer Join,傳回的資料要跟 2a 一樣的。這次不用設別名。
標準語法:Select * from 資料表2 Right Outer Join
     資料表1 On 資料表別名1.欄位2=資料表別名2.欄位1
實例語法:Select * from Fares Right Outer Join
     Accounts On Accounts.Username=Fares.UserName
語法解說:這個跟Left Outer Join非常相似,只是把關鍵字換成了Right Outer Join。
     由於換了關鍵字,變成根據右邊的資料庫串連,兩個資料表的位置也一併置換。
資料傳回:跟 2a 一樣。


【資料增值站 】

‧Left/Right Outer Join 在Oracle及Sybase的語法
在前面的文章,我提及到這兩種資料庫系統需要使用不同的語法。在這裏筆者把相關的語法告訴大家。

Left Outer Join
一般的語法:Select * from 資料表1 資料表別名1 Left Outer Join
      資料表2 資料表別名2 On 資料表別名1.欄位1=資料表別名2.欄位2
Sybase的語法:Select * from 資料表1,資料表2 where 資料表別名1.欄位1*=資料表別名2.欄位2
Oracle的語法:Select * from 資料表1,資料表2 where 資料表別名1.欄位1+=資料表別名2.欄位2

Right Outer Join
一般的語法:Select * from 資料表2 資料表別名2 Right Outer Join
     資料表1 資料表別名1 On 資料表別名1.欄位2=資料表別名2.欄位1
Sybase的語法:Select * from 資料表2,資料表1 where 資料表別名1.欄位1=*資料表別名2.欄位2
Oracle的語法:Select * from 資料表2,資料表1 where 資料表別名1.欄位1=+資料表別名2.欄位2

‧Cross Join 和 Natural Join
在上文中,我們明白到Inner Join在進行結合時是需要指定條件的。若果兩個要結合的資料表已有相同名稱的欄位,即是我們不說明如何連結

,也可以成功進行連結。而Cross Join是指列出兩個資料表結合後的所有有可能出現的組合。這樣一來,資料數量便是兩個資料表資料數量的

乘積。以範例資料庫來說,總共有20筆資料。