数据库基础与安装
写给初学者:每个概念都从”为什么需要它”开始讲,配合通俗比喻和完整可运行 SQL。
一、前置知识:数据库是什么?
1.1 没有数据库的世界
假设你经营一家小型网店,开始的时候用 Excel 记录订单:
| 订单号 | 客户 | 商品 | 数量 | 金额 | 日期 |
|---|---|---|---|---|---|
| 1 | 张三 | 键盘 | 1 | 299 | 2025-01-15 |
| 2 | 李四 | 鼠标 | 2 | 298 | 2025-01-16 |
| 3 | 张三 | 显示器 | 1 | 1999 | 2025-01-17 |
Excel 的致命问题:
-
数据多了卡死——10 万行打开要 30 秒
-
多人同时编辑会冲突——“文件已被其他人锁定”
-
误删一行,Ctrl+Z 可能救不回来
-
没法让程序自动读写——网页后台不可能去操作 Excel
数据库就是解决这些问题的——能存海量数据、支持多人同时访问、操作可回滚、程序可以调用。
1.2 通俗类比:数据库 = 仓库
| 概念 | 类比 | 解释 |
|---|---|---|
| 数据库(Database) | 一个仓库 | 一个仓库里放很多货架 |
| 表(Table) | 仓库里的一个货架 | 比如”用户表""订单表”,每个货架存一类东西 |
| 行(Row / 记录) | 货架上的一件货物 | 比如用户表里的一行 = 一个用户的信息 |
| 列(Column / 字段) | 货物上的标签 | name、age、email 这些都属于”列” |
| SQL | 你给仓库管理员下达的指令 | ”帮我拿张三的订单""把李四的邮箱改了” |
你写 SQL → MySQL 执行 → 操作仓库里的货架。
1.3 MySQL 安装与连接
Windows 安装:
-
去 https://dev.mysql.com/downloads/installer/ 下载 MySQL Installer
-
安装时选 “Developer Default”,一路 Next
-
记住你设置的 root 密码(root 是最高权限用户)
连接 MySQL 有两种方式:
| 方式 | 怎么打开 | 适用场景 |
|---|---|---|
| 命令行 | mysql -u root -p 然后输密码 | 服务器上没有图形界面时 |
| 图形化工具 | Navicat、DBeaver、DataGrip、MySQL Workbench | 日常开发(强烈推荐初学者用) |
连接成功后你会看到:
mysql>
TIP
初学者安装 DBeaver(免费)或 DataGrip(JetBrains 全家桶),比命令行直观得多——能看到表结构、能一键执行 SQL、出错有高亮提示。
二、建库(CREATE DATABASE)
2.1 为什么先建库?
你要往仓库里放货架,首先得有个仓库。建库就是”盖仓库”。
2.2 基本语法
-- 创建数据库
CREATE DATABASE my_shop;
-- 查看有哪些数据库
SHOW DATABASES;
-- 进入这个数据库(之后的操作都在这个库里)
USE my_shop;
-- 删除数据库(危险操作!)
DROP DATABASE my_shop;
执行效果:
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_shop | -- ← 你刚创建的
| mysql |
+--------------------+
2.3 命名规范
-- ✅ 好的命名
CREATE DATABASE my_blog; -- 小写 + 下划线
CREATE DATABASE student_system; -- 清晰表达用途
-- ❌ 不好的命名
CREATE DATABASE MyBlog; -- 大小写混用(不同操作系统行为不一致)
CREATE DATABASE my-blog; -- 含连字符(需要每次都加反引号)
CREATE DATABASE a; -- 不知道干嘛的
IMPORTANT
规则:数据库名、表名、字段名统一用小写 + 下划线(snake_case)。 这不是语法要求,是社区约定,避免踩坑。
三、建表(CREATE TABLE)
3.1 为什么需要定义表结构?
建表就是”设计货架的形状”——这个货架有几层?每层放什么类型的东西?哪些格必须填?
表结构定义了:
-
这个表有哪些列(字段)
-
每列的类型是什么(数字?字符串?日期?)
-
哪些列不能为空
-
哪一列是唯一标识(主键)
3.2 数据类型速览
初学者只需记住这 5 种:
| 数据类型 | 含义 | 例子 | 什么时候用 |
|---|---|---|---|
INT | 整数 | 1, 99, -5 | 年龄、数量、ID |
VARCHAR(n) | 变长字符串,最长 n 个字符 | ’张三’, ‘hello’ | 姓名、邮箱(长度不固定) |
CHAR(n) | 定长字符串,固定 n 个字符 | ’M’, ‘F’ | 性别、状态码(长度固定) |
DECIMAL(m,n) | 精确小数,总共 m 位,小数 n 位 | 299.99 | 金额(不能用 FLOAT,会精度丢失!) |
DATE | 日期 | ’2025-01-15’ | 生日、订单日期 |
DATETIME | 日期 + 时间 | ’2025-01-15 14:30:00’ | 订单时间、创建时间 |
BOOLEAN | 布尔值(实际存的是 0/1) | TRUE, FALSE | 是否启用、是否删除 |
TEXT | 长文本 | ’很长的文章内容…’ | 文章正文、商品描述 |
金额为什么不能用 FLOAT?
FLOAT 是近似值,
0.1 + 0.2在计算机里可能是0.30000000000000004。金额必须精确,所以用DECIMAL(10,2)(总共 10 位,2 位小数 → 最多 99999999.99)。
3.3 第一个 CREATE TABLE
-- 先用一下前面建的库
USE my_shop;
-- 建用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自动递增
username VARCHAR(20) NOT NULL UNIQUE, -- 不能为空,不能重复
email VARCHAR(100) NOT NULL, -- 不能为空
age INT, -- 可以为空
balance DECIMAL(10,2) DEFAULT 0.00, -- 默认值 0.00
created_at DATETIME DEFAULT CURRENT_TIMESTAMP -- 默认当前时间
);
逐行解释:
| 代码 | 含义 |
|---|---|
PRIMARY KEY | 主键——唯一标识每一行。就像身份证号,绝对不能重复。 |
AUTO_INCREMENT | 自动递增——每次插入新数据,id 自动 +1,你不用管。 |
NOT NULL | 不能为空——这个字段必须填,不填就报错。 |
UNIQUE | 唯一——值不能重复。比如用户名,不能有两个人都叫 “admin”。 |
DEFAULT 0.00 | 默认值——如果不传 balance,就自动填 0.00。 |
DEFAULT CURRENT_TIMESTAMP | 默认当前时间——不传就自动填此刻的时间。 |
3.4 查看表结构
-- 查看表结构
DESC users;
-- 查看建表语句(完整 SQL,包括默认值等细节)
SHOW CREATE TABLE users;
DESC users; 输出:
+------------+---------------+------+-----+-------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+-------------------+-------------------+
| id | int | NO | PRI | NULL | auto_increment |
| username | varchar(20) | NO | UNI | NULL | |
| email | varchar(100) | NO | | NULL | |
| age | int | YES | | NULL | |
| balance | decimal(10,2) | YES | | 0.00 | |
| created_at | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+---------------+------+-----+-------------------+-------------------+
CAUTION
Null列为NO且没有DEFAULT的字段,插入数据时必须在INSERT中明确提供值,否则整个语句会失败。 这个错误初学者很容易碰到。
3.5 再建一张订单表(含外键)
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL, -- 哪个用户的订单
product VARCHAR(100) NOT NULL, -- 商品名称
price DECIMAL(10,2) NOT NULL, -- 单价
quantity INT NOT NULL DEFAULT 1, -- 数量,默认 1
total DECIMAL(10,2) NOT NULL, -- 总价
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
为什么要分开两张表? 如果订单直接写用户名,用户改名时所有历史订单都要改。用 user_id 关联,改用户名只改 users 表一次。
3.6 常见踩坑
-- ❌ 错误 1:忘了逗号
CREATE TABLE bad1 (
id INT PRIMARY KEY
name VARCHAR(20) -- ← 上一行没逗号,报错!
);
-- ❌ 错误 2:最后一个字段后面有逗号
CREATE TABLE bad2 (
id INT PRIMARY KEY,
name VARCHAR(20), -- ← 最后一个字段不能有逗号(MySQL 早期版本)
);
-- ❌ 错误 3:字段名用了保留字
CREATE TABLE bad3 (
order INT, -- ← order 是 MySQL 保留字,必须用反引号 `order`
from VARCHAR(20) -- ← from 也是保留字
);
-- ✅ 正确:用反引号包裹保留字
CREATE TABLE ok (
`order` INT,
`from` VARCHAR(20)
);
速查表
| 操作 | 语法 | 一句话解释 |
|---|---|---|
| 建库 | CREATE DATABASE 库名; | 盖一个仓库 |
| 删库 | DROP DATABASE 库名; | 炸掉仓库(不可逆) |
| 选库 | USE 库名; | 进入这个仓库 |
| 建表 | CREATE TABLE 表名 (列定义...); | 设计一个货架的结构 |
| 查看表结构 | DESC 表名; | 看货架有几层、每层放什么 |
| 整型 | INT | 整数 |
| 变长字符串 | VARCHAR(n) | 最长 n 个字符 |
| 精确小数 | DECIMAL(m,n) | 共 m 位,小数 n 位 |
| 日期时间 | DATETIME | 日期 + 时间 |
| 长文本 | TEXT | 很长的文本内容 |
▶ 对应原理:01-MySQL索引B+树与聚簇非聚簇
速记卡(面试闪卡)
Q1:一句话讲清「数据库基础与安装」到底是什么?
A:本文讲数据库是什么、MySQL 安装连接,以及用 CREATE DATABASE / CREATE TABLE 建库建表。
Q2:二、建库(CREATE DATABASE) —— 怎么理解?
A:像先盖仓库再放货架:CREATE DATABASE 建库、SHOW DATABASES 看库、USE 进库;命名统一小写+下划线(Create Database)。
Q3:三、建表(CREATE TABLE) —— 怎么理解?
A:像设计货架形状:CREATE TABLE 定义列类型、主键、NOT NULL/UNIQUE,PRIMARY KEY 像身份证唯一标识每行(Create Table)。
Q4:速查表 —— 怎么理解?
A:像随身备忘卡:把建库/建表/常用类型(INT、VARCHAR、DECIMAL、DATETIME)浓缩成一页速查,金额用 DECIMAL 别用 FLOAT(Quick Reference)。
Q5:MySQL 安装与连接 —— 怎么理解?
A:像开店前领钥匙:Windows 下 MySQL Installer 装好记 root 密码,命令行 mysql -u root -p 或 DBeaver 图形工具连(Connection)。
Q6:核心速记主线有哪些?
-
数据库:存海量数据、多人并发、可回滚,比作仓库
-
建库:CREATE DATABASE + USE,命名 snake_case
-
建表:定义列/类型/主键,金额用 DECIMAL 防精度丢
-
连接:命令行或 DBeaver,记住 root 密码
口诀
A:数据库,像仓库,货架表格行列装
先建库,再建表,蛇形命名记心上
主键唯一 NOT NULL,金额 DECIMAL 别浮
命令行或 DBeaver,root 密码不能忘
相关链接
-
目录:00-MySQL
-
下一篇:02-CRUD操作与数据类型