Day1-MySQL概述SQL-1这个标题其实干掉了很多同学学数据库的积极性因为它太朴素了。但我反倒觉得这是一条非常扎实的学习路径里最重要的一天。很多想入门MySQL的人第一步就走偏了要么对着网上的安装教程随便下个版本稀里糊涂装完最后连数据库服务怎么启动都不知道要么上来就狂背SQL语句结果连SQL是语言、MySQL是数据库这种最基本的关系都没搞清楚。今天这篇就是把我自己带新手时的Day1流程完整走一遍适合真正的零基础也适合那些学过一点但始终没建立体系的人。走完这一天你会得到一套能正常使用的MySQL环境以及第一组能随手写出来的SQL语句为主线后面的SQL-2、索引、事务和存储过程打底。1. 为什么Day1先讲概述MySQL到底是干什么的1.1 一句话讲清MySQL的定位MySQL是一个关系型数据库管理系统RDBMS它管理的核心是结构化数据。所谓结构化就是数据可以抽象成一张张二维表每一行是一条记录每一列是一个属性。用户表、订单表、商品表这些业务数据的存放方式天然就是表格形态。MySQL替你把数据怎么存数据怎么查多个人同时读写时怎么保持一致意外断电后数据怎么不丢这些脏活累活都干了你只需要通过SQL语句告诉它自己的意图即可。这个定位很重要因为它决定了MySQL在技术栈中的位置。它和文件存储不一样文件存的是无结构的一坨查起来全靠应用自己遍历它也和不宕机的Redis这类缓存方案不一样缓存追求的是极速读写但没法保证复杂查询和持久化。MySQL要的是可靠、一致、能复杂查询、能处理常规的并发写入。1.2 它的主场在哪里哪些场景别用它以我自己这些年接触过的项目来看MySQL的主场是典型的OLTP在线事务处理场景。网站的用户中心、电商的商品和订单、内容管理系统的文章和分类、论坛的帖子和回复、后台管理系统的配置和日志这些读写频繁、单次操作涉及数据量不大、但对一致性有要求的业务都属于MySQL的舒适区。绝大多数互联网Web应用采用经典的LAMP或LEMP架构其中那个M指的就是MySQL或其分支MariaDB所以学会MySQL几乎等于拿到了Web后端岗位的入场券。但MySQL不是万能的。海量日志分析这种OLAP场景更适合ClickHouse、Doris这类列式存储超高并发写入的场景往往需要先落到消息队列再做异步批处理入库而不是让MySQL硬扛。这个认知Day1建立起来比较好否则以后容易把MySQL当成万能数据库在错误场景里死磕。1.3 和SQL Server、PostgreSQL的取舍热搜词里有很多人搜sql server 2022下载sql server安装教程说明不少新手在MySQL和SQL Server之间犹豫过。这里直接给出一张对比表基于我实际在两种数据库里写过项目的经验对比项MySQL 8.0SQL ServerPostgreSQL开源授权开源GPL社区免费商业授权为主开源免费跨平台Windows/Linux/macOS主打Windows新版本也支持Linux全平台Web互联网生态极强几乎标配偏企业内网应用强大金融/地理数据受欢迎分页写法LIMIT offset, countOFFSET...FETCH / TOPLIMIT...OFFSET自增列AUTO_INCREMENTIDENTITYSERIAL 或 IDENTITY默认存储引擎InnoDB专有引擎专有存储架构我的建议是如果你面向国内互联网行业求职优先MySQL如果你在纯Windows企业环境、项目已经锁定了微软技术栈那学SQL Server也不算错。但别同时开两个坑Day1只需要选定一个方向学透数据库的核心概念是通用的后面迁移到其他关系型数据库成本并不高。还有一个点值得提前说热搜词里有个高频词叫mysql面试题。很多人把面试题当宝典我觉得过度了但确实有个规律——面试考MySQL几乎必从概述部分切入比如事务四个特性ACID、InnoDB和MyISAM的区别、索引为什么快。这些内容Day1不用硬背先把环境跑起来后面每个主题都会单独拿出来讲到时候理解透了自然能答。2. 装一个能用的MySQL版本选择和踩坑实录2.1 版本选择8.0还是5.7关于mysql下载哪个版本这个问题我每次的答案都一样新项目一律选8.0。MySQL 8.0发布到现在已经很多年成熟度非常高而且默认字符集改成了utf8mb4原生支持窗口函数后面会讲到SQL窗口函数、公共表表达式CTE优化器也比5.7强了不少。反观5.7虽然在很长一段时间里是经典生产版本但已经走到了生命周期末尾官方停止维护新环境再装5.7等于是给自己埋坑。那什么时候还要用5.7只有一种情况你在维护老项目代码里用了老版本才支持的语法或行为贸然升8.0可能引发兼容问题。但这是维护者的选择题不是新手的。Day1学习者直接下载8.0最新的社区版即可不需要碰企业版功能对学习完全够用。2.2 Windows安装的关键步骤Windows是大多数新手的学习环境这里把安装流程中容易翻车的几个节点单独拎出来讲。第一步去MySQL官网的Community Server下载页选最新的8.0.x Windows Installer版本。国内网络下载可能会有波动如果官网很慢可以找比较可靠的镜像站但要留意校验文件哈希别下到被篡改的安装包。第二步安装类型选Developer Default还是Server only我的建议是Server only加MySQL Shell就够了。Developer Default会顺带装一堆连接器Connectors和文档组件对学习没坏处但会让安装过程明显变慢而且有些组件会停留在旧版本反而带出新问题。干净的Server only降低变量数量。第三步配置阶段几个关键选项端口默认3306除非本机端口被占否则不要改。后面所有连接串、教程代码都默认3306改了徒增麻烦。认证方式8.0默认是caching_sha2_password。一定记得设置root密码并且在学习阶段用简单点的密码比如root123特殊字符容易在写连接串时引发转义问题我见过太多人密码里带了和$结果在URL里折腾半天排错。配置成Windows服务勾选开机自启这是最稳的用法。第四步安装完成后把MySQL的bin目录加到系统PATH里这样可以在任意命令行窗口直接敲mysql命令而不是每次都要cd到安装目录。2.3 Linux安装要点Linux服务器上装MySQL要简单粗暴很多。Ubuntu/Debian系执行apt install mysql-serverCentOS/RHEL系执行yum install mysql-server。装完启动服务并设置开机自启systemctl start mysql systemctl enable mysql systemctl status mysql有一个非常容易困惑的点Debian系安装后root用户默认用的是auth_socket认证也就是说直接sudo mysql就能以root身份进MySQL不需要密码。有些新手以为这是BUG其实不是这是默认安全策略。你可以进去后用ALTER USER命令改成密码登录但学习阶段直接用sudo mysql进去也没问题。CentOS系默认的root密码会临时写在日志里用grep temporary password /var/log/mysqld.log查一下首次登录会让你改密码。2.4 验证安装和常见错误处理装完别急着写代码先做一次健康检查。在任何命令行窗口执行mysql -uroot -p输入密码后如果能出现mysql提示符说明客户端和服务端都正常。再顺手执行SELECT VERSION();能返回8.0.x版本号整个环境就算跑通了。这里提前讲一个很多新手第一天就会遇到的高频报错ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock。这句话看着吓人其实原因非常直白——MySQL服务没起来或者客户端找不到socket文件。排查链路固定三步第一服务状态。Windows下打开服务管理器找MySQL80确认是不是已启动Linux下systemctl status mysql看状态。服务没起来报错是必然的。第二看socket路径。MySQL连接本机时优先走socket文件默认路径通常写在配置文件my.cnf或my.ini里比如/var/run/mysqld/mysqld.sock。如果系统里确实找不到这个文件可能就是mysqld压根没启动成功。可以执行tail -100 /var/log/mysql/error.log看一下具体错误常见的是数据目录权限不对或磁盘满了。第三如果真的起不来最省事的方式是systemctl restart mysql重启再不行就检查配置文件的datadir目录是否可写。这个错误在Day1遇到并不丢人反而是一次很好的排查训练把上面链路走一遍后面再看到各种Cant connect心里就有底了。3. SQL-1核心概念分清SQL和MySQL才能动手写语句3.1 SQL是语言MySQL是数据库这是我见过初学者最容易混淆的概念没有之一。很多人把MySQL和SQL当成一个东西来搜搜出来的资料一混知识点全乱。简单打个比方SQL是一套通用的语言标准类似普通话MySQL是对这套标准的一个具体实现类似某个地区的方言。同样的SQL语句在MySQL、SQL Server、PostgreSQL里大部分写法一样但会有各自的方言差异。SQL全称Structured Query Language结构化查询语言它是你和数据库对话的唯一桥梁。你在mysql命令行里敲的每一句指令都是SQL语句。数据库收到SQL语句后会解析、优化、执行然后把结果集返回给你。理解这个链路很重要——SQL不是MySQL独有的只是我们选MySQL来学SQL的具体载体。热搜词里常把sql server和mysql并列其实它们的关系是SQL Server是微软家的数据库产品MySQL是Oracle家主导的开源数据库产品两者是竞品关系。3.2 SQL语言的五大分类SQL语句不是平铺的一堆指令按功能可以分成五大类Day1至少要把名字和代表语句记清楚分类全称代表性语句作用DQLData Query LanguageSELECT查询数据DMLData Manipulation LanguageINSERT、UPDATE、DELETE操作数据DDLData Definition LanguageCREATE、ALTER、DROP定义结构DCLData Control LanguageGRANT、REVOKE权限控制TCLTransaction Control LanguageCOMMIT、ROLLBACK事务控制Day1我们重点接触的是两部分DDL用来建库建表DML用来往表里写数据和改数据再加上最基础的SELECT查询。DCL属于账号权限管理等以后分库分表、多环境发布时再深入TCL是事务范畴MySQL事务单独拿出来能讲一整章这里知道名词就行。3.3 第一天就该养成的SQL书写习惯SQL语句本身不分大小写select和SELECT执行结果一样但行业惯例是把关键字大写把字段名、表名小写这样语句层次一目了然。每一条完整的SQL以英文分号结尾这是告诉MySQL一句话说完了的结束符。注释有三种写法。单行注释可用两个短横线加空格--也可以用#开头多行注释用/* 注释内容 */。写笔记型脚本时多用注释这个习惯后面写存储过程、写定时任务时特别有用。字符串和日期类型的值必须用单引号包裹数字类型不需要。刚开始写SQL经常有人忘记引号记住一个原则你写的是SQL指令还是指令里的数据数据里的文本用引号。另外很多教程习惯在每行语句后面加反引号包裹表名和字段名比如user。这是因为反引号是用来转义那些跟系统关键字冲突的标识符的。如果你起的表名没有撞关键字完全可以不用反引号但加上也不会错。为了可读性我习惯只在确有必要时用。4. 第一张表用DDL把数据结构定下来4.1 先选一个库当练习场用root登录MySQL后默认库列表里有information_schema、mysql、performance_schema、sys这些系统自带库。新手看到这么多库别慌这些都是MySQL自己用的内部库平时不要碰它们。需要用CREATE DATABASE建一个自己的业务库。CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4;这一步真正重要的是字符集选择。MySQL 5.7及更早版本默认字符集是latin1不支持中文所以在老教程里经常能看到插入中文变成问号的乱码问题。我劝所有Day1学习者直接建库时指定utf8mb4它是完整的Unicode字符集中文、英文、Emoji都能正常存储这也是8.0的默认选项。既然建库时就能定妥就不要等乱码了再想办法补救。建完库后用USE shop;切换进去后续的建表、插数据都在这个库下操作。4.2 建一张用户表每一行都值得读懂下面这张用户表是Day1的练手核心我会逐行解释为什么这样写而不是让你无脑复制CREATE TABLE user ( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键ID, username VARCHAR(50) NOT NULL COMMENT 用户名, age TINYINT UNSIGNED DEFAULT 0 COMMENT 年龄, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表;第一列id类型INT UNSIGNED。熟悉其他语言的同学可能奇怪主键为什么要加UNSIGNED因为INT的默认范围有负数而自增主键永远不会用到负数加上UNSIGNED可以让正数范围上限翻一倍。AUTO_INCREMENT表示自增每插入一行自动加1保证主键唯一的经典做法。第二列username用VARCHAR(50)。VARCHAR是可变长度字符串50是最大字符数适合用户名这种长度不固定的场景。不要所有字符串都用TEXTTEXT没有默认值、不能直接加索引而且会拖慢查询。第三列age用TINYINT UNSIGNED。年龄范围最大也就一两百一个字节的TINYINT足够用INT反而浪费空间。这里给了DEFAULT 0意思是如果插入数据时不传年龄就默认为0而不是NULL。第四列created_at用DATETIME加DEFAULT CURRENT_TIMESTAMP。这是MySQL最常见的记录创建时间写法插入数据时不需要手动传时间数据库自动填当前时间。表两侧的两个设置也是必选的ENGINEInnoDB在MySQL 8.0里其实是默认引擎但显式写出来能让人一眼看懂——InnoDB支持事务、行级锁和外键是OLTP业务的正确选择DEFAULT CHARSETutf8mb4则把字符集再锁一遍防止某张表不小心变成老字符集。4.3 ALTER TABLE别怕改表业务本来就是长的很多新手把建表想得太神圣总觉得要把所有字段一次设计到位。实际上项目迭代中加字段、改字段是家常便饭。常用的改表语句其实就三句ALTER TABLE user ADD COLUMN email VARCHAR(100) NULL COMMENT 邮箱; ALTER TABLE user MODIFY COLUMN age TINYINT UNSIGNED NULL; ALTER TABLE user DROP COLUMN email;ADD COLUMN是加字段MODIFY COLUMN是改字段定义DROP COLUMN删字段。有一个经验值得分享能用加字段解决的问题就不要去动已有字段的逻辑。比如用户表后来需要是否VIP直接加一个is_vip TINYINT DEFAULT 0字段就行不要去改原有字段的含义。数据库表和代码一样追求的是可演进性而不是一步到位。SHOW CREATE TABLE user;可以查看建表语句DESC user;可以查看表结构这两个命令在排错、对照文档时非常实用建议Day1就记住。5. 增删改查第一课INSERT/UPDATE/DELETE/SELECT入门5.1 INSERT把数据写进去往表里插入数据的基本语法是INSERT INTO user (username, age) VALUES (张三, 25);表名后面括号里列出要插入的列VALUES里面按顺序给值。我建议始终显式列出列名不要写INSERT INTO user VALUES (...)这种省略列名的写法——一旦表结构将来加了字段这种写法直接崩而且阅读起来完全不知道谁是谁。支持一条语句插入多行INSERT INTO user (username, age) VALUES (李四, 26), (王五, 27), (赵六, 28);这样比一行一条INSERT效率高得多也是实战中推荐的批量写入方式。插入时没指定id自增会自动分配没指定created_at默认当前时间会自动填上。插入后可以用SELECT * FROM user;感受一下成果。如果你在Linux终端里看到中文乱码执行一句SET NAMES utf8mb4;这是告诉客户端当前会话用utf8mb4传输字符。这个操作在终端工具连接MySQL时特别常见。5.2 UPDATE最容易出事的语句UPDATE的语法非常简洁UPDATE user SET age 30 WHERE username 张三;它的逻辑是找出username等于张三的行把age改成30。WHERE子句用来限定范围SET子句用来指定新值。热搜词里专门有人搜mysql update语法说明这个看似简单的语句其实坑不少。最大的坑就是忘记写WHERE或写错WHERE。UPDATE user SET age 30;这条语句没有任何条件它会更新表中所有行。在开发环境数据只有几条还好在生产环境这等于瞬间把全表数据改坏而且没有后悔药。我在实战项目里见过不止一次因为手滑少写WHERE导致线上数据全改的事故。对应到操作习惯上有一条铁律执行UPDATE之前先把WHERE条件单独拿出来SELECT一下。SELECT * FROM user WHERE username 张三;确认查出来的就是想改的行再把SELECT换成UPDATE执行。多花三秒钟能救你一次职业生涯。另外MySQL有一个安全模式如果客户端开启了safe updates不加WHERE条件或没有索引的UPDATE会被直接拒绝执行相当于一道保险。学习阶段可以在查询命令前加SET SQL_SAFE_UPDATES 1;体验一下。5.3 DELETE和TRUNCATE删除也要有边界意识删除数据的基本语句是DELETE FROM user WHERE id 3;这条语句只会删除id等于3的那一行。它同样遵守上面的铁律——先确认条件再执行删除。DELETE FROM user;会清空全表但注意它并不是不可挽回如果在一个事务里执行没有COMMIT之前还能ROLLBACK。但新手别指望这个老老实实写WHERE最靠谱。这里补充一个常见区别TRUNCATE TABLE也能清空表但它是DDL语句直接把表重建一遍所以执行后自增计数器会重置而且无法回滚。而DELETE FROM user是DML逐行删除自增计数器保留下一行插入时id会继续增长。想清掉测试数据同时让id从1重新开始可以用TRUNCATE但生产环境里用它的频率极低操作前要再三确认。5.4 SELECT入门查询才是SQL主打功能SELECT是SQL世界里使用频率最高的语句。最基础的几个子句Day1必须烂熟于心。查所有列SELECT * FROM user;这个语句虽然简单但后面专门有一节讲它的问题现在先用来验证数据。查指定列并去重SELECT username, age FROM user; SELECT DISTINCT age FROM user;去重是排查脏数据时很好用的工具比如想快速知道表里一共有几种年龄。过滤条件SELECT username, age FROM user WHERE age 25;WHERE后面可以跟各种比较条件同时可以用AND和OR组合。它是SQL里被用得最多、也最需要注意效率的子句——如果表里数据量大WHERE后面筛选的列没建索引就是热搜词里慢sql优化问题的开端。排序SELECT username, age FROM user ORDER BY age DESC;ORDER BY后面跟排序字段DESC表示从大到小ASC表示从小到大默认是ASC。排序字段可以跟多个比如先按年龄排再按id排用英文逗号分开。分页SELECT username, age FROM user ORDER BY age DESC LIMIT 2; SELECT username, age FROM user ORDER BY age DESC LIMIT 2 OFFSET 1;LIMIT一个参数表示最多返回多少行比如取前2条LIMIT offset, count这里offset从0开始或LIMIT count OFFSET offset是分页的标准写法。分页在后台管理系统里几乎必用Day1先把LIMIT记牢后面SQL-2会专门演算分页的计算公式。6. 从Day1就开始培养的数据库好习惯6.1 少用SELECT *能指名道姓就不做甩手掌柜我前面特意让新手用SELECT *验证数据但到了真正写业务或练习的时候要开始克制它。SELECT *会把表里所有列都查出来网络传输需要传的列变多数据库需要扫描的数据变大代码里如果依赖列名而不是列顺序将来表结构一改还会静默出错。一条清楚写着列名的SELECT本身就是在描述意图比如SELECT username, age FROM user读者一眼就知道你要的是用户基本资料。这个习惯越早建立越省事。6.2 危险操作前的双步确认法UPDATE和DELETE是数据库里风险最高的两类语句。除了先SELECT确认影响范围还有一个技巧是记录影响行数。执行UPDATE后MySQL会返回Rows matched和Changed如果匹配行数和你预期差距很大赶紧排查。如果事务还没提交还能用ROLLBACK救回来。这里不展开事务但Day1知道MySQL有后悔药这个概念对后面学习事务很有帮助。6.3 认识SQL注入别成为拼接SQL的那个人热搜词里的sql注入sql注入万能密码绕过在国内很多开发者的学习刚需里可以说是排前面的。它的原理可以用一个例子瞬间说清。假设登录查询是这样拼出来的SELECT * FROM user WHERE username $username AND password $password如果密码框输入 OR 11 --最终SQL变成SELECT * FROM user WHERE username 任意名 AND password OR 11OR 11永远为真攻击者不需要知道任何真实密码就能绕过登录判断这就是传说中的万能密码。根本原因不是MySQL的问题而是应用程序把用户的输入直接拼进了SQL语句。防御的核心思路就是参数化查询让SQL模板和参数分离数据库不会把参数当SQL指令执行。这个内容等后面学完Python或Java连MySQL时再实操但Day1应该把这个概念种在脑子里——以后只要看到手工拼接SQL的代码就知道这是危险信号。6.4 第一天就带上性能意识慢SQL不是遥远的传说热搜词里慢sql优化mysql性能调优出现的频率很高说明这是无数开发者的痛点。很多人的优化思路是先写出一堆慢查询等系统卡了再回头补课。我不建议这样。Day1虽然只写了几条SELECT但性能意识的种子现在就可以种下WHERE后面用到的字段就是最应该建索引的字段SELECT只取需要的列减少不必要的回表排序和分组字段尽量走索引避免在大表上用LIKE %关键字%这种无法用索引的前缀模糊查询。这些概念现在不懂没关系重要的是知道SQL写法会影响性能这件事。到后面讲索引时你才不会觉得优化与新功能是两码事而是同一个知识的连贯延伸。6.5 关于存储过程和窗口函数先眼熟不着急热搜词里还有mysql存储过程sql窗口函数。这两个是进阶专题窗口函数在MySQL 8.0里已经是标准能力后面做排名、分组统计时会非常有用存储过程则是把一段SQL封装成可重复调用的程序单元。名字可以先记着但Day1阶段不要花时间去啃。数据库学习最忌贪多基础增删改查结构设计没吃透之前学这些进阶内容只会越学越乱。等SQL-2把查询和约束练扎实索引和事务讲清楚再回头看它们会轻松得多。今天这个Day1核心就三件事装好环境、看懂建表、写会增删改查。我自己的体会是能亲手建一张表、插几行中文不报错、再用一条UPDATE改对数据比看十篇教程都有用。建议你把上面的SQL语句在终端里逐条敲一遍敲完顺手SHOW TABLES;和DESC user;看一眼结构强化记忆。最后分享一个小习惯每建一张表把SHOW CREATE TABLE的结果截图存进自己的笔记过几个月回看你对表结构的理解会明显不一样。明天进入SQL-2我们继续深入查询过滤、约束和表关系到时候这些基础语句会成为你理解复杂概念的地基。