这周主要系统学习了一遍数据库最核心的链路:创建数据库 → 创建表 → 对表里的数据做增删改查

一、创建数据库

数据库就像一个大仓库,用来装各种"表"。动手前,我们要先在数据库里建一个自己的"仓库"。

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-DD2000-01-01
datetime日期时间 YYYY-MM-DD HH:MM:SS2026-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):把数据取出来看(重点)

查询是增删改查里最常用、内容也最丰富的一部分。下面我们假设表里有这些数据:

idnameagemajorscore
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;

七、实践易错点

  1. 忘了写 USE 库名:不切换到目标库就操作,会报"没有选择数据库"。
  2. 字符串忘了加引号:字符串和日期要用单引号 ' 括起来,数字不用。
  3. 表名、列名拼错:SQL 关键字不区分大小写,但表名、列名要写对。
  4. 主键重复:插入时手动给了和已有主键相同的值会报错,主键要保证唯一、非空。
  5. 各类删除的区别:想连表结构一起删掉,用 DROP TABLE student;清空整张表的数据(保留表结构),用DELETE FROM student 或者 TRUNCATE TABLE student;
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐