MySQL动手练习
参考资料
- 鱼皮的 MySQL 学习网站:http://sqlmother.yupi.icu/
- 在线运行 SQL:https://dbfiddle.uk
- Python 连接 MySQL 与使用教程:https://github.com/cess-100/python-study2
练习 1:学生与班级管理
环境准备
创建并使用 python_test_1 数据库:
|
|
创建学生表:
|
|
创建班级表:
|
|
插入数据:
|
|
查询练习
基本查询
- 查询所有学生的编号和姓名
|
|
- 使用 DISTINCT 去重查询性别
|
|
条件查询
比较运算符和逻辑运算符:查询指定年龄和身高范围的学生信息
|
|
模糊查询:查询姓名至少有 2 个字的学生信息
|
|
注意:
%匹配任意个字符,_匹配 1 个字符
范围查询:
|
|
判断字段是否为空:
|
|
排序
ORDER BY 默认升序排列(ASC),降序使用 DESC。
|
|
聚合函数
|
|
分组
统计各性别的人数:
|
|
统计各性别中最高的身高:
|
|
注意:GROUP BY 需要配合聚合函数才能使用。以下语句会报错:
SELECT * FROM students GROUP BY gender;
SELECT gender, name FROM students GROUP BY gender;
GROUP_CONCAT 可以对同一分组内的指定字段进行拼接:
|
|
HAVING 子句
HAVING 在分组后进行筛选,注意 GROUP BY 在 HAVING 前使用。
|
|
等同于使用子查询:
|
|
LIMIT 限制
MySQL 中用于限制查询结果数量:
|
|
表连接
将学生表和班级表根据班级 id 连接起来:
|
|
提示:进行表连接时,推荐给表指定别名;表可以和自己连接。
子查询
- 标量子查询
|
|
- 列子查询
|
|
- 行子查询
|
|
练习 2:商品管理
环境准备
创建并使用 JD 数据库:
|
|
创建商品表:
|
|
插入数据:
|
|
查询练习
- 查询每种类型商品的最高价、最低价、平均价、数量
|
|
- 查询每种类型中最贵的商品的所有信息
|
|
- 查询每种类型中最贵商品的信息
|
|
如果只需要部分特定信息,可以不需要表连接:
|
|
新增与修改练习
将查询出的数据插入到新的商品分类表中:
|
|
把商品表中的 cate_name 替换成商品分类表中的商品 id:
|
|
修改表结构,把 cate_name 改成 cate_id:
|
|
外键约束
外键可以确保数据的完整性和一致性。
添加外键:
|
|
上述语句在 goods 表中添加外键 cate_id,与 goods_cates 表的 id 字段关联。向 goods 表插入数据时,cate_id 必须存在于 goods_cates 表的 id 中,否则会引发外键约束错误。
有时执行上述语句会报错,原因是当前数据库存在不符合规则的数据,需先删除那些数据再重新添加外键。
创建表时同时设置外键:
|
|
查看外键名:
|
|
视图
什么是视图
通俗地讲,视图就是一条 SELECT 语句执行后返回的结果集。
视图的特点
- 视图是对若干张基本表的引用,是一张虚表,不存储具体数据,基本表数据改变时视图也会跟着改变
- 视图可以隐藏敏感数据,如只显示姓名、地址而不显示社会保险号和工资等
- 视图使复杂的查询易于理解和使用
视图的意义
程序对数据库操作时,一旦数据库发生变化,程序就需要修改。使用视图而非普通表格,可以通过只修改视图来解决这个问题。
视图操作
创建视图 v_goods_info,查询产品名称、分类名称及对应品牌:
|
|
原表产品名称改变后会影响视图:
|
|
删除视图:
|
|
其他技巧
批量删除大量数据
假设需要根据时间范围删除大量数据:
|
|
若数据量很大,该语句可能执行失败。可以按主键分批删除:
先找出前三个月最后一个订单的 id:
|
|
然后按主键 id 分批删除:
|
|
拓展与后续学习建议
- 查询优化:深入学习 EXPLAIN 分析查询计划,了解如何通过索引优化提升查询性能
- 事务进阶:学习 SAVEPOINT 保存点、回滚段等高级事务控制
- 触发器:了解如何使用触发器自动执行业务逻辑
- 数据库设计实践:通过实际项目练习数据库设计,包括 ER 图绘制、表结构规范化
- ORM 框架:学习 SQLAlchemy 等 ORM 工具,体会对象关系映射的优势与局限