SQL Tutorial for Beginners
===
語法教學:
---
1. Choose Database
```
USE [database];
```
DB中選擇要使用的DB空間。
2. SELECT Statement / Clause, WHERE Clause
```
SELECT [DISTINCT][database.table.column / * FOR All / Math Operator Use ] AS [new column name]
FROM [database.table]
WHERE [NOT][set codition to query] // != same with <>
ORDER BY [database.table.column / Operation] [DESC]
```
在 [SELECT] 中選擇欄位名稱,並設定table路徑 [FROM] table名稱。透過設定條件 [WHERE] 篩選資料後,可利用 [ORDER BY] 針對某欄位資料進行排序。若篩選條件大於2,則利用 [AND] / [OR],作為使用。此外, [DISTINCT] 語法可去除重複性資料, [DESC] 可逆序排列。
3. LIKE Operator
```
WHERE last_name [NOT][LIKE] 'b%'
```
本段主要用於篩選字符開頭為b的姓名,該方式不限字串長度,表達式有'b%' / '%b%' / '%b'。若需要設定字串長度,則使用 _ 符號作為使用。
4. NULL Operator
```
WHERE phone IS [NOT] NULL
```
適用於篩選空值。
5. LIMIT Clause
```
FROM customers
LIMIT 10
LIMIT 6,3
```
基礎而言,可顯示前幾筆資料,但此語法務必排列在程式碼最後段。若要分頁抽出顯示,如第6頁的前三位。
6. INNER JOIN
```
SELECT *
FROM orders
[INNER] JOIN customers
ON orders.customer_id = customers.customer_id
```
本段主要與合併table,並利用 [on] 語法作為合併配對值。
7. Joining Across Database
```
USE sql_inventory;
SELECT *
FROM sql_store.order_items oi
JOIN products p
ON oi.product_id = p.product_id
```
本段主要是跨DB進行table合併,並建立新的table於其他DB空間中。
8. Self Join
```
USE sql_hr;
SELECT
e.employee_id,
e.first_name,
m.first_name [AS] manager
FROM employees e
JOIN employees m
ON e.reports_to = m.employee_id
```
本段主要是在同一個DB下進行篩選並建立新的DB儲存資料。該段透過對象屬性進行對經理之匹配,最終建立經理DB。
9. Multiple Table
```
USE sql_store;
SELECT
o.order_id,
o.order_date,
c.first_name,
c.lst_name,
os.name [AS] status
FROM orders o
JOIN customers c
ON o.customer_id = c.customer_id
JOIN order_statuses os
ON o.status = os.order_status_id
```
本段主要將多合格DB與Table情況下,對貨品狀態進行合併,最終Query出最淺顯易懂的Table。一般企業裡,不會只有兩三個Table合併,可能出現10個以上都是必然的。
10. Compound Join Conditions
```
SELECT *
FROM order_items oi
JOIN order_item_notes poin
ON io.order_id = oin.order_id
AND oi.product_id = oin.product_id
```
本段表示在合併時針對多項屬性進行設定。
11. Outer Joins
```
SELECT
c.customer_id,
c.first_name,
o.order_id
FROM orders o
[LEFT/RIGHT] [OUTER] JOIN customers c
ON c.customer_id = o.customer_id
ORDER BY c.customer_id
```
本段表示若要顯示非符合合併條件時,一併列合併後之結果,可透過 [LEFT / RIGHT] 的形式去指定Table作合併,則 [OUTER] 可選擇性輸入。那是因為在設定 [JOIN | ON] 時,預設為Inner Join,若加上 [LEFT / RIGHT] 之後,顧名思義就是Outer Join。
12. Outer Joins Between Multiple Tables
```
SELECT
c.customer_id,
c.first_name,
o.order_id,
sh.name [AS] shipper
FROM orders o
LEFT [OUTER] JOIN customers c
ON c.customer_id = o.customer_id
LEFT [OUTER] JOIN shippers sh
ON o.shipper_id = sh.shipper_id
ORDER BY c.customer_id
```
本段主要說明如何將多個Table下,合併資料,因此延續上題例子,將shippers id插入,並全部顯示。
不過需要注意的是,在合併時不要過於複雜交互使用 [LEFT / RIGHT],可能導致其他人難以理解程式碼所執行的本意。
13. Self Outer Joins
```
USE sql_hr;
SELECT
e.employee_id,
e.first_name,
m.first_name [AS] manager
FROM employees e
LEFT JOIN employees m
ON e.reports_to = m.employee_id
```
本段想找出員工與經理之關係,最終因為經理本身不屬任何上司,因此利用Outer Join的形式,將經理個人資料顯示出來。
14. Natural Joins(不推薦使用)
```
SELECT
o.order_id,
c.first_name
FROM orders o
NATURAL JOIN customers c
```
本段主要功能為系統針對兩個Table之間相同的屬性名稱進行自動配對,但其存在一定的危險性,除無法控制合併屬性外,可能產生出意想不到的顯示結果。
15. Cross Joins
```
SELECT
c.first_name [AS] customer,
p.name [AS] product
FROM customers c
CROSS JOIN products p
ORDER BY c.first_name
or
SELECT
c.first_name [AS] customer,
p.name [AS] product
FROM customers c,products p
ORDER BY c.first_name
```
本段描述當使用Cross Join時,會將兩Table直接合併(在第一部分資料結束後銜接上)。
16. Unions
```
SELECT
order_id,
order_date,
'Active' [AS] status
FROM orders
WHERE order_date >= '2019-01-01'
UNION
SELECT
order_id,
order_date,
'Archived' [AS] status
FROM orders
WHERE order_date < '2019-01-01'
```
本段主要講述當兩個或以上Statement結果需要合併成一份Table時,可透過UNION進行串接並顯示。但此功能只能用在不同Statement下相同的欄位數,不然會顯示Error。
17. Column Attributes
![](https://i.imgur.com/R0oyXz9.png)
注意事項:
(1)Column :欄位名稱
(2)Datatyple : 資料格式
【[CHAR 與 VARCHAR 的區別](https://blog.csdn.net/Gane_Cheng/article/details/52316408)】
(3)欄位縮寫:
PK :Primary Key
NN :Not NULL
UQ :
BIN:
UN :
ZF :
AI :Auto Increment(搭配PK使用) // 每次新增一筆資料,將自動插入自訂格式之內容或數字
G :
18. Inserting a Single Row
```
INSERT INTO customers [(
first_name,
last_name,
birth_date,
address,
city,
state)] //如果自訂輸入內容或者順序可以編寫該內容
VALUES (
DEFAULT,
'John',
'Smith',
'1990-08-21',
NULL,
'address'
'city',
'CA',
DEFAULT)
```
本段講述如何匯入單筆資料,且匯入之資料需格式化時,可按照上述方式,在申明INSERT之後,掛號輸入相關資料順序。
19. Inserting a Multiple Row
```
INSERT INTO shippers(name)
VALUES ('Shipper1'),
('Shipper2'),
('Shipper3')
```
本段描寫如何匯入多筆資料之方式。
20. Inserting Hierarchical Rows
```
INSERT INTO orders(customer_id,order_date,status)
VALUES (1,'2019-01-02',1);
INSERT INTO order_items,
VALUES
(LAST_INSRT_ID(),1,1,2.95),
(LAST_INSRT_ID(),2,1,3.95)
```
本段主要同時匯入資料至不同Table,透過利用SQL內建函數 [LAST_INSERT_ID()] ,找到最後一筆資料內容後,將以設定好之函式與其作用。
21. Creating a Copy of Table
```
// 建立現有Table
CREATE TABLE orders_archieved AS
SELECT * FROM orders
// 滑鼠移到該Table,右鍵點擊選擇『Truncate Table』,清楚內容
// 從其他Table中進行條件Query, 並將資料整理後匯入 orders_archieved
INSERT INTO orders_archieved
SELECT *
FROM orders
WHERE order_date < '2019-01-01'
```
本段講解如何從現有Table複製並建立相同Table,接著透過條件Query,把其他Table中的內容匯入至現有Table中。
× 進階題
```
USE sql_invoicing;
CREATE TABLE invoices_archievec AS
SELECT
i.invoice_id,
i.number,
c.name [AS] client,
i.invoice_total,
i.payment_total,
i.invoice_date,
i.payment_date,
i.due_date
FROM invoices i
JOIN clients c
USING (client_id)
WHERE payment_date IS NOT NULL
```
本段程式是透過跨Table進行Query,並將現有Table內容進行覆蓋。
22. Updating a Single Row
```
UPDATE invoices
SET
payment_total = 10, // 可以以Null形式上傳或函數計算
payment_date = '2019-03-01'
WHERE invoice_id = 1
```
本段講述如何更新有關條件下的內容。
23. Updating a Multiple Row
```
UPDATE invoices
SET
payment_total = 10, // 可以以Null形式上傳或函數計算
payment_date = '2019-03-01'
WHERE invoice_id IN (3,4)
```
本段主要講述如何同時跟新所有Table有關的invoice_id。首先,點擊MySQLWorkbench, 選擇『Preferences』,然後點擊『SQL Editor』,解除打勾『Safe Updates』,然後重啟MySQL後執行以上程式即可。
![](https://i.imgur.com/YyY2aKc.png)
24. Using Subqueries in Updates
```
UPDATE invoices
SET
payment_total = invoice_total * 0.8, // 可以以Null形式上傳或函數計算
payment_date = due_date
WHERE invoice_id =
(SELECT cliend_id
FROM clients
WHERE name = 'Myworks')
```
本段主要描述當我們不知道client_id時,利用Query方式找到client_id後,將其回傳給條件函式中。
25. Deleting Data
```
DELETE FROM invoices
WHERE invoice_id = (
SELECT *
FROM clients
WHERE name = 'Myworks')
```
本段說明如何透過相關條件去刪除有關資料。
**特殊使用式 :**
===
[OR]
```
WHERE state = 'VA' [OR] state = 'GA' [OR] state = 'FL'
WHERE state [NOT][IN] ('VA','FL','GA')
```
[Operator]
```
WHERE points >= 1000 [AND] points <= 3000
WHERE points [BETWEEN] 1000 [AND] 3000
```
[REGEXP]
```
WHERE last_name LIKE '%field%'
WHERE last_name REGEXP 'field'
***【^ FOR additional side】
***【$ FOR fixed word】
***【| FOR meaning of 'AND'】
***【[] FOR optional condition,eg [gim]】
***【- FOR multi condition,eg '[a-h]e'】
```
[AS like python]
```
SELECT order_id,o.customer_id
FROM orders o
JOIN customers c
ON o.customer_id = c.customer_id
```
[Implicit Join Syntax]
```
SELECT *
FROM orders o
JOIN customers c
ON o.customer_id = c.customer_id
SELECT *
FROM orders o, customers c
WHERE o.customer_id = c.customer_id
// Remember to set WHERE condition, otherwise it would cross join the table
```
[USING]
```
[LEFT / RIGHT] JOIN customers c
ON o.customers_id = c.customer_id
AND oi.product_id = oin.product_id
[LEFT / RIGHT] JOIN customers c
USING (customer_id,product_id)
```