本文整理了資料庫開發與維護中最高頻的 SQL 語句,涵蓋資料庫/資料表結構管理 (DDL)、資料操作 (DML)、進階查詢技巧、集合運算、多表連接等核心知識點,適合作為日常開發的快速參考手冊。
-- 建立資料庫 (先判斷是否存在,避免報錯)
CREATE DATABASE IF NOT EXISTS `db_name` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 刪除資料庫
DROP DATABASE IF EXISTS `db_name`;
-- 建立資料表
CREATE TABLE `table_name` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL DEFAULT '',
`age` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 依現有資料表結構建立新表 (僅結構)
CREATE TABLE `new_table` LIKE `old_table`;
-- 依查詢結果建立新表 (含資料)
CREATE TABLE `new_table` AS SELECT * FROM `old_table`;
-- 刪除資料表
DROP TABLE IF EXISTS `table_name`;
-- 清空資料表 (保留結構,重置自增 ID)
TRUNCATE TABLE `table_name`;
-- 新增欄位
ALTER TABLE `table_name` ADD COLUMN `col_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '欄位說明';
-- 修改欄位型別/屬性
ALTER TABLE `table_name` MODIFY COLUMN `col_name` VARCHAR(200) NOT NULL DEFAULT '';
-- 刪除欄位
ALTER TABLE `table_name` DROP COLUMN `col_name`;
-- 新增主鍵
ALTER TABLE `table_name` ADD PRIMARY KEY (`col_name`);
-- 刪除主鍵
ALTER TABLE `table_name` DROP PRIMARY KEY;
-- 建立索引
CREATE INDEX `idx_name` ON `table_name` (`col_name`);
CREATE UNIQUE INDEX `uk_name` ON `table_name` (`col_name`);
-- 刪除索引
DROP INDEX `idx_name` ON `table_name`;
CREATE VIEW `view_name` AS SELECT `col1`, `col2` FROM `table_name` WHERE `condition`;
DROP VIEW IF EXISTS `view_name`;
-- 基礎查詢
SELECT * FROM `table_name` WHERE `col` = 'value' ORDER BY `col` DESC;
-- 模糊查詢
SELECT * FROM `table_name` WHERE `col` LIKE '%keyword%';
-- 分頁查詢
SELECT * FROM `table_name` WHERE `col` = 'value' ORDER BY `id` DESC LIMIT 10 OFFSET 0;
-- 多值匹配
SELECT * FROM `table_name` WHERE `col` IN ('val1', 'val2', 'val3');
-- 範圍查詢
SELECT * FROM `table_name` WHERE `col` BETWEEN 10 AND 20;
INSERT INTO `table_name` (`col1`, `col2`) VALUES ('val1', 'val2');
INSERT INTO `target_table` SELECT * FROM `source_table`;
UPDATE `table_name` SET `col1` = 'new_val' WHERE `condition`;
UPDATE `table_name` SET `col1` = 'v1', `col2` = 'v2' WHERE `condition`;
DELETE FROM `table_name` WHERE `condition`;
DELETE FROM `table_name`; -- 刪除所有資料 (慎用)
SELECT
COUNT(*) AS total_rows,
COUNT(`col`) AS non_null_count,
SUM(`col`) AS sum_val,
AVG(`col`) AS avg_val,
MAX(`col`) AS max_val,
MIN(`col`) AS min_val
FROM `table_name` WHERE `condition`;
SELECT DISTINCT `col1`, `col2` FROM `table_name`;
UNION:合併結果集並去除重複行。UNION ALL:合併結果集保留重複行 (效能較好)。EXCEPT (MySQL 不支援,可用 NOT IN 或 LEFT JOIN ... IS NULL 替代):差集。INTERSECT (MySQL 不支援,可用 INNER JOIN 替代):交集。注意: 參與運算的查詢欄位數、順序、型別必須一致。
-- 內連接:僅返回符合條件的匹配行
SELECT a.*, b.* FROM `table_a` a INNER JOIN `table_b` b ON a.id = b.a_id;
-- 左外連接:返回左表所有行 + 右表匹配行 (無匹配則 NULL)
SELECT a.*, b.* FROM `table_a` a LEFT JOIN `table_b` b ON a.id = b.a_id;
-- 右外連接:返回右表所有行 + 左表匹配行
SELECT a.*, b.* FROM `table_a` a RIGHT JOIN `table_b` b ON a.id = b.a_id;
-- 全外連接:MySQL 不直接支援,可用 UNION 模擬
SELECT * FROM `table_a` a LEFT JOIN `table_b` b ON a.id = b.a_id
UNION
SELECT * FROM `table_a` a RIGHT JOIN `table_b` b ON a.id = b.a_id;
-- MySQL / PostgreSQL
SELECT * FROM `table_name` ORDER BY `id` DESC LIMIT 10;
-- SQL Server
SELECT TOP 10 * FROM `table_name` ORDER BY `id` DESC;
SELECT TOP 50 PERCENT * FROM `table_name`;
%:匹配任意長度字元 (含 0 個)。_:匹配單個字元。[]:匹配括號內任一字元 (SQL Server)。[^]:匹配非括號內字元 (SQL Server)。SELECT * FROM `users` WHERE `name` LIKE '張%'; -- 張開頭
SELECT * FROM `users` WHERE `name` LIKE '%三'; -- 三結尾
SELECT * FROM `users` WHERE `name` LIKE '_三_'; -- 中間是三,共三字
提示: 實際生產環境中,請務必在 WHERE 條件欄位上建立適當索引,避免全表掃描;大批量寫入時建議分批提交事務,並關閉非必要索引與觸發器以提升效能。