Categories: SQL

SQL 語法筆記

本文會介紹SQL 基本語法, 進階查詢, 計算函式, 彙總函式 和表格連接的語法。

1. 基本語法

1.1 創建資料表

CREATE TABLE

CREATE TABLE table_name (
   column_1 data_type, 
   column_2 data_type, 
   column_3 data_type
);
CREATE TABLE celebs (
    id INTEGER,
    name TEXT, 
    age INTEGER
);
CREATE TABLE celebs (
   id INTEGER PRIMARY KEY, 
   name TEXT UNIQUE,
   date_of_birth TEXT NOT NULL,
   date_of_death TEXT DEFAULT 'Not Applicable',
);
  1. PRIMARY KEY:可用於資料的唯一識別,不能重複,一個資料只能有一個欄位是 PRIMARY KEY。
  2. UNIQUE:與 PRIMARY KEY 很像,不過它可以設置在一個資料的多個欄位
  3. NOT NULL:強制該欄位一定要給定值
  4. DEFAULT:如果欄位沒有值,會自動定預設值

1.2 刪除資料表

DROP DATABASE

DROP DATABASE table_name;

1.3 新增資料

INSERT INTO

INSERT INTO table_name (id, name, age)
VALUES (1, 'Justin Bieber', 21);

SELECT * FROM table_name;

1.4資料表查詢

SELECT

SELECT column_name FROM table_name;
SELECT * FROM table_name;

1.5 更新資料

UPDATE

UPDATE celebs
SET age = 22
WHERE id = 1;

1.6 改變資料表欄位

ALTER TABLE

  • 新增欄位
ALTER TABLE celebs 
ADD COLUMN twitter_handle TEXT;
  • 刪除欄位
ALTER TABLE celebs
DROP COLUMN twitter_handle;
  • 修改欄位
    • SQL Server / MS Access
      ALTER TABLE celebs
      ALTER COLUMN twitter_handle INTEGER;
    • My SQL / Oracle (prior version 10G)
      ALTER TABLE celebs
      MODIFY COLUMN twitter_handle INTEGER;
    • Oracle 10G and later
      ALTER TABLE celebs
      MODIFY twitter_handle INTEGER;

1.7 刪除資料

DELETE FROM

DELETE FROM celebs
WHERE twitter_handle IS NULL;

2. 進階查詢語法

2.1 SELECT

查詢結果顯示 name, genre, year

SELECT name, genre, year
FROM movies;

2.2 AS

可以改變查詢結果的欄位名稱,但不會改掉資料表裡的欄位

SELECT imdb_rating AS 'IMDb' 
FROM movies;

2.3 SELECT DISTINCT

去掉的重複的查詢結果

  • 去掉 year 重複的結果
    SELECT DISTINCT year
    FROM movies;

  • 去掉 year 和 name 都重複的結果
    SELECT DISTINCT year, name
    FROM movies;

2.4 WHERE

篩選資料用的

SELECT *
FROM movies
WHERE year > 2014;

:::danger
「等於」要特別注意,只有一個等號

2.5 LIKE

可以在 WHERE 子句中使用 LIKE 運算子來進行模糊搜尋

SELECT *
FROM movies
WHERE name LIKE 'Se_en';

:::info
_ 代表任意字元
:::

SELECT * 
FROM movies
WHERE name LIKE 'A%';
  • A% 代表由 A 開頭
  • %A 代表由 A 結尾
  • %man% 代表所有含有 man 的字串

2.6 NULL

NULL 不能拿來用運算子進行比較,因此出現 IS NULL、IS NOT NULL 來判斷是否是 NULL。

  • 顯示具有 imdb_rating 的資料
    SELECT name
    FROM movies 
    WHERE imdb_rating IS NOT NULL;

2.7 BETWEEN

可以在 WHERE 子句中使用 BETWEEN 運算子來篩選出特定範圍區間得值

篩選出 name 開頭為 ‘A’、‘B’、‘C’ 的結果

SELECT *
FROM movies
WHERE name BETWEEN 'A' AND 'D';

篩選出 year 在 1990 ~ 1999 區間的結果

SELECT *
FROM movies
WHERE year BETWEEN 1990 AND 1999;

:::warning
BETWEEN 兩個字串,會不包含結尾
BETWEEN 兩個數字,會包含結尾的數字
:::

2.8 AND

SELECT * 
FROM movies
WHERE year BETWEEN 1990 AND 1999
   AND genre = 'romance';

2.9 OR

SELECT *
FROM movies
WHERE genre = 'romance'
  OR genre = 'comedy';

2.10 ORDER BY

用來排序結果

:::warning
如果 WHERE 存在,ORDER BY 永遠跟在 WHERE 後面
:::

  • DESC:從大到小排序
  • ASC:從小到大排序(預設)

2.11 LIMIT

用來限制查詢結果數量

SELECT *
FROM movies
ORDER BY imdb_rating DESC
LIMIT 3;

:::warning
永遠放在查詢語法最後面
:::

:::info
不是所有 RDBMS(關聯式資料庫管理系統) 都有
:::

2.12 CASE

SQL 中的判斷式,可以用在顯示結果加上新欄位

:::info
CASE 通常在 SELECT 語句中
:::

  • WHEN 後面接著條件式,如果條件式為真,會返回 THEN 後面的字串
  • ELSE 會在前面條件式都不符合的時候,返回一個字串
  • CASE 結尾一定要有一個 END
  • 可以在 END 後面接 AS 來簡稱該條件的欄位名稱
SELECT name,
    CASE
        WHEN genre = 'romance' THEN 'Chill'
        WHEN genre = 'comedy' THEN 'Chill'
        ELSE 'Intense'
    END AS 'Mood'
FROM movies;

3. 計算函式

3.1 Count

計算指定欄位非空資料的總數

SELECT COUNT(*) 
FROM fake_apps
WHERE price = 0;

3.2 SUM

加總指定欄位的值

SELECT SUM(downloads)
FROM fake_apps;

3.3 MAX / MIN

求指定欄位的最大或最小值

SELECT MIN(downloads)
FROM fake_apps;

3.4 AVERAGE

求指定欄位的平均值

SELECT AVG(price)
FROM fake_apps;

3.5 ROUND

將指定資料四捨五入

SELECT ROUND(AVG(price), 2)
FROM fake_apps;

4. 彙總函式

4.1 GROUP BY

用來搭配 SELECT 語句,將指定欄位中,相同資料的放在一組,以便計算函式以組為單位進行計算

:::info
GROUP BY 會出現在 WHERE 之後,ORDER BY 和 LIMIT 之前
:::

SELECT category, SUM(downloads) 
FROM fake_apps
GROUP BY category;

GROUP BY 後面的參數可以接數字,從 1 開始,分別代表 SELECT 後面的第幾個值

SELECT category, 
   price,
   AVG(downloads)
FROM fake_apps
GROUP BY 1, 2;

以上面的例子來說,GROUP BY 後面的 1、2 分別指向 category 和 price

4.2 HAVING

與 WHERE 類似,不過他是針對 Group

:::info
HAVING 會出現在 GROUP BY 之後,ORDER BY 和 LIMIT 之前
:::

SELECT price, 
   ROUND(AVG(downloads)),
   COUNT(*)
FROM fake_apps
GROUP BY price
HAVING COUNT(*) > 10;

5. 表格連接

5.1 JOIN

使用方法:JOIN 表格名稱 ON 連接欄位規則

連接後會自動補 NULL

SELECT *
FROM orders
JOIN customers
  ON orders.customer_id = customers.customer_id;

5.2 INNER JOIN

使用方法:INNER JOIN 表格名稱 ON 連接欄位規則

會自動將不符合連接欄位規則的部分捨棄,如下圖

SELECT COUNT(*)
FROM newspaper
JOIN online
ON newspaper.id = online.id;

文章出處:BlackMaple’s Blog

Facebook Comments
tina

Share
Published by
tina

Recent Posts

新使用者留存率分析

https://www.youtube.com/watch?v=MEydBzWAABo newn

3 years ago

Retention 留存率分析Part 1 – 帶你認識基本的留存率分析架構

Part 2 留存用戶分析~加入會員即可觀看,免費體驗一個月,活動請參考: https://blog.codeformarketing.co/subscribe-pressplay-dija/

3 years ago

CFM電子報第四期

Hello 各位讀者~本期為第四期電子報,本次電子報我們將帶大家來看看一些最新的行銷時事以及工具的更新的有趣內容! 目錄: Google網址檢查工具現在可以顯示多個參照網頁了 舊版的Google取消連結工具將在2021年1月19日終止服務 Google Search Console要使用者透過完成驗證程序來證明自己是資源的擁有者 Google搜尋出現內容複製鏡像網站的Canonical Bug Google解釋為何一些使用不良SEO策略的網站仍有不錯的排名 Google正在致力於改善robots.txt測試工具 Google Ads身分驗證制度即將上路 這些常見的SEO錯誤會有害於你的排名 Google指出:太專注於一種SEO策略可能會有害於整體SEO結果 Google面臨的反信任訴訟對行銷人會有什麼影響? Google在華盛頓的暴力事件後暫停投放政治廣告 Google網址檢查工具現在可以顯示多個參照網頁了 Google近期在Google網站管理員的網址檢查工具中,讓一些URL可以顯示多個參照網頁了。…

3 years ago

CFM 電子報第三期

Hello 各位讀者~本期為第三期電子報,本次電子報我們將帶大家來看看一些最新的行銷時事以及工具的更新的有趣內容! 目錄: 英國「Watchdog」對Google Ads的數據政策變更展開調查 你可以使用資料排除功能來避免轉換追蹤問題影響智慧出價 2021年SEO數位行銷的七個潮流 英國「Watchdog」對Google Ads的數據政策變更展開調查 英國的組織Watchdog已經開始針對Google近期對廣告數據系統的大翻新計畫展開調查,因為Watchdog認為這次的翻新可能會讓Google在線上廣告產業中,排除更多競爭對手。 英國的政府機構「競爭及市場管理局」(Competition and Markets Authority, CMA)聲明其將會針對Google近期關於從Chrome和Chromium架構的瀏覽器引擎中,移除第三方cookie的改變展開調查。 Cookie是小型文字檔案,是某些網站為了記錄使用者資訊(例如使用者名稱)而儲存在用戶端上的資料。它能幫助企業更有效率的鎖定客群投放廣告,對提供免費內容的網站也相當有幫助,但它也能用來記錄使用者在網路上的行徑。 Google在2022年即將推出的「數位沙盒」(digital sandbox)提案中,提到以自家的工具替代第三方cookie的計畫。但Watchdog認為這樣的改變會削弱出版者盈利的能力,以及破壞數位廣告競爭,讓Google更加根深蒂固的壟斷市場。 競爭及市場管理局的執行長Andrea Coscelli聲明:…

3 years ago