以mysql 为例,增删改查语法及其他高级特性

以下是 MySQL增删改查语法高级特性的详细整理,结合示例说明:


1. 基础操作(CRUD)

(1) 创建数据(INSERT)

sql 复制代码
-- 单条插入
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)

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 = 'new_email@example.com', 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', 'dave@example.com');
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. 注意事项

  1. 索引优化
    • 避免过度索引,影响写入性能。
    • 优先为 WHERE, JOIN, ORDER BY 字段创建索引。
  2. 事务设计
    • 短事务可减少锁冲突。
    • 根据业务选择隔离级别(如 READ COMMITTEDREPEATABLE READ)。
  3. JSON 字段
    • 使用 JSON_EXTRACT->> 简化查询。
  4. 分区表
    • 适用于大数据量表(如按日期分区)。
    • 需评估分区键的合理性。

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

如需更具体的场景(如高并发设计、主从复制),可进一步说明需求!

相关推荐
0xDevNull4 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希5 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神5 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员5 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴5 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存