本篇为 MySQL 入门第二篇,重点讲解数据查询语法、常用函数、索引、事务与权限管理,是日常开发的核心内容。
一、数据查询(SELECT)详解
查询是 MySQL 最常用的操作,语法灵活,功能丰富。以下示例均基于上一篇的 student 表。
1. 基础查询
sql
cpp
-- 查询所有字段(生产环境不推荐 *,影响性能且不明确)
SELECT * FROM student;
-- 查询指定字段
SELECT id, name, age FROM student;
-- 字段别名
SELECT name AS 姓名, age 年龄 FROM student;
-- 去重查询
SELECT DISTINCT gender FROM student;
2. 条件查询(WHERE)
sql
cpp
-- 比较运算符
SELECT * FROM student WHERE age > 18;
SELECT * FROM student WHERE gender = '男';
-- 逻辑运算符 AND / OR / NOT
SELECT * FROM student WHERE age > 18 AND gender = '女';
-- 范围查询 BETWEEN ... AND ...
SELECT * FROM student WHERE age BETWEEN 18 AND 20;
-- 枚举查询 IN
SELECT * FROM student WHERE age IN (18, 20, 22);
-- 模糊查询 LIKE(% 匹配任意字符,_ 匹配单个字符)
SELECT * FROM student WHERE name LIKE '张%';
SELECT * FROM student WHERE name LIKE '_三';
-- 空值判断 IS NULL / IS NOT NULL
SELECT * FROM student WHERE gender IS NULL;
3. 排序与分页
sql
cpp
-- 排序:ASC 升序(默认),DESC 降序
SELECT * FROM student ORDER BY age DESC;
-- 多字段排序
SELECT * FROM student ORDER BY age DESC, id ASC;
-- 分页:LIMIT 偏移量, 每页条数
SELECT * FROM student LIMIT 0, 3; -- 第1页,每页3条
SELECT * FROM student LIMIT 3, 3; -- 第2页
分页公式:第 n 页,每页 size 条 → LIMIT (n-1)*size, size
4. 分组聚合查询
sql
cpp
-- 聚合函数
SELECT COUNT(*) 总人数 FROM student;
SELECT MAX(age) 最大年龄, MIN(age) 最小年龄, AVG(age) 平均年龄 FROM student;
SELECT SUM(age) 年龄总和 FROM student;
-- 分组统计:按性别统计人数
SELECT gender, COUNT(*) 人数 FROM student GROUP BY gender;
-- 分组后筛选 HAVING(WHERE 筛选行,HAVING 筛选分组结果)
SELECT gender, AVG(age) 平均年龄
FROM student
GROUP BY gender
HAVING 平均年龄 > 19;
5. 联表查询
当数据分布在多张表中时,通过关联字段连接查询。假设有另一张表 class(班级表),student 表有 class_id 字段关联班级。
sql
cpp
-- 内连接:只返回两张表匹配的数据
SELECT s.name, c.class_name
FROM student s
INNER JOIN class c ON s.class_id = c.id;
-- 左连接:返回左表全部数据,右表无匹配则显示 NULL
SELECT s.name, c.class_name
FROM student s
LEFT JOIN class c ON s.class_id = c.id;
-- 右连接:返回右表全部数据,左表无匹配则显示 NULL
SELECT s.name, c.class_name
FROM student s
RIGHT JOIN class c ON s.class_id = c.id;
6. 子查询
查询语句中嵌套另一个查询:
sql
-- 查询年龄大于平均年龄的学生
SELECT * FROM student WHERE age > (SELECT AVG(age) FROM student);
二、常用内置函数
1. 字符串函数
sql
SELECT CONCAT('姓名:', name) FROM student; -- 拼接字符串
SELECT LENGTH(name) FROM student; -- 字节长度
SELECT SUBSTRING(name, 1, 2) FROM student; -- 截取字符串
SELECT UPPER(name) FROM student; -- 转大写
2. 数值函数
sql
SELECT ROUND(3.1415, 2); -- 四舍五入保留2位
SELECT CEIL(3.1); -- 向上取整
SELECT FLOOR(3.9); -- 向下取整
SELECT ABS(-10); -- 绝对值
3. 日期函数
sql
SELECT NOW(); -- 当前日期时间
SELECT CURDATE(); -- 当前日期
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); -- 加7天
SELECT DATEDIFF(NOW(), '2020-01-01'); -- 日期相差天数
三、索引基础
索引是提升查询速度的核心手段,类似书籍的目录,通过牺牲少量写入性能换取查询效率。
1. 索引类型
- 主键索引:主键自动创建,唯一且非空
- 唯一索引:字段值不允许重复
- 普通索引:最基础的索引
- 联合索引:多个字段组成的索引
2. 索引操作
sql
cpp
-- 创建普通索引
CREATE INDEX idx_name ON student(name);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_name_unique ON student(name);
-- 创建联合索引
CREATE INDEX idx_name_age ON student(name, age);
-- 查看索引
SHOW INDEX FROM student;
-- 删除索引
DROP INDEX idx_name ON student;
3. 查看执行计划
判断查询是否命中索引:
sql
EXPLAIN SELECT * FROM student WHERE name = '张三';
重点关注 type 列,ALL 表示全表扫描,ref、range 等表示命中索引。
四、事务与存储引擎
1. 事务四大特性(ACID)
- 原子性(Atomicity):事务内操作要么全部成功,要么全部失败
- 一致性(Consistency):事务前后数据完整性保持一致
- 隔离性(Isolation):多个事务之间互不干扰
- 持久性(Durability):事务提交后数据永久生效
2. 事务控制
sql
cpp
-- 开启事务
START TRANSACTION;
-- 执行多条 SQL
UPDATE account SET money = money - 100 WHERE id = 1;
UPDATE account SET money = money + 100 WHERE id = 2;
-- 提交事务
COMMIT;
-- 回滚事务(出错时执行)
ROLLBACK;
3. 常用存储引擎
- InnoDB:MySQL 默认引擎,支持事务、外键、行级锁,适合高并发写入场景
- MyISAM:不支持事务,表级锁,查询速度快,适合读多写少场景
五、用户与权限管理
1. 用户管理
sql
cpp
-- 创建用户(指定用户名和访问主机)
CREATE USER 'test_user'@'localhost' IDENTIFIED BY '123456';
-- 修改密码
ALTER USER 'test_user'@'localhost' IDENTIFIED BY 'new_password';
-- 删除用户
DROP USER 'test_user'@'localhost';
2. 权限控制
sql
cpp
-- 授予所有库所有表的查询、插入权限
GRANT SELECT, INSERT ON *.* TO 'test_user'@'localhost';
-- 授予所有权限
GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
-- 撤销权限
REVOKE INSERT ON *.* FROM 'test_user'@'localhost';
-- 查看用户权限
SHOW GRANTS FOR 'test_user'@'localhost';
谢谢