MySQL入门第一天:SQL基础语言与实操避坑指南

发布时间:2026/9/28 14:28:53
MySQL入门第一天:SQL基础语言与实操避坑指南 1. 第一天学MySQL到底先学什么很多人第一次接触数据库都是被一句先学MySQL吧推进门的。MySQL开源免费、资料多、遇到问题随手一搜就有答案确实是最适合入门的关系型数据库。但真正打开教程那一瞬间往往是一堆术语扑面而来索引、事务、存储引擎、主从复制、慢查询优化……如果第一天就扎进这些东西里面大概率三天之内就会放弃。我的建议非常直接第一天只干一件事——把SQL基础语言学扎实。SQL学好了后续什么索引优化、存储过程、主从复制全都是在SQL这根树干上长出来的枝叶。先搞清楚SQL怎么写、怎么查、怎么改再谈性能、架构和高级特性。这里先给个底层的认知框架。在MySQL里SQL语言按功能可以分成四类分类全称作用常见关键字DDLData Definition Language定义数据库结构CREATE, ALTER, DROPDMLData Manipulation Language操作表里的数据INSERT, UPDATE, DELETEDQLData Query Language查询数据SELECTDCLData Control Language权限控制GRANT, REVOKE第一天重点关注DML和DQL这两个占了日常工作里至少七成使用频率。DDL学会基础的建库建表就够了DCL知道有这回事即可后面用到了再深入。下面我按自己当年学习的顺序把这套内容完整拆开讲一遍。每一步都是可以直接照着操作的。先说明一点我所有的示例都基于MySQL 8.0版本这是目前最主流、也最适合新手的版本。如果你用的是5.7绝大部分语法完全通用个别特性差异我会在文中专门标注。2. 装好环境再动手MySQL 8.0安装与连接避坑学习SQL必须有一台能跑起来的MySQL光看书不操作等于白学。这一节我把从下载到连接的完整过程讲清楚并重点说几个最容易卡住新手的地方。2.1 下载与安装官方版本选择电脑上双击安装的那种直接去MySQL官网下载社区版MySQL Community Server。社区版完全免费功能对学习来说绰绰有余不需要Music版那个是商用付费的。下载时注意区分操作系统。Windows用户下载.msi安装包macOS用户下载.dmgLinux用户通常用包管理器安装。安装过程中有几个选项需要注意端口号默认3306不动它。root密码设置一个自己记得住的密码最好记在备忘录里。我见过太多人安装完第二天就把密码忘了然后到处找重置密码的教程。字符集如果是5.7版本安装时注意选UTF-88.0版本默认就是utf8mb4不用额外设置。有个小细节Windows安装时如果提示缺少Visual C运行库先去微软官网装一下再回来继续安装这是最常见的前置依赖问题。2.2 连接MySQL命令行和图形化工具安装完成后第一件事是确认MySQL能连上。打开命令行工具输入mysql -u root -p回车后会提示输入密码注意这里输入密码时屏幕不会显示任何字符不要以为是自己没敲进去。如果出现这样的报错ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock这个报错在Mac和Linux上非常经典。意思不是说密码不对而是MySQL服务根本没起来。先检查服务状态# macOS brew services list # Linux (以systemd为例) systemctl status mysqld # Windows net start | findstr mysql如果服务没在运行启动它# macOS brew services start mysql # Linux systemctl start mysqld # Windows net start mysql启动完再执行mysql -u root -p基本就能进去了。命令行是必须练的因为它是所有工具的基础。但日常学习和操作我更推荐配一个图形化工具。MySQL Workbench是官方出的免费工具下载MySQL时可以直接一起装上。Workbench能直观地看到数据库里的表、数据还能可视化地写查询、看执行计划对新手特别友好。社区里常提到的Navicat功能更完善但收费学习阶段没必要急着上。我自己第一天学习时是命令行和Workbench配合着用的命令行练语法Workbench看结果。这样既不会变成只会点按钮不会写SQL也不会因为一直对着黑窗口觉得枯燥。2.3 确认安装成功跑一条SQL验证连接成功后先输入这个命令确认版本SELECT VERSION();看到类似8.0.36的输出就说明环境已经没问题了。我习惯接着执行一句SHOW DATABASES;这一步是让你感受一下数据库服务器里有什么。一般情况下会有information_schema、mysql、performance_schema、sys这几个系统自带的库新手的MySQL里还没有自己的业务数据库。这也正好引出下一节的内容如何亲手建一个库、建一张表。3. SQL基础语言核心从建库建表到增删改查环境搞定了接下来就是第一天的主菜。我不建议一上来就背语法而是跟着下面的案例走一遍把库建起来、把数据放进去、再把数据查出来。走完一遍SQL基础语言基本上就成型了。3.1 建库建表DDL里的CREATE我以学生选课这个经典场景为例建一个school数据库。先建库CREATE DATABASE school DEFAULT CHARACTER SET utf8mb4;utf8mb4是MySQL里最推荐使用的字符集它支持完整的Unicode包括emoji和生僻字。如果不指定老版本可能默认用latin1存中文会出现乱码。这属于老生常谈但依然会有人踩的坑。建完库之后用USE命令切换到它USE school;然后建表。两张基本的表学生表和学生选课记录表。CREATE TABLE student ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT 主键自增, name VARCHAR(50) NOT NULL COMMENT 学生姓名, age INT COMMENT 年龄, created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ) COMMENT学生表;CREATE TABLE course ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT 主键, student_id INT COMMENT 关联学生表id, course_name VARCHAR(100) COMMENT 课程名称, score DECIMAL(5,2) COMMENT 成绩 ) COMMENT选课表;逐个解释一下这里面涉及的基础语法正是SQL基础语言最核心的几个点INT整数类型。AUTO_INCREMENT表示自增每插入一条记录自动加1不需要手动指定。VARCHAR(50)可变长字符串括号里是最大长度。DATETIME日期时间类型。DEFAULT CURRENT_TIMESTAMP表示插入时自动取当前时间就不用自己在SQL里写时间了。PRIMARY KEY主键每张表都建议设计一个用来唯一标识每一行记录。COMMENT注释给字段和表加说明。学习阶段一定要养成写注释的习惯不然过一个月回来看表结构完全想不起来当初这个字段是干什么用的。DECIMAL(5,2)小数类型5位有效数字、2位小数。存分数这类数据比直接用FLOAT更精确避免浮点数误差。3.2 DMLINSERT、UPDATE、DELETE表建好之后用INSERT插入几条测试数据INSERT INTO student (name, age) VALUES (张三, 20); INSERT INTO student (name, age) VALUES (李四, 22); INSERT INTO student (name, age) VALUES (王五, 21);注意我建表时有created_at字段默认取当前时间所以INSERT里可以不用写它甚至主键id也可以不写让它自增。插入选课记录INSERT INTO course (student_id, course_name, score) VALUES (1, 数学, 85.50); INSERT INTO course (student_id, course_name, score) VALUES (1, 英语, 92.00); INSERT INTO course (student_id, course_name, score) VALUES (2, 数学, 78.00);修改数据的UPDATEUPDATE student SET age 23 WHERE id 2;这条SQL把id为2的学生年龄改成了23。注意WHERE是UPDATE的生命线。如果漏了WHERE就是死路一条UPDATE student SET age 23;这条会把表里所有学生的年龄都改成23。这是新手阶段最常见的事故没有之一。我接触过的很多人在入职后不小心做过类似操作轻则背锅写检讨重则直接走人。删除数据用DELETEDELETE FROM course WHERE id 1;同理DELETE FROM course;会把整张表清空非常危险。如果我的记忆和多年经验没出错的话几乎所有MySQL相关的坑汇总里UPDATE和DELETE忘记加WHERE永远排在前三名。3.3 DQLSELECT查询SQL使用频率最高的部分DQL是SQL里最核心的内容也是第一天需要花最多时间的部分。基础查询从最简到复杂逐层加东西-- 查询全部字段 SELECT * FROM student; -- 查询指定字段 SELECT name, age FROM student; -- 带条件查询 SELECT * FROM student WHERE age 20; -- 排序 SELECT * FROM course ORDER BY score DESC; -- 去重 SELECT DISTINCT course_name FROM course; -- 限制条数 SELECT * FROM student LIMIT 2;逐条说一下SELECT *适合在练习阶段快速看数据但实际项目里不推荐。表字段多了之后SELECT *会拉回大量不必要的数据浪费内存和网络带宽。工作中更常见的是明确列出需要的字段这也是大厂开发规范里经常强调的一条。WHERE是查询条件过滤支持、、、、、不等于这些比较运算符也支持AND、OR组合多个条件SELECT * FROM course WHERE score 80 AND course_name 数学;ORDER BY用来排序DESC是倒序大到大ASC是正序小到大也是默认值。注意多字段排序时的书写顺序先写第一优先级字段再写第二优先级字段比如SELECT * FROM course ORDER BY student_id ASC, score DESC;这样就是先按学生id正序同一个学生再按成绩倒序排列。DISTINCT去重很好用但要注意它作用于后面跟的所有字段的组合不是只作用于第一个字段。比如SELECT DISTINCT course_name, score FROM course去重的是课程成绩的组合而不是单独对课程名去重。这个问题我在面试候选人的时候问过很多次答错的占比不低。LIMIT控制返回行数。注意不同数据库写法不同SQL Server用的是TOPOracle用的是ROWNUM只有MySQL和PostgreSQL这样用LIMIT。这也是为什么我常建议新手从MySQL入门——语法更简单直接迁移到别的数据库也不难。3.4 数据过滤的几个进阶条件WHERE里面还有几个比较常用的写法第一天讲了不亏后面写报表、做排查都会高频用到-- IN匹配多个值 SELECT * FROM student WHERE id IN (1, 2); -- LIKE模糊匹配 SELECT * FROM student WHERE name LIKE 张%; -- BETWEEN范围匹配 SELECT * FROM course WHERE score BETWEEN 80 AND 90;LIKE里的%是通配符代表任意长度的任意字符。LIKE 张%匹配所有张开头的名字。要注意LIKE的性能比较差如果表很大这个查询会很慢但在学习阶段不必太纠结性能问题后面学索引优化时会专门讲到。4. 第一天绕不开的坑NULL、乱码、默认值与连接报错第一天学习SQL除了语法本身还有一些实操中一定会遇到的、据说让人无比抓狂的问题。这里我系统性地梳理一下如果你今天也遇到了照着对照表排查就可以。4.1 关于NULL它不等于空字符串NULL和空字符串是很多新手第一天就会被搞混的两个概念。NULL表示没有值或值未知它不是0也不是空字符串。表示一个长度为0的字符串它是一个确切的值。有个典型的错误写法是把WHERE age NULL当作查询空值的条件-- 错误永远查不到任何记录 SELECT * FROM student WHERE age NULL; -- 正确 SELECT * FROM student WHERE age IS NULL;判断NULL必须用IS NULL或IS NOT NULL不能用 NULL或 NULL。为什么因为NULL参与任何比较运算包括、、结果都是NULL也就是不确定。所以在SQL里NULL NULL的结果不是真而是NULL。还有一个相关的高频坑在计算时NULL会传染。比如NULL 1的结果仍然是NULL两个字段相加时如果其中一个字段为NULL整体结果就是NULL。这时需要用IFNULL函数兜底SELECT IFNULL(age, 0) FROM student;IFNULL(age, 0)的意思是如果age是NULL就返回0否则返回age本身。这在处理统计计算时非常实用。4.2 中文乱码字符集和连接编码一起确认学习第一天最常见的一个场景数据库里明明存的是中文查出来却是一堆???或者乱码。这个问题大概率是字符集不统一造成的。排查思路三步走第一步确认表本身的字符集SHOW CREATE TABLE student;看结果里有没有DEFAULT CHARSETutf8mb4。如果没有说明建表时没指定字符集这时候用ALTER修改ALTER TABLE student CONVERT TO CHARACTER SET utf8mb4;第二步确认客户端连接时用的字符集。命令行方式连接可以在退出后重新这样进入mysql --default-character-setutf8mb4 -u root -p第三步检查数据本身。如果数据在存储之前就已经乱码了后面怎么调连接都救不回来。这时候只能把数据删除后重新插入。另外一个常见误区存中文用utf8还是utf8mb4在MySQL里utf8其实不是真正的全量UTF-8它最多只能存3字节字符像emoji这类4字节字符会存不进去导致报错。而utf8mb4才是彻底完整的UTF-8实现。所以无论建库还是建表直接默认用utf8mb4都不会错。4.3 默认值设置DEFAULT后为什么插入还是报错热搜词里有一个mysql设置默认值为0这个确实会难住不少人。不少人在建表的时候给字段设置了默认值但插入数据时仍然遇到了字段没有默认值之类的报错。这里我举例说明一下CREATE TABLE t ( id INT, status INT DEFAULT 0 );插入一条只含id的数据INSERT INTO t (id) VALUES (1);这样status就会自动填0没有问题。但如果是这样写INSERT INTO t VALUES (1);这一条会报错因为VALUES后面没写完整字段列表时MySQL会认为你要给所有字段都提供值。如果表结构是id、status两个字段你只给了一个值MySQL会提示列数不匹配。所以正确的插入习惯是显式写出字段列表不要省略。同理GUID也是默认值的关键词之一。热搜词里有sql 默认值guid那是另一种玩法——MySQL并不像SQL Server那样原生支持DEFAULT NEWID()的方式生成GUID但可以通过DEFAULT (UUID())达到类似效果CREATE TABLE t ( id VARCHAR(36) DEFAULT (UUID()) );这个语法在MySQL 8.0中才支持5.7里不能用。不过学习阶段直接使用自增主键就完全够用了。4.4 连接数据库时报错SSL、端口、服务状态热搜词里信息量比较大的还有一条mysql ssl连接错误以及更长的驱动程序无法通过使用安全套接字层(ssl)加密与 sql server 建立安全连接。后者说的是SQL Server但在MySQL连接中同样会遇到SSL相关的提示。常见的一条报错是SSL connection error: unknown error number这类报错多发生在用Java、Python等程序连接MySQL时。如果只是本地开发环境、学习阶段在连接参数里明确禁掉SSL即可# Python示例 import pymysql conn pymysql.connect( hostlocalhost, userroot, passwordyour_password, databaseschool, ssl_disabledTrue, )如果是Workbench连接时报类似的SSL错误也可以在连接配置里找到SSL相关的选项把Use SSL调成Disabled或者If available。不过这里要提醒一句生产环境不要禁用SSL那会带来安全隐患。这个做法只适合本地学习环境。5. 第一天的动手练习用一套完整流程巩固SQL基础语言前面把知识点拆开了现在把它们串起来。我给自己学习第一天设计了一套练习流程可以照着做一遍。整套流程模拟的是一个非常贴近真实工作的场景从建库建表到插入数据再到查询分析。5.1 练习题一套第一步创建一个名为practice的数据库字符集选utf8mb4。第二步在里面建一张员工表employee字段包括id自增主键、姓名name、部门department、薪资salary、入职日期hire_date。第三步插入至少5条员工数据要求分布在至少3个不同部门薪资各不相同。第四步写出以下查询语句查询所有员工的姓名、部门和薪资。只查询技术部的员工。按薪资从高到低排序并只显示前3条。查询薪资大于10000的员工数量用COUNT聚合函数。按部门分组计算每个部门的平均薪资。第五步更新某一条员工的薪资再删除某一条员工记录。5.2 题解参考建表和插入数据的SQL如下CREATE DATABASE practice DEFAULT CHARACTER SET utf8mb4; USE practice; CREATE TABLE employee ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, department VARCHAR(20), salary DECIMAL(10,2), hire_date DATE ); INSERT INTO employee (name, department, salary, hire_date) VALUES (赵大, 技术部, 15000.00, 2020-03-15), (钱二, 技术部, 18000.00, 2019-08-01), (孙三, 产品部, 12000.00, 2021-05-20), (李四, 运营部, 9000.00, 2022-01-10), (周五, 产品部, 14000.00, 2020-11-30);查询语句参考-- 1. 查询所有员工的姓名、部门和薪资 SELECT name, department, salary FROM employee; -- 2. 技术部员工 SELECT * FROM employee WHERE department 技术部; -- 3. 按薪资倒序取前3 SELECT * FROM employee ORDER BY salary DESC LIMIT 3; -- 4. 薪资大于10000的人数 SELECT COUNT(*) FROM employee WHERE salary 10000; -- 5. 各部门平均薪资 SELECT department, AVG(salary) FROM employee GROUP BY department;最后一条用到的GROUP BY和AVG是第一天学完后最值得往下延伸的知识点。GROUP BY的作用是按某个字段分组然后针对每组做聚合计算。它经常和COUNT、AVG、SUM、MAX、MIN这五个聚合函数搭配使用。这套练习做完SQL基础语言就有了一个相对完整的轮廓。6. 第一天学完后下一步往哪个方向走如果把MySQL学习比作登山第一天的SQL基础语言就是山脚下的热身。热身结束不代表结束了后面还有几条明显的主路根据自己的目标选一条往下走就行。如果未来要做开发、写业务代码接下来的重点是SELECT的高级玩法多表JOIN内连接、左连接、右连接、子查询、窗口函数。热搜词里的sql窗口函数就属于这一块窗口函数在做排名、同比环比这类分析时极其好用。事务和锁ACID、隔离级别、行锁表锁这是和Java、Go等后端语言配合时的核心知识。索引优化为什么查询越来越慢怎么通过索引解决慢查询。热搜词里的慢sql优化就是从这里引申出来的。如果未来要做运维、DBA方向接下来的重点是MySQL存储引擎InnoDB和MyISAM的区别、MVCC机制。存储过程热搜词里有mysql存储过程属于把一段SQL逻辑封装起来反复用的能力。主从复制热搜词里有怎么使用mysql 主从复制这是高可用架构的基石涉及binlog、从库同步、读写分离等概念。如果想快速找到工作建议按照基础SQL - 索引优化 - 事务 - 项目实战这条线走。JavaWeb项目、Spring Boot MySQL这套组合是目前市场占有率极高的技术栈javaweb项目完整案例mysql这类资料说明很多人都是从项目和MySQL的组合中练出来的。我个人在这些年接触过不少新人一个比较真实的感受是第一天就把SQL基础语言里的增删改查练到条件反射级别的人后面的路会走得特别顺。因为后续学的事务、索引、存储过程、主从复制都得以SQL为操作语言。SQL写不顺后面每一步都会卡。另外再分享一个学习习惯准备一个自己的SQL笔记不需要多正式把每天写的SQL都存下来。今天写的这些建表语句、查询语句后续学JOIN、学窗口函数时都可以在上面扩展。日积月累那就是一份完全属于自己的、可随时查阅的SQL手册比任何别人的教程都更有针对性。就按这个节奏学下去第一天不贪多把上面这些内容练扎实你就已经比很多装完MySQL就吃灰的人走得远多了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询