# SQL Syntax 
## 📌What is SQL?
SQL的全名是結構化查詢語言。簡單來說,它就是一門**查詢資料庫的程式語言**。
## 📌SQL Operators
### ==算術運算子(Arithmetic Operator)==
| 運算子 | 語意 | 用法 |
|:------:|:----:|:----:|
| + | 加 | 1+2 |
| - | 減 | 1-2 |
| * | 乘 | 1*2 |
| / | 除 | 1/2 |
| % | 餘 | 1%2 |
### ==比較運算子(Comparison Operator)==
| 運算子 | 語意 | 用法 |
|:-------:|:----------------:|:------:|
| < | 小於 | 1 < 2 |
| > | 大於 | 2 > 1 |
| <= | 小於等於 | 1 <= 2 |
| >= | 大於等於 | 2 >= 1 |
| = | 等於 | 1 = 1 |
| <> | 不等於 | 1 <> 2 |
| BETWEEN | 在某個範圍內 | |
| LIKE | 符合模式條件 | |
| IN | 值存在於IN集合中 | |
### ==邏輯運算子(Logical Operator)==
| 運算子 | 語意 |
|:------:|:----:|
| AND | 且 |
| OR | 或 |
| NOT | 非 |
### ==其他符號==
| 符號 | 語意 |
|:-----:| ---------------------------------- |
| * | ALL |
| ' ' | 中間輸入特定值,主要是用於加入字串 |
| - - | 後面可輸入註解,不會被程式語言讀入 |
| /* */ | 中間可輸入註解,不會被程式語言讀入 |
| ASC | 升冪排列 |
| DESC | 降冪排列 |
| % | 代表零個、一個或數個字母 (Wildcard)[^first] |
| _ | 代表剛好一個字母 (Wildcard) |
[^first]: Wildcard就是萬用字元的意思。
## 📌SQL Basic Syntax
### ==SELECT==
``` SQL=
SELECT 欄位名稱
FROM 表名
```
### ==SELECT DISTINCT==
``` SQL=
SELECT DISTINCT 欄位名稱
FROM 表名
```
### ==WHERE==
``` SQL=
SELECT 欄位名稱
FROM 表名
WHERE 條件
```
### ==AND/OR==[^second]
```SQL=
SELECT 欄位名稱
FROM 表名
WHERE 簡單條件
{[AND|OR]簡單條件}+;
```
[^second]:{}+代表{}之內的情況會發生一或多次。
### ==IN==
``` SQL=
SELECT 欄位名稱
FROM 表名
WHERE 欄位名稱 IN ('值1', '值2', ...);
```
### ==BETWEEN==
``` SQL=
SELECT 欄位名稱
FROM 表名
WHERE 欄位名稱 BETWEEN '值1' AND '值2';
```
### ==LIKE==
``` SQL=
SELECT 欄位名稱
FROM 表名
WHERE 欄位名稱 LIKE {模式};
```
### ==ORDER BY==
```sql=
/*預設為ASC*/
SELECT 欄位名稱1, 欄位名稱2...
FROM 表名
ORDER BY 欄位名稱1 ASC|DESC, 欄位名稱2 ASC|DESC...
```
### ==AS==
```sql=
/*表名取別名*/
SELECT 欄位名稱1, 欄位名稱2, 欄位名稱3...
FROM 表名 AS 別稱;
```
**or**
```sql=
/*欄位名稱取別名*/
SELECT 欄位名稱 AS 別稱
FROM 表名;
```
## 📌SQL "JOIN"
JOIN是結合多個表並組成一個暫時性資料表以供資料查詢,在原各資料表中之紀錄及結構皆不會因此查詢而改變。
### ==INNER JOIN==
```sql=
SELECT 欄位名稱1, 欄位名稱2...
FROM 表名1
INNER JOIN 表名2
ON 表名1.欄位名稱=表名2.欄位名稱;
```
**or**
```sql=
SELECT 欄位名稱1, 欄位名稱2...
FROM 表名1
INNER JOIN 表名2
USING (欄位名稱);
```
### ==LEFT JOIN==
``` sql=
SELECT 欄位名稱1, 欄位名稱2...
FROM 表名1
LEFT JOIN 表名2
ON 表名1.欄位名稱=表名2.欄位名稱;
```
### ==RIGHT JOIN==
```sql=
SELECT 欄位名稱1, 欄位名稱2···
FROM 表名1
RIGHT JOIN 表名2
ON 表名1.欄位名稱=表名2.欄位名稱;
```
### ==FULL JOIN==
```sql=
/*LEFT JOIN 和 RIGHT JOIN的聯集*/
SELECT 欄位名稱1, 欄位名稱2...
FROM 表名1
FULL JOIN 表名2
ON 表名1.欄位名稱=表名2.欄位名稱;
```
### ==CROSS JOIN==
當你在結合兩個資料表時,且不指定任何條件,將兩個資料表中所有的可能排列組合出來。另外,當有 WHERE、ON、USING 條件時不建議使用。
```sql=
SELECT 欄位名稱, 欄位名稱2...
FROM 表名1
CROSS JOIN 表名2;
```
**or**
```sql=
SELECT 欄位名稱1, 欄位名稱2...
FROM 表名1, 表名2;
```
**or**
```sql=
SELECT 欄位名稱1, 欄位名稱2...
FROM 表名1
JOIN 表名2;
```
### ==NATURAL JOIN==
兩資料表之間同名的欄位會被自動結合在一起。
```sql=
SELECT 欄位名稱1, 欄位名稱2...
FROM 表名1
NATURAL JOIN 表名2;
```
## 📌SQL Combining two tables
UNION 與 JOIN 不同的地方在於,JOIN 是作橫向結合(合併多個資料表的各欄位);而 UNION則是作垂直結合(合併多個資料表中的紀錄)。
### ==Horizontal Combination==
``` SQL=
SELECT *
FROM A, B
WHERE A.ID = B.ID /*Combine the same ID elements in Table A & B*/
```

### ==Vertical Combination==
``` SQL=
SELECT *
INTO B /*Store to the new table B*/
FROM A1
UNION ALL
SELECT *
FROM A2
```

## 📌Other Syntax
### ==INTERSECT==
```sql=
SELECT 欄位名稱(s) FROM 表名1
INTERSECT
SELECT 欄位名稱(s) FROM 表名;
```
### ==MINUS==
```sql=
SELECT 欄位名稱(s) FROM 表名1
MINUS
SELECT 欄位名稱(s) FROM 表名2;
```
### ==Subquery==
```sql=
SELECT 欄位名稱1, 欄位名稱2, 欄位名稱3...
FROM 表名
WHERE 欄位名稱 比較運算子 (SELECT 子查詢);
```
### ==EXISTS==
若EXISTS為真,會繼續執行外查詢中的SQL;若EXISTS為假,則不會返回任何結果。
```sql=
SELECT * FROM 表A
WHERE EXISTS
(SELECT * FROM 表B WHERE 表B.id=表A.id);
```
### ==CASE==
```sql=
CASE
WHEN 條件 THEN 結果
[WHEN BLABLABLA]
[ELSE 結果]
END;
```
**or**
```sql=
CASE 敘述
WHEN 值 THEN 結果
[WHEN BLABLABLA]
[ELSE 結果]
END;
```
:::warning
:zap::zap::zap:注意 :zap::zap::zap:
:::
> 除了以上的語法,SQL仍有其他更細節的語法,想找尋更深入的內容都可以點選References的連結去看更詳細的SQL語法和函數,這裡只列出較為常用的XD
## 📌Comments
Please feel free to correct my mistakes in the article😊.
If u have any further questions or cooperation opportunities, please contact me via
Email📬: willie880201044@gmail.com
## 📌References
1. SQL教學講義: https://reurl.cc/EnNlLn
2. SQL語法教學: https://www.1keydata.com/tw/sql/sqlorderby.html
3. Fooish 程式技術: https://reurl.cc/Nrd4kx