SQL指令語法速查手冊(四)

子查詢

以下透過student、homework及teacher三張資料表來做說明。

子查詢是什麼?就是在一個SQL敘述句內輸入兩次查詢(SELECT)指令,這種用法稱為子查詢。

語法
SELECT...FROM <資料表> WHERE <欄位><比較運算子>
(SELECT...FROM <資料表> WHERE <搜尋條件>);

範例
SELECT * FROM teacher WHERE subject=(SELECT work
FROM homework WHERE ID='102404248');

說明
本範例,搜尋學號為102404248的學生做的功課,指導老師為誰?

子查詢的解析

SQL 指令
SELECT * FROM homework WHERE 'English'=(SELECT subject FROM teacher WHERE teacher.subject=homework.work);
  看到SQL敘述句中的子查詢的WHERE指令後方的homework.work,是由外部指定的資料表(homework)查詢取得值。這邊的子查詢透過外部指定的資料表取值,並將取得的值進行計算處理,再將結果回傳給外部的SQL敘述。
在這個SQL中由外部的查詢homework資料表內的值並一次次地傳入子查詢內,而子查詢中會判斷teacher表內的subject欄位的值是否與homework表內work欄位的值相同。如果值相同,依次傳回外部的敘述句中,接著外部敘述句會將子查詢所傳回的值分辨出是否為English。是English的值則顯示出來,就是該敘述句的結果。
流程解析
Start:->敘述句中主查詢指定資料庫取值
->給子查詢內資料
->子查詢判斷搜尋取值
->回傳給主查詢
->如果回傳值符合主查詢條件
->產生結果
注意
相關子查詢也有必須要注意的地方,與一般子查詢相同,每次回傳值只能夠有一個值。例如子查詢內的語法只能限定一個欄位,如果指定多欄位的取得就會發生錯誤。另外,如果子查詢回傳的值資料型態與主查詢WHERE敘述中的資料型別不同,也會發生錯誤。
例如子查詢回傳值為1為數值,但主查詢的條件判斷為字串「01」,此時系統會無法正確判斷。

SQL指令語法速查手冊(三)

資料表指定與結合

語法
FORM 語法指定多表格
SELECT .. FROM (指定資料表),(指定資料表)...

如果當兩張資料表有相同欄位時,沒有指定資料表的話會系統會無法取得正確目標而錯誤。要正確的執行這個敘述就必須指定特定表格,語法是在欄位前加上資料表名稱,並透過「.」(小數點)分隔。

語法如下
SELECT (指定資料表名稱).(欄位名稱),....
FROM (指定資料表),(指定資料表)..

範例
SELECT student.ID FROM student,homework
WHERE student.ID=homework.ID;

透過別名來指名資料表

定義別名常用於資料表名稱過於冗長的時候。透過定義資料表別名,就能有效的簡化冗長的資料表名稱。

語法
SELECT .. FROM (指定資料名稱) (資料表別稱)...;

範例
SELECT aaa.ID FROM student aaa, homework bbb
WHERE aaa.ID=bbb.ID;

交叉結合

交叉結合就是兩張資料表透過外積的方式來結合,而交叉結合也稱為Cross結合。

語法
SELECT ...FROM (指定資料表) CROSS JOIN (指定資料表)
SELECT ...FROM (指定資料表), (指定資料表)

範例
SELECT * FROM student,homework;

自然結合(內部結合)

自然結合的意思在兩個資料表進行交叉結合後,將其中一表內特定的欄位值與另一張資料表內特定欄位值進行相等的判斷(連結結合),自然結合也稱為等結合(相等結合)。
自然結合分為內部結合與外部結合,這邊首先介紹內部結合。

語法
1.SELECT...FROM (指定資料表),(指定資料表)
WHERE (指定資料表.指定欄位)=(指定資料表.指定欄位)
2.SELECT...FROM (指定資料表) INNER JOIN (指定資料表)
WHERE (指定資料表.指定欄位)= (指定資料表.指定欄位)

範例
SELECT * FROM student,homework
WHERE student.ID=homework.ID;

SELECT student.ID,student,name,student.height,
student.weight,homework.work FROM
student.ID=.homework.ID;

加入另一個資料表 teacher
SELECT student.ID,student.name,student.height,
student.weight,teacher.name teacher,homework.work
FROM student,homework,teacher
WHERE student.ID=homework.ID
and homework.work=teacher.work;
另一寫法
SELECT student.ID,student.name,student.height,
student.weight,teacher.name teacher,homework.work
FROM student INNER JOIN homework ON student.ID=homework.ID
INNER JOIN teacher ON homework.work=teacher.subject;

透過上面的內部結合的例子來進行進階範例,搜尋學生名字為jack的功課資料。

語法:
INNER JOIN 敘述
SELECT student.ID,student.name,student.height,
student.weight,teacher.name teacher,homework.work
FORM student INNER JOIN homework
ON student.ID=homework.ID
INNER JOIN teacher
ON homework.work=teacher.subject
WHERE student.name='jack';

where 敘述
SELECT student.ID,student.name,srudent.height
student.weight,teacher.name,homewrk.work
FROM student,homework,teacher
WHERE student.ID=homework.ID
and homework.work=teacher.subject
and student.name='jack';

自然結合(外部結合)

左外部結合

左外部結合是將SQL敘述句內的先指定的資料表作為主資料表,並且將主資料表內的資料全部保留。而被結合的資料表稱為副資料表,副資料表則是只有滿足條件時才會留下來。

語法
SELECT ...FROM (主資料表)
LEFT OUTER JOIN (副資料表) ON (條件式)

範例
SELECT student.ID,student.name,student.height,
student.weight,homework.work FROM student
LEFT OUTER JOIN homework ON student.ID=homework.ID;

右外部結合

右外部結合與左外部結合相反,會將後來指定的資料表設為主資料表,並且將主資料表所有資料輸出。

語法
SELECT ...FROM (副資料表)
right OUTER JOIN (主資料表) ON (條件式)

SQL指令語法速查手冊(二)

運算子的優先順序

優先順序運算子
1*、/、%
2+、-
3=、>、>=、<、<=、<>、!=
4&、|、^、~
5NOT
6AND
7BETWWEN、IN、LIKE、OR

「%」萬用字元應用

說明
LIKE 透過「%」萬用字元有三種常用用法:
1.透過xxx開頭:LIKE'xxx%'
2.xxx在字串中:LIKE'%xxx%'
3.xxx在字尾:LIKE'%xxx'

「_」萬用字元

說明
「_」萬用字元是一個匹配單一字元的萬用字元,「%」萬用字元是可以匹配零至多個的字元,但是「_」萬用字元僅僅只能匹配一字,是相當嚴格。

例如
價格要搜尋三位數的字串時,可能就會透過
語法(price LIKE'___') 三個_
以下則是搜尋商品名稱有5個字元的資料
select * from store where name LIKE'_____'; 五個_

欄位別名

語法
欄位 別名

範例
SELECT name,weight/((height/100)*(height/100)) BMI FROM student
篩選 name 跟 BMI(是由方程式欄位設別名為BMI)從 student 資料表出來。

指定遞增、遞減排序

語法
ORDER BY (指定欄位) (ASC遞增/DESC遞減)

指定多欄位排序

語法
ORDER BY (指定欄位) (ASC/DESC),
(指定欄位) (ASC/DESC)
多個欄位的排序首先對指定的第一個欄位來進行排序,再對下一個指定的欄位進行排序,依此類推。

將資料輸出以群組化彙總

SQL不僅僅提供查詢計算的功能,也能夠將資料表特定欄位內的值群組進行彙總。群組化的意思是將欄位內相同的值集合起來分為各個群組,並且將各個群組進行彙總。

語法
指令為 GROUP BY
SELECT * FROM (資料表) GROUP BY (指定欄位)
範例
SELECT * FROM store GROUP BY class
範例
SELECT class, count(*), sum(price), sum(cost)
FROM store GROUP BY class;

將群組化資料設定條件

HAVING 的使用語法如下
SELECT * FROM (資料表) GROUP BY (指定欄位)
HAVING (指定條件)
範例
SELECT class, count(*),sum(price), sum(cost)
FROM store GROUP BY class;
若加上HAVING一起使用:
SELECT class, count(*),sum(price), sum(cost)
FROM store GROUP BY clas
HAVING count(*)>2;
在SQL中HAVING與WHERE這個兩個指令的差異是不是不大?是否覺得為何不用WHERE就足夠了?其實WHERE跟HAVING的差別在於WHERE是用於GROUP BY之前,因此就無法GROUP BY之後的結果來進行判斷。所以無論如何在GROUP BY後要進行資料判斷時,一定要使用HAVING指令。

SQL指令語法速查手冊(一)

關聯式資料庫(RDB)

關聯式資料模型式以列、欄鎖組成的資料表來表現資料的一種資料模型。我們可以對於這種資料表進行集合原理的操作。


資料操作語言(DML)

*SELECT 搜尋資料
*INSERT 加入資料
*UPDATE 更新資料
*DELETE 刪除資料

資料定義語言(DDL)

*CREATE 建立資料庫、資料表、視圖(VIEW)
*ALTER 變更資料庫、資料表、視圖(VIEW)
*DROP 刪除資料庫、資料表、視圖(VIEW)

資料控制語言(DCL)

*GRANT 給予資料庫使用者權限
*REVOKE 刪除資料庫使用者權限
*COMMIT 確定資料變更
*ROLLBACK 取消資料變更

SQL命令結構

SQL的敘述列是具有結構的,結構內分為三類:
*指令
*短句
*敘述句
在這個範例中指令就是 SELECT、 FROM,短句是「SELECT *」、「FROM TABLE」,則整個組合就稱為敘述句。

撰寫SQL敘述時的注意事項

*在SQL中英文大小寫並無區分
*空白字元的個數並不會對敘述句造成影響
*字串型態的常數必須要用單引號包住
*中文的處理
中文的處理
對於中文的處理在SQL上是沒有問題,唯一必須注意的是字元編碼問題。字元編碼問題在設定建立資料庫的時候必須小心注意,如果該資料庫的字元編碼不符合中文的編碼設定,將會造成資料庫內的值產生亂碼的問題,以及跨平台的編碼處理問題。如果要從Window系統降資料匯入Linux系統必須特別留意,因為兩者的字元編碼為BIG,後者為UTF-8,但只要多加留意就不會有太大的問題。

SQL備註說明

備註範例語法:
# (備註說明內容)
/*(備註說明內容) */
> SELECT * table #搜尋table內的所有欄位;
> SELECT * /*搜尋所有欄位*/ FROM TABLE ;

資料庫系統理論(九)

檢視表(VIEW)的用途與優缺點

    VIEW 檢視表 的主要用途,就是可以提供不同的使用者不同的查詢資訊。因此,我們可以歸納為下列幾項用途:
1.讓不同使用者對於資料有不同的觀點與使用範圍。
例如:教務處是以學生的「學業成績」為主要觀點;學務處是以學生的「操行成績」為主要觀點。
2.定義不同的視界,讓使用者看到的是過濾後的資料。
例如:一般使用者所看到的資訊只是管理者的部分子集合。
3.有保密與資料隱藏的作用
例如:個人可以看到個人全部資訊,但是,無法觀看他人的資料(如:薪資、紅利、年終獎金等)。
4.絕大部分的視界僅能做查詢,不能做更新。
優點
1.降低複雜度
如果我們要查詢的資料是來自多個資料表時,利用View檢視表就可以將所要查詢的欄位集合成檢視表中的欄位。亦即把複雜的表格關係利用View來表現,較能提高閱讀性。
例如:公司老闆所需要的摘要式資訊報表。
2.提高保密性
如果我們不想公開整個資料表中的全部欄位時,則利用View檢視表就可以有效地隱藏個人的隱私資料,以達到保密措施。亦即針對不同使用者,可產生不同權限設定的View。
例如:公司員工只能查詢個人的薪資,無法查詢他人。
3.提高程式維護性
當應用程式透過View檢視表來存取資料表時,如果基底表格的架構改變時,無需改變應用程式,只要修改View檢視表即可。
例如:當公司員工升遷為經理時,則查詢的權限直接升級。
缺點
1.執行效率差
因為View檢視表每次都是經過多個資料表合併產生的,所以,必須花費較多時間。
2.操作限制較多
因為View檢視表在進行「刪除及修改」,必須要符合某些特定的條件才能夠更新,例如:檢視表的建立指令不能包含GROUP BY 、 DISTINCT、聚合函數。

建立檢視表(CREATE VIEW)

定義
是指建立「檢視表」(或稱視界、虛擬資料表)

格式
CREATE VIEW 檢視表名稱[(欄位1,欄位2,...,欄位n)]
AS
SELECT<屬性集合>
FROM <基底表格>
[WHERE <條件>]
[GROUP BY <屬性集合>]
[HAVING<條件>]

注意
基本上,檢視表中的欄位名稱都是來自於Select_statement中的<屬性集合>,因此,「檢視表」中的欄位名稱之資料型態會與「基底表格」中的欄位名稱相同。
SQL指令
CREATE VIEW 學生成績單
AS
SELECT 姓名,課名,成績
FROM 學生表 AS A ,選課表 AS B ,課程表 AS C
WHERE A.學號=B.學號
AND C.課號=B.課號

資料庫系統理論(八)

除法(Divsion)

定義
此種運算如同數學的除法一般,有二個運算元:第一個關聯表R1當作「被除表格」;第二個關聯表R2當作「除表格」。其中,「被除表格」的屬性必須比「除表格」中的任何屬性中的值域都要與「被除表格」中的屬性之值域相符合。
代表符號
R1/R2
概念圖
基本型格式

巢狀結構查詢
定義
是指在 Where 敘述中再嵌入另一個查詢敘述,此查詢敘述稱為「子查詢」。換言之,您可以將「子查詢」的結果拿來做為另一個查詢條件。

注意
「子查詢」可以獨立地被執行,其執行結果稱為「獨立子查詢」。
分類
1.傳回單一值(=)
2.傳回多值(IN)
3.測試子查詢是否存在(利用EXIST)
第一種作法:
範例
利用子查詢來找出選修「資料庫系統」的學生學號及姓名。
解答
SELECT A.學號,姓名
FROM 學生檔 AS A, 選課檔 AS B 主查詢
WHERE A.學號=B.學號 AND B.學號=
(SELECT C.課號 FROM 課程檔 AS C
WHERE 課名='資料庫系統') 子查詢

第二種作法
範例
利用子查詢來找出選修「課號為C005」的學生學號與姓名
解答
SELECT A.學號,姓名
FROM 學生檔 AS A 主查詢
WHERE A.學號 =
(SELECT 學號 FROM 選課檔 AS B
WHERE A.學號 = B.學號 AND B.課號='C005') 子查詢

SQL巢狀EXISTS/NOT EXISTS        有點難懂請看進一步說明

更簡單的想法:
1.外層是:學生檔(Student)
2.把內層當成學生檔(Student)X選課檔(Course)(做卡式積/Cross Join)
3.內層紀錄去和課程檔(CourseTaken)去做比對(存在/不存在)
4.外層的紀錄再和內層做比對(存在/不存在)
如上圖所示:
橘色:內層(Student表×Course表)中不存在於CourseTaken表的紀錄
意義:每個學生沒有修的課
綠色:外層(Student表)中不存在於橘色的紀錄
意義:沒有課沒修的學生,即為解答!
經過以上方式及可求得巢狀EXISTS/NOT EXISTS的答案。

資料庫系統理論(七)

卡式積(Cartesian Product)

注意!CROSS JOIN 會有問題

改善的方法

作法
1.透過 SELECT 指令 WHERE 部分的等式,
及對等合併(Equi-Join)。

From A,B
Where (A.c=B.c)

2.透過 SELECT 指令 FROM 部分的 INNER JOIN。
即自然合併(Natural Join);又稱為內部合併
(Inner Join)。

From A INNER JOIN B
ON A.c=B.c
範例
1.第一種做法(Equi-Join最常用)

Select 學號,姓名,課程表,課號,課程名稱,學分數
From 學生表,課程表
Where 學生表.課號=課程表.課號

2.第二種做法:INNER JOIN

SELECT 學號,姓名,課程表,課號,課程名稱,學分數
FROM 學生表 INNER JOIN 課程表
ON 學生表.課表=課程表.課表
範例
SELECT A.學號,姓名,課號,成績
(加入 投影使用者 輸出的欄位名稱)

FROM 學生資料表 AS A, 選課資料表 AS B

WHERE A.學號=B.學號
(加入 內部合併 Join)

And B.成績>=70
(加入 限制條件 成績大於或等於70分者)

GROUP BY A.學號,姓名
(使用群組化及聚合函數)

HAVING AVG(成績)>=90
(在聚合函數後,再進行篩選條件)

ORDER BY AVG(成績) ASC
(在聚合函數結果,再來進行排序-由低到高)

左外部合併

右外部合併

資料庫系統理論(六)

資料操作語言(Data Manipulation Language  DML
DML四種基本指令
1.INSERT(新增)
2.UPDATE(修改)
3.DELETE(刪除)
4.SELECT(查詢)

INSERT(新增紀錄)指令

定義:只新增一筆紀錄到新的資料表內。
格式:INSERT INTO 資料表名稱<欄位串列>
VALUES(<欄位值串列>|<SELECT指令>)
範例一
INSERT INTO 學生表 VALUES('S001','一心','111111','前鎮區','男');

範例二
INSERT INTO 學生表(學號,姓名,地址) VALUES ('S002','二聖','苓雅區');

UPDATE  (修改紀錄) 指令

定義:指修改一個資料表中某些值組(紀錄)之屬性值。
格式:UPDATE 資料表名稱
SET{<欄位名稱1>=<欄位值>,....,<欄位名稱N>=<欄位值N>}
[WHERE <條件子句>]
範例
UPDATE 學生表 SET 電話='222222' WHERE 電話 IS NULL
And 學號 ='S002' ;

DELETE FROM 資料表名稱

定義:把合乎條件的值組(紀錄),從資料表中刪除
格式:DELETE FROM 資料表名稱
[WHERE <條件式>]
範例: 請將「學生表OLD」中的「十全」學生記錄刪除。
DELETE FROM '學生表OLD'
WHERE 姓名='十全' ;

SELECT 指令簡介


使用「聚合函數」

COUNT 紀錄筆數
SELECT COUNT(*) AS 全班人數 FROM 學生表;
SELECT COUNT(成績) AS 有成績總筆數 FROM 學生表;

AVG 平均數
SELECT AVG(成績) AS 資料庫平均成績 FROM 選課表
WHERE 課號 ='C005';

SUM 總和
SELECT SUM(成績) AS 資料庫總成績 FROM 選課表
WHERE 課號 ='C005';

MAX 最大值
MIN 最小值

SQL的執行順序

資料庫系統理論(五)

SQL提供三種語言
1.資料定義語言(Data Definition Language)DDL。
2.資料操作語言(Data Manipulation Language)DML。
3.資料控制語言(Data Control Language)DCL。

Create Database 基本語法  (建立)

語法:  Create Database[IF NOT EXIXTS]
範例: Create Database 選課系統料庫

Alter Database 基本語法  (修改)

語法: Alter Database 資料庫名稱
[CHARACTER SET 字元集名稱]
[COLLATE Collation 名稱]
範例: Alter Database 選課系統料庫
CHARACTER SET utf8

DROP Database[IF EXISTS]資料庫名稱  (刪除)

語法:  DROP Database 資料庫名稱
範例: DROP Database 選課系統料庫

CREATE TABLE  (建立資料表)

ALTER TABLE (修改資料表)

DROP TABLE (刪除資料表)

格式:  DROP TABLE 資料表名稱
範例: DROP TABLE 學生表

資料庫系統理論(四)

關聯式資料庫

定義
由兩個或兩個以上的資料表組合而成,而資料表之間是透過相同的欄位值(即「外鍵」參考「主鍵」)來連結,以這種方式來存放資料的資料庫,在電腦術語中,稱為「關聯式資料庫(Relation Database)」。
作法
將各種資料依照性質的不同(如:學籍資料、選課資料、課程資料、學習歷程資料等....),分別存放在幾個不同的表格中,表格與表格之間的關係,則是以公同的欄位值(如:「學號」欄位....)相互連結。
目的:
1.節省重複輸入的時間與儲存空間。
2.確保異動資料(新增、修改、刪除)時的一致性及完整性。
優點
1.節省記憶體空間:相同的資料紀錄不需要再重複輸入。
2.提高行政效率:因為資料不須再重複輸入,固可以節省行政人員的輸入時間。
3.達到資料的一致性:因為資料不須再重複輸入,固可以減少多次輸入產生人為的錯誤。

差集(Difference)
定義
是指關聯表R「差集」關聯表S之後的結果,則為關聯表R減掉RS兩關聯表共同的值組。
關聯式代數: R-S
範例:
若A={1,2,3,4},B={3,4,5,6},則A-B=?
A-B = {1,2}


合併(Join)
定義
是指將兩關聯表R與S依合併條件合併成一個新的關聯表R3,假設P為合併條件,以R[X]pS表示此合併運算。
作法
從兩關聯表的「卡式積」中選取屬性滿足一定條件的值組。
關聯式代數:R[X]pS
合併(Join)有三種型態
1.自然合併(Natural Join);又稱為內部合併(Inner Join)。
2.θ-合併(Theta Join)
3.對等合併(Equi-Join):是θ-合併的特例。

自然合併(Natural Join)
定義:自然合併(Natural Join)又稱為內部合併(Inner Join),它必須在左右兩邊的關聯表中找到對應值才行。而外部合併(Outer Join)則無此規定。一般的結合(Join)都屬於此種方法。

θ-合併(Theta Join)
定義:以「等於」以外的條件為基礎來合併兩個關聯的運算。
語法:(A X B) WHERE A.X θ B.Y
其中,A、B為無關聯屬性的關聯,A具有屬性X,而B具有屬性Y。
注意:相同名稱的欄位會同時出現在運算結果的表格中。亦即重複欄位,會出現兩次。

外部合併(Outer Join)
定義:當在進行合併(Join)時,不管紀錄是否符合條件,都會被列出其中一個資料表的所有紀錄時,則稱為「外部合併」。因此,其合併結果中會保留一個關聯(Left Outer-Join)或保留第二個關聯(Right Outer-Join),或保留兩個關聯(Full Outer-Join)中的所有值組。

作法:進行合併(Join)時,如果不符合條件的紀錄就會被預設為NULL值。即左右兩邊的關聯表,不一定要有對應值組。

使用時機:應用在異質性分散式資料庫上的整合運算,其好處是不會遺漏資訊。

電腦書的截圖
Step1.用Gaze抓圖:點右邊小圈圈->選圖片的小Icon->點選分享->藍芽
Step2.電腦接受圖:進入藍芽設定->接收檔案
Step3.上傳圖片時要選擇完整大小、50%