數據庫補充筆記 (答案版) PDF

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

Database(2)/ SQL/P.

1
中華傳道會劉永生中學
數據庫︰
數據庫︰SQL
1 是什麼?
是什麼
SQL是什麼
1.1 SQL (Structured Query Language)代表結 構 化 查 詢 語 言 。
1.2 當用戶發出一項查詢,便可從數據庫檔內獲得若干資料。這項查詢是根據用戶所提供的條件
(condition) 所作出的一項檢索。而 SQL則是一個可讓用戶把條件列明的查詢語言。這樣,用戶
只須列明查詢的條件,而不須要實際知道有關的檢索方法。
1.3 一般的數據庫管理軟件系統 (DBMS) 都包含 SQL 功能。

2 的概念
SQL的概念
2.1 通過 SQL 指令,用戶先要找尋的數據庫檔及查詢的 條 件 ,SQL 程序便會在這數據庫
檔內檢查每筆記錄是否符合條件,並把顯示合適的資料。這個過程稱為檢索。 (見例 2)
2.2 除了直接查問各筆記錄的資料外,也可查問 運 算 數項,例如最大值、最小值、總和及平均等。
2.3 查詢所得的結果會以表格的形式顯示,用戶亦可指示 SQL 程序把結果貯存成為數據庫檔。

3 檢索指令的基本結構
SQL檢索指令的基本結構

一般語法 SELECT, ALL / DISTINCT, *, AS, FROM, WHERE


比較 IN, BETWEEN, LIKE, "% _"
群組 GROUP BY, HAVING, COUNT( ), SUM( ), AVG( ), MAX( ), MIN( )
顯示次序 ORDER BY, ASC / DESC
邏輯運算符 AND, OR, NOT
輸出 INTO TABLE / CURSOR, TO FILE [ADDITIVE], TO PRINTER, TO SCREEN
聯合 UNION

簡稱: expr = 表達式 expression, groupexpr = 群組表達式 group expression


col = 欄 column, comcol = 共同欄 common column
colname = 欄名 column name
nullval = 空值 null value

字段 欄
     

記錄 橫列

數據庫檔 表格
Database(2)/ SQL/P.2
實例:學生個人資料
考慮以下貯存學生數據的數據庫檔 STUDENT. DBF:
欄名 類型 欄寬 內容 例子
id 數字 4 學生編號
name 字符 32 學生英文姓名
dob 日期 8 出生日期
sex 字符 1 性別: M / F
class 字符 2 班別
classno 數字 2 班號
hcode 字符 1 社名 R = Red, Y = Yellow, B = Blue, G = Green
dcode 字符 3 居住地區碼 TST = 尖沙咀(Tsim Sha Tsui), MK = 旺角(Mong Kok)
remission 邏輯 1 學費減免 T =享有學費減免, F = 沒有學費減免
mtest 數字 3 數學測驗分數 貯存學生數學測驗的分數,滿分為100。

4 一般語法(
一般語法 SELECT… FROM… WHERE… )
句法如下︰
SELECT [ALL / DISTINCT] expr1 [AS col1], expr2 [AS col2]… FROM tablename WHERE condition
語句 功能
SELECT 指明選擇要顯示的資料
FROM 從哪表格選取資料
WHERE 設定篩選條件
4.1 SQL 程序會從數據庫檔 tablename 選取符合條件的橫列並以表格的格式顯示。
4.2 表達式 expr1, expr2 可以是 字 段 ,或以 函 數 和字段組成的表達式。
4.3 而 col1, col2 是表達式 expr1, expr2 在輸出結果的表格內的 欄 名 。
4.4 加入 DISTINCT 會輸出 無 重 覆 出現的橫列,而選項 ALL 則輸出重覆而合條件的記錄。
4.5 條件 condition 可以是等 式 、不等式,或 字 符 串 的比較,並使用邏輯運算符使用。

5 於FoxPro環境使用
環境使用 SQL
5.1 用戶可於指令視窗 (Command Window) 直接輸入指令,亦可使用對話方塊把指令輸入。
5.2 使用 SQL,必須開啟有關數據庫︰USE [數據庫名稱] (例︰ USE STUDENT )
5.3 若用戶選用字符串的完全配對時,便須輸入 SET ANSI ON。

6 邏輯運算符
運算 運算符 作用
及 AND 兩個條件 同 時 為真,結果為真。
或 OR 兩個條件 任 一 為真,結果才為真。
非 NOT 將所得的結果相反。
Database(2)/ SQL/P.3

語句︰
語句︰實例
SQL語句 備註

求所有學生的資料︰  該查詢並無任何條件限制,故省去
SQL語句︰ WHERE。
SELECT * FROM student  SELECT 部分以 * 表示來源表格所有欄。
 查詢所得的結果將貯存於一 暫 時 的表格
內。
求1A 班學生的名字和社名︰  SQL會於student表格中檢查每一列是否符
SQL語句︰ 合資格(class= “1A”),並顯示欄name, hcode
SELECT name, hcode, class; 及 class於暫時的表格內。
FROM student;  以分號 ( ; ) 代表指令可並未完成。
WHERE class="1A"

求出紅社社員的居住地區︰(hcode="R")  若兩個或以上的學生居住於同一地區,使
SQL語句︰ 用選項 DISTINCT 便可把重覆的結果省
SELECT DISTINCT dcode FROM student; 去。
WHERE hcode="R"
求出 1A 班有學費減免的學生的名字和編號︰  在 WHERE分中加上 AND 表示需同時符
SQL語句︰ 合。
SELECT name, id, class ;  因 remission 是一個邏輯值(T / F),故可直
FROM student ; 接在邏輯表達式中使用 。
WHERE class="1A" AND remission
 如邏輯值需表達非,可於前方加入 NOT 。

求出 1B 班女生的名字和年齡︰(準至一位小數)  「1B 班女生」的條件包括兩部分:


SQL語句︰ class="1B" 和 sex="F"。而這項條件必須同
SELECT name, 時符合,所以要使用邏輯運算符 AND。
ROUND((DATE()-dob)/365,1) AS age;  在這數據庫檔裏並沒有一欄直接貯存年
FROM student;
齡,所以我們須要使用學生的出生日期
WHERE class="1B" AND sex="F"
dob 來計算。首先,DATE( )-dob 表示該生
的"日歲",再除 365 就變成"年歲"。再用選
項 AS age 去說明該欄的名稱。
Database(2)/ SQL/P.4
7 比較結構
比較結構可以在 WHERE 部份使用,以設定查詢要求︰
指令 結構 備註
IN expr IN(value1, value2, value3…)  搜尋expr 的值是否等於括號中任一個值
(例︰value1, value2, value3…)。
 而 expr 可以是數值或字符串。
BETWEEN expr BETWEEN value1 AND value2  搜尋 expr界乎於 value1 和 value2 之間。
LIKE expr LIKE "%_"  搜尋 expr是否為LIKE之様式之 字 串 。
 "%"︰代表任何長度的字符串。
 "_"︰代表任何的 單 一 字符。

實例
SQL實例 備註

求出所有出生於星期三或星期六的學生。  CDOW()函數︰
SQL語句︰  輸入日期,並輸出英文星
期。如︰Monday, Tuesday,
SELECT name, class, CDOW(dob) AS bday
Thursday…
FROM student;  DOW()函數︰
WHERE DOW(dob) IN (4,7)  輸入日期,並輸出數字星
期︰星期日=1,星期一=2。
如此類推。
求出所有不是在一月、三月、六月或九月出生的學生。  MONTH()函數︰
SQL語句︰  輸入日期,並輸出月份為數
字。
SELECT name, class, dob FROM student;
 以 NOT 表示「非」邏輯值。
WHERE MONTH(dob) NOT IN (1,3,6,9)
求出1A 班的學生名字及數學測驗分數,其分數界乎於 80~90
SQL語句︰
SELECT name, mtest FROM student;
WHERE class="1A" AND mtest BETWEEN 80 AND 90

求出所有學生其名字是以 "T" 為起首。  這裏所用的樣式是 "T%" ,這表


SQL語句︰ 示第一個字符必須是 "T" 而其
後可以是任何的字符串。
SELECT name, class FROM student ;
WHERE name LIKE "T%"
求出所有紅社社員其名字的第二個字母是"a"。  這裏所用的樣式是 "_a%" ,而
SQL語句︰ 其中的 "_" 符號代表任何單一
字符,亦即第一個字符是任意
SELECT name, class, hcode FROM student ;
的。第二個字符則必須是 "a",
WHERE name LIKE "_a%" AND hcode="R" 而其後的 "%" 代表任何的字符
串。
Database(2)/ SQL/P.5
8 群組
SELECT … FROM … WHERE condition ;
GROUP BY groupexpr [HAVING requirement]
 GROUP BY groupexpr 列出群組組成所依照的表達式。一般都是數據庫的 欄 。
 WHERE condition 列出每橫列的篩選條件;而 HAVING requirement 則列出群組須符合的條件。
 可使用以群組函數來計算統計數項。
函數 功能
COUNT( ) 記錄出現的目數
SUM( ) 總和
AVG( ) 平均值
MAX( ) 最大值
MIN( ) 最小值

實例
SQL實例 備註

求出每一班的人數。  GROUP BY class 將以class 分組。


SQL語句︰
 群組函數 COUNT(*) 算數每組總數。
SELECT class, COUNT(*) FROM student;
GROUP BY class
求出每一班的數學測驗平均分。  SQL 程序先以 class 群組,然後於每
SQL語句︰
組中計算該組的 mtest 平均值。
SELECT class, AVG(mtest) FROM student;
GROUP BY class
求出每一居住地區的女生數目。
SQL語句︰
SELECT dcode , COUNT(*) FROM student;
WHERE sex="F" GROUP BY dcode
求出每一區中一學生數學測驗的最高分及最低分。  WHERE class LIKE "1_" 揀選班別以
SQL語句︰
“1” 字符起首的學生。
SELECT dcode, MAX(mtest), MIN(mtest), ;
FROM student WHERE class LIKE "1_" ;
GROUP BY dcode
列出每一班男生數學測驗的平均分,但男生人數不及廿人  先把符合條件 sex="M" 的橫列選出
的班則不計算在內。  然後依照 class 來群組並計算每組的
SQL語句︰ mtest 平均值。
SELECT AVG(mtest) , class FROM student;  最後 SQL 程序會檢查群組條件
WHERE sex="M" GROUP BY class; COUNT(*) >=20。(這例中 2C 班男生
人數不及三人,所以並沒有在結果裏
HAVING COUNT(*)>= 20
顯示出來。)
Database(2)/ SQL/P.6
9 顯示次序
SELECT ...... FROM ...... WHERE ......;
GROUP BY ..... ORDER BY colname ASC/DESC
 ORDER BY colname 控制顯示順序; colname 查詢中的一欄。
 而ASC = 升冪, DESC = 降冪。

實例
SQL實例 備註

列出 1A 班男生的名字,並按名字序顯示。  Order by 預設為 升 冪


SQL語句︰
SELECT name, id FROM student;
WHERE sex="M" AND class="1A" ORDER BY name
列出 2A 班的學生資料,並按居住地區序顯示。
SQL語句︰
SELECT name, id, class, dcode FROM student;
WHERE class="2A" ORDER BY dcode
求出每區居住學生的人數,並按降冪顯示。  如表達式沒有加入欄名 “cnt” 則不
SQL語句︰ 能以人數排序
SELECT COUNT(*) AS cnt, dcode FROM student;
GROUP BY dcode ORDER BY cnt DESC
列出每社的男社員名字並以會社及班別次序排列。  橫列先按 hcode 排列(即第一層排
(先會社後班別) 列);而相同的 hcode,再按 class 次
SQL語句︰ 序顯示。
SELECT name, hcode, class FROM student;
WHERE sex="M" ORDER BY hcode, class
Database(2)/ SQL/P.7
指令及補充
SQL指令及補充
指令 描述 例子
 SELECT 選取查詢的欄 SELECT ID, NAME…
 ALL/DISTINCT DISTINCT:無重覆記錄數據 SELECT DISTICT SCORE
(預設為ALL) ALL: 所有數據(重覆記錄)
 AS 新增欄名 SELECT AVG(SCORE) AS AVGS
 FROM 指示查詢的數據庫名字 FROM STUDENT
 WHERE 條件篩選 WHERE SCORE=100
WHERE CLASS= ‘1A’ AND ID<1000
 IN 於清單篩選 WHERE SCORE IN (48,50,53)
 BETWEEN AND 數值篩選範圍 WHERE SCORE BETWEEN 50 AND 60
 LIKE 文字近似篩選 WHERE NAME LIKE ‘_AY’
_︰任何單一字元 WHERE NAME LIKE ‘MAY%’
%︰任何長度字符(包括無字)
 ORDER BY 資料排序(欄可以數字表示) ORDER BY CLASS,NO
降序︰DESC(預設為升序) ORDER BY 3 DESC,4
 GROUP BY 群組查詢 GROUP BY CLASS
 HAVING 群組條件篩選 篩選 GROUP BY CLASS HAVING AVG>20
 INTO TABLE 輸出數據庫檔 INTO TABLE C:\SQL1.DBF
 TO 列印︰TO PRINTER TO FILE C:\OUTPUT.TXT
輸出文字檔︰TO FILE… TO PRINTER
數據庫修改 描述 例子
 CREATE 新 增 數據庫 CREATE TABLE GOODS
CREATE TABLE 表格 (NAME CHR(10),DOB DATE,
PRICE NUMBER(4,2),AGE INTEGER)
(欄名 欄類型, …)
CHR︰文字(可訂明長度)
NUMBER︰數字(可訂明長度及小數位)
DATE︰日期 / INTEGER︰整數
如欄為關鍵欄,需於後方加入 unique
 INSERT INTO 加入 記 錄 INSERT INTO S (ID, NAME, CLASS)
VALUES INSERT INTO 表格名 VALUES (6472, ‘PETER’, ‘3D’)
(欄位1,欄位2,…)
VALUES (值1,值2,…)
 UPDATE 更 新 數據︰ UPDATE STUD SET CLASS='2A';
SET UPDATE 表格 SET 更新內容 WHERE CLASS='1A'
(將數據庫STUD內1A班全更新為2A班)
 ALTER ADD/DROP 加入或刪除 欄 位 ALTER TABLE STUDENT ADD ADR
ALTER TABLE 表格 CHR(20)
(加入20字長的欄 “ADR”)
ADD 新增欄名 欄類型
ALTER TABLE STUDENT DROP SEX
或 DROP 刪除欄名
(刪除欄SEX)
 DELETE 刪除 記 錄 (標記 標記)
標記 DELETE FROM DB WHERE YEAR=2005
(刪除所有2005年的紀錄)
 DROP TABLE 刪除 表 格 DROP TABLE STUDENT
(系統不會詢問是否確定)
多個數據庫處理 描述 例子
 UNION 數據庫聯合 SELECT… FROM A
UNION SELECT… FROM B
Database(2)/ SQL/P.8
函數
SQL函數
類別 功能 試算表
函數
對應*
對應
算術類 ABS( 數值欄 ) 傳回絕對值︰只傳回其正數值 
INT( 數值欄 ) 捨 去 小數之數值 
ROUND( 數值欄, M) 傳回四捨五入之值,並至第M個小數位 
日期類 YEAR( 日期欄 ) 傳回年份 
MONTH( 日期欄 ) 傳回月份(數字) 
CMONTH( 日期欄 ) 傳回月份(英文)

DAY( 日期欄 ) 傳回日期 


CDOW( 日期欄 ) 傳回星期(英文)

DOW( 日期欄 ) 傳回星期(數字︰1為星期日) WEEKDAY


傳回日期格式︰
DATE( YYYY, MM, DD) date(1990,12,31)等同{^1991/12/31} 
date()傳回今 日 日 期
文字類 SUBSTR( 文字欄, M, N) 傳回欄由第M個字起的N個字符 MID
刪除字符串後方多餘之空格
TRIM( 文字欄 ) 
前方、中間重覆及後方多餘的空格)
前方
(Excel則刪除前方
UPPER( 文字欄 ) 傳回全改為大寫 
LOWER( 文字欄 ) 傳回全改為小寫 
PROPER( 文字欄 ) 傳回適當寫法(首字大寫,其後小寫) 
LEN( 文字欄 ) 傳回字串長度(預設為 欄 長度!!) 
LEFT( 文字欄, M) 傳回左方數起M個字符串 
RIGHT( 文字欄, M) 傳回右方數起M個字符串(留意 空 格 ) 
STR( 數字欄 ) 將數值轉為 文 字 ASC
群組類 SUM( 數值欄 ) 群組之和 
AVG( 數值欄 ) 群組之平均值 AVERAGE

MAX( 數值欄 ) 群組之最大值 


MIN( 數值欄 ) 群組之最小值 
COUNT( 任何欄 ) 點算記錄數目 
貯存格輸入計算。
註︰函數與試算表對應指其計算效果及格式相同,唯試算表內以貯存格
貯存格

參考網頁︰
 SQL語法入門(http://www.1keydata.com/tw/sql/sql.html)
 簡單易懂的介紹 SQL(http://vzoo.net/),可於網上練習執行SQL指令

You might also like