说实话,MySQL这几个字在我电脑里躺了快一年。每次想学,都被"数据库"三个字吓回去,总觉得那是科班程序员才碰的东西。直到这周下定决心给自己安排了一个"MySQL学习第一天"的计划,折腾完才明白:真正劝退你的不是MySQL本身,而是网上教程跳过的那些细节。这篇就记录我第一天的完整经过,参考的课程正好讲到第3章第2节——也就是库和表的基本操作。内容包括环境安装、建库建表、基础查询,还有几个让我卡了不少时间的问题:SSL连接报错、默认值设置、字符集配置。如果你也准备从零开始,这篇可以直接当你的第一天路线图。我的环境是Windows + MySQL 8.0,大部分内容在Linux和macOS上同样适用。
1. 第一天学习路线:为什么直接干库表操作而不是先啃原理
1.1 从"会用"开始,第一天只解决三件事
很多新手学MySQL最容易犯的错,就是先去背概念。什么事务隔离级别、B+树索引原理、MVCC……这些东西很重要,但第一天完全用不上。我的原则很简单:先跑起来,再问为什么。
第一天我只给自己定了三个目标:环境装好、命令行能登录、能建库建表并跑通几条基本查询。至于原理,等到后面开始学索引和事务的时候再回头补,那时候有了实践基础,看原理才不会像看天书。
实际操作下来,这三个目标大概花了我一个下午加半个晚上。真正花时间的地方不在SQL本身,而在安装、配置、连接这种环境问题。这也是为什么我把环境部分放在博文的最前面——因为80%的新手都是在这里被劝退的,而不是卡在SQL语法上。
1.2 教程3.2节是什么:先有库表,才有查询
我跟着学的这套入门教程分章节大概是这样:第一章MySQL概述和安装,第二章SQL基础概念,第三章操作数据库和表,第四章查询与增删改……我写的"3.2"指的就是第三章的第二节:数据库的创建、删除,以及表的创建和字段设计。
这个章节位置特别适合"第一天"这个时间点——它前面是安装和概念铺垫,后面才是真正的查询练习。先搞清楚库和表怎么建,后面写SELECT才有地方施展。第一次学的人可能不理解为什么数据定义语言(DDL)比数据操作语言(DML)更值得先学。打个比方:你想练习在纸上写字,总得先有张纸。CREATE DATABASE是给你准备一个练习本,CREATE TABLE是在本子里画好格子,后面的INSERT和SELECT才是往格子里填内容、查内容。没有库表,后面一切操作都是空谈。
第一天我的实操顺序是:装完MySQL之后,先用命令行创建了一个study_db数据库,在里面建了两张表,然后往表里插了几条数据,再跑了几个带排序、条件过滤的查询。整个过程没有碰任何高级特性,但恰恰是这些基础操作让后面的学习变得顺利。后面几天我准备按顺序补索引、视图、事务和存储过程,第一天只需要把基础打牢。
2. 环境搭建:从下载安装到命令行成功登录
2.1 Windows下安装MySQL 8.0:图形化安装与zip手动配置
先说下载。MySQL官网的下载页面确实需要一个账号,但下载动作本身不需要登录,直接点"Download"即可。社区版(MySQL Community Server)是免费的,足够学习用,千万别下成商业版。
方式一:MySQL Installer图形化安装
下载mysql-installer-community-8.0.x.msi,双击安装,选Server only。接着进入配置界面,端口保持默认3306,认证方式建议选第一个"Use Strong Password Encryption"(对应caching_sha2_password),然后设置root密码,后面一路Next就行。这种方式适合不想折腾的读者,图形化引导比较友好,十几分钟能装完。
但Installer方式有几个坑值得一提。第一,安装过程中如果安全软件拦截服务启动,MySQL服务可能起不来,装完连不上先检查服务状态;第二,安装完后的root密码千万记好,忘了就只能走重置流程,后文会提到。
方式二:zip压缩包手动配置
我更推荐的方式。下载mysql-8.0.x-winx64.zip,解压后放到一个纯英文路径下,比如D:\mysql-8.0.xx。然后在目录下新建my.ini,内容为:
[mysqld] basedir=D:/mysql-8.0.xx datadir=D:/mysql-8.0.xx/data port=3306 character-set-server=utf8mb4 [client] default-character-set=utf8mb4注意basedir和datadir路径里用的是斜杠而不是反斜杠,否则可能解析有问题。写好后,以管理员身份打开cmd,进入bin目录执行:
mysqld --initialize-insecure mysqld --install mysql net start mysql mysql -uroot这里--initialize-insecure表示初始化数据目录,并且root初始密码为空。如果换成--initialize,则会生成随机临时密码,密码会记录在data目录下的错误日志文件中。两者选哪个都行,新手建议用--initialize-insecure,少一步找密码的操作。
2.2 折腾过程中遇到的两个问题:初始密码和字符集
命令行登录后第一件事是改密码,否则空密码太危险了。登录MySQL后执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; FLUSH PRIVILEGES;如果你在Linux发行版上通过包管理器安装(比如CentOS的rpm安装),初始密码往往需要去日志里找。我见过很多人在这一步卡住,登录不进去就以为装坏了。其实只要执行:
grep 'temporary password' /var/log/mysqld.log看到那串临时密码,复制出来mysql -uroot -p登录就行。日志文件的位置可能因发行版略有差异,但关键词一定是temporary password。
另一个容易忽略的问题是字符集。很多老教程会教你设置character_set_server=utf8,但在MySQL 8.0里utf8这个编码名其实是utf8mb3的别名,存不了emoji,推荐直接用utf8mb4。我在my.ini里已经把服务端和客户端的默认字符集都设成了utf8mb4,这样做的好处是建库建表时不用每次都手动指定字符集,能少踩很多"中文变问号"的坑。
MySQL 8.0默认的字符集其实已经是utf8mb4了,为什么还要手动写?因为客户端(命令行、Navicat等)的字符集是独立的,如果你的客户端连接没设置utf8mb4,插入中文照样乱码。所以[client]那段配置特别关键,很多人漏了这一段就导致了中文乱码,排查半天找不到原因。
3. 3.2节内容拆解:创建数据库和表的核心语法
3.1 数据库层面:CREATE DATABASE、SHOW、USE、DROP
命令行登录后,第一步自然是创建数据库。完整操作如下:
CREATE DATABASE study_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; SHOW DATABASES; USE study_db; DROP DATABASE study_db;为什么要显式指定字符集和排序规则?我在前面提到过,MySQL 8.0服务端默认字符集已经是utf8mb4,但显式写出来更保险,尤其以后要把库往服务器上迁移时,防止因为两边版本不同导致字符集不一致。排序规则里的utf8mb4_general_ci是大小写不敏感的比较规则,_ci就是case-insensitive,日常开发基本都用这个。
另外想提醒一个新手的操作习惯:USE study_db;之后,你所在的数据库就切换了,但MySQL命令行不会像某些工具那样显示当前库。建议执行后先跑SELECT DATABASE();确认自己没选错库,否则后面所有建表都会落到默认库里,到时候找不到表就是一脸懵。
3.2 CREATE TABLE完整示例与字段设计
有了库,下一步是建表。我用一个常见的用户表作例子:
CREATE TABLE user ( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', username VARCHAR(50) NOT NULL COMMENT '用户名', email VARCHAR(100) DEFAULT NULL COMMENT '邮箱', age TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄', balance DECIMAL(10,2) DEFAULT 0.00 COMMENT '余额', status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:1正常 0禁用', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';这行建表语句里包含了第一天的核心知识点,逐个拆开讲。
INT UNSIGNED表示无符号整数,配合AUTO_INCREMENT做主键,这是最常见的写法。VARCHAR(50)表示最多50个字符,注意是字符数不是字节数,一个汉字也算一个字符。DECIMAL(10,2)表示总共10位、小数点后2位,适合存金额。DATETIME存日期时间,默认值用CURRENT_TIMESTAMP可以在插入时自动填充当前时间。
COMMENT是字段注释,这里强烈建议大家写。几个月后回头看表结构,注释能救命。没有注释的表,字段一多,连自己都分不清哪是哪。
还有个细节:status TINYINT NOT NULL DEFAULT 1这种写法在业务表里非常常见。状态字段用数字1和0表示,比用字符串"enable"/"disable"节省空间,查询也更快。这就是热搜里"mysql设置默认值为0"的常见场景,我们后面专门讲。
3.3 数据类型怎么选:第一天最该记住的五个类型
新手最头疼的就是类型选择。其实第一天记住下面这五类基本就够用了。
| 类型 | 常见用途 | 注意点 |
|---|---|---|
| INT / BIGINT | 主键、数量、状态码 | INT最大约21亿,超过用BIGINT |
| VARCHAR(n) | 用户名、标题、短文本 | n是字符数不是字节数 |
| DECIMAL(m,d) | 金额、精确小数 | 不要用FLOAT/DOUBLE存金额 |
| DATETIME / TIMESTAMP | 时间记录 | DATETIME更直观,TIMESTAMP有2038年问题 |
| TEXT / LONGTEXT | 长文章、大文本 | 不能设置默认值,查询性能较差 |
关于"mysql中int+5"这个热搜词,我特意查了一下,很多人在问INT(11)是不是表示最多存11位数字。这个说法是历史遗留:老版本中INT(M)的M只是影响显示宽度,比如INT(5)配合ZEROFILL会在前面补零,但不影响实际存储范围。MySQL 8.0已经不建议使用这个显示宽度了,你直接写INT就行,不要被网上旧资料误导。
3.4 表和字段的修改:第一天就要会ALTER
建完表后,99%的情况会想改结构。最容易漏的就是某些字段。这时常用ALTER TABLE:
ALTER TABLE user ADD COLUMN phone VARCHAR(20) DEFAULT NULL COMMENT '手机号'; ALTER TABLE user MODIFY COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄'; ALTER TABLE user DROP COLUMN email;注意,ALTER TABLE在表数据量大的时候会锁表,生产环境要谨慎。第一天在自己机器上随便改没问题,但心里要绷一根弦:线上改表不是小事,后面学到锁表的时候会专门回顾这个点。
这里插一句,热搜里还有"mysql表结构自动转tdengine超级表+子表"这种关键词。TDengine是时序数据库,和MySQL不是一回事,第一天完全不用关心。但你要明白一个方向:MySQL的表结构是二维关系模型,转到其他数据库往往需要工具辅助。这是后话,先把MySQL本身的结构搞明白。
4. 查询与常用函数实操:第一天能上手的高频操作
4.1 基础查询:SELECT、WHERE、ORDER BY、LIMIT
建好表后,我插了一些测试数据,然后开始试查询。比如:
SELECT id, username, status FROM user WHERE status = 1 ORDER BY id DESC LIMIT 10;这句的意思是从user表里查状态为1的用户,按id倒序排列,只要前10条。还有:
SELECT * FROM user WHERE username LIKE '张%';注意%是通配符,'张%'表示以"张"开头。条件多的时候:
SELECT * FROM user WHERE age BETWEEN 20 AND 30 AND status = 1;这里值得说一个新手常踩的坑:SQL的书写顺序和实际执行顺序不一样。拿刚才那句举例,书写顺序是SELECT、FROM、WHERE、ORDER BY、LIMIT,但执行顺序其实是FROM、WHERE、SELECT、ORDER BY、LIMIT。这解释了为什么WHERE后面不能用SELECT里定义的别名,因为WHERE执行时SELECT还没算出来。这个点第一天如果消化不了就先记住结论,后面学到子查询会豁然开朗。
4.2 常用函数:日期、字符串与聚合
热搜里有"mysql常用函数"和"mysql将字符串转为日期",这是新手很快会碰到的需求。列举几个第一天就能用得上的。
SELECT NOW(), CURDATE(); SELECT STR_TO_DATE('2025-04-15', '%Y-%m-%d'); SELECT DATE_FORMAT(create_time, '%Y年%m月%d日') FROM user; SELECT COUNT(*), AVG(age), MAX(balance) FROM user; SELECT IF(age >= 18, '成年', '未成年') FROM user;STR_TO_DATE就是把字符串转成日期的函数,后面的格式串%Y-%m-%d必须和字符串格式对得上,不然返回NULL。DATE_FORMAT反过来,把日期按指定格式输出。聚合函数COUNT、AVG、MAX是统计场景的重头戏,第二天学分组查询时会经常用到。
这些函数不需要硬记,但要学会怎么看。最实用的方法是在SQL客户端里输入函数名按F1查帮助,或者直接去官网文档搜函数列表。第一天只要知道MySQL提供了这些工具、有需求时会去查就行,不用逼自己背下来。
5. 第一天避坑清单:默认值、字符集、SSL连接问题
5.1 字段默认值到底什么时候写
热搜词里"mysql设置默认值为0"出现频率很高,我在实操中也遇到了默认值的困惑。看这个案例:
CREATE TABLE t_order ( id INT PRIMARY KEY, status TINYINT NOT NULL DEFAULT 0 );当插入数据时没有指定status,MySQL会自动填入0。但如果字段定义改成status TINYINT(不加NOT NULL),插入时没给值就会是NULL,NULL不等于0,在WHERE status = 0这种条件里查不到,这是非常隐蔽的坑。
所以经验是:语义上不允许为空的字段,一定要同时写NOT NULL和DEFAULT。DEFAULT 0通常用在状态、计数这类字段上,而DEFAULT NULL则用在可选信息上。还有一类字段要特别小心,比如create_time这种时间字段,写DEFAULT CURRENT_TIMESTAMP后,插入时可以完全不管它,MySQL自动填当前时间。
5.2 连接工具的选择与SSL错误完整排查
关于连接工具,我自己试了Navicat、DBeaver和MySQL Workbench。如果你用的是Windows,Navicat确实最顺手,但有些高级功能需要付费;DBeaver免费开源,功能也不差,尤其适合不想折腾的人;MySQL Workbench是官方出品,运维类的工具(导出、性能分析)很强,但界面风格偏工程化。
再说我前面埋下的SSL连接错误。这个问题的完整排查过程如下。
第一步,先在命令行确认MySQL服务真的在运行:
net start | findstr mysql或在Linux上:
systemctl status mysqld如果服务没起来,先解决服务问题,不然后面全白搭。
第二步,确认端口通不通:
telnet 127.0.0.1 3306端口不通就去查my.ini里的bind-address和端口配置。
第三步,确认账号能否用命令行登录:
mysql -uroot -p如果命令行能登录,说明MySQL本身没问题,问题就出在客户端连接参数上。
第四步,回到客户端。Navicat连接配置里,在"SSL"标签页把使用SSL那一项改成"禁用"。很多教程从没提过这个选项,导致MySQL 8.0默认开启SSL后客户端报"SSL connection error",很多人卡在这就放弃了。
第五步,如果禁用SSL还报认证插件错误,就要在MySQL里改认证方式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';这个改动只影响root用户本机登录的安全策略,对学习环境完全够用。但如果你要上生产环境,建议保留caching_sha2_password,因为它的密码传输安全性更好,MySQL 8.0默认使用它,只是部分老客户端兼容性差。说白了,学习环境怎么方便怎么来,生产环境别乱动默认行为。
5.3 关于事务和锁:第一天需要知道的两个概念
最后聊一下热搜里高频出现的"mysql事务处理"和"mysql锁表"。第一天我并没有真正写事务代码,但建表时发现了一个绕不开的现实:InnoDB引擎支持事务,而MyISAM不支持。现在的MySQL 8.0默认引擎就是InnoDB,建表语句里我特意写了ENGINE=InnoDB,建议大家不要省。
事务的核心理解一句话:多条SQL要么全部成功,要么全部失败。最典型的就是转账:扣钱和加钱必须是一个整体,不能扣了钱但没加过去。
锁的理解也可以浓缩成一句话:当两个人同时在改同一行数据,后动手的人要等前面的人改完。第一天知道这两个概念就行,具体怎么用、怎么避免锁等待,是后面学习的内容。
我在建表时还发现一个细节:如果表里没有明确的索引,即使只有几万条数据,查询也可能会变慢。所以第二天我准备重点学索引,这是一个顺理成章接下去的方向。
第一天折腾下来,最大的体会是:学MySQL最大的障碍从来不是SQL语法本身,而是环境和服务那一层。只要把安装、登录、建库建表这三步跑通,后面就是一层一层往上叠。
另外分享一个小习惯:我从第一天开始,就把当天练过的SQL语句全部存成带日期的.sql文件,比如day01.sql。别小看这个动作,第二天回顾时直接打开文件就能复盘,比翻聊天记录高效太多。
第二天我计划学索引的创建和优化,还有连接查询。如果你也和我一样从零开始,建议先别急着买厚厚的教材,按我这条路线把第一天跑通,你会觉得MySQL没那么可怕。