乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 数据库基础与安装

    • MySQL 简介
    • MySQL 5.6 到 5.7 到 8.0 关键差异速查
    • 安装 MySQL 5.7
    • 连接与断开服务器
    • 创建数据库
    • 创建数据表
    • 数据库与数据表
    • 加载数据
    • 获取数据库信息
    • 批处理模式
    • SHOW 语句汇总
    • FLUSH 与 RESET 语句
    • my.cnf 核心参数
    • 字符集与排序规则
  • 第2章 SQL基础查询

    • SELECT
    • WHERE
    • ORDER BY
    • LIMIT
    • COUNT
    • 聚合函数
    • 比较运算符
    • 逻辑运算符
    • 算术运算符
    • 模式匹配
    • NULL 值处理
    • UPDATE
    • DELETE
    • REPLACE
    • SELECT INTO
  • 第3章 数据类型与运算符

    • 数值类型
    • 字符串类型
    • 日期时间类型
    • BIT 类型
    • ENUM 类型
    • SET 类型
    • JSON 类型
    • 类型转换
  • 第4章 函数与表达式

    • 字符串函数
    • 数值函数
    • 日期函数
    • 全文检索函数
  • 第5章 高级查询与子查询

    • JOIN
    • 子查询
    • UNION
    • GROUP BY
    • HAVING
    • DISTINCT
  • 第6章 表与索引

    • 数据定义语言
    • 修改表结构
    • 视图
    • 修改视图与检查选项
    • 外键
    • 索引
    • 唯一索引
    • 复合索引
    • 存储引擎对比
    • 分区表
    • 第一范式与第二范式
    • 第三范式与 BC 范式
    • 反范式设计
  • 第7章 存储过程与函数

    • 存储过程
    • 存储函数
    • 变量
    • 流程控制
    • 游标
    • 预处理语句
  • 第8章 事务与锁

    • 事务
    • 事务隔离级别
    • 锁机制
    • MVCC
    • 死锁专题分析
    • LOCK TABLES
    • XA 事务
  • 第9章 用户管理与安全

    • 用户管理
    • 权限管理
    • 角色
    • SQL 注入防范
  • 第10章 性能优化入门

    • 执行计划
    • 索引优化
    • 查询优化
    • 查询优化器提示
    • 慢查询日志
    • InnoDB 深入机制
    • InnoDB 专项优化
    • Performance Schema
    • sys Schema
  • 第11章 复制与高可用

    • 主从复制原理
    • 半同步复制配置
    • binlog 开启与 point-in-time 恢复
    • mysqldump 全库备份
    • mysqldump 单表与条件备份
    • mysqldump 恢复与导入
    • xtrabackup 全量热备
    • xtrabackup 准备与恢复
    • xtrabackup 增量与流式备份
  • 第12章 触发器与事件

    • 触发器
    • 事件调度器
  • 参考

    • MySQL 5.7 专业术语大全
    • MySQL 5.7 关键字与保留字大全

数据库与数据表

导学

在写 SQL 之前,必须先建立两个核心概念:数据库(Database)和数据表(Table)。它们是 MySQL 组织数据的两个最基本层级。本节会用"图书馆"做类比,并通过完整的 SQL 示例让你建立直观认知,观察每一步操作前后的数据状态变化。

定义

数据库(Database):一个逻辑上的数据容器,用于将一组相关的数据表、视图、存储过程等对象组织在一起。可以把数据库想象成一座图书馆。

数据表(Table):数据库中存储数据的二维结构,由行(Row)和列(Column)组成。可以把数据表想象成图书馆里的一张具体的书架。

行与列

数据表的核心是行和列:

  • 列(Column):定义了数据的属性,如书名、作者、价格。每列有固定的数据类型。
  • 行(Row):一条具体的记录,如《数据库系统概念》这本书的所有信息。

关系型数据库的核心特征

关系型数据库之所以叫"关系型",是因为表与表之间可以通过公共字段建立关系(Relationship)。

上图中:

  • PK = Primary Key(主键),唯一标识一行记录
  • FK = Foreign Key(外键),建立表与表之间的关系

完整示例:从创建数据库到建立表关系

当前数据状态:查看服务器上已有的数据库

SHOW DATABASES;

典型的执行结果:

Database
information_schema
mysql
performance_schema
sys

结果解读:新安装的 MySQL 5.7 默认有 4 个系统数据库,不要修改它们。

操作语句:创建图书馆数据库

CREATE DATABASE IF NOT EXISTS library
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_ci;

操作后的数据状态

SHOW DATABASES;
Database
information_schema
library
mysql
performance_schema
sys

结果解读:library 数据库已创建,现在它是空的容器。

操作语句:在数据库中创建多张表

USE library;

-- 创建员工表
CREATE TABLE employees (
    emp_id      INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工ID',
    emp_name    VARCHAR(20) NOT NULL COMMENT '姓名',
    dept        VARCHAR(20) DEFAULT '技术部' COMMENT '部门',
    score       DECIMAL(5,2) COMMENT '绩效分'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工表';

-- 创建绩效记录表(演示表间关系)
CREATE TABLE scores (
    score_id    INT PRIMARY KEY AUTO_INCREMENT COMMENT '记录ID',
    emp_id      INT NOT NULL COMMENT '员工ID',
    score       DECIMAL(5,2) COMMENT '绩效分',
    created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
    FOREIGN KEY (emp_id) REFERENCES employees(emp_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='绩效记录表';

操作后的数据状态

SHOW TABLES;
Tables_in_library
employees
scores

结果解读:一个数据库(图书馆)中现在有了两张表(两个书架),它们通过外键建立了关系。

查看表结构的对应关系:

DESC employees;
FieldTypeNullKeyDefaultExtra
emp_idint(11)NOPRINULLauto_increment
emp_namevarchar(20)NONULL
deptvarchar(20)YES技术部
scoredecimal(5,2)YESNULL
DESC scores;
FieldTypeNullKeyDefaultExtra
score_idint(11)NOPRINULLauto_increment
emp_idint(11)NOMULNULL
scoredecimal(5,2)YESNULL
created_attimestampYESCURRENT_TIMESTAMP

结果解读:scores 表的 emp_id 列的 Key 字段显示为 MUL,表示它是多列索引的一部分(这里是外键索引)。

完整示例二:USE 切换数据库

当前数据状态

SELECT DATABASE();
DATABASE()
library

结果解读:当前会话默认在 library 数据库中。

操作语句:切换到系统数据库

USE mysql;

SHOW TABLES;

操作后的数据状态:

SELECT DATABASE();
DATABASE()
mysql

结果解读:USE 语句选择当前会话要操作的数据库。执行后,后续的查询默认在该数据库中进行。mysql 库中的表是系统表,例如 user 表存储了所有用户账号信息。

查看当前库中的表(节选):

SHOW TABLES LIKE 'user%';
Tables_in_mysql (user%)
user

切换回自己的数据库:

USE library;

完整示例三:验证表之间的关系

当前数据状态

SELECT * FROM employees;
SELECT * FROM scores;

Empty set (0.00 sec)

结果解读:两张表都是空的。现在插入数据,验证关系型数据库的核心价值。

操作语句:插入数据

-- 插入员工
INSERT INTO employees (emp_name, dept, score) VALUES
('大翔', '技术部', 100),
('白歌', '技术部', NULL);

操作后的数据状态

SELECT * FROM employees;
emp_idemp_namedeptscore
1大翔技术部100
2白歌技术部NULL

结果解读:employees 表存储了员工的基本信息,通过 emp_id 唯一标识每行记录。

操作语句:建立绩效记录关系

INSERT INTO scores (emp_id, score) VALUES
(1, 90);

操作后的数据状态

SELECT * FROM scores;
score_idemp_idscorecreated_at
1190.002024-01-15 10:35:00

结果解读:scores 表通过 emp_id 记录了"哪位员工的绩效分"。这就是关系型数据库的核心:不把所有信息塞在一张表里,而是通过关联字段连接多张表。

查询大翔的绩效记录(演示 JOIN):

SELECT 
    e.emp_name AS 员工,
    s.score AS 绩效分,
    s.created_at AS 记录时间
FROM scores s
JOIN employees e ON s.emp_id = e.emp_id
WHERE e.emp_name = '大翔';
员工绩效分记录时间
大翔90.002024-01-15 10:35:00

结果解读:通过 JOIN 操作,我们从两张独立的表中组合出了有意义的业务信息。这是关系型数据库最强大的能力。

完整示例四:验证外键的引用完整性

当前数据状态

SELECT emp_id, emp_name FROM employees;
emp_idemp_name
1大翔
2白歌

操作语句:尝试插入不存在的员工ID

INSERT INTO scores (emp_id, score) VALUES (999, 85);

操作后的数据状态

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails

结果解读:外键约束阻止了非法数据的插入。emp_id = 999 在 employees 表中不存在,因此无法创建绩效记录。这就是关系型数据库保证数据一致性的机制。

常见误区

误区正解
"数据库就是数据表"数据库是容器,数据表是容器内的对象。一个数据库可包含多张表。
"MySQL 只能有一个数据库"一个 MySQL 实例可以创建成百上千个数据库,受磁盘空间和配置限制。
"表名可以随便起"表名在同一数据库内必须唯一,且应避免使用 SQL 保留字(如 order、select)。

验证保留字问题:

-- 尝试用保留字做表名(会报错或需要反引号)
CREATE TABLE order (id INT);
ERROR 1064 (42000): You have an error in your SQL syntax

正确使用反引号:

CREATE TABLE `order` (id INT PRIMARY KEY);

SHOW TABLES;
Tables_in_library
employees
order
scores
-- 清理测试表
DROP TABLE `order`;

结果解读:虽然可以用反引号包裹保留字作为表名,但这会导致后续所有查询都需要加反引号,极不推荐。

面试考点

Q:information_schema 是什么?

它是 MySQL 的元数据数据库(虚拟数据库,无实际物理文件),存储了所有数据库、表、列、索引、权限等元信息。例如查询 information_schema.TABLES 可获知所有表的大小和引擎类型。

验证:

SELECT 
    table_name,
    engine,
    table_rows
FROM information_schema.tables
WHERE table_schema = 'library'
ORDER BY table_name;
table_nameenginetable_rows
employeesInnoDB2
scoresInnoDB1

结果解读:information_schema.tables 提供了所有表的标准化元数据查询能力。

Q:一个 MySQL 实例最多能有多少个数据库?

没有硬性上限,受操作系统文件描述符和目录限制。实际生产中,单实例管理的数据库数量建议控制在合理范围内(如几百个),过多会影响运维效率。

小结

  • 数据库 = 图书馆,数据表 = 书架
  • 表由行(记录)和列(属性)组成
  • 关系型数据库的核心价值在于表与表之间可以通过主键/外键建立关系
  • MySQL 自带 4 个系统数据库,不要轻易动它们
  • 外键约束保证了数据的引用完整性

清理测试数据库(可选):

-- DROP DATABASE IF EXISTS library;

下一章引子:概念清楚了,接下来我们动手连接 MySQL 服务器,执行第一条命令。

上一页
创建数据表
下一页
加载数据