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) ```