SQL | 語法基礎篇 (2)

更新 發佈閱讀 5 分鐘

繼之前的 SQL CRUD、運算子、函式之後,今天來寫 SQL 很常用到的指令 JOINJOIN的功能呢,就是建立資料表之間的聯繫。

前一篇文章裡,已經建立了三個資料表:drinks、customers、orders。接下來會說明如何用JOIN讓他們產生關聯。



JOIN

為什麼會需要JOIN?我們已知在 orders 資料表裡記錄了每個飲料品項的販賣情況,但這個資料表中只記錄了飲料的 drinks_id,並沒有飲料的詳細名稱,詳細名稱是記錄在 drinks 資料表裡面,所以會需要用JOIN來幫忙兩個資料表做連結。

INNER JOIN

所謂INNER JOIN,就是查尋兩邊資料表都有的資料,比方說,現在要把 orders 的 drinks_id 對回 drinks 的 id 來找出飲料名稱,那就是這樣寫:

SELECT orders.`drinks_id`, orders.`amounts`, drinks.`name`
FROM drinks
JOIN orders
ON drinks.`id` = orders.`drinks_id`;

於是乎我們得到下面這個結果,現在知道我們賣出的飲料名稱了:

raw-image

所以JOIN的重點在於:

  1. SELECT,反正查詢一定要有SELECT
  2. FROM是原本的資料表
  3. JOIN是要加入查詢的資料表
  4. ON則是參考點

LEFT JOIN 和 RIGHT JOIN

從上述可以看到,INNER JOIN為我們列出了兩邊資料相符的部分,但如果今天想把參考點對應不到的資料也一併呈現呢?比方說我還是想列出所有飲料名稱怎麼辦,那就是LEFT JOINRIGHT JOIN 上場的時候啦!

在這裡,LEFT指的是FROM後面的資料表,RIGHT指的是JOIN後面的資料表,這樣講可能不太清楚,看 code 和結果就會清晰很多:

// LEFT JOIN
SELECT orders.`drinks_id`, orders.`amounts`, drinks.`name`
FROM drinks
LEFT JOIN orders
ON drinks.`id` = orders.`drinks_id`;

// RIGHT JOIN
SELECT orders.`drinks_id`, orders.`amounts`, drinks.`name`
FROM orders
RIGHT JOIN drinks
ON drinks.`id` = orders.`drinks_id`;

上述兩種寫法差別在 drinks 資料表所在的位置,但都會得到下圖這個結果:

raw-image

SELF JOIN

這玩意兒有點邪門,自己和自己JOIN是啥鬼?其實這種情況會用在像下面這種在同一張資料表做比較的狀況。

比方說,我們要在 drinks 中找比冰咖啡便宜的飲料:

SELECT d1.`name`, d2.`name` AS `cheaper_name`, d2.price
FROM drinks AS d1
JOIN drinks AS d2
ON d1.price > d2.price
WHERE d1.`name` = '冰咖啡';
raw-image

綜合練習一下

  1. 哪項飲料銷售量最高?
SELECT drinks.`name`, SUM(orders.`amounts`) AS `total`
FROM drinks
JOIN orders
ON drinks.`id` = orders.`drinks_id`
GROUP BY orders.`drinks_id`
ORDER BY `total` DESC
LIMIT 1;
raw-image
  1. 誰是購買額最高的顧客?
SELECT customers.`name`, SUM(orders.`amounts` * drinks.`price`) AS `revenue`
FROM orders
JOIN customers
ON customers.`id` = orders.`customers_id`
JOIN drinks
ON drinks.`id` = orders.`drinks_id`
GROUP BY customers.`id`
ORDER BY `revenue` DESC
LIMIT 1;
raw-image



SQL Transaction

這是一個補充知識~ 什麼是 Transaction (交易)?

SQL 作為操縱資料的語言,有時難免會遇到複數資料操縱必須全部執行完成,否則乾脆不要執行的時候,比如說:轉帳時 A、B 帳戶的資料。

若是今天 A 轉了錢給 B,那他們的帳戶金額資料勢必得更新嘛。但當 A 更新完後,程式突然崩潰了,B 沒更新到帳戶資料,這樣算有入帳還是沒入帳?所以會需要交易來幫助管理需要全部執行完畢的步驟來避免這種情形。

操作就像這樣:

set autocommit = 0;
START TRANSACTION;
UPDATE ... SET ... WHERE account = "A";
UPDATE ... SET ... WHERE account = "B";
COMMIT;
留言
avatar-img
Jeremy Ho的沙龍
20會員
37內容數
這個專題用來存放我在學習網頁開發時的心得及知識。
Jeremy Ho的沙龍的其他內容
2023/12/03
從 leetcode 學資料結構堆疊 (stack)
Thumbnail
2023/12/03
從 leetcode 學資料結構堆疊 (stack)
Thumbnail
2023/10/03
SQL 基本篇 - CRUD、運算子、內建函式
Thumbnail
2023/10/03
SQL 基本篇 - CRUD、運算子、內建函式
Thumbnail
2023/09/27
MySQL 應用到 URL Shortener 上
Thumbnail
2023/09/27
MySQL 應用到 URL Shortener 上
Thumbnail
看更多
你可能也想看
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
BigQuery M是 BigQuery 中的一項功能,數據分析師可以使用SQL語句創建、訓練、評估和預測機器學習模型。 在這次實作將使用一個電子商務(Google 商品商店)數據集來運行一些典型的查詢和模型訓練和預測,以讓企業更了解其客戶的購買習慣。
Thumbnail
BigQuery M是 BigQuery 中的一項功能,數據分析師可以使用SQL語句創建、訓練、評估和預測機器學習模型。 在這次實作將使用一個電子商務(Google 商品商店)數據集來運行一些典型的查詢和模型訓練和預測,以讓企業更了解其客戶的購買習慣。
Thumbnail
題目敘述 題目會給我們一張Products資料表。裡面分別有product_id、new_price、change_date等欄位。其中(product_id, change_date)是這張資料表的複合主鍵Primary key。 所有商品預設都是10元。之後若有更新,則以新價格為主。 要求
Thumbnail
題目敘述 題目會給我們一張Products資料表。裡面分別有product_id、new_price、change_date等欄位。其中(product_id, change_date)是這張資料表的複合主鍵Primary key。 所有商品預設都是10元。之後若有更新,則以新價格為主。 要求
Thumbnail
題目會給我們兩張資料表。 第一張是Customer資料表,裡面分別有customer_id 、product_key 等欄位。其中product_key 是這張資料表的外鍵foreign key,關連到第二張Product資料表。 題目還特別提醒,這張資料表可能包含重複的data row
Thumbnail
題目會給我們兩張資料表。 第一張是Customer資料表,裡面分別有customer_id 、product_key 等欄位。其中product_key 是這張資料表的外鍵foreign key,關連到第二張Product資料表。 題目還特別提醒,這張資料表可能包含重複的data row
Thumbnail
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
Thumbnail
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
Thumbnail
有兩張資料表格,第一張是顧客資料表,第二張是訂單資料表。請找出所有顧客資料,不管這位顧客有沒有訂購過商品。請列出名字、姓氏、居住城市、訂購明細。注意:可能會有重複的資料點,因為一位顧客可以重複訂購同一件商品。最後依照顧客名字、訂購明細遞增排序。
Thumbnail
有兩張資料表格,第一張是顧客資料表,第二張是訂單資料表。請找出所有顧客資料,不管這位顧客有沒有訂購過商品。請列出名字、姓氏、居住城市、訂購明細。注意:可能會有重複的資料點,因為一位顧客可以重複訂購同一件商品。最後依照顧客名字、訂購明細遞增排序。
Thumbnail
有兩張資料表格,第一張是顧客資料,第二張是訂單資料。請找出名字叫Jill和Eva的客戶資料,並其對應的訂單日期、明細、金額,最後依照顧客號碼由小至大排序。
Thumbnail
有兩張資料表格,第一張是顧客資料,第二張是訂單資料。請找出名字叫Jill和Eva的客戶資料,並其對應的訂單日期、明細、金額,最後依照顧客號碼由小至大排序。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News