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

SELECT 從資料表取得資料
SELECT (欄位名稱) (欄位名稱)....
FROM (表格名稱)
WHERE (搜尋條件)
GROUP BY [HAVING ] (欄位名稱)
ORDER BY (欄位名稱)
範例
SELECT * FORM store;
SELECT name,price,cost FROM store;
SELECT name,price,cost FROM store WHERE price<50;

使用排序順序的查詢-ORDER BY
SELECT name,price,cost FROM store WHERE price<50
ORDER BY cost;

使用別名查詢
SELECT name,price,cost,price-cost FROM store;
SELECT name,price,cost,price-cost profit FROM store;
FROM 指定資料表
SELECT ....
FROM TABLE [TABLE2] [TABLE3]....
範例
SELECT student.name,homework.work FROM homework,student;
SELECT student.name,homework.work
FROM homework,student W=student.ID;
WHERE 指定條件
SELECT ...
FROM TABLE
WHERE (搜尋條件) [OR ,AND] ...
範例
SELECT * FROM student WHERE height>=170;
SELECT * FROM student WHERE height<170 OR weight<70;
SELECT * FROM student WHERE height between 170 AND 190;
GROUP BY 將資料群組化
SELECT ...
FROM TABLE
GROUP BY (欄位名稱)
 在寫GROUP BY 的語法時必須注意,使用的函數都必須是群組計算的概念。如果使用sum函數,將特定欄位計算得出值,就會是群組的總和,而不會是所有的值總和。在群組的語法後面加上WITH ROLLUP可以計算出所有群組的總和,指令中該語法最後一排會出現匯總的值,而該會總列的列名會被指定為NULL。
範例
SELECT * FROM store GROUP BY class;
SELECT class,sum(price),sum(cost) FROM store
GROUP BY class;
SELECT class,sum(price),sum(cost) FROM store
GROUP BY class WITH ROLLUP;
HAVING 對群組化的資料設定條件
SELECT...
FROM TABLE
GROUP BY (欄位名稱)
HAVING (搜尋條件)
  GROUP BY 語法群組化的資料取得時,如果要再進行搜尋條件設定的話,就必須使用HAVING語法。在沒有群組話之前的資料是透過WHERE語法來進行搜尋設定,而在群組化之後的資料就必須透過HAVING語法才能進行搜尋。
範例
SELECT class,sum(price),sum(cost) FROM store
GROUP BY class HAVING sum(cost)<40;
SELECT class,AVG(price),AVG(cost) FROM store
GROUP BY class;
ORDER BY 指定結果的排列方式
SELECT...
FROM TABLE
ORDER BY (欄位名稱)
ASC 由小到大
DESC 由大到小
範例
SELECT * FROM ball ORDER BY price DESC;
SELECT * FROM ball ORDER BY quantity ASC;
LIMIT 限制結果筆數
SELECT...
FROM TABLE
LIMIT (資料筆數)

LIMIT [開始筆數],[資料筆數]
 當我們同時使用WHERE語法指定條件與LIMIT指定筆數時,WHERE指定的條件判斷會被執行,執行完成才會執行LIMIT語法。也就是說WHERE與LIMIT的執行優先順序為WHERE優先於LIMIT。
範例
SELECT * FROM people limit 5;
SELECT * FROM people limit 3,4;

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