【数据库】MySQL数据库的数据查询及操作命令汇总(超详细)
MySQL作为最受欢迎的开源关系型数据库之一,在现代软件开发中扮演着至关重要的角色。
(关注不迷路哈!!!)
文章目录
- 【数据库】MySQL数据库的数据查询及操作命令汇总(超详细)
-
- 一、数据准备阶段
-
- [1.1 表结构设计要点](#1.1 表结构设计要点)
- [1.2 数据初始化技巧](#1.2 数据初始化技巧)
- 二、基础查询操作精要
-
- [2.1 字段与表的别名运用](#2.1 字段与表的别名运用)
- [2.2 去重与限定查询](#2.2 去重与限定查询)
- 三、高级查询策略
-
- [3.1 多表联接查询](#3.1 多表联接查询)
- [3.2 子查询的强大功能](#3.2 子查询的强大功能)
- 四、数据筛选与排序艺术
-
- [4.1 条件筛选的多种手段](#4.1 条件筛选的多种手段)
- [4.2 精准排序控制](#4.2 精准排序控制)
- 五、聚合分析利器
- 六、分组统计进阶
-
- [6.1 GROUP BY深度应用](#6.1 GROUP BY深度应用)
- [6.2 HAVING子句精准筛选](#6.2 HAVING子句精准筛选)
- 七、高效数据管理技巧
-
- [7.1 数据更新策略](#7.1 数据更新策略)
- [7.2 数据删除注意事项](#7.2 数据删除注意事项)
- 八、分页查询优化
- 九、SQL编写三步法(黄金法则)
一、数据准备阶段
在开始任何数据库操作之前,首先需要建立正确的表结构并填充初始数据。
1.1 表结构设计要点
sql
/* 示例:学生信息表 */
create table student
(
sno varchar(20) not null primary key,/*学生编号*/
sname varchar(20) not null,/* 学生姓名*/
ssex varchar(20) not null,/* 学生性别*/
sbirthday datetime,/* 学生生日*/
class varchar(20)/* 班级*/
);
关键要素包括:
- 合理设置字段类型和长度
- 正确使用约束(主键、非空等)
- 清晰添加注释说明各字段含义
1.2 数据初始化技巧
sql
/* 插入单条记录 */
insert into student values('108','曾华','男','1977-09-01','95033');
/* 批量插入多条记录 */
insert into student values
('105','匡明','男','1975-10-02','95031'),
('107','王丽','女','1976-01-23','95033');
数据定义与管理
| 操作类别 | 关键词 | 功能描述 |
|---|---|---|
| 表结构定义 | CREATE TABLE |
创建新表 |
| 数据插入 | INSERT INTO |
插入数据记录 |
| 数据更新 | UPDATE ... SET |
修改现有数据 |
| 数据删除 | DELETE FROM |
删除符合条件的数据 |
| 表结构变更 | ALTER TABLE |
修改已存在的表结构 |
| 表移除 | DROP TABLE |
删除整个表 |
二、基础查询操作精要
2.1 字段与表的别名运用
sql
-- 字段别名提升可读性
select sname as 姓名, ssex as 性别, class as 班级 from student;
-- 表别名简化复杂查询
select * from student st where st.sname = '王芳';
2.2 去重与限定查询
sql
-- 消除重复值
select distinct depart from teacher;
-- 范围查询
select * from score where degree between 60 and 80;
查询基本结构

条件查询操作符
| 类型 | 操作符 | 示例 |
|---|---|---|
| 比较运算 | =, <, >, <=, >=, != 或 <> |
age > 25 |
| 逻辑运算 | AND, OR, NOT |
age > 20 AND sex = '女' |
| 模糊匹配 | LIKE + %(多字符)/_(单字符) |
name LIKE '张%' |
| 范围匹配 | BETWEEN ... AND ... |
age BETWEEN 20 AND 30 |
| 集合匹配 | IN (...) |
city IN ('北京', '上海') |
| 空值判断 | IS NULL, IS NOT NULL |
email IS NOT NULL |
三、高级查询策略
3.1 多表联接查询
三种核心联接方式:
-
内连接(INNER JOIN):返回两表匹配的记录
sqlSELECT * from student s INNER JOIN score sc on s.sno = sc.sno; -
左连接(LEFT JOIN):保留左表全部记录
sqlSELECT * from student s LEFT JOIN score sc on s.sno = sc.sno; -
右连接(RIGHT JOIN):保留右表全部记录
sqlSELECT * from student s RIGHT JOIN score sc on s.sno = sc.sno;
连接查询表格对比
| 类型 | 语法结构 | 特点说明 |
|---|---|---|
| 内连接 | INNER JOIN ON |
返回两表共有的记录 |
| 左外连接 | LEFT JOIN ON |
返回左表所有记录,右表无对应则填充 NULL |
| 右外连接 | RIGHT JOIN ON |
返回右表所有记录,左表无对应则填充 NULL |
| 全外连接 | MySQL 不支持原生 FULL OUTER JOIN,可用 UNION 模拟 | 返回左右两表的所有记录 |
| 自连接 | 一张表与自身连接 | 适用于树状结构或层级关系查询 |
3.2 子查询的强大功能
标量子查询示例:
sql
-- 查询高于平均分的成绩记录
select * from score where degree > (select avg(degree) from score);
列子查询示例:
sql
-- 查询特定条件下的学生及其成绩
select * from (SELECT * from student where class = '95031') stu
INNER JOIN score sc on stu.sno = sc.sno;
四、数据筛选与排序艺术
4.1 条件筛选的多种手段
sql
-- 比较运算符
select * from student where sbirthday > '1976-01-01';
-- 逻辑组合
select * from student where class='95031' or ssex='女';
-- 模糊匹配
select * from student where sname like '王%';
-- 空值判断
select * from student where sbirthday is null;
4.2 精准排序控制
sql
-- 单字段排序
select * from student order by sbirthday desc;
-- 多字段排序
select * from score order by cno, degree desc;
排序机制

五、聚合分析利器
五大核心聚合函数:
| 函数 | 功能 | 示例 |
|---|---|---|
count() |
统计记录数(行数) | select count(*) from student |
max() |
获取最大值 | select max(degree) from score |
min() |
获取最小值 | select min(sbirthday) from student |
sum() |
数值求和 | select sum(degree) from score |
avg() |
计算平均值 | select avg(degree) from score |
六、分组统计进阶
6.1 GROUP BY深度应用
sql
-- 按班级统计学生人数
select class, count(*) from student group by class;
-- 复杂分组统计
select class, count(*), avg(year(now()) - year(sbirthday)) as 平均年龄
from student group by class;
6.2 HAVING子句精准筛选
sql
-- 筛选平均成绩超过80分的课程
select cno, avg(degree) from score
group by cno having avg(degree) > 80;
聚合函数与分组配合使用规则总结
| 函数名 | 功能 | 可用于 WHERE 中 |
可用于 HAVING 中 |
可配合 GROUP BY |
|---|---|---|---|---|
COUNT() |
计数(行数) | ❌ | ✅ | ✅(当分组时) |
MAX() |
最大值 | ❌ | ✅ | ✅(当分组时) |
MIN() |
最小值 | ❌ | ✅ | ✅(当分组时) |
SUM() |
求和 | ❌ | ✅ | ✅(当分组时) |
AVG() |
平均值 | ❌ | ✅ | ✅(当分组时) |
七、高效数据管理技巧
7.1 数据更新策略
sql
-- 单一记录更新
update student set sname='王美丽' where sname='王丽';
-- 批量更新
update score set degree = degree * 1.1 where degree < 60;
7.2 数据删除注意事项
sql
-- 条件删除(推荐)
delete from teacher where tno='861';
-- 清空表(谨慎使用)
truncate table score;
-- 删除表(极其谨慎)
drop table if exists score;
八、分页查询优化
sql
-- 分页公式:limit (页码-1)*每页数量, 每页数量
-- 查询第3页,每页5条记录,即计算偏移量:(3-1)*5 = 10,显示第11到第15条记录。
select * from student limit 10, 5;
结果集控制策略
| 方法 | 目标 | 实现方式 |
|---|---|---|
| 分页显示 | 控制输出量 | LIMIT offset,count |
| 去重显示 | 消除冗余项 | DISTINCT 字段列表 |
| 别名设置 | 提高可读性 | 字段 AS 别名 |
九、SQL编写三步法(黄金法则)
- 搭框架:构建基本SELECT语句和JOIN结构
- 看条件:确定WHERE子句的具体条件
- 显字段:明确SELECT后要展示的字段
实践示例:
sql
-- 查询所有学生的'计算机导论'课程成绩,显示姓名、成绩、课程名
-- 第一步:搭框架
SELECT * from student INNER JOIN score ON student.sno = score.sno
INNER JOIN course ON score.cno = course.cno;
-- 第二步:看条件
-- where course.cname = '计算机导论';
-- 第三步:返回字段名
SELECT sname, degree, cname from student INNER JOIN score ON student.sno = score.sno
INNER JOIN course ON score.cno = course.cno
where course.cname = '计算机导论';
通过系统掌握以上内容,可以游刃有余地应对大部分MySQL数据库操作需求。