前言
举例子,是最简单有效的学习方法。本系列文章以一个贯穿始终的场景,结合多个实例讲解MySQL的基本用法。
❔ 为什么要写这个系列?
- 模仿是最好的老师,实践是检验成果的方法。
- 本系列以实操样例和应用场景为核心,将MySQL基本用法贯穿其中,达到学以致用的效果。
❔ 为什么要学习MySQL?
- MySQL是最常用的数据库之一,具有简单易用的特点,适合初学者学习
- 数据库的基本用法有相通之处,学会MySQL可以为学习其他数据库打下良好基础
❔ 跟别的入门教材有什么不同?
- 以一个贯穿始终的应用场景为主线,渐进地讲解用法
- 难度适中,既有基础方法,也有值得注意的关键细节
❔ 本系列文章不包含哪些内容?
该系列文章的目标是,将最核心的知识,以最直接的方式,呈现给初学者。因此不包含:
- MySQL安装方法
- MySQL系统管理方法,例如备份、恢复、导入导出等
- 高级主题,例如数据库监控、数据库调优和SQL优化
回顾
上篇文章👉《【跟着例子学MySQL】连接方式 – 内连接和外连接》 讲了内连接和外连接的用法。这篇介绍综合练习。
租赁系统
假设你经营着一家小型汽车租赁公司,有10辆汽车和5辆卡车。你需要设计一个门户网站,把这些车辆放到网上。在初始阶段,门户网站应提供以下基本功能:
- 维护车辆和客户的记录。
- 询问有关车辆的可用性
- 预定车辆
客户记录中包含其姓名、地址和电话号码。
由车辆登记号码标识的车辆,可以每天租用。不同车辆的租车率也有所不同。7天或以上有20%的折扣。
客户租用需要指定开始日期和结束日期。首选客户可享受0-50%不等的特别客户折扣。
数据库
初始数据库包含3个表:vehicles、customers和rental_records。rental_records是一个支持车辆和客户之间多对多关系的连接表。
DROP DATABASE IF EXISTS `rental_db`;
CREATE DATABASE `rental_db`;
USE `rental_db`;
-- 创建`vehicles` 表
DROP TABLE IF EXISTS `vehicles`;
CREATE TABLE `vehicles` (
`veh_reg_no` VARCHAR(8) NOT NULL,
`category` ENUM('car', 'truck') NOT NULL DEFAULT 'car', -- 保存车辆类型的枚举列
`brand` VARCHAR(30) NOT NULL DEFAULT '',
`desc` VARCHAR(256) NOT NULL DEFAULT '', -- desc是一个关键字(表示降序),必须用反引号包围
`photo` BLOB NULL, -- 高达64KB的二进制大对象
`daily_rate` DECIMAL(6,2) NOT NULL DEFAULT 9999.99, -- 设置默认值为最大值
PRIMARY KEY (`veh_reg_no`),
INDEX (`category`) -- 在此列上构建索引以进行快速搜索
) ENGINE=InnoDB; -- InnoDB引擎支持外键和事务
DESC `vehicles`;
SHOW CREATE TABLE `vehicles` \G
SHOW INDEX FROM `vehicles` \G
-- 创建`customers` 表
DROP TABLE IF EXISTS `customers`;
CREATE TABLE `customers` (
`customer_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
-- 始终对AUTO_INCREMENT列使用INT以避免溢出
`name` VARCHAR(30) NOT NULL DEFAULT '',
`address` VARCHAR(80) NOT NULL DEFAULT '',
`phone` VARCHAR(15) NOT NULL DEFAULT '',
`discount` DOUBLE NOT NULL DEFAULT 0.0,
PRIMARY KEY (`customer_id`),
UNIQUE INDEX (`phone`), -- 在此唯一值列上构建索引
INDEX (`name`) -- 在此列上构建索引
) ENGINE=InnoDB;
DESC `customers`;
SHOW CREATE TABLE `customers` \G
SHOW INDEX FROM `customers` \G