以下是 MySQL 的 增删改查语法 及 高级特性的详细整理,结合示例说明:
1. 基础操作(CRUD)
(1) 创建数据(INSERT)
sql
-- 单条插入
INSERT INTO users (id, name, email)
VALUES (1, 'Alice', '[email protected]');
-- 多条插入
INSERT INTO users (id, name, email)
VALUES
(2, 'Bob', '[email protected]'),
(3, 'Charlie', '[email protected]');
(2) 查询数据(SELECT)
sql
-- 基础查询
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)
sql
UPDATE users
SET email = '[email protected]', updated_at = NOW()
WHERE id = 1;
(4) 删除数据(DELETE)
sql
DELETE FROM orders
WHERE order_date < '2023-01-01';
2. 高级特性
(1) 事务(Transaction)
sql
-- 显式事务控制
START TRANSACTION;
INSERT INTO users (name, email) VALUES ('Dave', '[email protected]');
UPDATE accounts SET balance = balance - 100 WHERE user_id = 4;
COMMIT; -- 提交或 ROLLBACK 回滚
-- 自动提交设置(默认开启)
SET autocommit = 0; -- 需手动提交
(2) 索引(Index)
sql
-- 创建索引
CREATE INDEX idx_email ON users(email);
-- 复合索引
CREATE INDEX idx_name_age ON users(name, age);
-- 查看索引
SHOW INDEX FROM users;
(3) 存储过程(Stored Procedure)
sql
DELIMITER $$
CREATE PROCEDURE GetUsersByAge(IN min_age INT)
BEGIN
SELECT * FROM users WHERE age >= min_age;
END $$
DELIMITER ;
-- 调用存储过程
CALL GetUsersByAge(30);
(4) 触发器(Trigger)
sql
CREATE TRIGGER before_user_update
BEFORE UPDATE ON users
FOR EACH ROW
SET NEW.updated_at = NOW();
(5) 视图(View)
sql
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)
sql
-- 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)
sql
SELECT * FROM users
WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$';
(8) JSON 支持
sql
-- 创建 JSON 字段
ALTER TABLE products ADD COLUMN metadata JSON;
-- 查询 JSON 字段
SELECT * FROM products
WHERE metadata->>'$.category' = 'electronics';
(9) 分区表(Partitioning)
sql
-- 按范围分区
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) 事务隔离级别
sql
-- 查看当前隔离级别
SELECT @@tx_isolation;
-- 设置隔离级别(如可重复读)
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
3. 其他实用特性
(1) 子查询(Subquery)
sql
SELECT name
FROM users
WHERE age > (SELECT AVG(age) FROM users);
(2) 联合查询(UNION)
sql
SELECT 'active' AS status, COUNT(*) FROM users WHERE active = 1
UNION ALL
SELECT 'inactive', COUNT(*) FROM users WHERE active = 0;
(3) 日期函数
sql
SELECT
DATE_FORMAT(NOW(), '%Y-%m-%d') AS today,
DATEDIFF(end_date, start_date) AS duration
FROM events;
(4) 锁机制
sql
-- 显式行级锁(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) 复杂查询优化
sql
-- 使用 EXPLAIN 分析执行计划
EXPLAIN SELECT * FROM orders
WHERE user_id = 100 AND status = 'pending';
(2) 备份与恢复
sql
-- 备份
mysqldump -u root -p mydatabase > backup.sql
-- 恢复
mysql -u root -p mydatabase < backup.sql
如需更具体的场景(如高并发设计、主从复制),可进一步说明需求!