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 (條件式)