插入多条数据(SQL):
在 SQL 中插入多条数据时,可以使用 单个 INSERT
语句结合 多组 VALUES
来实现。以下是详细语法和注意事项:
基本语法
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES
(值1_1, 值1_2, 值1_3, ...), -- 第一条数据
(值2_1, 值2_2, 值2_3, ...), -- 第二条数据
... -- 更多数据
;
insert into student values(910,'张老大','男','1985-01-02','计算机系','北京市海淀区');
学生数据表
INSERT INTO student VALUES
(905, '张老大', '男', '1985-01-01', '计算机系', '北京市海淀区'),
(906, '张老二', '男', '1986-01-01', '中文系', '湖南省永州市'),
(907, '张三', '女', '1986-01-01', '中文系', '辽宁省阜新市'),
(908, '李四', '男', '1986-01-01', '英语系', '福建省厦门市'),
(909, '王五', '女', '1986-01-01', '英语系', '北京市昌平区'),
(900, '王六', '男', '1986-01-01', '计算机系', '湖南省衡阳市');
修改数据库表的字段:
修改数据库表的字段:
方式一:修改字段名
修改表的字段, alter table表名 change 旧字段 新字段 数据类型()
ALTER TABLE student
CHANGE department dept VARCHAR(15); -- 将 department 字段重命名为 dept
方式二:
ALTER TABLE表名 MODIFY 字段名 新数据类型;
ALTER TABLE users MODIFY age INT;
修改字段类型
ALTER TABLE student
MODIFY dept CHAR(20); -- 将 dept 字段类型改为 CHAR(20)
添加字段名和字段类型
ALTER TABLE student ADD grade INT(10); -- 增加一个 grade 字段
添加字段
ALTER TABLE 表名 ADD 新字段名 数据类型;
ALTER TABLE student ADD email VARCHAR(255);
删除字段
ALTER TABLE 表名 DROP 字段名;
ALTER TABLE student DROP email;
-- 注意:DROP 操作一般无法回滚
修改字段默认值
ALTER TABLE 表名 ALTER 字段名 SET DEFAULT 默认值;
ALTER TABLE users ALTER email SET DEFAULT 'wangjing@123.com';
更新数据
UPDATE student SET name='掏粪男孩' WHERE id=901;
多条件锁定更新数据
多条件锁定更新数据
UPDATE 表名
SET 列1=值1, 列2=值2, ...
WHERE 条件1 AND/OR 条件2...;
示例:
UPDATE student
SET dept='计算机系', address='北京市朝阳区'
WHERE id=905 AND name='张老大';
批量更新数据
UPDATE student
SET age = age + 1; -- 将表中所有记录的age字段值加1
子查询更新(先查子表,后查外部表)
-- 将表 students 中 name 为'张三'的记录的 class_id 更新为
-- 表 classes 中 name 为'数学班'的 class_id
UPDATE students
SET class_id = (SELECT id FROM classes WHERE name = '数学班')
WHERE name = '张三';
Create Table Example
CREATE TABLE class (
id INT(10) NOT NULL,
classname VARCHAR(10)
) DEFAULT CHARSET utf8mb4;
删除某一列的数据:
update student set name=NULL;(数据设为空)(性能较低,找一列再删除)
alter table student drop dept;(直接删除字段,告诉为空的)
批量更新
replace into是指更新替换的意思。
在使用时,会检索表的主键或者唯一约束,没有只会做新增,起不到替换作用
replace into表名value(带有约束的值1,值2);
如果该值1存在,则更新值2
如果不存在,则新增一条数据
REPLACE INTO student(id, name) VALUES (1, '杜拉拉');
更新少量数据
UPDATE your_table
SET column1 = value1, column2 = value2
WHERE condition;
update表名 set要修改的字段=CASE
CASE 语句批量更新
UPDATE 表名
SET 字段 = CASE
WHEN 条件1 THEN 值1
WHEN 条件2 THEN 值2
...
ELSE 默认值 -- 可选
END;
-- 示例
UPDATE boy SET
id = CASE
WHEN id = 1 THEN 3
WHEN id = 2 THEN 4
ELSE id -- 保持其他记录不变(该字段的其他值不做任何处理)
END;
-- 示例
UPDATE student SET
sex = CASE
WHEN 1=1 THEN '女'
END;
!TCP/IP 模拟的抓包
删除数据使用delete:
limit 有正序排列之意
and (和) between(区间)
DELETE FROM 表名 WHERE 条件; -- 删除符合条件的数据
-- 示例
DELETE FROM student WHERE id = 905; -- 删除id为905的记录
DELETE FROM student WHERE dept = '英语系'; -- 删除所有英语系学生
-- 使用LIMIT限制删除数量(limit默认是降序)
DELETE FROM 表名 WHERE 条件 LIMIT 数量; (
DELETE FROM student WHERE score < 60 LIMIT 10; -- 只删除10条不及格记录
删除表,但是保留结构
DELETE FROM 表名; -- 删除表中所有数据(保留表结构)(一行一行删)
-- 更推荐使用 TRUNCATE 清空表,性能更好(直接删除所有数据)
TRUNCATE TABLE 表名;
数据删除操作对比
- DELETE: 逐行删除(可回滚)
- TRUNCATE: 快速清空表(通常不可回滚)
- DROP: 快速删除表/库,不留结果(不可回滚)
数据库约束
数据库约束
数据库约束是对数据的合法性校验机制,目的是防止非法数据被插入/修改。
NOT NULL 约束
创建表时指定列不允许为空:
CREATE TABLE 表名 (
列名 数据类型 NOT NULL -- 该列不允许为空
);
-- 例子
CREATE TABLE users (
id INT NOT NULL, -- id不能为空
username VARCHAR(50) -- username可以为空(默认)
);
未指定
NOT NULL
时,列允许插入NULL
值。
UNIQUE 约束
-- 创建表时添加唯一约束
CREATE TABLE 表名 (
列名 数据类型 UNIQUE -- 该列值必须唯一
);
-- 示例
CREATE TABLE users (
id INT NOT NULL,
email VARCHAR(50) UNIQUE -- email必须唯一
);
-- 现有表添加唯一约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (列名);
ALTER TABLE users ADD CONSTRAINT uc_email UNIQUE (email);
- 插入/修改数据时会检查值是否已存在
- 唯一但允许NULL值(可多行包含NULL)
- 会隐式创建索引提高查询效率
- UNIQUE + NOT NULL = PRIMERY KEY
DEFAULT 约束
设置字段的默认值(未显式指定值时使用):
CREATE TABLE 表名 (
列名 数据类型 DEFAULT 默认值 -- 设置默认值
);
-- 示例
CREATE TABLE users (
id INT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 默认当前时间
);
-- 现有表修改默认值
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 新默认值;
特点:
- 未指定时默认NULL
- INSERT时若忽略该列则使用默认值
PRIMARY KEY 约束
主键是一个表中每行数据的唯一标识(如身份证号、学号等),特点:
- 等同于 UNIQUE + NOT NULL
- 每表只能有一个主键(可以是单列或多列组合)
- 常用作索引提高查询性能
-- 单列主键
CREATE TABLE users (
id INT PRIMARY KEY, -- 直接定义
name VARCHAR(50)
);
-- 多列联合主键(少见)
CREATE TABLE orders (
user_id INT,
order_id INT,
PRIMARY KEY (user_id, order_id) -- 复合主键
);
-- 现有表添加主键
ALTER TABLE 表名 ADD PRIMARY KEY (列名);
主键值通常不可修改且不建议包含业务逻辑
Student 表的定义
字段名 | 字段描述 | 数据类型 | 主键 | 外键 | 非空 | 唯一 | 自增 |
---|---|---|---|---|---|---|---|
Id | 学号 | INT(10) | 是 | 否 | 是 | 是 | 是 |
Name | 姓名 | VARCHAR(20) | 否 | 否 | 是 | 否 | 否 |
Sex | 性别 | VARCHAR(4) | 否 | 否 | 否 | 否 | 否 |
Birth | 出生年份 | YEAR | 否 | 否 | 否 | 否 | 否 |
Department | 院系 | VARCHAR(20) | 否 | 否 | 是 | 否 | 否 |
Address | 家庭住址 | VARCHAR(50) | 否 | 否 | 否 | 否 | 否 |
Student 表的定义
CREATE TABLE Studentdata (
Id INT(10) PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(20) NOT NULL,
Sex VARCHAR(4),
Birth YEAR,
Department VARCHAR(20) NOT NULL,
Address VARCHAR(50)
)default charset utf8mb4;
create table student(int auto_increment)自增长
MySQL 外键约束
外键约束用于维护表间的数据完整性,通过引用另一个表的主键/唯一键来保证参照完整性。
创建外键约束(添加时:先有外键表,再有子表)(删除时,无子表内容,才能删除外键表内容)
- 建表时添加:
CREATE TABLE 表名 (
列名 数据类型,
FOREIGN KEY (列名) REFERENCES 主表(主键列)
);
- 现有表添加:
ALTER TABLE 从表
ADD CONSTRAINT 约束名
FOREIGN KEY (列名) REFERENCES 主表(主键列);
CREATE TABLE employees (
emp_id INT AUTO_INCREMENT,
emp_name VARCHAR(100),
dept_id INT,
PRIMARY KEY (emp_id),
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
指定外键约束的时候,要求父表中被关联
的这一列,是主键或者是unique约束的。
否则子表不能关联到该列,会报错。
外键约束。有外键的叫做子表。一个表的主键作为另一个表的主键,该表称成为父表,需要先给父表进行添加内容。才能给子表添加内容,删除时,也需要先删除子表里面的内容,才能删除父表的内容。
自我的介绍