【前言 】
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,是使用井號(#)來包住日期的。這點請大家注意。
‧關係運算子
關係運算子是SQL的Select語法中的一個頗重要元素,通常是用於查詢資料架構,但這並不會更變資料架構,只是更改傳回的方式。SQL中有四個重要的關係運算子,上面說的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語法是不分大小寫的。