MySQL 基础用法(下):查询进阶与核心特性

本篇为 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 表示全表扫描,refrange 等表示命中索引。

四、事务与存储引擎

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';

谢谢

相关推荐
math_hongfan1 小时前
鸿蒙Agent高级技能自定义开发:自定义意图服务/能力注册/Agent技能编排/服务插件开发实战
android·学习·华为·harmonyos·鸿蒙
郭涤生1 小时前
C++ 零拷贝(Zero-Copy)
linux·开发语言·c++
XWalnut1 小时前
MySQL入门到精通
数据库·mysql
乐观勇敢坚强的老彭1 小时前
计算机内存中的堆和栈
c++
十月的皮皮1 小时前
STM32从零到量产开发:四路继电器工业控制模块开发 - 上位机操作说明书
c语言·stm32·单片机·stm32cubemx
wear工程师2 小时前
MySQL 分页为什么会重复数据:补上 id 还不够
sql·mysql
2501_915106322 小时前
iOS 证书类型及作用说明 账号证书与签名配置的完整解读
android·ios·小程序·https·uni-app·iphone·webview
小张同学a.2 小时前
zabbix企业级监控平台3——服务监控与API实战
linux·运维·mysql·nginx·tomcat·zabbix
间歇性努力持续性发呆的野生快乐选手2 小时前
dfs回溯,bfs枚举,完全背包
c++·算法·深度优先·宽度优先