零基础起步:把第一个数据库建出来
假设你什么都没做过。6 个关卡,每一步都写清「做什么 / 敲什么 / 你应该看到 / 报错怎么办」。全程约 40 分钟。
走完这 6 关,你就能
- 启动 MySQL 并用命令行 / Navicat 连上
- 建一个不乱码的库,并建出带主键、自增的表
- 用 INSERT 灌数据、用 SELECT 查出来
- 用 WHERE / LIKE / ORDER BY / LIMIT 取数
- 用 UPDATE / DELETE / ALTER 维护数据与结构
- 看到报错知道按错误码去哪里查
关卡目录
第 0 关 · 确认 MySQL 装好、能连上(5 分钟)
前提:已经装过 MySQL(第2章--4 安装MYSQL)
1① 看服务有没有起来
🎯 Windows 上用「服务」管理器看,或命令行执行:
net start | findstr /i mysqlMySQL MySQL80
出现 MySQL 相关服务名说明服务已在运行。
什么都没输出
→ 服务没启动:net start mysql80(服务名以实际为准)。
2② 用命令行连上去
🎯 这是最原始也最可靠的连接方式,出问题时先回这里排查。
mysql -u root -pEnter password: ****** Welcome to the MySQL monitor... mysql>
看到 mysql> 提示符就成功了,后面所有 SQL 都敲在这里。
Access denied for user 'root'@'localhost'
→ 密码不对。忘记密码需要跳过权限验证重置,或用安装时设置的密码。Can't connect to MySQL server on 'localhost' (10061)
→ 服务没起来,回到第①步。
3③ 用 Navicat 连一次(第2章的方式)
🎯 图形化工具日常更好用,连接参数和命令行一致。
连接名:本机MySQL
主机:localhost 端口:3306
用户名:root 密码:你的密码连接成功后会看到左侧出现 mysql、information_schema、performance_schema、sys 四个系统库
这四个是 MySQL 自带的系统库,别删别改。
1045 - Access denied
→ 用户名或密码错,改连接属性里的密码。2003 - Can't connect
→ MySQL 服务没启动,或端口不是 3306。
第 1 关 · 建库:先解决中文乱码(5 分钟)
前提:能连上 MySQL(第 0 关)
1① 看看有哪些库
🎯 先看现状,再动手建。
show databases;+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
默认只有四个系统库。
2② 建库并指定字符集
🎯 一条语句搞定"建库 + 中文不乱码"。
create database 软件4班
character set utf8mb4
collate utf8mb4_general_ci;| 语句片段 | 逐句解释 |
|---|---|
create database 软件4班 | 建库,库名直接用中文也可以(课件里就是这么用的) |
character set utf8mb4 | 字符集用 utf8mb4,能存中文和 emoji;老版本可用 gb2312 |
collate utf8mb4_general_ci | 校对规则,_ci 表示比较时不区分大小写 |
Query OK, 1 row affected
返回 Query OK 就建好了。
ERROR 1007 (HY000): Can't create database; database exists
→ 库已存在,换名字或先删掉(见第 5 关)。建完中文表名报错
→ 库名/表名尽量别用生僻字;确实要中文,确保连接字符集也是 utf8mb4。
3③ 切进去
🎯 下面建表必须先进这个库,否则建到别的库里。
use 软件4班;
select database();Database changed +--------------+ | database() | +--------------+ | 软件4班 | +--------------+
select database() 用来确认"我现在在哪个库"。
第 2 关 · 建表:字段、类型、主键(8 分钟)
前提:已 use 软件4班(第 1 关)
1① 建一张学生表
🎯 照着敲,先不求全懂,下一步逐行解释。
create table 学生表(
学号 char(3) not null primary key,
姓名 varchar(10),
性别 char(1),
年龄 int,
生日 date,
成绩 decimal(5,1)
);Query OK, 0 rows affected
建表只改结构,不产生数据,所以很快。
ERROR 1064 (42000): You have an error in your SQL syntax
→ 多半是括号/逗号/引号用了中文符号,或字段之间少逗号(最后一个字段后不要逗号)。ERROR 1050 (42S01): Table '学生表' already exists
→ 表已存在:drop table 学生表;再重建。
2② 每一行在说什么
🎯 对照下表,以后任何建表语句都是这个结构。
| 语句片段 | 逐句解释 |
|---|---|
学号 char(3) not null primary key | 学号是 3 位定长字符串、不能为空、是主键(唯一标识一行) |
姓名 varchar(10) | 可变长度字符串,最多 10 个字,适合姓名 |
性别 char(1) | 只要 1 个字,用定长 char 更省 |
年龄 int | 整数 |
生日 date | 日期类型,格式 yyyy-mm-dd |
成绩 decimal(5,1) | 定点小数,共 5 位、小数点后 1 位,如 89.5——成绩/金额要用它,别用 float |
3③ 看看表建对没有
🎯 两个常用语句,一个看结构,一个看建表语句原文。
desc 学生表;
show create table 学生表;+--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | 学号 | char(3) | NO | PRI | NULL | | | 姓名 | varchar(10) | YES | | NULL | | ...
Key 列出现 PRI 说明主键设对了。
ERROR 1146 (42S02): Table doesn't exist
→ 不在正确的库里:use 软件4班;再看。
4④ 加一个自增 id(课件里的常见做法)
🎯 id 自增主键是最常用的建表套路。
create table 学生表2(
id int primary key auto_increment,
姓名 varchar(10),
性别 char(1)
);
insert into 学生表2(姓名,性别) values('张三','男'),('李四','女');
select * from 学生表2;+----+--------+------+ | id | 姓名 | 性别 | +----+--------+------+ | 1 | 张三 | 男 | | 2 | 李四 | 女 | +----+--------+------+
id 自动从 1 开始,插入时不用写它。
ERROR 1075: Incorrect table definition; there can be only one auto column
→ 一张表只能有一个自增字段。自增字段必须为主键/索引
→ 建表时把 id 同时设成 primary key。
第 3 关 · 灌数据:INSERT 与导入(6 分钟)
前提:学生表已建好(第 2 关)
1① 插入几行数据
🎯 字段顺序要与建表一致,字符串和日期要加单引号。
insert into 学生表(学号,姓名,性别,年龄,生日,成绩)
values ('001','张三','男',20,'2004-03-15',89.5),
('002','李四','女',21,'2003-07-02',92.0),
('003','王五','男',19,'2005-11-20',78.0);Query OK, 3 rows affected
一条语句插多行,比一条一条插快得多。
ERROR 1136: Column count doesn't match value count
→ 字段个数和值的个数对不上,数一数。ERROR 1366: Incorrect string value
→ 连接或表字符集不是 utf8,中文存不进去。Incorrect date value
→ 日期格式要写 yyyy-mm-dd,且加引号。
2② 查一下插进去没有
🎯 插完必须验证,这是习惯。
select * from 学生表;+------+--------+------+------+------------+-------+ | 学号 | 姓名 | 性别 | 年龄 | 生日 | 成绩 | +------+--------+------+------+------------+-------+ | 001 | 张三 | 男 | 20 | 2004-03-15 | 89.5 | ...
三行都在就对了。
查出来中文是问号
→ 连接字符集问题:命令行执行set names utf8mb4;再查。
3③ 从文件导入(第2章讲的导入导出)
🎯 数据量大时用导入。CSV 文件要存成 UTF-8,列顺序与表一致。
-- 方式一:命令行导入 SQL 脚本
mysql -u root -p 软件4班 < 学生表.sql
-- 方式二:SQL 里 source
source D:/data/学生表.sql;
-- 方式三:LOAD DATA 导入 CSV
load data local infile 'D:/data/students.csv'
into table 学生表
fields terminated by ',
lines terminated by '\n';Query OK, N rows affected
Navicat 里则是右键表 → 导入向导,选 Excel/CSV,一步步点。
LOAD DATA 报 The used command is not allowed
→ 服务端没开 local_infile,改配置文件或改用 Navicat 导入。导入后中文乱码
→ 文件编码不是 UTF-8,另存为 UTF-8 再导。
第 4 关 · 查询:四个招式(8 分钟)
前提:表里有数据(第 3 关)
1① 条件查询 WHERE
🎯 等值、不等、范围、与或非。
select 学号,姓名,成绩 from 学生表 where 性别 = '男';
select 姓名 from 学生表 where 成绩 >= 80 and 年龄 < 21;+------+--------+-------+ | 学号 | 姓名 | 成绩 | +------+--------+-------+ | 001 | 张三 | 89.5 | | 003 | 王五 | 78.0 | +------+--------+-------+
字符串和日期要加单引号,数字不用。
ERROR 1054: Unknown column
→ 字段名写错或不在这个表里,用 desc 表名 看字段。查不到数据但明明有
→ 字符串大小写/空格不一致,或字符集不匹配。
2② 模糊查询 LIKE
🎯 % 代表任意多个字符,_ 代表一个字符。
select 姓名 from 学生表 where 姓名 like '张%';
select 姓名 from 学生表 where 姓名 like '%三%';
select 姓名 from 学生表 where 姓名 like '张_';+--------+ | 姓名 | +--------+ | 张三 | +--------+
张% 姓张;%三% 含“三”;张_ 姓张且只有两个字。
LIKE 用了双引号且不生效
→ MySQL 里字符串用单引号更稳妥。
3③ 排序 ORDER BY
🎯 升序 ASC(默认)、降序 DESC,可多列。
select 姓名,成绩 from 学生表 order by 成绩 desc;+--------+-------+ | 姓名 | 成绩 | +--------+-------+ | 李四 | 92.0 | | 张三 | 89.5 | | 王五 | 78.0 | +--------+-------+
多列排序:order by 性别 asc, 成绩 desc。
4④ 限制条数 LIMIT(第3章--5)
🎯 取前几名、第几页都靠它。
select 姓名,成绩 from 学生表 order by 成绩 desc limit 2;
select 姓名 from 学生表 limit 1,2; -- 跳过1行取2行(分页)+--------+-------+ | 姓名 | 成绩 | +--------+-------+ | 李四 | 92.0 | | 张三 | 89.5 | +--------+-------+
limit 2 取前 2 行;limit 起始,条数 做分页。
limit 不生效
→ 必须和 order by 一起用才有“前几名”的意义,否则顺序不确定。
第 5 关 · 改与删:UPDATE / DELETE / ALTER / DROP(5 分钟)
前提:前面几关都做过
1① 改数据 UPDATE(先查再改)
🎯 永远先用 WHERE 查出要改的行,再把同样的条件搬进 UPDATE。
select * from 学生表 where 学号 = '001';
update 学生表 set 成绩 = 95.0 where 学号 = '001';
select 学号,姓名,成绩 from 学生表 where 学号 = '001';Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0
不写 WHERE 会改全表——这是最常见的生产事故。
ERROR 1093: You can't specify target table for update in FROM clause
→ 更新时子查询又查了同一张表,套一层子查询别名即可。
2② 删数据 DELETE
🎯 同样先查后删。删表是删结构,删数据只删行。
select count(*) from 学生表 where 成绩 < 60;
delete from 学生表 where 成绩 < 60;
select count(*) from 学生表;Query OK, 0 rows affected
delete from 表名; 会删掉所有行但保留结构;truncate table 表名; 更快,且自增重置。
ERROR 1451: Cannot delete or update a parent row
→ 有外键引用了这行数据,先删子表记录或改外键策略。
3③ 改结构 ALTER
🎯 加字段、改类型、改名、加主键。
alter table 学生表 add 班级 varchar(20);
alter table 学生表 modify 姓名 varchar(20);
alter table 学生表 change 班级 所在班级 varchar(20);
alter table 学生表 add primary key(学号); -- 已有主键会报错Query OK, 0 rows affected Records: 0 Duplicates: 0 Warnings: 0
add 加、modify 改类型、change 改名+类型、drop 删字段。
ERROR 1060: Duplicate column name
→ 字段名重复,换个名字。ERROR 1068: Multiple primary key defined
→ 表已有主键,先把旧主键 drop 掉。
4④ 删表删库
🎯 结构没了,数据也没了,谨慎。
drop table if exists 学生表2;
drop database if exists 软件4班;Query OK, 0 rows affected
if exists 保证不存在时不报错,脚本里建议都带。
ERROR 1008: Can't drop database
→ 库不存在或没权限,检查库名与账号权限。
常见报错速查 按错误码或关键字 Ctrl+F 搜本页
| 报错 | 原因 | 解决 |
|---|---|---|
ERROR 1045 (28000): Access denied for user 'root'@'localhost' | 密码错误或用户不存在 | 确认密码;忘记可用跳过权限验证方式重置 |
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) | MySQL 服务没启动 | Windows:net start mysql80;Linux:systemctl start mysqld |
ERROR 1049 (42000): Unknown database '软件4班' | 库不存在 | 先 create database 软件4班; |
ERROR 1146 (42S02): Table '软件4班.学生表' doesn't exist | 表名错或不在当前库 | use 库名; 后 show tables; 确认 |
ERROR 1064 (42000): You have an error in your SQL syntax | 语法错误:中文标点、括号/引号不配对、少逗号 | 把标点换成英文,检查括号与引号成对 |
ERROR 1054 (42S00): Unknown column 'xxx' in 'field list' | 字段名写错 | desc 表名; 核对字段名 |
ERROR 1062 (23000): Duplicate entry '001' for key 'PRIMARY' | 主键重复 | 换一个主键值,或用 insert into … on duplicate key update … |
ERROR 1366 (HY000): Incorrect string value | 字符集不支持中文 | 建库/建表用 utf8mb4,连接前 set names utf8mb4; |
ERROR 1050 (42S01): Table 'xxx' already exists | 表已存在 | 换表名或 drop table 后再建 |
ERROR 1136 (21S01): Column count doesn't match value count at row 1 | INSERT 的字段数与值的个数不一致 | 数一数前面的字段列表和后面的 values |
ERROR 1068 (42000): Multiple primary key defined | 重复定义主键 | 一张表只能一个主键,先 drop primary key |
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails | 有外键引用,不能删父表记录 | 先删子表记录,或建外键时设 on delete cascade |
ERROR 1215 (HY000): Cannot add foreign key constraint | 外键字段类型/字符集与被引用字段不一致 | 两边字段类型、字符集必须完全一致,且被引用字段要有索引 |
ERROR 1292 (22007): Incorrect date value | 日期格式不对 | 日期写成 '2004-03-15',并加引号 |
完成自检清单
- ☐ 能启动 MySQL 服务,并用命令行 / Navicat 连上
- ☐ 能用 create database 建库并指定 utf8mb4 字符集
- ☐ 能写 create table:字段、类型、主键、自增、默认值
- ☐ 能用 insert 插入数据,用 select 查出来
- ☐ 能用 where / like / order by / limit 取数
- ☐ 能用 update / delete 维护数据,并且知道先查后改
- ☐ 遇到报错会按错误码去查原因
全打勾,就可以去第3章、第4章正式上课件内容了。