UPDATE 表名
SET 列1=新值1, 列2=新值2
WHERE 条件; -- 无WHERE则更新全表
-- 示例:带计算表达式
UPDATE products
SET price = price * 0.9
WHERE category = '清仓区';
关键点:
WHERE子句必须谨慎使用,避免误改全表数据
支持通过子查询更新多表关联数据(如 UPDATE ... FROM ... 语法)
(3)删除数据(DELETE)
sql复制代码
DELETE FROM 表名
WHERE 条件; -- 无WHERE则清空表
-- 清空表(DDL操作,不可回滚)
TRUNCATE TABLE 表名;
区别对比:
操作
可回滚性
性能
触发器触发
DELETE
是
较慢
是
TRUNCATE
否
极快
否
(4)事务控制(TRANSACTION)
DML 操作需配合事务语句保证原子性:
sql复制代码
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 或 ROLLBACK 回滚
(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)通用语法结构
sql复制代码
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 等
示例:
sql复制代码
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;
分组统计:
sql复制代码
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 10000; -- HAVING 筛选分组结果
WHERE vs HAVING:
WHERE:在分组前过滤,不可用聚合函数
HAVING:在分组后过滤,可用聚合函数
(4)排序与分页(ORDER BY)
排序(ORDER BY):
sql复制代码
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 中的查询
sql复制代码
SELECT name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
(7)联合查询(UNION)
UNION:合并多个查询结果(自动去重)
UNION ALL:保留重复结果
sql复制代码
SELECT city FROM table1
UNION
SELECT city FROM table2;