SQL -總結

閱讀時間約 12 分鐘

※ 整個SQL課程過程

*如何從資料庫拿資料開始:

SELECT :從資料庫拿資料。

ORDER BY :排序SELECT的結果。

• JOIN :連結各個TABLE的 資訊,發揮關聯式資料庫的優勢。

• GROUP BY :對資料庫的資料做加總的AGGREGATE FUNCTION操作。

  • GROUP HAVING :篩選出GROUP BY後的結果。

• Subquery :把多個QUERY放在一個QUERY裡面,去減少多個QUERY造成的網路溝通成本。

  • CTE :取代Subquery更簡潔的寫法,用更簡潔的方法去表達複雜的QUERY,可以幫助我們思考並減少錯誤。

*如何加入、更新、刪除資料:

• INSERT

• Update

• Delete

*把一系列的資料當成一個Transaction結果不是成功就是失敗:

Transaction

*資料庫需求變動時去更改table欄位的資訊;例如欄位的型別、新增和刪除欄位:

Alter table


※ 創建資料庫案例:SPOTIFY SYSTEM

※ 創建資料庫第一步:設計Table 和Table的欄位

使用者(User)可以創建歌單(Playlist),每個歌單裡面可以包含多首歌曲(Song)。創作者(Artist)會發佈專輯(Album),每張專輯會包含多首歌曲。我們需要為這五個元素創建表格(table),以記錄它們的詳細資訊。

Spotify 有什麼元素 :

  1. User (使用者)使用者可以創建多個歌單(Playlist)。
  2. Artist(創作者):創作者可以發佈多張專輯。
  3. Album (專輯):每張專輯由創作者(Artist)發佈,並包含多首歌曲。
  4. Song (歌):每首歌曲可以屬於多個播放列表,也可以屬於一張專輯(Album)。
  5. Playlist(歌單):每個歌單可以包含多首歌曲(Song)。


元素之間的關係:

  1. ⼀對多

Artist(創作者) -> Album (專輯):

創作者一個人可以創造好幾張專輯,可是一張專輯只會被一個創造者所創造,就是一對多的關係。

舉例:在資料庫設計中,我們可以在 Albums 表格中添加一個 artist_id 欄位,這樣每張專輯都會有一個對應的創作者 ID。這個 artist_id 欄位是 Artists 表格中的主鍵(primary key),並且在 Albums 表格中作為外鍵(foreign key)使用。這樣的設計可以讓我們通過 artist_id 將 Albums 表格和 Artists 表格連結起來。

當我們需要查詢某張專輯的創作者詳細資料時,可以使用 SQL 的 join table 概念來連結這兩個表格。例如,查詢 album_id 為 1 的專輯的創作者詳細資料。

raw-image


Album(專輯) -> Song(歌):

一張專輯裡面可以有好幾首歌,可是一首歌只會屬於一張專輯,就是一對多的關係。

舉例:當我們在歌曲 (song) 表格中加入 album_id 欄位後,可以將 song_id 為 1 的這首歌與 album_id 為 1 的專輯連結起來。然後,透過 JOIN 操作,可以在專輯 (album) 表格中查找 album_id 為 1 的詳細資訊。這樣就可以把兩個表格連結在一起,這正是一對多關係的處理方式。

raw-image
  1. 多對多

• User <-> Song:一個使用者可以喜歡好幾首歌,一首歌也會被好幾個使用者喜歡。

• User <-> Album:一個使用者可以喜歡好幾張專輯,一張專輯可以被好幾個使用者喜歡。

• User <-> Artist: 一個使用者可以追蹤一個創作者,一個創作者可以被好幾個使用者追蹤。

• User <-> User:一個創作者可以被好幾個使用者追蹤。使用者可以追蹤好幾個使用者,使用者可以被好幾個使用者追蹤。

• User <-> Playlist:一個使用者可以創建好幾個歌單,一個歌單也可以被好幾個創作者所創作。一個播放清單裡面可以有幾首歌,一首歌可以屬於好幾個歌單。

• Playlist <-> Song:一個歌單裡面可以有幾首歌,一首歌可以屬於好幾個歌單。

舉例:User <-> Song(使用者喜歡的歌)

在多對多關係中,直接在 Users 表或 Songs 表中新增欄位來記錄關係會導致資料重複。例如:

  • 如果在 Users 表中新增 song_id 欄位,則每個使用者喜歡的每首歌都需要新增一行,這會導致使用者資訊的重複。
  • 如果在 Songs 表中新增 user_id 欄位,則每首歌被每個使用者喜歡都需要新增一行,這會導致歌曲資訊的重複。
raw-image


  • 解決⽅案

額外建立中間表可以有效地管理多對多關係,並避免資料重複和空間浪費:

  • User_Song 表:用來儲存使用者喜歡的歌曲。
  • User_Album 表:用來儲存使用者喜歡的專輯。
  • User_Artist 表:用來儲存使用者追蹤的創作者。
  • User_Follow 表:用來儲存使用者之間的追蹤關係。
  • User_Playlist 表:用來儲存使用者創建的歌單。
  • Playlist_Song 表:用來儲存歌單中的歌曲。
raw-image


※ Spotify 的操作

找到⼀張專輯裡⾯的歌 - ORDER BY

raw-image

說明:

  1. 關係:專輯和歌曲之間是一對多的關係。
  2. 欄位:在 song 表中添加一個 album_id 欄位來標識每首歌所屬的專輯。
  3. 篩選:使用 SELECT 和 WHERE 語句來篩選出屬於特定 album_id 的所有歌曲。
  4. 順序:在 song 表中添加一個 order 欄位來記錄每首歌在專輯中的順序。
  5. 排序:使用 ORDER BY 語句根據 order 欄位對歌曲進行排序。


找到⼀⾸歌所屬的專輯跟創作者 - JOIN

raw-image

說明:

  1. 關係:
    • artist 和 album 是一對多的關係,所以 album 表中會有 artist_id 欄位。
    • album 和 song 也是一對多的關係,所以 song 表中會有 album_id 欄位。
  2. 步驟:
    • 首先,將 artist 和 album 兩個表進行 JOIN,使用 artist_id 作為連接條件。
    • 然後,將上一步的結果與 song 表進行 JOIN,使用 album_id 作為連接條件。
  3. 查詢:
    • 這樣可以得到包含 song_idartist_id 和album_id 的結果。


找到使⽤者 Liked Songs(喜歡的歌)- CTE

raw-image

說明:

  1. 建立 Junction Table:由於使用者和歌曲之間是多對多的關係,我們需要創建一個 junction table 來記錄這些關係。
  2. 使用 CTE 紀錄喜歡的歌曲:我們利用 CTE(Common Table Expression)來紀錄使用者喜歡的歌曲的 ID。
  3. Inner Join:接著,我們將這些 ID 與歌曲表(song table)進行 inner join,以獲取使用者喜歡的歌曲的詳細資訊。
  4. 包含創作者和專輯資訊:每首歌都包含創作者和專輯的資訊。因此,我們需要將歌曲表與創作者表和專輯表進行 inner join。
  5. 最終結果:我們將這些表與 CTE 中的歌曲 ID 進行 join,這樣就可以獲取使用者喜歡的歌曲的完整資訊,包括創作者和專輯的詳細資料。


• 找到⼀個創作者的⽉總觀看數-GROUP BY

raw-image

說明:

  1. 連結表格:首先,我們需要將 song_idartist_id 和 album_id 這三個表格進行 JOIN 操作,得到一個包含 song_iduser_idalbum_id 和 monthly_plays 的表格。
  2. GROUP BY:接著,我們利用 GROUP BY 對 user_id 這個欄位進行分組。
  3. 加總:最後,我們將每個 user_id 所有歌曲的 monthly_plays 加總起來,得到每位創作者的月總觀看數。


  • 找到⽉總觀看數超過⼀百萬的發燒創作者 -HAVING
raw-image

說明:

  1. GROUP BY:首先,我們對 user_id 進行分組,並對 monthly_plays 進行加總。
  2. HAVING:接著,我們使用 HAVING 子句來篩選出月總觀看數超過一百萬的創作者。


使⽤者對⼀⾸歌按愛⼼ - INSERT

raw-image

說明:

當使用者對一首歌按愛心時,我們需要將這個操作記錄到資料庫中。這涉及到在記錄使用者和歌曲之間多對多關係的中介表(junction table)中進行插入操作。具體步驟如下:

  1. 插入操作:將使用者的 ID(user_id) 和歌曲的 ID (song_id)插入到中介表中。
  2. 記錄關係:這樣就能記錄使用者對這首歌按愛心的行為。


創作者更新封⾯圖片和⾃我介紹 - Update

raw-image

說明:

我們可以使用 UPDATE 語法來更新 artist 表中的封面照片和自我介紹這兩個欄位。具體步驟如下:

  1. 指定表格:我們需要更新的表格是 artist
  2. 設定新值:我們需要更新封面照片和自我介紹這兩個欄位。
  3. 條件:我們需要指定哪個創作者的資料需要更新。


創作者下架專輯 - DELETE

raw-image

說明:

當創作者要下架專輯時,我們可以使用 DELETE 和 ON DELETE CASCADE 來確保專輯及其所屬的歌曲都被刪除:

  1. 刪除專輯:當創作者要下架專輯時,我們需要刪除 album 表中的記錄。
  2. 刪除歌曲:同時,專輯內所屬的歌曲也需要從 song 表中刪除。
  3. ON DELETE CASCADE:在 song 表中設置一個指向 album 表的外鍵,並使用 ON DELETE CASCADE 選項。這樣當我們刪除 album 表中的記錄時,相關的 song 表中的記錄也會自動被刪除。

這樣的設置確保了當我們刪除專輯時,相關的歌曲也會被自動刪除。接著,我們可以使用 DELETE 語法來刪除專輯。


將歌單中的兩⾸歌調換順序 - TRANSACTION

raw-image

說明:

當使用者想要將歌單中的兩首歌調換順序時,這涉及到多對多關係的中介表(junction table)。這個table除了記載playlist裡面有這首歌之外,還必須記載這首歌在playlist中的順序。為了確保兩個更新操作(即將第1首歌的順序更新為第2首,將第2首歌的順序更新為第1首)要麼全部成功,要麼全部失敗,我們可以使用TRANSACTION來包裹這兩個更新操作。

  1. 多對多關係:歌單和歌曲之間是多對多的關係,這些關係記錄在中介表(junction table)中。
  2. 順序記錄:中介表(junction table)除了記載playlist裡面有這首歌之外,還必須記載這首歌在playlist中的順序。
  3. 更新操作:當使用者想要調換兩首歌的順序時,需要進行兩個更新操作:
    • 將第1首歌的順序更新為第2首
    • 將第2首歌的順序更新為第1首
  4. 使用TRANSACTION:為了確保這兩個更新操作要麼全部成功,要麼全部失敗,可以使用TRANSACTION來包裹這兩個更新操作。


發現原本設計的 Table 不完美或需求改變 - ALTER TABLE

說明:

可以使用ALTER TABLE語句來修改現有的表結構。這可以包括添加、刪除或修改列,添加或刪除約束等。

  1. 添加新列當需要在表中添加新列時,可以使用ADD關鍵字。
  2. 刪除列當需要從表中刪除某列時,可以使用DROP COLUMN關鍵字。
  3. 修改列的數據類型當需要修改某列的數據類型時,可以使用ALTER COLUMN關鍵字。
  4. 重命名列當需要重命名某列時,可以使用RENAME COLUMN關鍵字。
  5. 添加約束當需要在表中添加約束時,可以使用ADD CONSTRAINT關鍵字。
  6. 刪除約束當需要從表中刪除約束時,可以使用DROP CONSTRAINT關鍵字。

※ ⼩叮嚀

撰寫 QUERY 的關鍵 - 越少 QUERY,效率越好。




    全端網頁開發專業知識分享
    留言0
    查看全部
    發表第一個留言支持創作者!
    ALTER TABLE: 這個命令是用來修改資料表的結構,例如新增、修改或刪除欄位。它針對的是資料表(table)本身的結構,而不是具體的記錄(record)。 INSERT 和 UPDATE: 這兩個命令是用來操作具體的記錄(record)。INSERT 用於新增記錄,而 UPDATE 用於修改
    ※ 功能: 刪除表格中的資料。 ※ 語法: DELETE ON DELETE CASCADE DELETE JOIN ※ DELETE • 語法 : DELETE FROM table_name WHERE condition FROM 後面接上表格的名字:這是想要刪除資料的表
    ※ 為什麼我們需要 Transaction? 當我們談到 Transaction(交易)時,指的是一組不可分割的 SQL 操作。這些操作結果只能成功或失敗,以確保資料庫的一致性和完整性。Transaction 是資料庫操作中的一個「邏輯單位」,包含多個操作步驟。如果其中任何一個步驟失敗,整個 Tr
    已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
    ※ 把record加到table有兩種方式: VALUES • SELECT ※ 語法 INSERT INTO VALUES 語法: Record 代表一組值的集合,每個值對應到表格中的一個欄位(column)。 INSERT INTO 語法用來指定要插入資料的表格。 需要提供一個
    ※ CTE是什麼? 在 SQL 中,我們經常需要從多個表中提取數據,因此會使用子查詢 (subquery)。為了讓子查詢更易讀並實現遞迴查詢,我們可以使用 Common Table Expression (CTE)。 CTE 是一個「暫存」且「具名」的結果集合,透過 AS 關鍵字將查詢結果暫時儲
    ALTER TABLE: 這個命令是用來修改資料表的結構,例如新增、修改或刪除欄位。它針對的是資料表(table)本身的結構,而不是具體的記錄(record)。 INSERT 和 UPDATE: 這兩個命令是用來操作具體的記錄(record)。INSERT 用於新增記錄,而 UPDATE 用於修改
    ※ 功能: 刪除表格中的資料。 ※ 語法: DELETE ON DELETE CASCADE DELETE JOIN ※ DELETE • 語法 : DELETE FROM table_name WHERE condition FROM 後面接上表格的名字:這是想要刪除資料的表
    ※ 為什麼我們需要 Transaction? 當我們談到 Transaction(交易)時,指的是一組不可分割的 SQL 操作。這些操作結果只能成功或失敗,以確保資料庫的一致性和完整性。Transaction 是資料庫操作中的一個「邏輯單位」,包含多個操作步驟。如果其中任何一個步驟失敗,整個 Tr
    已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
    ※ 把record加到table有兩種方式: VALUES • SELECT ※ 語法 INSERT INTO VALUES 語法: Record 代表一組值的集合,每個值對應到表格中的一個欄位(column)。 INSERT INTO 語法用來指定要插入資料的表格。 需要提供一個
    ※ CTE是什麼? 在 SQL 中,我們經常需要從多個表中提取數據,因此會使用子查詢 (subquery)。為了讓子查詢更易讀並實現遞迴查詢,我們可以使用 Common Table Expression (CTE)。 CTE 是一個「暫存」且「具名」的結果集合,透過 AS 關鍵字將查詢結果暫時儲
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
    Thumbnail
    題目敘述 題目會給我們一張Employee 資料表。裡面分別有employee_id、department_id 、primary_flag 等欄位。其中(employee_id, department_id) 是這張資料表的複合主鍵Primary key。 要求我們列出每一位員工的主要歸屬
    Thumbnail
    題目敘述 題目會給我們一張Employees 資料表。裡面分別有employee_id、name、reports_to 、age 等欄位。其中employee_id 是這張資料表的主鍵Primary key。 要求我們列出每一位經理人下轄部屬的數量和部屬的平均年齡(四捨五入到最接近的整數)。
    Thumbnail
    題目會給我們兩張資料表。 第一張是Customer資料表,裡面分別有customer_id 、product_key 等欄位。其中product_key 是這張資料表的外鍵foreign key,關連到第二張Product資料表。 題目還特別提醒,這張資料表可能包含重複的data row
    Thumbnail
    題目敘述 題目會給我們一張Courses資料表,裡面分別有student、class等欄位。其中(student, class) 是這張資料表的複合主鍵Primary key pair。 要求我們,以課程做分群,列出至少有五位同學的課程。 輸出的順序不拘。 Table: Courses
    Thumbnail
    題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
    Thumbnail
    題目敘述 題目會給我們一張Activity資料表,裡面分別有user_id、 session_id、activity_date 、activity_type等欄位。 要求我們列出所有過去30天的活躍使用者。 活躍使用者的定義為2019-07-27包含這天,往前三十天的區間內,至少有過一次活動紀錄
    Thumbnail
    題目敘述 題目會給我們一張World資料表,裡面分別有name、 continent、area、population 、gdp等欄位,其中name 是主鍵Primary Key。 要求我們列出所有大型國家,大型國家的定義是 人口大於等於兩千五百萬人 或者 土地面積大於等於三百萬平方公里。 輸出順
    Thumbnail
    題目敘述 題目會給我們一張Cinema資料表,裡面分別有id、movie、description, rating 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID為奇數,而且不無聊的電影,印出時依照電影rating評分從高到低降序排列。 Table: Cinema
    Thumbnail
    題目敘述 題目會給我們一張Customer資料表,裡面分別有id、name、referee_id 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID referee_id不等於2的顧客,印出順序不拘。
    Thumbnail
    題目會給我們一張Products資料表,裡面分別有product_id、low_fats、recyclable等欄位,其中product_id 是主鍵Primary Key。 要求我們列出所有的可回收 且 低脂產品的product_id,順序不拘。
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
    Thumbnail
    題目敘述 題目會給我們一張Employee 資料表。裡面分別有employee_id、department_id 、primary_flag 等欄位。其中(employee_id, department_id) 是這張資料表的複合主鍵Primary key。 要求我們列出每一位員工的主要歸屬
    Thumbnail
    題目敘述 題目會給我們一張Employees 資料表。裡面分別有employee_id、name、reports_to 、age 等欄位。其中employee_id 是這張資料表的主鍵Primary key。 要求我們列出每一位經理人下轄部屬的數量和部屬的平均年齡(四捨五入到最接近的整數)。
    Thumbnail
    題目會給我們兩張資料表。 第一張是Customer資料表,裡面分別有customer_id 、product_key 等欄位。其中product_key 是這張資料表的外鍵foreign key,關連到第二張Product資料表。 題目還特別提醒,這張資料表可能包含重複的data row
    Thumbnail
    題目敘述 題目會給我們一張Courses資料表,裡面分別有student、class等欄位。其中(student, class) 是這張資料表的複合主鍵Primary key pair。 要求我們,以課程做分群,列出至少有五位同學的課程。 輸出的順序不拘。 Table: Courses
    Thumbnail
    題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
    Thumbnail
    題目敘述 題目會給我們一張Activity資料表,裡面分別有user_id、 session_id、activity_date 、activity_type等欄位。 要求我們列出所有過去30天的活躍使用者。 活躍使用者的定義為2019-07-27包含這天,往前三十天的區間內,至少有過一次活動紀錄
    Thumbnail
    題目敘述 題目會給我們一張World資料表,裡面分別有name、 continent、area、population 、gdp等欄位,其中name 是主鍵Primary Key。 要求我們列出所有大型國家,大型國家的定義是 人口大於等於兩千五百萬人 或者 土地面積大於等於三百萬平方公里。 輸出順
    Thumbnail
    題目敘述 題目會給我們一張Cinema資料表,裡面分別有id、movie、description, rating 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID為奇數,而且不無聊的電影,印出時依照電影rating評分從高到低降序排列。 Table: Cinema
    Thumbnail
    題目敘述 題目會給我們一張Customer資料表,裡面分別有id、name、referee_id 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID referee_id不等於2的顧客,印出順序不拘。
    Thumbnail
    題目會給我們一張Products資料表,裡面分別有product_id、low_fats、recyclable等欄位,其中product_id 是主鍵Primary Key。 要求我們列出所有的可回收 且 低脂產品的product_id,順序不拘。