学习MySQL的基本操作,就像是搭建一个井然有序的图书馆。我们需要先建立存放数据的“库”,这就是数据库的创建和管理,通过CREATE DATABASE
来新建一个库,并用SHOW DATABASES
查看已经存在的库,必要时还能用DROP DATABASE
清理不再需要的库。
接下来,在数据库中创建存放具体数据的“架子”,也就是表的创建与管理。用CREATE TABLE
新建表结构,比如定义表里有哪些“格子”(字段)来放数据,DROP TABLE
用于删除表,ALTER TABLE
则可以灵活调整表的结构,让数据更符合需求。
为了把每个“格子”设计得恰到好处,我们要了解MySQL支持的数据类型。不同的内容适合不同的数据类型,例如整数用INT
、文本用VARCHAR
、日期用DATE
。合理选择数据类型不仅能提高效率,还能减少空间占用。
最后,主键和外键就像是每本书的ISBN码和分类标签。主键(Primary Key)让每条数据都能被唯一识别,而外键(Foreign Key)让表之间形成关联关系,比如学生和选课数据的匹配。这些约束条件帮助我们建立数据的唯一性和一致性,让整个数据库结构更加清晰、合理。
在MySQL里,数据库就像一间房子,里面存放着各种数据表,表里放的则是具体的数据。接下来,我们学习如何“盖房子”、查看已经盖好的房子,以及“拆掉”不需要的房子!
我们要“盖”一间新房子(数据库),在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;
当我们在MySQL里存了很多数据库后,可能会忘记某些数据库的名字。这时,可以使用SHOW DATABASES
命令来看看有哪些“房子”已经盖好。
语法:
SHOW DATABASES;
例子:
直接运行SHOW DATABASES;
,MySQL会返回一个所有数据库的列表,看上去像这样:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| my_school |
| test |
+--------------------+
在结果里,我们就可以找到我们创建的数据库,比如“my_school”。另外,MySQL默认还会有一些系统数据库,比如information_schema
和mysql
,这些是MySQL系统自己用的,通常不要删除它们。
当一个数据库已经没有用处了,我们可以把这个“房子”拆掉。在MySQL里,用DROP DATABASE
命令来删除一个数据库,删除后数据将无法恢复,所以要谨慎操作。
语法:
DROP DATABASE 数据库名;
举个例子:
假设我们不再需要my_school
数据库了,可以这样删除它:
DROP DATABASE my_school;
这样,MySQL会彻底删除my_school
数据库以及其中所有的数据表和数据!
要注意:删除的数据库无法恢复,因此在执行前,一定要确认!
为了防止手误删除已有的数据库,可以加个IF EXISTS
,如果数据库不存在就不会报错:
DROP DATABASE IF EXISTS my_school;
CREATE DATABASE 数据库名;
来创建数据库。SHOW DATABASES;
来查看当前所有的数据库。DROP DATABASE 数据库名;
来删除不需要的数据库,但要小心,这个操作是不可逆的!在数据库中,数据是按“表”来存放的,每个表像是一张电子表格,有列(字段)和行(数据条目)。比如学生信息表里可能有“学号”、“姓名”、“年龄”等列。今天我们来学习如何用MySQL创建这些表、修改表结构,以及删除不需要的表。
创建表时,我们需要指定表的名字和它的结构,包括列的名字、类型,以及可能的限制条件(比如主键)。
语法:
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)
来表示。创建好表后,我们可以用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 | |
+-------------+-------------+------+-----+---------+-------+
如果我们不再需要某个表了,可以用DROP TABLE
命令来删除这个表,注意这会连同表里的所有数据一并删除,无法恢复。
语法:
DROP TABLE 表名;
举个例子:
假设我们不再需要“students”表了,可以这样删除:
DROP TABLE students;
MySQL会删除students
表以及它存放的所有数据,所以这个操作要慎重。
小贴士:如果不确定表是否存在,可以加上IF EXISTS
,避免报错:
DROP TABLE IF EXISTS students;
有时我们可能需要调整表的结构,比如加列、删列或修改某列的数据类型,这时就用ALTER TABLE
命令。
假设students
表里我们还想加一列“邮箱地址”,可以这样做:
ALTER TABLE students
ADD email VARCHAR(100);
这样students
表里就多了一列email
,可以用来存每位学生的邮箱地址。
假如我们不再需要class
(班级)这列了,可以用下面的命令来删除它:
ALTER TABLE students
DROP COLUMN class;
注意:删除列后所有数据都会一并消失,操作前要确认。
如果我们发现age
这列使用INT
类型不太合适,想改成TINYINT
(占用更少存储空间),可以这样写:
ALTER TABLE students
MODIFY age TINYINT;
这样age
列的数据类型就从INT
改成了TINYINT
,在节省存储的同时,更符合年龄数据的大小范围。
假如我们想把“student_id”重命名为“id”,可以用下面的语法:
ALTER TABLE students
CHANGE student_id id INT;
这里不仅重命名了,还得重新指定数据类型(INT
)。
CREATE TABLE 表名
命令,定义每一列的结构和约束。DROP TABLE 表名
命令删除整个表和表中的数据。ALTER TABLE
命令添加、删除或修改列。在MySQL中,我们的表就像装东西的“架子”,每一列(字段)都是用来装特定类型的数据。所以,选择正确的数据类型非常重要,不仅关系到存储效率,还影响查询速度!下面我们一起来认识MySQL中常用的数据类型,并了解它们的“性格特点”,好让每个字段都挑到合适的“衣服”。
数字类型专门用来存放整数、浮点数或定点数,不同场景用不同类型:
整数类型
小贴士:用整数时尽量选小一点的类型,减少存储空间,比如TINYINT
比INT
更省空间。
浮点数类型
FLOAT
高,可以表示非常精确的小数(约15位有效数字)。用于科学计算、需要高精度的场景。注意:如果要处理金额或财务数据,推荐用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
适合多选。通过选择合适的数据类型,我们不仅能优化存储,还能加速查询速度,提升数据库整体性能!
在数据库的世界里,主键(Primary Key)和外键(Foreign 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
组合成主键,确保一个学生在同一课程只能选一次。
外键可以理解为一张表里某个字段“引用”了另一张表的主键,目的是建立起表与表之间的关联关系,确保数据的完整性。比如,学生选课表里就会引用学生表的主键,确保选课记录是符合逻辑的。
在创建表时,用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
,就不能插入对应的选课记录。
外键还可以设置“级联更新”和“级联删除”:
例子:
给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
表中该学生的选课记录也会自动删除,保持数据一致性。
用好主键和外键,不仅让数据库的结构更清晰,还能保障数据的准确性和完整性!
假设我们要建立一个小型“学生管理系统”,包含学生的基本信息、选课信息等。这是一个绝佳的例子,能让我们了解数据库和表的创建管理,掌握数据类型的选择,还能了解主键和外键的用法。接下来我们就一步步地创建数据库、表,挑选合适的数据类型,设置主键和外键。
首先,我们需要一个数据库来存放所有的表和数据。在MySQL中,创建数据库就像在电脑上新建一个文件夹,用来存放我们所有的“文件”。
-- 创建一个叫“student_management”的数据库
CREATE DATABASE student_management;
-- 显示所有数据库,确认我们的数据库创建成功
SHOW DATABASES;
-- 如果哪天我们不需要这个数据库了,可以删除它
DROP DATABASE student_management;
这样我们就创建了一个叫student_management
的数据库,并可以用它来存放所有学生管理相关的数据。
接下来,在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
会根据内容长度动态分配空间。给每个字段选择合适的数据类型非常重要。看一下我们在上面选择的数据类型:
student_id
和course_id
需要保持唯一性,用INT
既通用也方便。这些类型让我们既节省了存储空间,又能保证数据的准确性。
现在,我们还可以扩展,假如有一张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
表,确保选课记录里的学生和课程必须是有效的。(提前用一下插入语句,要不然没法写了~)
举个例子,假设某学生“张三”入学了,他的学生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
时,选课记录才会插入成功。这种外键约束能确保所有数据之间的关系是符合逻辑的。