零基础起步

零基础起步:把第一个数据库建出来

假设你什么都没做过。6 个关卡,每一步都写清「做什么 / 敲什么 / 你应该看到 / 报错怎么办」。全程约 40 分钟。

6 个关卡21 个微步骤14 条报错速查MySQL + Navicat

走完这 6 关,你就能

  • 启动 MySQL 并用命令行 / Navicat 连上
  • 建一个不乱码的库,并建出带主键、自增的表
  • 用 INSERT 灌数据、用 SELECT 查出来
  • 用 WHERE / LIKE / ORDER BY / LIMIT 取数
  • 用 UPDATE / DELETE / ALTER 维护数据与结构
  • 看到报错知道按错误码去哪里查
怎么用① 打开 MySQL 命令行或 Navicat,页面上说敲什么就敲什么;② 每步都有“你应该看到”,对不上先看“如果报错”;③ 别跳关——第 1 关的库没建好,第 2 关一定失败。

第 0 关 · 确认 MySQL 装好、能连上(5 分钟)

目标MySQL 分两半:服务端(后台跑的服务)+ 客户端(你敲命令的地方)。先确认服务在跑,再连上去。
前提:已经装过 MySQL(第2章--4 安装MYSQL)

1① 看服务有没有起来

🎯 Windows 上用「服务」管理器看,或命令行执行:

SHELL
net start | findstr /i mysql
👀 你应该看到
MySQL
MySQL80

出现 MySQL 相关服务名说明服务已在运行。

⚠️ 如果报错
  • 什么都没输出
    → 服务没启动:net start mysql80(服务名以实际为准)。

2② 用命令行连上去

🎯 这是最原始也最可靠的连接方式,出问题时先回这里排查。

SHELL
mysql -u root -p
👀 你应该看到
Enter 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章的方式)

🎯 图形化工具日常更好用,连接参数和命令行一致。

SQL
连接名:本机MySQL
主机:localhost    端口:3306
用户名:root      密码:你的密码
👀 你应该看到
连接成功后会看到左侧出现 mysql、information_schema、performance_schema、sys 四个系统库

这四个是 MySQL 自带的系统库,别删别改。

⚠️ 如果报错
  • 1045 - Access denied
    → 用户名或密码错,改连接属性里的密码。
  • 2003 - Can't connect
    → MySQL 服务没启动,或端口不是 3306。
✅ 过关标准能看到 mysql> 提示符、Navicat 能连上,就过关。

第 1 关 · 建库:先解决中文乱码(5 分钟)

目标建库时把字符集定好,否则后面存中文全是问号。
前提:能连上 MySQL(第 0 关)

1① 看看有哪些库

🎯 先看现状,再动手建。

SQL
show databases;
👀 你应该看到
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

默认只有四个系统库。

2② 建库并指定字符集

🎯 一条语句搞定"建库 + 中文不乱码"。

SQL
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③ 切进去

🎯 下面建表必须先进这个库,否则建到别的库里。

SQL
use 软件4班;
select database();
👀 你应该看到
Database changed

+--------------+
| database()   |
+--------------+
| 软件4班      |
+--------------+

select database() 用来确认"我现在在哪个库"。

✅ 过关标准你能说出建库时为什么要指定字符集吗?

第 2 关 · 建表:字段、类型、主键(8 分钟)

目标建表就是把"要存哪些字段、每个字段什么类型、谁能唯一标识一行"写清楚。
前提:已 use 软件4班(第 1 关)

1① 建一张学生表

🎯 照着敲,先不求全懂,下一步逐行解释。

SQL
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③ 看看表建对没有

🎯 两个常用语句,一个看结构,一个看建表语句原文。

SQL
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 自增主键是最常用的建表套路。

SQL
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。
✅ 过关标准能说清 char 和 varchar、int 和 decimal 各适合什么场景吗?

第 3 关 · 灌数据:INSERT 与导入(6 分钟)

目标把数据放进表里,两种方式:手写 INSERT,或从文件导入。
前提:学生表已建好(第 2 关)

1① 插入几行数据

🎯 字段顺序要与建表一致,字符串和日期要加单引号。

SQL
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② 查一下插进去没有

🎯 插完必须验证,这是习惯。

SQL
select * from 学生表;
👀 你应该看到
+------+--------+------+------+------------+-------+
| 学号 | 姓名   | 性别 | 年龄 | 生日       | 成绩  |
+------+--------+------+------+------------+-------+
| 001  | 张三   | 男   |   20 | 2004-03-15 |  89.5 |
...

三行都在就对了。

⚠️ 如果报错
  • 查出来中文是问号
    → 连接字符集问题:命令行执行 set names utf8mb4; 再查。

3③ 从文件导入(第2章讲的导入导出)

🎯 数据量大时用导入。CSV 文件要存成 UTF-8,列顺序与表一致。

SQL
-- 方式一:命令行导入 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 再导。
✅ 过关标准INSERT 和导入各适合什么场景?

第 4 关 · 查询:四个招式(8 分钟)

目标第3章的全部内容:WHERE、LIKE、ORDER BY、LIMIT,组合起来就是日常取数。
前提:表里有数据(第 3 关)

1① 条件查询 WHERE

🎯 等值、不等、范围、与或非。

SQL
select 学号,姓名,成绩 from 学生表 where 性别 = '男';
select 姓名 from 学生表 where 成绩 >= 80 and 年龄 < 21;
👀 你应该看到
+------+--------+-------+
| 学号 | 姓名   | 成绩  |
+------+--------+-------+
| 001  | 张三   |  89.5 |
| 003  | 王五   |  78.0 |
+------+--------+-------+

字符串和日期要加单引号,数字不用。

⚠️ 如果报错
  • ERROR 1054: Unknown column
    → 字段名写错或不在这个表里,用 desc 表名 看字段。
  • 查不到数据但明明有
    → 字符串大小写/空格不一致,或字符集不匹配。

2② 模糊查询 LIKE

🎯 % 代表任意多个字符,_ 代表一个字符。

SQL
select 姓名 from 学生表 where 姓名 like '张%';
select 姓名 from 学生表 where 姓名 like '%三%';
select 姓名 from 学生表 where 姓名 like '张_';
👀 你应该看到
+--------+
| 姓名   |
+--------+
| 张三   |
+--------+

张% 姓张;%三% 含“三”;张_ 姓张且只有两个字。

⚠️ 如果报错
  • LIKE 用了双引号且不生效
    → MySQL 里字符串用单引号更稳妥。

3③ 排序 ORDER BY

🎯 升序 ASC(默认)、降序 DESC,可多列。

SQL
select 姓名,成绩 from 学生表 order by 成绩 desc;
👀 你应该看到
+--------+-------+
| 姓名   | 成绩  |
+--------+-------+
| 李四   |  92.0 |
| 张三   |  89.5 |
| 王五   |  78.0 |
+--------+-------+

多列排序:order by 性别 asc, 成绩 desc。

4④ 限制条数 LIMIT(第3章--5)

🎯 取前几名、第几页都靠它。

SQL
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。

SQL
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

🎯 同样先查后删。删表是删结构,删数据只删行。

SQL
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

🎯 加字段、改类型、改名、加主键。

SQL
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④ 删表删库

🎯 结构没了,数据也没了,谨慎。

SQL
drop table if exists 学生表2;
drop database if exists 软件4班;
👀 你应该看到
Query OK, 0 rows affected

if exists 保证不存在时不报错,脚本里建议都带。

⚠️ 如果报错
  • ERROR 1008: Can't drop database
    → 库不存在或没权限,检查库名与账号权限。
✅ 过关标准恭喜,第 0~5 关走完,你已经能独立建库建表、灌数据、查询、维护数据了。

常见报错速查 按错误码或关键字 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 1INSERT 的字段数与值的个数不一致数一数前面的字段列表和后面的 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章正式上课件内容了。