SQL | 語法基礎篇 (2)

更新於 2024/10/03閱讀時間約 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
18會員
37內容數
這個專題用來存放我在學習網頁開發時的心得及知識。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Jeremy Ho的沙龍 的其他內容
SQL 基本篇 - CRUD、運算子、內建函式
MySQL 應用到 URL Shortener 上
LeetCode 518. Coin Challenge II / 動態規劃
SQL 基本篇 - CRUD、運算子、內建函式
MySQL 應用到 URL Shortener 上
LeetCode 518. Coin Challenge II / 動態規劃
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
上一篇我們介紹了SQL如何使用指定的條件,搭配的SELECT 和 FROM 來篩選資料。本篇我們來討論,如何將兩個或多個資料表中的資料結合在一起,根據欄位之間的邏輯關係來拼接、合併資料表。
SQL 中的 Index 是什麼? 加了以後會有什麼影響? 想像你在讀一本厚厚的小說,裡面有幾百頁。如果你想要找到某個關鍵情節,比如「主角第一次登場的地方」,如果你沒有做任何標記,你可能得從頭到尾翻書,直到找到那一頁為止,這樣會花很多時間。 ▌Index 就像書籤一樣
Thumbnail
上一篇我們介紹了SQL基本架構和語法,如何用簡單的SELECT 和 FROM 撈取資料。本篇我們來討論,如何根據指定的條件來篩選資料,僅返回符合條件的結果。
在MS SQL Server 環境下,如何將sales_unpivot (表1)轉成 sales_pivot (表2)? 再將表2轉回表1?
Thumbnail
客戶發來詢問,我想修改SQL Server 2019 定序該如何做? 首先需要知道database的定序(Collation)是什麼,其實是決定資料庫所使用的字元集(character sets)、排序的方式。 因為客戶的SQL Server是英文版本,通常臺灣地區的預設定序是 Chin
Thumbnail
SQL 是一種專門用來和資料庫進行溝通的程式語言,它讓我們能夠創建資料表、新增、查詢、修改和刪除資料庫中的資料,本文將介紹基本的創建、新增、查詢、修改和刪除的 SQL 語法。
Thumbnail
在SQL Server中,暫存表(Temporary Table)是一種在連線會話期間存在的臨時表格,它可以用來暫存中間結果或臨時資料。本文將介紹如何使用T-SQL語法在SQL Server中建立暫存表。
Thumbnail
在資料庫管理中,SQL(Structured Query Language)是一種強大的工具,用於處理資料庫中的資料。本篇教學將介紹 SQL 中的基本操作,包括 SELECT、UPDATE、INSERT 和 DELETE,讓您能夠有效地查詢、更新、插入和刪除資料。
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
上一篇我們介紹了SQL如何使用指定的條件,搭配的SELECT 和 FROM 來篩選資料。本篇我們來討論,如何將兩個或多個資料表中的資料結合在一起,根據欄位之間的邏輯關係來拼接、合併資料表。
SQL 中的 Index 是什麼? 加了以後會有什麼影響? 想像你在讀一本厚厚的小說,裡面有幾百頁。如果你想要找到某個關鍵情節,比如「主角第一次登場的地方」,如果你沒有做任何標記,你可能得從頭到尾翻書,直到找到那一頁為止,這樣會花很多時間。 ▌Index 就像書籤一樣
Thumbnail
上一篇我們介紹了SQL基本架構和語法,如何用簡單的SELECT 和 FROM 撈取資料。本篇我們來討論,如何根據指定的條件來篩選資料,僅返回符合條件的結果。
在MS SQL Server 環境下,如何將sales_unpivot (表1)轉成 sales_pivot (表2)? 再將表2轉回表1?
Thumbnail
客戶發來詢問,我想修改SQL Server 2019 定序該如何做? 首先需要知道database的定序(Collation)是什麼,其實是決定資料庫所使用的字元集(character sets)、排序的方式。 因為客戶的SQL Server是英文版本,通常臺灣地區的預設定序是 Chin
Thumbnail
SQL 是一種專門用來和資料庫進行溝通的程式語言,它讓我們能夠創建資料表、新增、查詢、修改和刪除資料庫中的資料,本文將介紹基本的創建、新增、查詢、修改和刪除的 SQL 語法。
Thumbnail
在SQL Server中,暫存表(Temporary Table)是一種在連線會話期間存在的臨時表格,它可以用來暫存中間結果或臨時資料。本文將介紹如何使用T-SQL語法在SQL Server中建立暫存表。
Thumbnail
在資料庫管理中,SQL(Structured Query Language)是一種強大的工具,用於處理資料庫中的資料。本篇教學將介紹 SQL 中的基本操作,包括 SELECT、UPDATE、INSERT 和 DELETE,讓您能夠有效地查詢、更新、插入和刪除資料。