以下是 MySQL 的 增刪改查語法及 高級特性的詳細整理,結合示例說明:
1. 基礎操作(CRUD)
(1) 創建數據(INSERT)
-- 單條插入
INSERT INTO users (id, name, email)
VALUES (1, 'Alice', 'alice@example.com');-- 多條插入
INSERT INTO users (id, name, email)
VALUES (2, 'Bob', 'bob@example.com'),(3, 'Charlie', 'charlie@example.com');
(2) 查詢數據(SELECT)
-- 基礎查詢
SELECT name, email FROM users
WHERE age > 25
ORDER BY created_at DESC
LIMIT 10;-- 連接查詢(JOIN)
SELECT o.order_id, u.name, o.total
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.status = 'completed';
(3) 更新數據(UPDATE)
UPDATE users
SET email = 'new_email@example.com', updated_at = NOW()
WHERE id = 1;
(4) 刪除數據(DELETE)
DELETE FROM orders
WHERE order_date < '2023-01-01';
2. 高級特性
(1) 事務(Transaction)
-- 顯式事務控制
START TRANSACTION;
INSERT INTO users (name, email) VALUES ('Dave', 'dave@example.com');
UPDATE accounts SET balance = balance - 100 WHERE user_id = 4;
COMMIT; -- 提交或 ROLLBACK 回滾-- 自動提交設置(默認開啟)
SET autocommit = 0; -- 需手動提交
(2) 索引(Index)
-- 創建索引
CREATE INDEX idx_email ON users(email);-- 復合索引
CREATE INDEX idx_name_age ON users(name, age);-- 查看索引
SHOW INDEX FROM users;
(3) 存儲過程(Stored Procedure)
DELIMITER $$
CREATE PROCEDURE GetUsersByAge(IN min_age INT)
BEGINSELECT * FROM users WHERE age >= min_age;
END $$
DELIMITER ;-- 調用存儲過程
CALL GetUsersByAge(30);
(4) 觸發器(Trigger)
CREATE TRIGGER before_user_update
BEFORE UPDATE ON users
FOR EACH ROW
SET NEW.updated_at = NOW();
(5) 視圖(View)
CREATE VIEW user_summary AS
SELECT id, name, email, COUNT(order_id) AS total_orders
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id;
(6) 窗口函數(Window Functions)
-- MySQL 8.0+ 支持
SELECT id, name, salary,AVG(salary) OVER() AS avg_salary, -- 窗口內平均值ROW_NUMBER() OVER(ORDER BY salary DESC) AS rank -- 排名
FROM employees;
(7) 正則表達式(REGEXP)
SELECT * FROM users
WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$';
(8) JSON 支持
-- 創建 JSON 字段
ALTER TABLE products ADD COLUMN metadata JSON;-- 查詢 JSON 字段
SELECT * FROM products
WHERE metadata->>'$.category' = 'electronics';
(9) 分區表(Partitioning)
-- 按范圍分區
CREATE TABLE orders (order_id INT PRIMARY KEY,order_date DATE,amount DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(order_date)) (PARTITION p0 VALUES LESS THAN (2020),PARTITION p1 VALUES LESS THAN (2023),PARTITION p2 VALUES LESS THAN MAXVALUE
);
(10) 事務隔離級別
-- 查看當前隔離級別
SELECT @@tx_isolation;-- 設置隔離級別(如可重復讀)
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
3. 其他實用特性
(1) 子查詢(Subquery)
SELECT name
FROM users
WHERE age > (SELECT AVG(age) FROM users);
(2) 聯合查詢(UNION)
SELECT 'active' AS status, COUNT(*) FROM users WHERE active = 1
UNION ALL
SELECT 'inactive', COUNT(*) FROM users WHERE active = 0;
(3) 日期函數
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS today, DATEDIFF(end_date, start_date) AS duration
FROM events;
(4) 鎖機制
-- 顯式行級鎖(InnoDB)
SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;-- 排他鎖
SELECT * FROM users WHERE id = 1 FOR UPDATE;
4. 注意事項
- 索引優化:
- 避免過度索引,影響寫入性能。
- 優先為
WHERE
,JOIN
,ORDER BY
字段創建索引。
- 事務設計:
- 短事務可減少鎖沖突。
- 根據業務選擇隔離級別(如
READ COMMITTED
或REPEATABLE READ
)。
- JSON 字段:
- 使用
JSON_EXTRACT
或->>
簡化查詢。
- 使用
- 分區表:
- 適用于大數據量表(如按日期分區)。
- 需評估分區鍵的合理性。
5. 常見問題示例
(1) 復雜查詢優化
-- 使用 EXPLAIN 分析執行計劃
EXPLAIN SELECT * FROM orders
WHERE user_id = 100 AND status = 'pending';
(2) 備份與恢復
-- 備份
mysqldump -u root -p mydatabase > backup.sql-- 恢復
mysql -u root -p mydatabase < backup.sql
如需更具體的場景(如高并發設計、主從復制),可進一步說明需求!