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

集合運算子

UNION 運算子

語法
<SELECT敘述句> UNION <SELECT敘述句>

說明
UNION 運算子是用來求取聯集的運算子。我們可以使用這個運算子來對多個SELECT敘述句所查詢的結果作聯集處理。
如果只有指定UNION運算子的話,會傳回除去重複部分的聯集。但是若指定是ALL運算子的話,就會傳回沒有除掉重複部分的聯集。在實用上,多個SELECT敘述句由UNION運算子來連結,所以UNION運算子屬於集合運算子。

範例:
SELECT ID FROM homework UNION SELECT ID FROM student;
若加上 UNION ALL 運算子指令,會將進行運算的所有資料顯示出來。

EXCEPT 運算子

語法
<SELECT 敘述句> EXCEPT <SELECT 敘述句>

說明
EXCEPT 運算子是用來求取差集合的運算子。EXCEPT會由左邊指定的查詢果中,除去右邊指定的查詢結果中後傳回差集合。撰寫時,要在EXCEPT運算子左邊撰寫被減去的集合,在右邊撰寫減去的集合。

範例
SELECT ID FROM homework EXCEPT SELECT ID FROM student;

單項運算子

+ 單項運算子

語法
+ <數值式>

範例
SELECT price, +price FROM store;

說明
+ 單項運算子並非加法運算子,他可以用來明確表示數值為正數運算子。但是 + 單項運算子並不會進行任何處理,所以在資料處理上沒有任何意義。

– 單項運算子

語法
- <數值式>

範例
SELECT cost, -cost FROM store;

說明
- 單項運算式用來將數值符號進行反轉的運算子。- 單項運算子可以將正數變為負數,將負數變為正數。

IS (NOT) NULL運算子

語法
式 IS (NOT) NULL

範例
SELECT * FROM store WHERE ID IS NULL;

說明
IS NULL 運算子是用來確認式中的值是否為NULL運算子。NULL在資料庫上是用來表示沒有的值。
比較運算子中的等於以及不等於運算子,並沒有辦法對NULL進行比較,所以沒辦法判斷值是否為NULL。要確認是否為NULL的話,只能使用IS NULL 運算子。
本例為空值。
相反地,設定為非空的話,就會顯示所有值。
SELECT * FORM store where ID IS NOT NULL;

CASE 運算子

語法
CASE 式 WHEN 條件 THEN 輸出 ....END

範例
SELECT ID,CASE WHEN 1 THEN 'first' WHEN 2 THEN 'second' WHEN 3
THEN 'third' ELSE 'other' END FROM store;

說明
CASE 運算子主要是用來轉換值的運算子。在CASE後面指定的式中如有WHEN中指定條件的情形下,會轉換為THEN中所指定的輸出的值。這樣的組合可以重複指定。而最後透過ELSE指令,ELSE指令則是若不是WHEN中指定條件時,則會轉換為ELSE中指定的值。最後要撰寫END用以表示結束。

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

邏輯運算子

AND運算子

語法
條件式 AND 條件式
範例:
SELECT * FROM store WHERE class='household' AND price>70;

BETWEEN 運算子

語法
敘述式 BEWTEEN 數值1 AND 數值2
範例:
SELECT * FROM store WHERE price BEWTEEN 10 AND 40;

IN 運算子

語法
敘述式 IN (數值1,數值2)
範例:
SELECT * FROM store WHERE class IN ('office','food')
說明:
IN運算子是用來判斷再子查詢或者清單中具有與指定的值一致的值。在IN運算子前面賦予的值,如果在IN後面子查詢的結果清單中,或者在數值式的清單中具有相同一致的值的話,則會回傳真;如果沒有一致的值的話,則會回傳假。

NOT運算子

語法
NOT 式
範例
SELECT * FROM store WHERE NOT class='food';
說明
NOT 運算子是當右邊的式之值為真時回傳假,為假時回傳真的運算子。

OR運算子

語法
條件式 OR 條件式
範例
SELECT * FROM store WHERE class='food' OR class='office';

ALL 運算子

語法
WHERE 式 比較運算子 ALL (子查詢)
範例
SELECT * FROM store WHERE class = ALL(SELECT class FROM store WHERE class='food');
說明
ALL 運算子是用來由子查詢所傳回來的結果中,滿足所有條件的資料。ALL運算子會依據比較運算子來對每一個值與式子的值進行比較,對所有值都滿足條件時傳回真。例如子查詢的結果傳回三個值,三個值會與比較運算子中指定的條件做判斷,當滿足所有指定條件時回傳真。反之,只要具有任一不滿足的條件則傳回假。傳回真的值會被傳回主查詢中。

ANY運算子

語法
WHERE 式 比較運算子 ANY (子查詢)
範例
SELECT * FROM store WHERE class= ANY (SELECT class FROM store
WHERE class='food');
說明
ANY 運算子是用來求子查詢所傳回結果的值中,滿足任一條件的資料。ANY 運算子會依據比較運算子將每一個值與運算式中的值進行比較,只要滿足其中一條件就會傳回真。例如子查詢傳回三個值得話,這三個值都會對比較運算子中指定的條件進行判斷,只要滿足其中一條件的話就會回傳真。

ANY 與SOME運算子式相同的計算方式。另外如果要求滿足所有條件的時候,則使用ALL運算子。

EXISTS 運算子

語法
WHERE EXISTS (子查詢)
範例
SELECT * FROM store WHERE EXISTS (SELECT class FROM store WHERE class = 'food');

說明
EXISTS 運算子是用來確認子查詢所傳回的結果集合中,是否存在結果的運算子。當存在的情形下則傳回真。

SOME運算子

語法
WHERE 式 比較運算子 SOME(子查詢)
範例
SELECT * FROM store WHERE class = SOME(SELECT class FROM store WHERE class='food');

說明
功能與ANY運算子相同的功能。

LIKE 運算子

語法
式 LIKE<搜尋條件>
範例
SELECT * FROM store WHERE price LIKE '4%';

說明
LIKE運算子又稱為萬用字元搜查。
萬用字元搜查顧明思義就是透過萬用字元%來進行搜尋,語法為(LIKE%xxx%)則會傳回內容包含xxx的值;如果要搜尋開頭為xxx,語法為(LIKExxx%);搜尋結尾為xxx,語法為(LIKE%xxx)。

REGEXP運算子

語法
式 REXGEXP 正規表達式
REXGEXP運算子是用來進行POSIX正規表達式的樣式比對運算子。其與LIKE相同,但是在指定樣式時可以使用正規表示式。
引數為中介字元,有以下幾種:
^ :對字串開頭進行比對
$ :對字串結尾做比對
. :對所有文字進行比對
a* :對連續0個以上的a進行比對
a+ :對連續1個以上的a進行比對
a? :對0個或1個以上的a進行比對
de|abc :對連續的de或abc進行比對
(abc)* :對連續0個以上的abc進行比對
(abc)+ :對連續1個以上的abc進行比對
(abc)- :對0個或1個以上的abc進行比對
{} :指定樣式的重複
[] :指定候選文字的集合

範例
SELECT * FROM store WHERE name REGEXP 'c+';
說明:搜尋字串有c的資料。

範例
SELECT * FROM store WHERE name REGEXP '(tooth)+';
說明:搜尋字串有tooth的資料。

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

運算子

加法運算子

數值+數值
日期+數值
字串+字串
範例
:
SELECT INTERVAL 3 MONTH + '2012-12-31' newdate;
說明:
在MYSQL中,在加法運算子的任何一側加上INTERVAL關鍵字,然後接著指定數值以及日期型別,這樣也可以進行針對日期型別與數值型別的加種。本例子中簡單的要求將「2012-12-31」加上三個月後的結果。

減法運算子

數值-數值
日期-數值
字串-字串
範例
:
SELECT a,b,a-b total FROM number;
SELECT '2014-09-01' - INTERVAL 1 HOUR newtime;
說明:
INTERVAL 在減法運算子的右側加上INTERVAL 指令,然後放上數值以及日期類型的話,可以將日期型別的值減去數值型別的值。

乘法運算子

數值*數值
範例
:
SELECT a,a*2 FROM number;

除法運算子

數值/數值
範例
:
SELECT a,a/7 FROM number;

餘數運算子

數值%數值
範例
:
SELECT a,a%5 FROM number;

比較運算子

等於運算子

數值=數值
日期=數值
字串=字串
範例
:
SELECT * FROM number WHERE a=1;
說明:
等於運算子是用來比較左邊與右邊是否相等的判斷式,在相等的情況為真,不相等的情況回傳為假。一般來說,等於運算子在使用WHERE敘述式的條件居多。

大於運算子

數值>數值
日期>數值
字串>字串
範例
:
SELECT * FROM number WHERE a>1;
SELECT * FROM number WHERE a>b;

大於等於運算子

數值>=數值
日期>=數值
字串>=字串
範例
:
SELECT * FROM number WHERE a>=1;

小於運算子

數值<數值
日期<數值
字串<字串
範例
:
SELECT * FROM number WHERE a<b;

不等於運算子

數值<>數值    數值!=數值
日期<>數值 日期!=數值
字串<>字串 字串!=字串
範例
:
SELECT * FROM number WHERE a!=b;
SELECT * FROM number WHERE a<>b;

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

INSERT INTO 插入資料
INSERT INTO TABLE(欄位,欄位...)
VALUES (值,值...)
範例
INSERT INTO sample(ID,name,price)
values(001,'cola',30);
INSERT INTO sample(ID,name)
values(001,'tea');
上述SQL敘述,沒有指定price欄位,所以自動補上NULL(空值)。
將SELECT的結果輸出到另一個資料表-INSERT INTO
INSERT INTO TABLE1(欄位,欄位...)
SELECT (欄位名稱) (欄位名稱)...
FROM (表格名稱)
WHERE (搜尋條件)
範例
INSERT INTO people(ID,name,age) SELECT * FROM people;

INSERT INTO people SELECT * FROM people;
INSERT INTO people(age) SELECT sum(age) FROM people;
UPDATE 更新資料
UPDATE TABLE
SET 欄位名稱=更新值, 欄位名稱=更新值...
WHERE (搜尋條件)
範例
UPDATE people set age=34 WHERE ID=6;
DELETE 刪除資料
DELETE FROM TABLE
WHERE (搜尋條件)
 DELETE語法是指定資料表然後刪除符合條件的值。通常使用時,會透過WHERE加入條件判斷,並刪除指定資料。如果沒有加上WHERE指定搜尋條件的情況,則會將資料表中所有資料刪除。另外TRUNCATE TABLE語法也是將資料表清空的指令。
範例
DELETE FORM people WHERE ID=7;

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

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 ;