找回密码
 立即注册
首页 业界区 安全 MySQL DML基本操作

MySQL DML基本操作

全阳霁 2025-10-1 13:03:42
DML 是用于操作数据库中实际数据的 SQL 语句集合,主要包括四大操作:插入(INSERT)、查询(SELECT)、更新(UPDATE)和删除(DELETE)。
1、INSERT - 插入数据

1.1 基本语法
  1. INSERT INTO table_name (column1, column2, column3, ...)
  2. VALUES (value1, value2, value3, ...);
复制代码
注意:

  • 字段顺序需与值的顺序一一对应
  • 可不指定所有字段(未指定的字段将使用默认值,如自增主键 id、created_at 等)
  • 字符串值需用单引号 ' 包裹
  • 日期时间值可直接用字符串表示(如 '2023-10-01 12:00:00')
1.2 示例详解

1.2.1 插入完整数据(所有列)
  1. -- 假设表有 id, name, email, age 列,其中 id 是自增主键
  2. INSERT INTO users (name, email, age)
  3. VALUES ('张三', 'zhangsan@example.com', 25);
复制代码
1.2.2 插入部分数据
  1. -- 只插入 name 和 email,age 使用默认值或 NULL
  2. INSERT INTO users (name, email)
  3. VALUES ('李四', 'lisi@example.com');
复制代码
1.2.3 一次性插入多行数据
  1. INSERT INTO users (name, email, age)
  2. VALUES
  3. ('王五', 'wangwu@example.com', 30),
  4. ('赵六', 'zhaoliu@example.com', 28),
  5. ('孙七', 'sunqi@example.com', 35);
复制代码
1.2.3 从其他表复制数据插入
  1. -- 将临时表中的数据插入到正式表
  2. INSERT INTO users (name, email, age)
  3. SELECT temp_name, temp_email, temp_age FROM temp_users;
复制代码
1.2.3 插入时处理重复键
  1. -- 如果遇到重复的唯一键(如email),则更新其他字段
  2. INSERT INTO users (name, email, age)
  3. VALUES ('张三', 'zhangsan@example.com', 26)
  4. ON DUPLICATE KEY UPDATE age = 26, name = '张三';
  5. -- 或者忽略重复键的插入
  6. INSERT IGNORE INTO users (name, email, age)
  7. VALUES ('张三', 'zhangsan@example.com', 26);
复制代码
2、UPDATE - 更新数据

用于修改表中现有的记录。
2.1 基本语法
  1. UPDATE table_name
  2. SET column1 = value1, column2 = value2, ...
  3. WHERE condition;
复制代码
注意:

  • 严禁省略 WHERE 条件,否则会更新表中所有记录
  • 可同时更新多个字段,用逗号分隔
  • 可使用函数或表达式作为值(如 updated_at = NOW())
2.2 示例详解

2.2.1 更新单个字段
  1. UPDATE users
  2. SET email = 'new_email@example.com'
  3. WHERE id = 1;
复制代码
2.2.2 更新多个字段
  1. UPDATE users
  2. SET
  3.     name = '张三丰',
  4.     age = 28,
  5.     email = 'zhangsanfeng@example.com'
  6. WHERE id = 1;
复制代码
2.2.3 基于原值更新
  1. -- 年龄增加1岁
  2. UPDATE users
  3. SET age = age + 1
  4. WHERE id = 1;
  5. -- 字符串拼接
  6. UPDATE users
  7. SET name = CONCAT(name, '先生')
  8. WHERE gender = '男';
复制代码
2.2.4 使用子查询更新
  1. -- 将有订单的用户标记为活跃用户
  2. UPDATE users
  3. SET is_active = TRUE
  4. WHERE id IN (SELECT DISTINCT user_id FROM orders);
复制代码
2.2.5 批量更新
  1. -- 使用 CASE 条件更新
  2. UPDATE users
  3. SET age_group =
  4.     CASE
  5.         WHEN age < 20 THEN '青少年'
  6.         WHEN age BETWEEN 20 AND 40 THEN '青年'
  7.         ELSE '中年及以上'
  8.     END;
复制代码
3、DELETE - 删除数据

用于从表中删除记录。
3.1 基本语法
  1. DELETE FROM table_name
  2. WHERE condition;
复制代码
3.2 示例详解

2.2.1 删除特定记录
  1. DELETE FROM users
  2. WHERE id = 1;
复制代码
3.2.2 删除多条记录
  1. -- 删除所有未激活的用户
  2. DELETE FROM users
  3. WHERE is_active = FALSE;
  4. -- 删除年龄大于100的用户
  5. DELETE FROM users
  6. WHERE age > 100;
复制代码
3.2.3 使用子查询删除
  1. -- 删除没有订单的用户
  2. DELETE FROM users
  3. WHERE id NOT IN (SELECT DISTINCT user_id FROM orders);
复制代码
3.2.4 清空表(慎用!)
  1. -- 删除所有记录
  2. DELETE FROM users;
  3. -- 更快的清空表方式(不可回滚)
  4. TRUNCATE TABLE users;
复制代码
4、SELECT - 查询数据

用于从数据库中查询数据,这是最复杂和最常用的 DML 语句。
4.1 基本语法
  1. SELECT column1, column2, ...
  2. FROM table_name
  3. [WHERE condition]
  4. [ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...]
  5. [GROUP BY column1, column2, ...]
  6. [HAVING condition]
  7. [LIMIT number];
复制代码
4.2 示例详解

4.2.1 查询所有列
  1. SELECT * FROM users;
复制代码
4.2.2 查询特定列
  1. SELECT name, email FROM users;
复制代码
4.2.3 使用别名
  1.     SELECT
  2.     name AS 姓名,
  3.     email AS 邮箱,
  4.     age AS 年龄
  5. FROM users;
复制代码
4.2.4 使用 WHERE 条件过滤
  1. -- 简单条件
  2. SELECT * FROM users WHERE age > 25;
  3. -- 多条件组合
  4. SELECT * FROM users
  5. WHERE age > 25 AND name LIKE '张%';
  6. -- 使用 IN
  7. SELECT * FROM users
  8. WHERE age IN (25, 30, 35);
  9. -- 使用 BETWEEN
  10. SELECT * FROM users
  11. WHERE age BETWEEN 25 AND 35;
  12. -- 使用 IS NULL
  13. SELECT * FROM users
  14. WHERE email IS NULL;
复制代码
4.2.4 排序结果
  1. -- 单字段排序
  2. SELECT * FROM users ORDER BY age DESC;
  3. -- 多字段排序
  4. SELECT * FROM users
  5. ORDER BY age DESC, name ASC;
复制代码
4.2.5 限制结果集
  1. -- 前10条记录
  2. SELECT * FROM users LIMIT 10;
  3. -- 分页查询:从第20条开始,取10条
  4. SELECT * FROM users LIMIT 20, 10;
  5. -- 或者使用新语法
  6. SELECT * FROM users LIMIT 10 OFFSET 20;
复制代码
4.2.6 去重查询
  1. -- 获取所有不同的年龄
  2. SELECT DISTINCT age FROM users;
复制代码
4.2.7 聚合函数
  1. -- 计数
  2. SELECT COUNT(*) FROM users;
  3. SELECT COUNT(DISTINCT age) FROM users;
  4. -- 求和、平均、最大、最小
  5. SELECT
  6.     COUNT(*) AS 总人数,
  7.     AVG(age) AS 平均年龄,
  8.     MAX(age) AS 最大年龄,
  9.     MIN(age) AS 最小年龄,
  10.     SUM(age) AS 年龄总和
  11. FROM users;
复制代码
4.2.8 分组查询
  1. -- 按年龄分组统计
  2. SELECT
  3.     age,
  4.     COUNT(*) AS 人数
  5. FROM users
  6. GROUP BY age;
  7. -- 分组后筛选
  8. SELECT
  9.     age,
  10.     COUNT(*) AS 人数
  11. FROM users
  12. GROUP BY age
  13. HAVING COUNT(*) > 5;
复制代码
4.2.9 连接查询
  1. -- 内连接
  2. SELECT
  3.     u.name,
  4.     o.order_id,
  5.     o.order_date
  6. FROM users u
  7. INNER JOIN orders o ON u.id = o.user_id;
  8. -- 左连接
  9. SELECT
  10.     u.name,
  11.     o.order_id
  12. FROM users u
  13. LEFT JOIN orders o ON u.id = o.user_id;
  14. -- 多表连接
  15. SELECT
  16.     u.name,
  17.     p.product_name,
  18.     oi.quantity
  19. FROM users u
  20. JOIN orders o ON u.id = o.user_id
  21. JOIN order_items oi ON o.order_id = oi.order_id
  22. JOIN products p ON oi.product_id = p.id;
复制代码
4.2.10 子查询
  1. -- 在 WHERE 中使用子查询
  2. SELECT * FROM users
  3. WHERE age > (SELECT AVG(age) FROM users);
  4. -- 在 FROM 中使用子查询(派生表)
  5. SELECT *
  6. FROM (
  7.     SELECT name, age FROM users WHERE age > 25
  8. ) AS adult_users;
  9. -- 在 SELECT 中使用子查询
  10. SELECT
  11.     name,
  12.     age,
  13.     (SELECT COUNT(*) FROM orders WHERE user_id = users.id) AS order_count
  14. FROM users;
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册