• SELECT
,
)分隔不同的值列表。INSERT INTO SELECT
語法在實務中經常用來創建總結表格(summary table),特別是當需要結合不同的表格時。使用 JOIN
語法可以將多個表格中的數據結合起來,然後使用 INSERT INTO SELECT
將這些數據插入到新的表格中。
INSERT INTO SELECT 語法允許我們將一個查詢結果插入到另一個表格中。這個語法的作用類似於INSERT INTO VALUES,但它使用SELECT查詢來獲取要插入的數據。
INSERT INTO table_name(colum_list)
SELECT
select_list
FROM
another_table
WHERE
condition
說明
SUMMARY(計算每個歌單的歌數⽬)
// WITH AS(…)是一個 CTE,用來計算每個歌單中的歌曲數量。
WITH list_id_to_song_cnt AS (
SELECT list_id, COUNT(song_name) AS COUNT // 從 song 表中選擇 list_id 和歌曲數量。
FROM song // 資料來源是 song 表。
GROUP BY list_id // 根據 list_id 分組,計算每個歌單中的歌曲數量。
)
// 將計算結果插入到 list_with_song_cnt 表中。
INSERT INTO list_with_song_cnt(list_id, list_name, user_id, description, count)
// 從 list 表中選擇歌單ID、歌單名稱和歌曲數量。
SELECT t1.list_id, t1.list_name, IFNULL(t2.count, 0) // 如果 t2.count 為空,則返回0。
FROM list AS t1 // 資料來源是 list 表,並將其命名為 t1。
// 使用左連接將 list 表和CTE list_id_to_song_cnt 連接起來,根據 list_id 進行匹配。
LEFT JOIN list_id_to_song_cnt AS t2 ON t1.list_id = t2.list_id
list_with_song_cnt
表中。如果某個歌單中沒有歌曲,則顯示0。INSERT IGNORE
語法在插入數據時,如果遇到重複鍵(如唯一鍵或主鍵)或其他約束違反的情況,會忽略該行的插入操作,而不是終止整個插入過程,也不會報錯。這對於避免重複插入相同數據非常有用。說明
假設我們有一個 users
表,包含 id
和 email
欄位,並且 email
欄位具有唯一約束:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(130) NOT NULL UNIQUE
);
我們嘗試插入兩行數據,其中一行數據的 email
欄位值重複:
INSERT IGNORE INTO users (email)
VALUES ('john.doe@gmail.com'),
('john.doe@gmail.com');
在這種情況下,INSERT IGNORE
將忽略重複的行並插入有效的行,而不會引發錯誤。