DML 是用于操作数据库中实际数据的 SQL 语句集合,主要包括四大操作:插入(INSERT)、查询(SELECT)、更新(UPDATE)和删除(DELETE)。
1、INSERT - 插入数据
1.1 基本语法
- INSERT INTO table_name (column1, column2, column3, ...)
- VALUES (value1, value2, value3, ...);
复制代码 注意:
- 字段顺序需与值的顺序一一对应
- 可不指定所有字段(未指定的字段将使用默认值,如自增主键 id、created_at 等)
- 字符串值需用单引号 ' 包裹
- 日期时间值可直接用字符串表示(如 '2023-10-01 12:00:00')
1.2 示例详解
1.2.1 插入完整数据(所有列)
- -- 假设表有 id, name, email, age 列,其中 id 是自增主键
- INSERT INTO users (name, email, age)
- VALUES ('张三', 'zhangsan@example.com', 25);
复制代码 1.2.2 插入部分数据
- -- 只插入 name 和 email,age 使用默认值或 NULL
- INSERT INTO users (name, email)
- VALUES ('李四', 'lisi@example.com');
复制代码 1.2.3 一次性插入多行数据
- INSERT INTO users (name, email, age)
- VALUES
- ('王五', 'wangwu@example.com', 30),
- ('赵六', 'zhaoliu@example.com', 28),
- ('孙七', 'sunqi@example.com', 35);
复制代码 1.2.3 从其他表复制数据插入
- -- 将临时表中的数据插入到正式表
- INSERT INTO users (name, email, age)
- SELECT temp_name, temp_email, temp_age FROM temp_users;
复制代码 1.2.3 插入时处理重复键
- -- 如果遇到重复的唯一键(如email),则更新其他字段
- INSERT INTO users (name, email, age)
- VALUES ('张三', 'zhangsan@example.com', 26)
- ON DUPLICATE KEY UPDATE age = 26, name = '张三';
- -- 或者忽略重复键的插入
- INSERT IGNORE INTO users (name, email, age)
- VALUES ('张三', 'zhangsan@example.com', 26);
复制代码 2、UPDATE - 更新数据
用于修改表中现有的记录。
2.1 基本语法
- UPDATE table_name
- SET column1 = value1, column2 = value2, ...
- WHERE condition;
复制代码 注意:
- 严禁省略 WHERE 条件,否则会更新表中所有记录
- 可同时更新多个字段,用逗号分隔
- 可使用函数或表达式作为值(如 updated_at = NOW())
2.2 示例详解
2.2.1 更新单个字段
- UPDATE users
- SET email = 'new_email@example.com'
- WHERE id = 1;
复制代码 2.2.2 更新多个字段
- UPDATE users
- SET
- name = '张三丰',
- age = 28,
- email = 'zhangsanfeng@example.com'
- WHERE id = 1;
复制代码 2.2.3 基于原值更新
- -- 年龄增加1岁
- UPDATE users
- SET age = age + 1
- WHERE id = 1;
- -- 字符串拼接
- UPDATE users
- SET name = CONCAT(name, '先生')
- WHERE gender = '男';
复制代码 2.2.4 使用子查询更新
- -- 将有订单的用户标记为活跃用户
- UPDATE users
- SET is_active = TRUE
- WHERE id IN (SELECT DISTINCT user_id FROM orders);
复制代码 2.2.5 批量更新
- -- 使用 CASE 条件更新
- UPDATE users
- SET age_group =
- CASE
- WHEN age < 20 THEN '青少年'
- WHEN age BETWEEN 20 AND 40 THEN '青年'
- ELSE '中年及以上'
- END;
复制代码 3、DELETE - 删除数据
用于从表中删除记录。
3.1 基本语法
- DELETE FROM table_name
- WHERE condition;
复制代码 3.2 示例详解
2.2.1 删除特定记录
- DELETE FROM users
- WHERE id = 1;
复制代码 3.2.2 删除多条记录
- -- 删除所有未激活的用户
- DELETE FROM users
- WHERE is_active = FALSE;
- -- 删除年龄大于100的用户
- DELETE FROM users
- WHERE age > 100;
复制代码 3.2.3 使用子查询删除
- -- 删除没有订单的用户
- DELETE FROM users
- WHERE id NOT IN (SELECT DISTINCT user_id FROM orders);
复制代码 3.2.4 清空表(慎用!)
- -- 删除所有记录
- DELETE FROM users;
- -- 更快的清空表方式(不可回滚)
- TRUNCATE TABLE users;
复制代码 4、SELECT - 查询数据
用于从数据库中查询数据,这是最复杂和最常用的 DML 语句。
4.1 基本语法
- SELECT column1, column2, ...
- FROM table_name
- [WHERE condition]
- [ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...]
- [GROUP BY column1, column2, ...]
- [HAVING condition]
- [LIMIT number];
复制代码 4.2 示例详解
4.2.1 查询所有列
4.2.2 查询特定列
- SELECT name, email FROM users;
复制代码 4.2.3 使用别名
- SELECT
- name AS 姓名,
- email AS 邮箱,
- age AS 年龄
- FROM users;
复制代码 4.2.4 使用 WHERE 条件过滤
- -- 简单条件
- SELECT * FROM users WHERE age > 25;
- -- 多条件组合
- SELECT * FROM users
- WHERE age > 25 AND name LIKE '张%';
- -- 使用 IN
- SELECT * FROM users
- WHERE age IN (25, 30, 35);
- -- 使用 BETWEEN
- SELECT * FROM users
- WHERE age BETWEEN 25 AND 35;
- -- 使用 IS NULL
- SELECT * FROM users
- WHERE email IS NULL;
复制代码 4.2.4 排序结果
- -- 单字段排序
- SELECT * FROM users ORDER BY age DESC;
- -- 多字段排序
- SELECT * FROM users
- ORDER BY age DESC, name ASC;
复制代码 4.2.5 限制结果集
- -- 前10条记录
- SELECT * FROM users LIMIT 10;
- -- 分页查询:从第20条开始,取10条
- SELECT * FROM users LIMIT 20, 10;
- -- 或者使用新语法
- SELECT * FROM users LIMIT 10 OFFSET 20;
复制代码 4.2.6 去重查询
- -- 获取所有不同的年龄
- SELECT DISTINCT age FROM users;
复制代码 4.2.7 聚合函数
- -- 计数
- SELECT COUNT(*) FROM users;
- SELECT COUNT(DISTINCT age) FROM users;
- -- 求和、平均、最大、最小
- SELECT
- COUNT(*) AS 总人数,
- AVG(age) AS 平均年龄,
- MAX(age) AS 最大年龄,
- MIN(age) AS 最小年龄,
- SUM(age) AS 年龄总和
- FROM users;
复制代码 4.2.8 分组查询
- -- 按年龄分组统计
- SELECT
- age,
- COUNT(*) AS 人数
- FROM users
- GROUP BY age;
- -- 分组后筛选
- SELECT
- age,
- COUNT(*) AS 人数
- FROM users
- GROUP BY age
- HAVING COUNT(*) > 5;
复制代码 4.2.9 连接查询
- -- 内连接
- SELECT
- u.name,
- o.order_id,
- o.order_date
- FROM users u
- INNER JOIN orders o ON u.id = o.user_id;
- -- 左连接
- SELECT
- u.name,
- o.order_id
- FROM users u
- LEFT JOIN orders o ON u.id = o.user_id;
- -- 多表连接
- SELECT
- u.name,
- p.product_name,
- oi.quantity
- FROM users u
- JOIN orders o ON u.id = o.user_id
- JOIN order_items oi ON o.order_id = oi.order_id
- JOIN products p ON oi.product_id = p.id;
复制代码 4.2.10 子查询
- -- 在 WHERE 中使用子查询
- SELECT * FROM users
- WHERE age > (SELECT AVG(age) FROM users);
- -- 在 FROM 中使用子查询(派生表)
- SELECT *
- FROM (
- SELECT name, age FROM users WHERE age > 25
- ) AS adult_users;
- -- 在 SELECT 中使用子查询
- SELECT
- name,
- age,
- (SELECT COUNT(*) FROM orders WHERE user_id = users.id) AS order_count
- FROM users;
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |