当前位置: 首页 > news >正文

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

以下是 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)
BEGIN
    SELECT * 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. 注意事项

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

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

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

相关文章:

  • 3.21-1自动化框架
  • 3.3V升5V2A升压转换,WD1016可兼容SD6271
  • 文件相关函数的总结与记忆
  • 简洁、实用、无插件和更安全为特点的WordPress主题
  • 《南京日报》专题报道 | 耘瞳科技“工业之眼”加码“中国智造”
  • Billu_b0x靶机攻略
  • linux下基本命令和扩展命令(安装和登录命令、文件处理命令、系统管理相关命令、网络操作命令、系统安全相关命令、其他命令)欢迎补充噢
  • 微信小程序检测滚动到某元素位置的计算方法
  • 34、在 deque中使用 [] 操作符和 at() 方法有何区别?
  • 深度强化学习中的深度神经网络优化策略:挑战与解决方案
  • JavaScript |(五)DOM简介 | 尚硅谷JavaScript基础实战
  • 以mysql 为例, 在cmd 命令行连接数据,操作数据库,关闭数据库的详细步骤
  • java string 类型转list实体类且忽略实体类中没有的字段
  • 城市更新浪潮下的破局之道:中建海龙模块化集成建筑技术的新应用
  • 数智读书笔记系列021《大数据医疗》:探索医疗行业的智能变革
  • 接收与发送ipv6数据包
  • 北斗设备启动流程与时长解析
  • W80x使用WM IoT SDK 2.X 开发(二)驱动tft屏幕
  • JavaScript |(六)DOM事件 | 尚硅谷JavaScript基础实战
  • JVM 学习前置知识
  • 浙江演艺集团7部作品组团来沪,今夏开启首届上海演出季
  • 外交部部长助理兼礼宾司司长洪磊接受美国新任驻华大使递交国书副本
  • 一种声音·阿甘本|即将到来的中世纪;“新”与“旧”……
  • 英德宣布开发射程超2000公里导弹,以防务合作加强安全、促进经济
  • 小米汽车机盖门陷谈判僵局,车主代表称小米表示“退订会造成崩塌”
  • 获派驻6年后,中国驻厄瓜多尔大使陈国友即将离任