从建库建表到增删改查的SQL完全指南
这周主要系统学习了一遍数据库最核心的链路:创建数据库 → 创建表 → 对表里的数据做增删改查
一、创建数据库
数据库就像一个大仓库,用来装各种"表"。动手前,我们要先在数据库里建一个自己的"仓库"。
1. 基础建库语句
—— 创建一个名为 school 的数据库
create database school;
2.避免重复建库报错
if not exists:库已存在时不会报错,而是静默跳过
create database if not exsits school default character set utf8mb4;
3. 查看、切换、删除数据库
– 查看当前服务器上有哪些数据库
show databases;
– 切换(进入)到某个数据库,后续操作都作用于它
use school;
重要:执行 use school 之前,你对表的所有操作都会报"没有选择数据库"
– 删除数据库(⚠️ 不可逆,里面的表和数据会一起消失,新手慎用)
drop database school;
二、创建表
数据库建好后,就要在里面"建表"。表由列(字段)和数据类型、约束组成
1. 常用的数据类型
| 数据类型 | 说明 | 示例 |
|---|---|---|
| int | 整数 | 年龄 18、数量 100 |
| varchar(n) | 可变长字符串,n 为最大字符数 | 姓名 “小明” |
| char(n) | 定长字符串,固定占 n 个字符 | 手机号、学号 |
| text | 长文本 | 个人简介 |
| decimal(m,d) | 定点小数,m 总位数、d 小数位 | 成绩 92.50 |
| float/double | 浮点数 | 科学计算 |
| date | 日期 YYYY-MM-DD | 2000-01-01 |
| datetime | 日期时间 YYYY-MM-DD HH:MM:SS | 2026-10-18 10:30:00 |
| timestamp | 时间戳,常用于记录创建/更新时间 | 自动记录当前时间 |
| boolean | 布尔值,存 0/1 | 是否有效 |
2. 常用的约束
约束是给列加的"规则",保证数据合法、不乱
| 约束 | 作用 |
|---|---|
| primary key(主键) | 每一行的唯一标识,不能重复、不能为空,一张表只能有一个主键 |
| not null | 该列不能为空,必须有值 |
| unique | 该列的值不能重复 |
| default 值 | 不写时自动填入的默认值 |
| auto_increment | 自动递增,常用于主键,省得手动写编号 |
| check | 检查约束,限制取值范围 |
3. 建表完整示例
我们用"学生表" student 来演示:
create table student (
id int primary key auto_increment , – 主键,自增,不能为空
name varchar(50) not null, – 姓名,不能为空
age int, – 年龄
major varchar(50), – 专业
score decimal(5,2) check (score >= 0 AND score <= 100), – 成绩 0~100
email varchar(100) unique, – 邮箱,不能重复
is_active boolean default true, – 是否有效,默认有效
created_at datetime default currend_timestamp – 创建时间,默认当前时间
);
这段建表语句里,每列都包含:字段名 + 数据类型 + 约束。读法示例:name varchar(50) not null = “姓名这一列,最长 50 个字符,不能为空”。
4. 查看和删除表
– 查看表结构(每列的类型、约束、默认值)
DESC student;
– 查看当前数据库有哪些表
SHOW TABLES;
– 删除整张表(⚠️ 不可逆,数据连同结构一起删除,新手慎用)
DROP TABLE student;
5. 补充:修改表结构(ALTER TABLE)
建好表后想加列、删列、改列,用ALTER TABLE :
– 给表增加一列
ALTER TABLE student ADD COLUMN phone VARCHAR(20);
– 删除一列
ALTER TABLE student DROP COLUMN phone;
– 修改某列的数据类型
ALTER TABLE student MODIFY COLUMN age INT NOT NULL;
三、增(INSERT):往表里插入数据
1. 指定列插入
INSERT INTO student (name, age, major, score) VALUES (‘小明’, 20, ‘计算机’, 92.50);
只写了 name/age/major/score 四列,id自增、is_active 用默认值、created_at 取当前时间,都由系统自动填,不用手动管。
2. 一次插入多条
INSERT INTO student (name, age, major, score) VALUES
(‘小红’, 21, ‘数学’, 85.00),
(‘小刚’, 19, ‘物理’, 78.50),
(‘小丽’, 20, ‘计算机’, 96.00);
3. 给所有列赋值(顺序必须和建表一致)
INSERT INTO student VALUES (100, ‘小智’, 23, ‘物理’, 75.00, ‘xiaozhi@mail.com’, 1, NOW());
NOW()是取当前时间的函数。不推荐这种全列写法,因为一旦表结构变了很容易写错顺序,平时用"指定列"最稳。
4. 插入时显式指定默认值
– 用 DEFAULT 关键字,让该列填默认值
INSERT INTO student (name, age, major, score, is_active) VALUES (‘小梅’, 21, ‘生物’, 82.00, DEFAULT);
四、查(SELECT):把数据取出来看(重点)
查询是增删改查里最常用、内容也最丰富的一部分。下面我们假设表里有这些数据:
| id | name | age | major | score |
|---|---|---|---|---|
| 1 | 小明 | 20 | 计算机 | 92.50 |
| 2 | 小红 | 21 | 数学 | 85.00 |
| 3 | 小刚 | 19 | 物理 | 78.50 |
| 4 | 小丽 | 20 | 计算机 | 96.00 |
1. 基础查询
– 查所有列(开发中尽量少用 *,只取需要的列)
SELECT * FROM student;
– 只查指定列
SELECT name, age FROM student;
– 给列起别名,让结果更易读(AS 可省略)
SELECT name AS 姓名, score AS 成绩 FROM student;
2. 条件筛选(WHERE)
– 精确匹配
SELECT * FROM student WHERE major = ‘计算机’;
– 比较运算:> < >= <= = <>(<> 表示"不等于")
SELECT * FROM student WHERE score >= 90;
SELECT * FROM student WHERE age < 20;
SELECT * FROM student WHERE age <> 20; – 年龄不等于 20 的
– 组合条件:AND(且)、OR(或)、NOT(非)
SELECT * FROM student WHERE major = ‘计算机’ AND score >= 90;
SELECT * FROM student WHERE major = ‘计算机’ OR major = ‘数学’;
SELECT * FROM student WHERE NOT major = ‘物理’;
– IN:匹配多个值中的任意一个
SELECT * FROM student WHERE major IN (‘计算机’, ‘数学’);
– BETWEEN:范围查询(闭区间,含两端)
SELECT * FROM student WHERE score BETWEEN 80 AND 95;
3. 模糊查询(LIKE)
– % 代表任意多个字符,_ 代表任意一个字符
SELECT * FROM student WHERE name LIKE ‘小%’; – 以"小"开头的
SELECT * FROM student WHERE major LIKE ‘%计算%’; – 专业里含"计算"的
SELECT * FROM student WHERE name LIKE ‘小_’; – “小” + 任意一个字符
4. 去重(DISTINCT)
– 看表里一共出现过哪些专业(重复的只显示一次)
SELECT DISTINCT major FROM student;
5. 排序(ORDER BY)
– 按成绩从高到低(DESC 降序)
SELECT * FROM student ORDER BY score DESC;
– 按成绩从低到高(ASC 升序,默认就是升序,可省略)
SELECT * FROM student ORDER BY score ASC;
– 多字段排序:先按专业排,专业相同的再按成绩降序
SELECT * FROM student ORDER BY major, score DESC;
6. 分页(LIMIT)
– 只取前 2 条
SELECT * FROM student LIMIT 2;
– 跳过前 2 条,取后面的 3 条(offset, count)
SELECT * FROM student LIMIT 2, 3;
7. 聚合统计(COUNT / SUM / AVG / MAX / MIN)
SELECT COUNT(*) FROM student; – 表里一共几条记录
SELECT COUNT(name) FROM student; – name 不为空的记录数
SELECT AVG(score) FROM student; – 平均成绩
SELECT MAX(score) FROM student; – 最高分
SELECT MIN(score) FROM student; – 最低分
SELECT SUM(score) FROM student; – 成绩总和
8. 分组统计(GROUP BY + HAVING)
– 每个专业各有多少人
SELECT major, COUNT(*) AS 人数 FROM student GROUP BY major;
– 每个专业的平均分
SELECT major, AVG(score) AS 平均分 FROM student GROUP BY major;
– HAVING:对"分组后的结果"再筛选
– 找出平均分 >= 85 的专业
SELECT major, AVG(score) AS 平均分
FROM student
GROUP BY major
HAVING 平均分 >= 85;
WHERE和HAVING的区别:WHERE在分组之前过滤原始行,HAVING在分组之后过滤聚合结果。对聚合函数(如AVG(score))做条件筛选,只能用HAVING。
五、改(UPDATE):修改数据
1. 修改某一行的一个字段
UPDATE student SET age = 21 WHERE name = ‘小明’;
2. 同时修改多个字段
UPDATE student SET major = ‘软件工程’, score = 93.00 WHERE name = ‘小明’;
3. 带条件的批量修改
– 给所有计算机专业的学生成绩加 5 分
UPDATE student SET score = score + 5 WHERE major = ‘计算机’;
六、删(DELETE):删除数据
1. 删除某一行
DELETE FROM student WHERE name = ‘小刚’;
2. 带条件删除
– 删除所有成绩低于 80 的记录
DELETE FROM student WHERE score < 80;
3. 清空整张表的数据(保留表结构)
DELETE FROM student;
TRUNCATE TABLE student;
七、实践易错点
- 忘了写 USE 库名:不切换到目标库就操作,会报"没有选择数据库"。
- 字符串忘了加引号:字符串和日期要用单引号
'括起来,数字不用。 - 表名、列名拼错:SQL 关键字不区分大小写,但表名、列名要写对。
- 主键重复:插入时手动给了和已有主键相同的值会报错,主键要保证唯一、非空。
- 各类删除的区别:想连表结构一起删掉,用 DROP TABLE student;清空整张表的数据(保留表结构),用DELETE FROM student 或者 TRUNCATE TABLE student;
更多推荐



所有评论(0)