Skip to content

Instantly share code, notes, and snippets.

@sefx5ever
Created October 18, 2019 01:28
Show Gist options
  • Save sefx5ever/0168a907193e59395ad962bbd6b714a3 to your computer and use it in GitHub Desktop.
Save sefx5ever/0168a907193e59395ad962bbd6b714a3 to your computer and use it in GitHub Desktop.

SQL Tutorial for Beginners

語法教學:

  1. Choose Database
USE [database]; 

DB中選擇要使用的DB空間。

  1. 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] 可逆序排列。

  1. LIKE Operator
WHERE last_name [NOT][LIKE] 'b%'

本段主要用於篩選字符開頭為b的姓名,該方式不限字串長度,表達式有'b%' / '%b%' / '%b'。若需要設定字串長度,則使用 _ 符號作為使用。

  1. NULL Operator
WHERE phone IS [NOT] NULL

適用於篩選空值。

  1. LIMIT Clause
FROM customers
LIMIT 10
LIMIT 6,3

基礎而言,可顯示前幾筆資料,但此語法務必排列在程式碼最後段。若要分頁抽出顯示,如第6頁的前三位。

  1. INNER JOIN
SELECT *
FROM orders
[INNER] JOIN customers
    ON orders.customer_id = customers.customer_id

本段主要與合併table,並利用 [on] 語法作為合併配對值。

  1. 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空間中。

  1. 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。

  1. 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個以上都是必然的。

  1. 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

本段表示在合併時針對多項屬性進行設定。

  1. 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。

  1. 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],可能導致其他人難以理解程式碼所執行的本意。

  1. 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的形式,將經理個人資料顯示出來。

  1. Natural Joins(不推薦使用)
SELECT 
    o.order_id,
    c.first_name
FROM orders o
NATURAL JOIN customers c

本段主要功能為系統針對兩個Table之間相同的屬性名稱進行自動配對,但其存在一定的危險性,除無法控制合併屬性外,可能產生出意想不到的顯示結果。

  1. 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直接合併(在第一部分資料結束後銜接上)。

  1. 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。

  1. Column Attributes 注意事項: (1)Column :欄位名稱 (2)Datatyple : 資料格式 【CHAR 與 VARCHAR 的區別】 (3)欄位縮寫: PK :Primary Key NN :Not NULL UQ : BIN: UN : ZF : AI :Auto Increment(搭配PK使用) // 每次新增一筆資料,將自動插入自訂格式之內容或數字 G :

  2. 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之後,掛號輸入相關資料順序。

  1. Inserting a Multiple Row
INSERT INTO shippers(name)
VALUES ('Shipper1'),
       ('Shipper2'),
       ('Shipper3')

本段描寫如何匯入多筆資料之方式。

  1. 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()] ,找到最後一筆資料內容後,將以設定好之函式與其作用。

  1. 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內容進行覆蓋。

  1. Updating a Single Row
UPDATE invoices
SET 
    payment_total = 10, // 可以以Null形式上傳或函數計算
    payment_date = '2019-03-01'
WHERE invoice_id = 1

本段講述如何更新有關條件下的內容。

  1. 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後執行以上程式即可。

  1. 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後,將其回傳給條件函式中。

  1. 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment