MYSQL学习笔记
一、 环境准备(Linux 下 MySQL 安装与启动)
以主流的 CentOS 7/8 为例(Ubuntu 操作会附带说明),推荐使用 yum 安装 MySQL 8.0(目前稳定版)。
1. 安装 MySQL 源
MySQL 不在 CentOS 官方源中,先安装 MySQL 官方 yum 源:
# 下载 MySQL 8.0 官方 yum 包(CentOS 7)
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# 安装 yum 源
rpm -ivh mysql80-community-release-el7-3.noarch.rpm
# 验证源是否安装成功(会看到 mysql 相关 repo 配置)
ls /etc/yum.repos.d/ | grep mysql
2. 安装 MySQL 服务
# 安装 MySQL 社区版服务器
yum install -y mysql-community-server
# Ubuntu 系统(替换上述两步)
sudo apt update
sudo apt install -y mysql-server
3. 启动 MySQL 并设置开机自启
# 启动 MySQL 服务
systemctl start mysqld
# 查看 MySQL 运行状态(显示 active (running) 即为正常)
systemctl status mysqld
# 设置开机自启(重启服务器后自动启动 MySQL)
systemctl enable mysqld
4. 初始化配置(获取初始密码 + 修改密码)
MySQL 8.0 安装后会自动生成随机初始密码,存储在日志文件中:
# 提取初始密码(关键命令,复制输出的密码串,后续登录使用)
grep 'temporary password' /var/log/mysqld.log
输出示例:A temporary password is generated for root@localhost: abc123*XYZ(后面的字符串就是初始密码)
# 1. 登录 MySQL(输入上述初始密码,注意密码输入时终端不显示)
mysql -u root -p
# 2. 修改 root 密码(必须满足 MySQL 8.0 密码策略:大小写字母+数字+特殊字符,长度≥8)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass@123';
# 3. 刷新权限(使密码修改生效)
FLUSH PRIVILEGES;
5. 关闭防火墙(可选,便于远程连接)
# 停止 firewalld
systemctl stop firewalld
# 禁止 firewalld 开机自启
systemctl disable firewalld
二、 MySQL 核心基础命令(终端操作)
所有命令均在 MySQL 终端内执行(即登录 mysql -u root -p 后),注意:
1. MySQL 命令以 分号 ; 结尾(不结尾不会执行)
2. 可使用 \c 取消当前输入的未完成命令
3. 大小写不敏感(推荐关键字大写,表名/字段名小写,便于区分)
1. 退出 MySQL 终端
-- 两种方式均可
EXIT;
-- 或
\q
2. 查看 MySQL 版本
-- 方式 1(MySQL 终端内)
SELECT VERSION();
-- 方式 2(Linux 终端直接执行,无需登录 MySQL)
mysql --version
3. 查看当前所有数据库
SHOW DATABASES;
默认会显示 4 个系统数据库:information_schema、mysql、performance_schema、sys(请勿修改系统数据库)。
4. 切换/使用指定数据库
-- 语法:USE 数据库名;
USE test; -- 切换到 test 数据库(需先存在该数据库)
切换成功后会提示:Database changed。
5. 查看当前数据库下所有数据表
-- 前提:已使用 USE 切换到目标数据库
SHOW TABLES;
-- 若未切换数据库,可指定数据库查看:
SHOW TABLES FROM 数据库名;
6. 查看数据表结构(字段名、类型、约束等)
-- 语法:DESC 表名;(DESCRIBE 的缩写)
DESC student;
输出包含:字段名(Field)、数据类型(Type)、是否允许为空(Null)、是否为主键(Key)、默认值(Default)、额外属性(Extra)。
三、 数据管理(数据库/表/数据的增删改查)
1. 数据库操作(CRUD)
(1)创建数据库
-- 语法:CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARACTER SET 编码格式];
-- 说明:
-- 1. IF NOT EXISTS:可选,避免创建已存在的数据库时报错
-- 2. DEFAULT CHARACTER SET utf8mb4:指定编码(推荐 utf8mb4,支持所有中文和表情符号)
CREATE DATABASE IF NOT EXISTS school DEFAULT CHARACTER SET utf8mb4;
(2)删除数据库
-- 语法:DROP DATABASE [IF EXISTS] 数据库名;
-- IF EXISTS:可选,避免删除不存在的数据库时报错
DROP DATABASE IF EXISTS school;
⚠️ 警告:删除数据库会彻底删除所有数据表和数据,无法恢复,谨慎操作!
(3)修改数据库编码(较少使用)
-- 语法:ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 编码格式;
ALTER DATABASE school DEFAULT CHARACTER SET utf8;
2. 数据表操作(CRUD)
前提:已切换到目标数据库(USE school;)
(1)创建数据表
-- 语法:CREATE TABLE [IF NOT EXISTS] 表名 (
-- 字段名1 数据类型 [约束条件],
-- 字段名2 数据类型 [约束条件],
-- ...
-- 字段名n 数据类型 [约束条件]
-- ) ENGINE=存储引擎 DEFAULT CHARSET=编码;
-- 常用约束:PRIMARY KEY(主键)、AUTO_INCREMENT(自增)、NOT NULL(非空)、UNIQUE(唯一)
-- 示例:创建学生表(student)
CREATE TABLE IF NOT EXISTS student (
id INT PRIMARY KEY AUTO_INCREMENT, -- 学号,主键自增
name VARCHAR(50) NOT NULL, -- 姓名,非空
age TINYINT UNSIGNED DEFAULT 0, -- 年龄,无符号(不能为负),默认 0
gender ENUM('男','女','未知') DEFAULT '未知', -- 性别,只能选指定值
create_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 创建时间,默认当前时间
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 存储引擎:推荐
InnoDB(支持事务、外键,默认存储引擎) - 数据类型:常用
INT(整数)、VARCHAR(n)(可变长度字符串)、TINYINT(小整数)、DATETIME(日期时间)
(2)删除数据表
-- 语法:DROP TABLE [IF EXISTS] 表名;
DROP TABLE IF EXISTS student;
⚠️ 警告:删除数据表会彻底删除表结构和所有数据,无法恢复!
(3)修改数据表(添加/修改/删除字段,较少使用)
-- 示例 1:添加字段(添加手机号字段)
ALTER TABLE student ADD COLUMN phone VARCHAR(11) UNIQUE AFTER name;
-- 示例 2:修改字段类型(修改 age 字段长度,保留约束)
ALTER TABLE student MODIFY COLUMN age INT UNSIGNED DEFAULT 0;
-- 示例 3:删除字段(删除 phone 字段)
ALTER TABLE student DROP COLUMN phone;
3. 数据操作(核心 CRUD,重点)
前提:已存在 student 表,切换到 school 数据库。
(1)新增数据(CREATE – INSERT)
-- 语法 1:指定字段插入(推荐,字段顺序可与表结构不一致)
INSERT INTO student (name, age, gender) VALUES ('张三', 18, '男');
-- 语法 2:不指定字段(需与表结构字段顺序完全一致,主键自增字段可填 NULL 或省略)
INSERT INTO student VALUES (NULL, '李四', 19, '女', CURRENT_TIMESTAMP);
-- 语法 3:批量插入(高效,减少网络交互)
INSERT INTO student (name, age, gender)
VALUES ('王五', 20, '男'), ('赵六', 17, '女');
(2)查询数据(READ – SELECT,最常用)
-- 语法:SELECT 字段列表 FROM 表名 [WHERE 条件] [ORDER BY 字段] [LIMIT 限制条数];
-- 示例 1:查询所有字段(* 代表所有字段,生产环境不推荐,效率低)
SELECT * FROM student;
-- 示例 2:查询指定字段(推荐,精准查询)
SELECT id, name, age FROM student;
-- 示例 3:带条件查询(查询年龄大于 18 的男生)
SELECT id, name, age FROM student WHERE age > 18 AND gender = '男';
-- 示例 4:排序查询(按年龄降序排序,DESC 降序,ASC 升序(默认))
SELECT id, name, age FROM student ORDER BY age DESC;
-- 示例 5:限制查询结果条数(查询前 2 条数据,用于分页)
SELECT id, name, age FROM student LIMIT 2;
(3)修改数据(UPDATE)
-- 语法:UPDATE 表名 SET 字段1=值1, 字段2=值2 [WHERE 条件];
-- ⚠️ 警告:WHERE 条件可选,不写会修改表中所有数据!
-- 示例:修改张三的年龄为 21(通过 id 定位,最精准)
UPDATE student SET age = 21 WHERE id = 1;
(4)删除数据(DELETE)
-- 语法:DELETE FROM 表名 [WHERE 条件];
-- ⚠️ 警告:WHERE 条件可选,不写会删除表中所有数据!
-- 注意:DELETE 只删除数据,表结构保留;如需清空表且重置自增主键,用 TRUNCATE TABLE 表名;
-- 示例:删除 id 为 4 的数据
DELETE FROM student WHERE id = 4;
-- 示例:清空 student 表(数据全删,自增主键重置)
TRUNCATE TABLE student;
四、 常用进阶操作(Linux 终端 + MySQL 终端)
1. Linux 终端直接执行 MySQL 命令(无需登录)
适合编写脚本自动化执行,语法格式:
# 语法:mysql -u 用户名 -p'密码' -e "MySQL 命令" [数据库名]
# 注意:密码和 -p 之间无空格,单引号包裹(避免特殊字符解析问题)
# 示例 1:查看所有数据库
mysql -u root -p'MyNewPass@123' -e "SHOW DATABASES;"
# 示例 2:查询 student 表数据,指定数据库 school
mysql -u root -p'MyNewPass@123' -e "SELECT * FROM student;" school
2. 数据库备份(mysqldump 命令,Linux 终端)
mysqldump 是 MySQL 自带的备份工具,用于将数据库/表导出为 SQL 脚本文件,核心命令:
# 语法:mysqldump -u 用户名 -p 数据库名 [表名] > 备份文件路径.sql
# 说明:不指定表名则备份整个数据库
# 示例 1:备份整个 school 数据库,保存到 /root/backup/school_backup.sql
mkdir -p /root/backup # 先创建备份目录
mysqldump -u root -p school > /root/backup/school_backup.sql
# 示例 2:仅备份 school 数据库中的 student 表
mysqldump -u root -p school student > /root/backup/student_backup.sql
执行后输入 MySQL 密码,备份完成后,对应的 .sql 文件包含创建数据库/表、插入数据的完整 SQL 命令。
3. 数据库恢复(Linux 终端)
将备份的 .sql 脚本文件导入到 MySQL 中,前提:目标数据库已存在(若备份包含创建数据库命令,可省略创建)
# 语法 1:mysql -u 用户名 -p 数据库名 < 备份文件路径.sql
mysql -u root -p school < /root/backup/school_backup.sql
# 语法 2(MySQL 终端内):SOURCE 备份文件路径.sql;
# 步骤:1. 登录 MySQL 2. 切换到目标数据库 3. 执行 SOURCE 命令
mysql -u root -p
USE school;
SOURCE /root/backup/school_backup.sql;
4. 查看 MySQL 运行日志(Linux 终端)
# 查看 mysqld 日志(初始密码、运行错误等)
tail -f /var/log/mysqld.log # 实时查看日志末尾(按 Ctrl+C 退出)
cat /var/log/mysqld.log # 查看完整日志
五、 新手注意事项
- 所有删除操作(
DROP DATABASE、DROP TABLE、DELETE)务必加条件,谨慎操作,建议先备份再删除。 - MySQL 8.0 密码策略严格,若想简化密码(仅用于测试环境),可修改密码策略:
-- 1. 查看当前密码策略 SHOW VARIABLES LIKE 'validate_password%'; -- 2. 修改密码长度要求为 6 SET GLOBAL validate_password.length = 6; -- 3. 关闭密码复杂度要求(允许纯数字/字母) SET GLOBAL validate_password.policy = LOW; - 终端中输入密码时,屏幕不会显示任何字符,这是正常的安全机制,直接输入即可。
- 推荐使用
utf8mb4编码,避免中文乱码和表情符号无法存储的问题。
总结
- Linux 下 MySQL 核心操作分为系统终端(安装、启动、备份、恢复)和MySQL 终端(数据管理)两类,前者依赖系统命令,后者依赖 SQL 语法。
- MySQL 命令必须以分号结尾,数据操作的核心是
INSERT/SELECT/UPDATE/DELETE,其中SELECT是日常使用频率最高的命令。 - 备份(
mysqldump)和谨慎删除是保障数据安全的关键,新手在操作生产环境数据前务必先备份。