MySQL 基础完全指南(视频教程)
MySQL 基础完全指南
- MySQL 是最流行的开源关系型数据库管理系统(RDBMS),广泛用于 Web 开发、数据分析等场景。以下是 MySQL 基础核心知识点,从环境准备到常用操作,循序渐进帮你入门。
- 视频教程:
https://pan.quark.cn/s/cb365fac8807
一、环境准备
1. 安装 MySQL
- Windows:下载 MySQL Installer,按向导安装(注意记录 root 密码),默认端口 3306。
- Mac:用 Homebrew 安装
brew install mysql,或下载官网 dmg 包。 - Linux(Ubuntu):
sudo apt update && sudo apt install mysql-server。
2. 连接 MySQL
方式 1:命令行(推荐)
打开终端/命令提示符,输入连接命令:
# 本地连接(默认端口)
mysql -u root -p# 远程连接(指定主机和端口)
mysql -h 192.168.1.100 -P 3306 -u root -p
-u:指定用户名(默认 root)-p:提示输入密码(输入时不显示明文)- 连接成功后,终端会显示
mysql>提示符。
方式 2:图形化工具(新手友好)
常用工具:Navicat、SQLyog、DBeaver(开源)、MySQL Workbench(官方免费),输入主机、端口、用户名、密码即可连接。
二、核心概念
- 数据库(Database):存储数据的容器,一个 MySQL 服务器可创建多个数据库。
- 表(Table):数据库中数据的组织形式,由行(记录)和列(字段)组成。
- 字段(Column):表的列,定义数据类型(如整数、字符串、日期)。
- 记录(Row):表的行,对应一条具体数据。
- SQL:结构化查询语言,用于操作数据库的标准语言(分为 DDL、DML、DQL、DCL)。
三、SQL 基础操作
1. DDL:数据定义语言(操作数据库/表结构)
(1)数据库操作
-- 1. 创建数据库(指定字符集 utf8mb4,支持 emoji)
CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;-- 2. 查看所有数据库
SHOW DATABASES;-- 3. 切换数据库(使用某数据库)
USE mydb;-- 4. 删除数据库(谨慎!不可逆)
DROP DATABASE IF EXISTS mydb;
(2)表操作
核心语法:CREATE TABLE 表名 (字段1 类型 约束, 字段2 类型 约束, ...)
常用数据类型:
- 整数:
INT(4字节)、TINYINT(1字节,如 0-255) - 字符串:
VARCHAR(n)(可变长度,n 最大 65535)、CHAR(n)(固定长度) - 日期:
DATE(日期,如 2025-11-07)、DATETIME(日期+时间,如 2025-11-07 10:30:00) - 小数:
DECIMAL(总位数, 小数位数)(如DECIMAL(10,2)表示最大 99999999.99)
常用约束:
PRIMARY KEY:主键(唯一标识记录,非空且唯一)NOT NULL:字段不能为空UNIQUE:字段值唯一DEFAULT:默认值AUTO_INCREMENT:自增(仅整数类型,常用于主键)
示例:创建用户表 user
-- 创建表(IF NOT EXISTS 避免重复创建报错)
CREATE TABLE IF NOT EXISTS `user` (id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增username VARCHAR(50) NOT NULL UNIQUE, -- 用户名非空且唯一age TINYINT DEFAULT 18, -- 年龄默认18email VARCHAR(100) UNIQUE, -- 邮箱唯一create_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 创建时间默认当前时间
);-- 查看当前数据库所有表
SHOW TABLES;-- 查看表结构
DESC `user`; -- 或 SHOW COLUMNS FROM `user`;-- 修改表(添加字段)
ALTER TABLE `user` ADD COLUMN phone VARCHAR(20) UNIQUE;-- 修改表(修改字段类型)
ALTER TABLE `user` MODIFY COLUMN age INT DEFAULT 20;-- 修改表(删除字段)
ALTER TABLE `user` DROP COLUMN phone;-- 删除表(谨慎!不可逆)
DROP TABLE IF EXISTS `user`;
2. DML:数据操纵语言(操作表中数据)
(1)插入数据(INSERT)
-- 方式1:指定字段插入(推荐,顺序可自定义)
INSERT INTO `user` (username, age, email)
VALUES ('zhangsan', 22, 'zhangsan@xxx.com');-- 方式2:插入所有字段(需按表结构顺序,不推荐)
INSERT INTO `user` VALUES (NULL, 'lisi', 25, 'lisi@xxx.com', NOW());
-- 主键自增时,可填 NULL 或 0,会自动生成-- 批量插入(高效)
INSERT INTO `user` (username, age, email)
VALUES
('wangwu', 28, 'wangwu@xxx.com'),
('zhaoliu', 30, 'zhaoliu@xxx.com');
(2)修改数据(UPDATE)
-- 修改指定记录(必须加 WHERE 条件,否则修改全表!)
UPDATE `user`
SET age = 23, email = 'zhangsan_new@xxx.com'
WHERE username = 'zhangsan';-- 错误示例(无 WHERE,全表年龄改为 20)
UPDATE `user` SET age = 20; -- 谨慎!
(3)删除数据(DELETE)
-- 删除指定记录(加 WHERE 条件)
DELETE FROM `user` WHERE username = 'zhaoliu';-- 删除全表数据(保留表结构,自增主键不重置)
DELETE FROM `user`;-- 快速删除全表(清空数据+重置自增主键,比 DELETE 高效)
TRUNCATE TABLE `user`; -- 谨慎!不可逆
3. DQL:数据查询语言(查询表中数据)
核心语法:SELECT 字段 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 筛选 ORDER BY 排序 LIMIT 限制
(1)基础查询
-- 查询所有字段(不推荐,效率低)
SELECT * FROM `user`;-- 查询指定字段(推荐)
SELECT id, username, age FROM `user`;-- 别名查询(简化结果列名)
SELECT id AS '用户ID', username AS '用户名' FROM `user`;-- 去重查询(DISTINCT)
SELECT DISTINCT age FROM `user`; -- 查询所有不重复的年龄
(2)条件查询(WHERE)
常用运算符:
- 比较:
=(等于)、!=/<>(不等于)、>、<、>=、<= - 范围:
BETWEEN ... AND ...(区间)、IN (值1,值2)(在集合中) - 模糊:
LIKE(% 匹配任意字符,_ 匹配单个字符) - 空值:
IS NULL(为空)、IS NOT NULL(不为空) - 逻辑:
AND(且)、OR(或)、NOT(非)
示例:
-- 查询年龄大于 25 的用户
SELECT * FROM `user` WHERE age > 25;-- 查询年龄在 20-30 之间的用户
SELECT * FROM `user` WHERE age BETWEEN 20 AND 30;-- 查询用户名是 zhangsan 或 lisi 的用户
SELECT * FROM `user` WHERE username IN ('zhangsan', 'lisi');-- 模糊查询:用户名以 'z' 开头的用户
SELECT * FROM `user` WHERE username LIKE 'z%';-- 模糊查询:用户名包含 'ang' 的用户
SELECT * FROM `user` WHERE username LIKE '%ang%';-- 查询邮箱不为空的用户
SELECT * FROM `user` WHERE email IS NOT NULL;-- 多条件:年龄 >=22 且邮箱包含 @xxx.com
SELECT * FROM `user` WHERE age >=22 AND email LIKE '%@xxx.com';
(3)排序查询(ORDER BY)
-- 按年龄升序排列(默认 ASC,可省略)
SELECT * FROM `user` ORDER BY age;-- 按年龄降序排列(DESC)
SELECT * FROM `user` WHERE age >20 ORDER BY age DESC;-- 多字段排序:先按年龄降序,再按创建时间升序
SELECT * FROM `user` ORDER BY age DESC, create_time ASC;
(4)限制查询(LIMIT):分页/取前 N 条
-- 取前 2 条记录
SELECT * FROM `user` LIMIT 2;-- 分页查询(第 1 页:偏移量 0,取 2 条)
SELECT * FROM `user` LIMIT 0, 2; -- 偏移量 = (页码-1)*每页条数-- 分页查询(第 2 页:偏移量 2,取 2 条)
SELECT * FROM `user` LIMIT 2, 2;
(5)聚合查询(GROUP BY + 聚合函数)
常用聚合函数:
COUNT(字段):统计记录数(忽略 NULL)SUM(字段):求和(仅数值类型)AVG(字段):求平均值(仅数值类型)MAX(字段):求最大值MIN(字段):求最小值
示例:
-- 统计用户总数
SELECT COUNT(*) AS '总用户数' FROM `user`;-- 统计年龄大于 20 的用户数
SELECT COUNT(id) AS '20岁以上用户数' FROM `user` WHERE age >20;-- 按年龄分组,统计每组用户数
SELECT age, COUNT(*) AS '人数' FROM `user` GROUP BY age;-- 分组后筛选(HAVING,区别于 WHERE:HAVING 筛选分组结果)
SELECT age, COUNT(*) AS '人数'
FROM `user`
GROUP BY age
HAVING COUNT(*) >=2; -- 筛选出用户数 >=2 的年龄组
4. DCL:数据控制语言(权限管理)
-- 创建用户(允许本地登录)
CREATE USER 'test'@'localhost' IDENTIFIED BY '123456';-- 给用户授权(mydb 数据库所有表的查询/插入权限)
GRANT SELECT, INSERT ON mydb.* TO 'test'@'localhost';-- 查看用户权限
SHOW GRANTS FOR 'test'@'localhost';-- 撤销权限
REVOKE INSERT ON mydb.* FROM 'test'@'localhost';-- 删除用户
DROP USER 'test'@'localhost';-- 修改 root 密码(MySQL 8.0+)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
四、常见问题与注意事项
- 字段/表名加反引号:当表名/字段名是 MySQL 关键字(如
order、user)时,必须用反引号`包裹,避免语法错误。 - WHERE 与 HAVING 区别:
WHERE:筛选原始数据(分组前),不能用聚合函数。HAVING:筛选分组后的结果(分组后),可以用聚合函数。
- NULL 处理:
NULL不等于任何值(包括自身),判断空值必须用IS NULL,不能用=。 - 自增主键:删除数据后,自增主键不会自动重置,需用
TRUNCATE或手动修改自增起始值ALTER TABLE 表名 AUTO_INCREMENT = 1;。 - 字符集:创建数据库/表时指定
utf8mb4,避免中文乱码(utf8实际是utf8mb3,不支持 emoji)。
