
说实话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] basedirD:/mysql-8.0.xx datadirD:/mysql-8.0.xx/data port3306 character-set-serverutf8mb4 [client] default-character-setutf8mb4注意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 rootlocalhost IDENTIFIED BY 你的新密码; FLUSH PRIVILEGES;如果你在Linux发行版上通过包管理器安装比如CentOS的rpm安装初始密码往往需要去日志里找。我见过很多人在这一步卡住登录不进去就以为装坏了。其实只要执行grep temporary password /var/log/mysqld.log看到那串临时密码复制出来mysql -uroot -p登录就行。日志文件的位置可能因发行版略有差异但关键词一定是temporary password。另一个容易忽略的问题是字符集。很多老教程会教你设置character_set_serverutf8但在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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 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亿超过用BIGINTVARCHAR(n)用户名、标题、短文本n是字符数不是字节数DECIMAL(m,d)金额、精确小数不要用FLOAT/DOUBLE存金额DATETIME / TIMESTAMP时间记录DATETIME更直观TIMESTAMP有2038年问题TEXT / LONGTEXT长文章、大文本不能设置默认值查询性能较差关于mysql中int5这个热搜词我特意查了一下很多人在问INT(11)是不是表示最多存11位数字。这个说法是历史遗留老版本中INT(M)的M只是影响显示宽度比如INT(5)配合ZEROFILL会在前面补零但不影响实际存储范围。MySQL 8.0已经不建议使用这个显示宽度了你直接写INT就行不要被网上旧资料误导。3.4 表和字段的修改第一天就要会ALTER建完表后99%的情况会想改结构。最容易漏的就是某些字段。这时常用ALTER TABLEALTER 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 );当插入数据时没有指定statusMySQL会自动填入0。但如果字段定义改成status TINYINT不加NOT NULL插入时没给值就会是NULLNULL不等于0在WHERE status 0这种条件里查不到这是非常隐蔽的坑。所以经验是语义上不允许为空的字段一定要同时写NOT NULL和DEFAULT。DEFAULT 0通常用在状态、计数这类字段上而DEFAULT NULL则用在可选信息上。还有一类字段要特别小心比如create_time这种时间字段写DEFAULT CURRENT_TIMESTAMP后插入时可以完全不管它MySQL自动填当前时间。5.2 连接工具的选择与SSL错误完整排查关于连接工具我自己试了Navicat、DBeaver和MySQL Workbench。如果你用的是WindowsNavicat确实最顺手但有些高级功能需要付费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 rootlocalhost IDENTIFIED WITH mysql_native_password BY 密码;这个改动只影响root用户本机登录的安全策略对学习环境完全够用。但如果你要上生产环境建议保留caching_sha2_password因为它的密码传输安全性更好MySQL 8.0默认使用它只是部分老客户端兼容性差。说白了学习环境怎么方便怎么来生产环境别乱动默认行为。5.3 关于事务和锁第一天需要知道的两个概念最后聊一下热搜里高频出现的mysql事务处理和mysql锁表。第一天我并没有真正写事务代码但建表时发现了一个绕不开的现实InnoDB引擎支持事务而MyISAM不支持。现在的MySQL 8.0默认引擎就是InnoDB建表语句里我特意写了ENGINEInnoDB建议大家不要省。事务的核心理解一句话多条SQL要么全部成功要么全部失败。最典型的就是转账扣钱和加钱必须是一个整体不能扣了钱但没加过去。锁的理解也可以浓缩成一句话当两个人同时在改同一行数据后动手的人要等前面的人改完。第一天知道这两个概念就行具体怎么用、怎么避免锁等待是后面学习的内容。我在建表时还发现一个细节如果表里没有明确的索引即使只有几万条数据查询也可能会变慢。所以第二天我准备重点学索引这是一个顺理成章接下去的方向。第一天折腾下来最大的体会是学MySQL最大的障碍从来不是SQL语法本身而是环境和服务那一层。只要把安装、登录、建库建表这三步跑通后面就是一层一层往上叠。另外分享一个小习惯我从第一天开始就把当天练过的SQL语句全部存成带日期的.sql文件比如day01.sql。别小看这个动作第二天回顾时直接打开文件就能复盘比翻聊天记录高效太多。第二天我计划学索引的创建和优化还有连接查询。如果你也和我一样从零开始建议先别急着买厚厚的教材按我这条路线把第一天跑通你会觉得MySQL没那么可怕。