本章目标:掌握日常开发中最高频的数据库操作能力,能够完成新增、删除、修改、查询,并写出可维护、可扩展的 SQL。
DML(Data Manipulation Language)用于操作表中的数据。
INSERT:新增数据UPDATE:修改数据DELETE:删除数据DQL(Data Query Language)用于查询数据,核心命令是 SELECT。
CREATE TABLE IF NOT EXISTS employees (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
department VARCHAR(30) NOT NULL,
salary DECIMAL(10,2) NOT NULL,
hire_date DATE NOT NULL,
status TINYINT NOT NULL DEFAULT 1
);
INSERT INTO employees (name, department, salary, hire_date, status) VALUES
('张三', '研发', 18000.00, '2023-03-15', 1),
('李四', '研发', 22000.00, '2022-08-01', 1),
('王五', '测试', 15000.00, '2024-01-10', 1),
('赵六', '产品', 20000.00, '2021-11-20', 0);INSERT INTO employees (name, department, salary, hire_date, status)
VALUES ('钱七', '运营', 13000.00, '2024-05-01', 1);INSERT INTO employees (name, department, salary, hire_date, status) VALUES
('孙八', '研发', 21000.00, '2023-09-01', 1),
('周九', '测试', 14000.00, '2024-03-05', 1);NOT NULL 字段必须提供有效值(或设置默认值)UPDATE employees
SET salary = 23000.00
WHERE id = 2;UPDATE employees
SET salary = salary * 1.1
WHERE department = '研发' AND status = 1;WHERE,否则会更新整张表SELECT 验证条件,再执行 UPDATEDELETE FROM employees
WHERE id = 4;DELETE FROM employees
WHERE status = 0;| 命令 | 类型 | 是否可带 WHERE | 是否重置自增 | 适用场景 |
|---|---|---|---|---|
DELETE | DML | 可以 | 通常不重置 | 按条件删除 |
TRUNCATE | DDL | 不可以 | 会重置 | 快速清空全表 |
SELECT * FROM employees;SELECT id, name, department, salary
FROM employees;SELECT id, name, salary
FROM employees
WHERE department = '研发' AND salary >= 20000;SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC;-- 第 1 页,每页 2 条
SELECT id, name, salary
FROM employees
ORDER BY id ASC
LIMIT 0, 2;SELECT DISTINCT department
FROM employees;COUNT():计数SUM():求和AVG():平均值MAX():最大值MIN():最小值SELECT department,
COUNT(*) AS emp_count,
ROUND(AVG(salary), 2) AS avg_salary
FROM employees
WHERE status = 1
GROUP BY department
HAVING AVG(salary) >= 15000;
WHERE是分组前过滤,HAVING是分组后过滤。
flowchart LR
A[FROM] --> B[WHERE]
B --> C[GROUP BY]
C --> D[HAVING]
D --> E[SELECT]
E --> F[ORDER BY]
F --> G[LIMIT]
SELECT id, name, salary
FROM employees
WHERE department = '研发' AND status = 1
ORDER BY salary DESC
LIMIT 3;SELECT department,
COUNT(*) AS on_job_count,
MAX(salary) AS max_salary
FROM employees
WHERE status = 1
GROUP BY department;SELECT COUNT(*) AS after_2023_count
FROM employees
WHERE hire_date >= '2023-01-01';WHERE 和 HAVING 的区别 WHERE:在分组前过滤行HAVING:在分组后过滤组DELETE、TRUNCATE、DROP 区别 DELETE:删数据,保留表结构,可按条件删TRUNCATE:快速清空表,重置自增DROP:删除整张表(结构 + 数据)SELECT * status = 0)的数据。