SQL通用增删改查
1、DML基础概念
(1)定义与作用
- DML(Data Manipulation Language)用于操作数据库中的数据,核心功能包括数据的插入、更新、删除。
- 与 DQL(查询)不同,DML 直接修改数据存储。
(2)主要操作类型
- INSERT:向表中插入新数据
- UPDATE:修改已有数据
- DELETE:删除指定数据
2、数据增删改
(1)插入数据(INSERT)
INSERT INTO 表名 (列1, 列2)
VALUES (值1, 值2);
INSERT INTO 表名
VALUES (值1, 值2, 值3);
INSERT INTO 表名 (列1, 列2)
VALUES (值A1, 值A2),(值B1, 值B2);
- 注意事项:
- 未指定列时默认插入所有字段,需确保值顺序与表结构一致
- 批量插入可提升性能,但需注意单次操作的数据量限制
(2)更新数据(UPDATE)
UPDATE 表名
SET 列1=新值1, 列2=新值2
WHERE 条件;
UPDATE products
SET price = price * 0.9
WHERE category = '清仓区';
- 关键点:
WHERE
子句必须谨慎使用,避免误改全表数据- 支持通过子查询更新多表关联数据(如
UPDATE ... FROM ...
语法)
(3)删除数据(DELETE)
DELETE FROM 表名
WHERE 条件;
TRUNCATE TABLE 表名;
操作 | 可回滚性 | 性能 | 触发器触发 |
---|
DELETE | 是 | 较慢 | 是 |
TRUNCATE | 否 | 极快 | 否 |
(4)事务控制(TRANSACTION)
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
(5)注意事项
- 更新/删除前通过
SELECT
验证条件准确性 - 生产环境禁止无
WHERE
的 UPDATE/DELETE 操作 - 重要数据操作前备份表(如
CREATE TABLE backup AS SELECT * FROM target
)
3、DQL 基础概念
(1)定义与作用
- DQL(Data Query Language)用于从数据库中检索数据,核心语句是
SELECT
。 - 它是 SQL 四大子语言之一(与 DDL、DML、DCL 并列),不修改数据,仅提供查询结果。
(2)通用语法结构
SELECT [DISTINCT] 列1, 列2, 聚合函数(...)
FROM 表名
[WHERE 条件]
[GROUP BY 分组列]
[HAVING 分组后条件]
[ORDER BY 排序列 [ASC|DESC]]
[OFFSET 分页参数];
(3)执行顺序
- 非编写顺序:
FROM
→ WHERE
→ GROUP BY
→ HAVING
→ SELECT
→ ORDER BY
→ OFFSET
4、数据查询
(1)基础查询(SELECT)
- 查询指定列:
SELECT name, age FROM employees;
- 查询所有列:
SELECT * FROM employees;
(谨慎使用,可能影响性能) - 别名设置:
SELECT salary AS 月薪 FROM employees;
- 去重:
SELECT DISTINCT department FROM employees;
(2)条件筛选(WHERE)
- 运算符:
=
, >
, <
, BETWEEN
, IN
, LIKE
, IS NULL
等
示例:
SELECT * FROM employees
WHERE age > 30 AND department = 'Sales';
- 模糊查询:
LIKE '张%'
:以“张”开头的字符串LIKE '%X'
:以“X”结尾的字符串(如身份证号)
(3)聚合函数与分组(GROUP BY)
聚合函数 | 作用 | 示例 |
---|
COUNT() | 统计行数 | SELECT COUNT(*) FROM employees; |
SUM() | 计算数值列总和 | SELECT SUM(salary) FROM employees; |
AVG() | 计算平均值 | SELECT AVG(age) FROM employees; |
MAX()/MIN() | 获取最大/最小值 | SELECT MAX(salary) FROM employees; |
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 10000;
- WHERE vs HAVING:
WHERE
:在分组前过滤,不可用聚合函数HAVING
:在分组后过滤,可用聚合函数
(4)排序与分页(ORDER BY)
SELECT * FROM employees
ORDER BY salary DESC, name ASC;
- 分页标准 SQL:
OFFSET 起始行 FETCH NEXT 条数 ROWS ONLY
(5)多表连接查询(JOIN)
连接类型 | 语法示例 | 作用 |
---|
内连接(INNER JOIN) | SELECT * FROM A INNER JOIN B ON A.id=B.id | 返回两表匹配的行 |
左连接(LEFT JOIN) | SELECT * FROM A LEFT JOIN B ON A.id=B.id | 返回左表全部 + 右表匹配行 |
右连接(RIGHT JOIN) | SELECT * FROM A RIGHT JOIN B ON A.id=B.id | 返回右表全部 + 左表匹配行 |
全连接(FULL JOIN) | SELECT * FROM A FULL JOIN B ON A.id=B.id | 返回两表所有行(MySQL 需用 UNION 模拟) |
(6)子查询
- 嵌套在
WHERE
/FROM
/SELECT
中的查询
SELECT name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
(7)联合查询(UNION)
- UNION:合并多个查询结果(自动去重)
UNION ALL
:保留重复结果
SELECT city FROM table1
UNION
SELECT city FROM table2;