446 字
2 分钟
MySQL学习笔记 (8)
2026-09-01
NOTE

基于 MySQL 26.7。数据操作

INSERT INTO#

INSERT INTO 语句用于向表中插入新记录。

INSERT INTO employee (emp_id, last_name, dept_no)
VALUES (201, '周七', 'D01');

一次插入多行:

INSERT INTO employee (emp_id, last_name, dept_no)
VALUES (202, '吴八', 'D01'),
(203, '郑九', 'D02');

没有出现在列表里的列会使用默认值,或者是 NULL。

也可以把查询结果插入另一张表:

CREATE TABLE employee_archive (
emp_id INTEGER NOT NULL,
last_name VARCHAR(40) NOT NULL
);
INSERT INTO employee_archive (emp_id, last_name)
SELECT emp_id, last_name
FROM employee
WHERE hire_date < DATE '2020-01-01';

UPDATE#

UPDATE 语句用于更新表中的记录。

UPDATE employee
SET salary = salary * 1.05,
dept_no = 'D02'
WHERE emp_id = 101;

注意:省略 WHERE 会更新表中的所有行。

DELETE#

DELETE 语句用于删除表中的记录。

DELETE FROM employee
WHERE emp_id = 103;

注意:省略 WHERE 会删除表中的所有行。

TRUNCATE TABLE 也会清空表,和逐行 DELETE 不完全一样。

视图#

视图是基于 SQL 语句的结果集的可视化表。

CREATE VIEW employee_public AS
SELECT emp_id, last_name, dept_no
FROM employee;
SELECT * FROM employee_public
WHERE dept_no = 'D01';

删除视图:

DROP VIEW employee_public;

WITH CHECK OPTION 要求通过视图插入或更新的行,仍然能被该视图查到。带聚合、DISTINCT 或多表的视图往往不能更新。

事务#

事务把多条语句绑在一起:要么全部成功,要么全部取消。

CREATE TABLE account (
id INTEGER NOT NULL,
balance NUMERIC(12, 2) NOT NULL,
CONSTRAINT account_pk PRIMARY KEY (id)
);
INSERT INTO account (id, balance)
VALUES (1, 500), (2, 200);
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;
  • START TRANSACTION:开始事务
  • COMMIT:提交
  • ROLLBACK:回滚,撤销还没提交的修改

许多客户端默认每条语句自动提交。需要多条语句一起提交时,先执行 START TRANSACTION


参考#

  1. MySQL 26.7 · INSERT
  2. MySQL 26.7 · UPDATE
  3. MySQL 26.7 · DELETE
  4. MySQL 26.7 · CREATE VIEW
  5. MySQL 26.7 · START TRANSACTION
  6. ISO/IEC 9075(SQL<2023>
MySQL学习笔记 (8)
https://blog.chuwu.top/posts/sql/mysql8/
作者
ChuwuYo
发布于
2026-09-01
许可协议
CC BY-NC-SA 4.0