文章目录
- 写在前面:
- 1、数据库的创建和管理
- 1. 创建数据库:CREATE DATABASE
- 注意事项:
- 2. 查看已有数据库:SHOW DATABASES
- 3. 删除数据库:DROP DATABASE
- 防止误删
- 4. 总结
- 2、表的创建与管理
- 1. 创建数据表:CREATE TABLE
- 2. 查看表结构:DESCRIBE 表名
- 3. 删除数据表:DROP TABLE
- 4. 修改表结构:ALTER TABLE
- 4.1 添加新列
- 4.2 删除列
- 4.3 修改列的数据类型
- 4.4 重命名列
- 5. 总结
- 3、数据类型
- 一、数字类型
- 二、字符串类型
- 三、日期和时间类型
- 四、枚举与集合类型
- 五、二进制类型
- 数据类型选择小总结
- 4、主键和外键
- 1. 主键(Primary Key):唯一标识每一行数据
- 主键的特点:
- 定义主键
- 复合主键
- 2. 外键(Foreign Key):建立表与表之间的关联
- 外键的作用
- 定义外键
- 级联操作(CASCADE)
- 3. 总结
- 5 举个栗子
- 1. 数据库的创建和管理
- 2. 表的创建与管理
- 3. 数据类型的选择
- 4. 主键和外键的设置
- 5. 一个例子说明它们如何协作
写在前面:
先扔个导图
学习MySQL的基本操作,就像是搭建一个井然有序的图书馆。我们需要先建立存放数据的“库”,这就是数据库的创建和管理,通过CREATE DATABASE
来新建一个库,并用SHOW DATABASES
查看已经存在的库,必要时还能用DROP DATABASE
清理不再需要的库。
接下来,在数据库中创建存放具体数据的“架子”,也就是表的创建与管理。用CREATE TABLE
新建表结构,比如定义表里有哪些“格子”(字段)来放数据,DROP TABLE
用于删除表,ALTER TABLE
则可以灵活调整表的结构,让数据更符合需求。
为了把每个“格子”设计得恰到好处,我们要了解MySQL支持的数据类型。不同的内容适合不同的数据类型,例如整数用INT
、文本用VARCHAR
、日期用DATE
。合理选择数据类型不仅能提高效率,还能减少空间占用。
最后,主键和外键就像是每本书的ISBN码和分类标签。主键(Primary Key)让每条数据都能被唯一识别,而外键(Foreign Key)让表之间形成关联关系,比如学生和选课数据的匹配。这些约束条件帮助我们建立数据的唯一性和一致性,让整个数据库结构更加清晰、合理。
1、数据库的创建和管理
在MySQL里,数据库就像一间房子,里面存放着各种数据表,表里放的则是具体的数据。接下来,我们学习如何“盖房子”、查看已经盖好的房子,以及“拆掉”不需要的房子!
1. 创建数据库:CREATE DATABASE
我们要“盖”一间新房子(数据库),在MySQL里使用CREATE DATABASE
这个命令来实现。
语法:
CREATE DATABASE 数据库名;
举个例子:
假设我们要创建一个叫“my_school”的数据库,用来放学校的各种数据,比如学生信息、课程信息等。命令是这样的:
CREATE DATABASE my_school;
输入这条命令,MySQL就会帮我们创建一个名为my_school
的新数据库。创建后,我们就可以在这个数据库里建各种数据表,存放我们想要的内容。
注意事项:
-
数据库名字要简洁、好记,可以使用下划线(
_
)来连接多个单词,比如my_company
。 -
名字不能重复! 如果数据库里已经有同名的数据库,再次创建时就会报错。
-
想避免重复创建?我们可以加个
IF NOT EXISTS
条件,这样在已经存在时就不会重复创建了:CREATE DATABASE IF NOT EXISTS my_school;
2. 查看已有数据库:SHOW DATABASES
当我们在MySQL里存了很多数据库后,可能会忘记某些数据库的名字。这时,可以使用SHOW DATABASES
命令来看看有哪些“房子”已经盖好。
语法:
SHOW DATABASES;
例子:
直接运行SHOW DATABASES;
,MySQL会返回一个所有数据库的列表,看上去像这样:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| my_school |
| test |
+--------------------+
在结果里,我们就可以找到我们创建的数据库,比如“my_school”。另外,MySQL默认还会有一些系统数据库,比如information_schema
和mysql
,这些是MySQL系统自己用的,通常不要删除它们。
3. 删除数据库:DROP DATABASE
当一个数据库已经没有用处了,我们可以把这个“房子”拆掉。在MySQL里,用DROP DATABASE
命令来删除一个数据库,删除后数据将无法恢复,所以要谨慎操作。
语法:
DROP DATABASE 数据库名;
举个例子:
假设我们不再需要my_school
数据库了,可以这样删除它:
DROP DATABASE my_school;
这样,MySQL会彻底删除my_school
数据库以及其中所有的数据表和数据!
要注意:删除的数据库无法恢复,因此在执行前,一定要确认!
防止误删
为了防止手误删除已有的数据库,可以加个IF EXISTS
,如果数据库不存在就不会报错:
DROP DATABASE IF EXISTS my_school;
4. 总结
- 用
CREATE DATABASE 数据库名;
来创建数据库。 - 用
SHOW DATABASES;
来查看当前所有的数据库。 - 用
DROP DATABASE 数据库名;
来删除不需要的数据库,但要小心,这个操作是不可逆的!
2、表的创建与管理
在数据库中,数据是按“表”来存放的,每个表像是一张电子表格,有列(字段)和行(数据条目)。比如学生信息表里可能有“学号”、“姓名”、“年龄”等列。今天我们来学习如何用MySQL创建这些表、修改表结构,以及删除不需要的表。
1. 创建数据表:CREATE TABLE
创建表时,我们需要指定表的名字和它的结构,包括列的名字、类型,以及可能的限制条件(比如主键)。
语法:
CREATE TABLE 表名 (
列名1 数据类型 [约束条件],
列名2 数据类型 [约束条件],
...
);
举个例子:
假设我们要建一个叫“students”的表,用来记录学生信息,包括学号、姓名、年龄和班级。可以这样写:
CREATE TABLE students (
student_id INT PRIMARY KEY, -- 学号,主键
name VARCHAR(50) NOT NULL, -- 姓名,不能为空
age INT, -- 年龄
class VARCHAR(10) -- 班级
);
解释一下:
students
是表的名字。student_id
是学号,用INT
表示整数,并设为主键(PRIMARY KEY
),这样学号在表里不会重复。name
是姓名,VARCHAR(50)
表示最长50个字符,并且NOT NULL
代表这个字段不能为空。age
和class
分别表示年龄和班级,直接用INT
和VARCHAR(10)
来表示。
2. 查看表结构:DESCRIBE 表名
创建好表后,我们可以用DESCRIBE
命令看看表的结构,确保它和我们预想的一样。
例子:
DESCRIBE students;
执行后会看到表的结构,每一列的名字、数据类型和约束条件都列出来:
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| student_id | int | NO | PRI | NULL | |
| name | varchar(50) | NO | | NULL | |
| age | int | YES | | NULL | |
| class | varchar(10) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
3. 删除数据表:DROP TABLE
如果我们不再需要某个表了,可以用DROP TABLE
命令来删除这个表,注意这会连同表里的所有数据一并删除,无法恢复。
语法:
DROP TABLE 表名;
举个例子:
假设我们不再需要“students”表了,可以这样删除:
DROP TABLE students;
MySQL会删除students
表以及它存放的所有数据,所以这个操作要慎重。
小贴士:如果不确定表是否存在,可以加上IF EXISTS
,避免报错:
DROP TABLE IF EXISTS students;
4. 修改表结构:ALTER TABLE
有时我们可能需要调整表的结构,比如加列、删列或修改某列的数据类型,这时就用ALTER TABLE
命令。
4.1 添加新列
假设students
表里我们还想加一列“邮箱地址”,可以这样做:
ALTER TABLE students
ADD email VARCHAR(100);
这样students
表里就多了一列email
,可以用来存每位学生的邮箱地址。
4.2 删除列
假如我们不再需要class
(班级)这列了,可以用下面的命令来删除它:
ALTER TABLE students
DROP COLUMN class;
注意:删除列后所有数据都会一并消失,操作前要确认。
4.3 修改列的数据类型
如果我们发现age
这列使用INT
类型不太合适,想改成TINYINT
(占用更少存储空间),可以这样写:
ALTER TABLE students
MODIFY age TINYINT;
这样age
列的数据类型就从INT
改成了TINYINT
,在节省存储的同时,更符合年龄数据的大小范围。
4.4 重命名列
假如我们想把“student_id”重命名为“id”,可以用下面的语法:
ALTER TABLE students
CHANGE student_id id INT;
这里不仅重命名了,还得重新指定数据类型(INT
)。
5. 总结
- 创建表:用
CREATE TABLE 表名
命令,定义每一列的结构和约束。 - 删除表:用
DROP TABLE 表名
命令删除整个表和表中的数据。 - 修改表:用
ALTER TABLE
命令添加、删除或修改列。
3、数据类型
在MySQL中,我们的表就像装东西的“架子”,每一列(字段)都是用来装特定类型的数据。所以,选择正确的数据类型非常重要,不仅关系到存储效率,还影响查询速度!下面我们一起来认识MySQL中常用的数据类型,并了解它们的“性格特点”,好让每个字段都挑到合适的“衣服”。
一、数字类型
数字类型专门用来存放整数、浮点数或定点数,不同场景用不同类型:
-
整数类型
- TINYINT:存放范围为-128到127的整数,适合小范围的数字,比如“评分等级”或“年龄”。
- SMALLINT:存放范围为-32,768到32,767,适合不太大的数值,比如“库存数量”。
- MEDIUMINT:存放范围为-8,388,608到8,388,607,可以用来存稍大一点的数据,比如“ID编号”。
- INT:存放范围为-2,147,483,648到2,147,483,647,常用类型,适合大多数的整数场景。
- BIGINT:存放范围非常大(正负数范围为约±9亿亿),适合极大数值,比如“银行账户的余额”。
小贴士:用整数时尽量选小一点的类型,减少存储空间,比如
TINYINT
比INT
更省空间。 -
浮点数类型
- FLOAT:适合存储带小数的数据,精度一般。可用于表示一般的分数、比例等。
- DOUBLE:精度比
FLOAT
高,可以表示非常精确的小数(约15位有效数字)。用于科学计算、需要高精度的场景。 - DECIMAL:定点数,精度和小数位数是固定的,特别适合货币和金融数据。
注意:如果要处理金额或财务数据,推荐用
DECIMAL
,这样可以避免精度问题。
二、字符串类型
字符串类型用来存储文本数据,从单个字符到段落都可以。
-
CHAR(n):固定长度的字符串,
n
为最大长度。如果设置CHAR(5)
,那么每个值都会占用5个字符的空间,不足的地方用空格填充。适合固定长度的内容,比如“状态代码”。 -
VARCHAR(n):可变长度字符串,适合一般的文本数据,比如“姓名”和“地址”,可以设置最大长度
n
。不像CHAR
,VARCHAR
只占用实际存储的字符数。 -
TEXT:大段文本数据类型,适合描述性内容,比如“文章内容”或“评论”。它可以存储64KB的数据。
-
MEDIUMTEXT和LONGTEXT:分别可以存放16MB和4GB的数据,非常适合超长文本,比如“产品描述”或“日志”。
小贴士:尽量用合适长度的字符串类型,过长的数据会影响性能,
CHAR
和VARCHAR
要特别注意设定合理的最大长度。
三、日期和时间类型
日期和时间类型用来存放与时间相关的数据,MySQL提供了不同精度的日期时间类型。
-
DATE:用于存储日期,格式为
YYYY-MM-DD
,比如2024-10-26
。适合仅需日期的场景,如“出生日期”。 -
TIME:用于存储时间,格式为
HH:MM:SS
,比如14:30:00
。适合只记录时间的场景,如“电影时长”。 -
DATETIME:存储日期和时间,格式为
YYYY-MM-DD HH:MM:SS
,适合存储具体事件发生的时间点,比如“订单创建时间”。 -
TIMESTAMP:和
DATETIME
类似,但带有时区转换功能,自动记录UTC时间。特别适合记录“最后更新时间”。 -
YEAR:存储年份,格式为
YYYY
,比如2024
,适合只需要年份的场景,如“入学年份”。小贴士:
TIMESTAMP
非常适合自动记录数据更新时间,但有2038年限制(超出将无法使用)。若数据需要长期保存,DATETIME
更合适。
四、枚举与集合类型
有时我们有固定的几个选项,比如性别(男、女),用枚举或集合会非常方便。
-
ENUM:用于指定一组固定的字符串选项,比如性别字段只允许
'男'
或'女'
。定义语法为ENUM('男', '女')
。 -
SET:允许存储多个选项的组合,比如爱好字段可以选择多个爱好:
SET('阅读', '运动', '旅行')
。小贴士:
ENUM
适合单选选项,SET
适合多选选项,特别适合数据有固定取值的情况。
五、二进制类型
存储二进制数据,如图片或文件内容,可以选择Blob类型。
-
TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB:分别对应不同大小的二进制数据存储,适合存储图片、文件等数据,
LONGBLOB
最大可存4GB。小贴士:如果表里的二进制数据多且较大,可能会影响性能,建议只存放关键数据,把文件链接存在外部存储更合适。
数据类型选择小总结
- 数值:尽量选择适合数据范围的类型,不要一上来就选
BIGINT
或DOUBLE
。 - 字符串:
CHAR
和VARCHAR
区别在于存储长度是否固定,TEXT
用于较长的文本。 - 时间:
DATE
用于单独日期,DATETIME
、TIMESTAMP
用于带时间的日期,TIMESTAMP
还能自动记录更新。 - 枚举:
ENUM
适合选项少且固定的单选项,SET
适合多选。
通过选择合适的数据类型,我们不仅能优化存储,还能加速查询速度,提升数据库整体性能!
4、主键和外键
在数据库的世界里,主键(Primary Key)和外键(Foreign Key)就像一个人的身份证和亲属关系。主键帮助每一行数据都有唯一“身份”,外键则帮助我们建立起表与表之间的“亲戚”关系。掌握这两者的定义和作用后,不仅能提高数据的完整性,还能让查询更高效!
1. 主键(Primary Key):唯一标识每一行数据
主键的作用是确保表中每一行数据的唯一性,就像身份证一样,主键不能重复,也不能为空。这样我们可以快速锁定唯一一条数据,不会出现混淆。
主键的特点:
- 唯一性:每个主键的值都要独一无二。
- 非空:主键字段不能有空值,这样才能确保每条数据都能被唯一识别。
- 表的主键只能有一个,可以是单个字段,也可以是多个字段组合。
定义主键
在创建表时,我们可以通过PRIMARY KEY
关键字来定义主键:
例子:
假设我们有一个学生表students
,想让每个学生都拥有独一无二的学号student_id
作为主键:
CREATE TABLE students (
student_id INT PRIMARY KEY, -- 学号,主键
name VARCHAR(50), -- 姓名
age INT -- 年龄
);
这里,student_id
就是主键,这样即使有重名的学生,我们也能通过学号准确找到唯一的学生记录。
复合主键
如果一个字段不够区分数据,也可以用多个字段组合成主键,这叫复合主键。
例子:
比如在“学生选课”表enrollments
里,可能用“学号”和“课程编号”组合来唯一标识一个选课记录:
CREATE TABLE enrollments (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id)
);
这里,student_id
和course_id
组合成主键,确保一个学生在同一课程只能选一次。
2. 外键(Foreign Key):建立表与表之间的关联
外键可以理解为一张表里某个字段“引用”了另一张表的主键,目的是建立起表与表之间的关联关系,确保数据的完整性。比如,学生选课表里就会引用学生表的主键,确保选课记录是符合逻辑的。
外键的作用
- 保证数据的引用完整性:外键确保表与表之间的“关系”是正确的。比如,不能有一个选课记录对应的学生在学生表里不存在。
- 自动级联更新或删除:可以设置级联操作,当父表中的主键被删除或修改时,子表中的对应记录也自动更新或删除。
定义外键
在创建表时,用FOREIGN KEY
来定义外键,并用REFERENCES
指定要引用的表和字段。
例子:
假设我们有一个学生选课表enrollments
,它里头的student_id
应该来自学生表的students
表中。我们可以这样设置外键:
CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY, -- 选课记录ID
student_id INT, -- 学生ID
course_id INT, -- 课程ID
FOREIGN KEY (student_id) REFERENCES students(student_id)
);
这里,student_id
是enrollments
表的外键,它引用了students
表里的student_id
。这样,如果学生表没有这个student_id
,就不能插入对应的选课记录。
级联操作(CASCADE)
外键还可以设置“级联更新”和“级联删除”:
- ON DELETE CASCADE:当父表数据被删除时,自动删除所有关联的子表数据。
- ON UPDATE CASCADE:当父表的主键被修改时,自动更新子表中的外键值。
例子:
给enrollments
表设置级联删除,当students
表中的学生被删除时,自动删除该学生的所有选课记录:
CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY,
student_id INT,
course_id INT,
FOREIGN KEY (student_id) REFERENCES students(student_id) ON DELETE CASCADE
);
这样,当students
表里的某个学生记录被删除,enrollments
表中该学生的选课记录也会自动删除,保持数据一致性。
3. 总结
- 主键:唯一标识表中每一行数据,不能重复或为空。可以用单个字段或多个字段组合。
- 外键:用于建立表之间的关联,确保数据的引用完整性,可以设置级联操作。
用好主键和外键,不仅让数据库的结构更清晰,还能保障数据的准确性和完整性!
5 举个栗子
假设我们要建立一个小型“学生管理系统”,包含学生的基本信息、选课信息等。这是一个绝佳的例子,能让我们了解数据库和表的创建管理,掌握数据类型的选择,还能了解主键和外键的用法。接下来我们就一步步地创建数据库、表,挑选合适的数据类型,设置主键和外键。
1. 数据库的创建和管理
首先,我们需要一个数据库来存放所有的表和数据。在MySQL中,创建数据库就像在电脑上新建一个文件夹,用来存放我们所有的“文件”。
-- 创建一个叫“student_management”的数据库
CREATE DATABASE student_management;
-- 显示所有数据库,确认我们的数据库创建成功
SHOW DATABASES;
-- 如果哪天我们不需要这个数据库了,可以删除它
DROP DATABASE student_management;
这样我们就创建了一个叫student_management
的数据库,并可以用它来存放所有学生管理相关的数据。
2. 表的创建与管理
接下来,在student_management
数据库里创建几个表,比如students
(学生基本信息)和courses
(课程信息)。表就像Excel里的工作表,不同表用来放不同类型的数据。
-- 选择要操作的数据库
USE student_management;
-- 创建学生信息表
CREATE TABLE students (
student_id INT PRIMARY KEY, -- 学生ID,主键,独一无二
name VARCHAR(50), -- 学生姓名,最多50字符
age TINYINT, -- 年龄,范围足够小,用TINYINT
enrollment_date DATE -- 入学日期,使用DATE类型
);
-- 创建课程表
CREATE TABLE courses (
course_id INT PRIMARY KEY, -- 课程ID,主键
course_name VARCHAR(100) -- 课程名称
);
- 这里我们使用了
CREATE TABLE
创建表,并为每个字段指定了合适的数据类型。 student_id
和course_id
作为主键,确保每条记录都能被唯一识别。name
和course_name
选用VARCHAR
,是因为这些字段长度不固定,VARCHAR
会根据内容长度动态分配空间。
3. 数据类型的选择
给每个字段选择合适的数据类型非常重要。看一下我们在上面选择的数据类型:
- INT:适合数字,但范围较大。
student_id
和course_id
需要保持唯一性,用INT
既通用也方便。 - TINYINT:适合小范围整数,比如学生的年龄,因为年龄通常小于128。
- VARCHAR(50):适合不定长的文本。学生姓名长度不固定,但设置成50足够大且节省空间。
- DATE:专门用来存日期,适合入学日期等字段。
这些类型让我们既节省了存储空间,又能保证数据的准确性。
4. 主键和外键的设置
现在,我们还可以扩展,假如有一张enrollments
表记录学生选修的课程信息。这张表需要一个主键,同时,还需要能链接到students
和courses
表,以确保每条选课记录都是有效的。
-- 创建学生选课表
CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY, -- 选课记录ID,主键
student_id INT, -- 学生ID,外键,链接到students表
course_id INT, -- 课程ID,外键,链接到courses表
enrollment_date DATE, -- 选课日期
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
enrollment_id
是enrollments
表的主键,保证每条选课记录都是唯一的。student_id
和course_id
是外键,分别引用students
和courses
表,确保选课记录里的学生和课程必须是有效的。
5. 一个例子说明它们如何协作
(提前用一下插入语句,要不然没法写了~)
举个例子,假设某学生“张三”入学了,他的学生ID是1
,课程表里有一个“数据库基础”的课程,课程ID是101
。我们现在把这些数据加进来:
-- 向students表插入一条学生记录
INSERT INTO students (student_id, name, age, enrollment_date)
VALUES (1, '张三', 20, '2024-10-26');
-- 向courses表插入一条课程记录
INSERT INTO courses (course_id, course_name)
VALUES (101, '数据库基础');
-- 在enrollments表中插入张三的选课记录
INSERT INTO enrollments (enrollment_id, student_id, course_id, enrollment_date)
VALUES (1, 1, 101, '2024-10-27');
因为enrollments
表的student_id
和course_id
字段分别引用了students
和courses
表,所以只有当students
和courses
表里有匹配的student_id
和course_id
时,选课记录才会插入成功。这种外键约束能确保所有数据之间的关系是符合逻辑的。