基础术语
当数据库作为一个技术名词时,它特指数据库管理系统,即DBMS。
“库”是使用DBMS构建的存储和管理业务流程数据的“容器”,其中存储有若干表、视图等数据库对象。 •通常一个项目对应一个“库”,“库”中的数据库对象只为这个项目服务。 “库”对应于项目,使得数据库系统有条理



外键(Foreign Key)

实体(Entity )

数据库理论的提出 Codd首先提议把关系代 数作为数据库查询语言 的基础,他把数学和计算机科学在信检索领域做了创造性的结合, 使得计算机对数据的查 询检索有了严格的数学保证,正是由于他的开创性工作直接推动了关系数据库的诞生

库
创建库 create database CreateByDatabse;
Navigator 区域:RMC选择create schema
控制面板:
//注意库名不能加引号
CREATE DATABASE 数据库名;
//或使用
create schema 数据库名;
database和schema等价,下只给database的形式
修改库的属性

在库名的右侧隐藏菜单中选择扳手 – 进入库属性

删除库 DROP DATABASE 数据库名;
RMC库名 – 选择Drop Scheme
直接删除数据库(若数据库不存在,会报错)
DROP DATABASE 数据库名;
安全删除:判断数据库存在则删除,不存在则不报错
DROP DATABASE IF EXISTS 数据库名;
3.3 数据类型
什么是数据类型:为了规范数据,以及便于计算机存储、查找数据,计算机科学家设计了数据类型,数据类型本质是一种存储规则
字符串类
| 类型 | 长度特性 | 长度范围 | 存储规则 | 典型适用场景 |
|---|---|---|---|---|
| CHAR | 定长 显式声明长度 | 0-255 字节 | 空格填充 / 读取时去末尾空格 | 定长字符串 手机号、身份证号 |
| VARCHAR | 变长 显式 | 0-65535 字节 | 记录实际长度(占 1-2 字节) | 变长字符串 姓名、短评 |
| TINYTEXT | 变长 无需指定长度 | 0-255 字节 | 记录长度(占 2 字节) | 短文本字符串 用户备注 |
| TEXT | 变长 无需指定长度 | 0-65535 字节 | 记录长度(占 2 字节) | 长文本数据 文章正文 |
CHAR:
定长,即不管实际存储的字符串长度是多少,都会占用声明时指定的长度
若实际字符串长度不足声明长度,会用空格填充;读取时会自动去掉末尾空格。
适用场景:存储长度固定的字符串,如手机号、身份证号、性别(“男”“女”)等。
VARCHAR:
实际存储长度由内容决定,不会填充空格;会额外占用 1-2 字节来记录字符串的实际长度。
数字类

时间日期类

集合类


表操作
3.4 创建表
创建一个库CREATE DATABASE XXX; 设置这个库为当前库USE XXX;下面构建一个名为tb_student的表
CREATE TABLE ‘tb’.‘tb_student’
(
stu_num CHAR(11) NOT NULL,
name VARCHAR(20) NULL,
intro TINYTEXT NULL,
PRIMARY KEY (stu_num)
);
NULL(可省略,默认就是 NULL)表示该字段允许存储空值,即可以不赋值NOT NULL表示该字段不允许存储空值,必须为其赋值
通过 PRIMARY KEY ('stu_num') 将 stu_num 字段设置为主键。主键具有唯一性和非空性,保证了表中每条记录都能被唯一标识

列名(Column Name):表中每一列的名称
主键(PK – Primary Key):勾选表示该列是表的主键。主键是表中用于唯一标识每条记录的字段(或字段组合),具有唯一性(表中该列值不能重复)和非空性(值不能为NULL)
非空(NN – Not Null):勾选表示该列不允许为NULL值,即插入或修改数据时,该列必须有值
唯一(UQ – Unique):勾选表示该列的值在表中必须唯一,但与主键不同的是,唯一约束的列可以为NULL(若列没设置NN)。用于保证列中数据的唯一性,比如若有 “身份证号” 列,可设为唯一
3.5 修改表的结构 – 删除列,添加列,修改列名

添加列
- 语法格式
ALTER TABLE 表名ADD COLUMN 列名 数据类型 [约束条件] [AFTER 已有列名]; 约束条件可设置非空(NOT NULL)、默认值(DEFAULT)等,AFTER 已有列名可选,用于指定新列添加在某已有列之后,若不指定则添加在表的最后。- 示例中
ALTER TABLE tb_student ADD COLUMN sex ENUM ("男","女") NULL AFTER name;,就是在tb_student表的name列后添加sex列,类型为枚举(只能选 “男” 或 “女”),允许为空(NULL)。
- 示例中
对比 CHANGE COLUMN 用于修改列(与 ALTER COLUMN 等结合场景)
- 语法格式:
ALTER TABLE 表名 / CHANGE COLUMN 原列名 新列名 数据类型 [约束条件]; - 说明:
CHANGE COLUMN功能更强大,不仅能修改列的数据类型、约束等,还能修改列名。示例中ALTER TABLE tb_student CHANGE COLUMN sex sex ENUM ('男','女') NULL DEFAULT '男' ;,这里原列名和新列名都是sex,主要是修改sex列的类型、允许为空以及默认值等属性。
删除列
- 语法格式:
ALTER TABLE 表名 DROP COLUMN 列名; - 说明:用于从表中删除指定的列,删除后该列及对应的数据都会被移除。
- 示例中
ALTER TABLE tb_student DROP COLUMN intro ;,删除tb_student表中的intro列。
- 示例中
3.6 删除表
Drop Table 表名
3.7 批量插入数据
INSERT INTO 表名 VALUES(”,”,”);
//因为学号定长而姓名不定长所以分别声明为Char和varChar
CREATE TABLE tb_student
(
stu_num char(11),
name varchar(20),
sex enum('男','女')
);
INSERT INTO tb_student VALUES
('16100101', '马诗' ,'男'),
('16130201', '博文' ,'女'),
('16130205', '黄弘' ,'男'),
('17130202', '邹睿睿' ,'男'),
('17130203', '马诗' ,'女');
作业代码
//建立数据库MyLib
CREATE DATABASE MyLib;
//创建student表
//stuID设为INT 类型(主键,自增更合理,可选);
//name设为VARCHAR(50);
//gender设为CHAR(2),默认值设为'男'(或'女',根据需求选择);
//school设为VARCHAR(100)。
USE MyLib;
CREATE TABLE student (
stuID INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
gender CHAR(2) DEFAULT '男',
school VARCHAR(100)
);
创建book表
bookID设为INT 类型(主键,自增);
title设为VARCHAR(100);
author设为VARCHAR(50);
publish设为VARCHAR(100);
price设为DECIMAL(10,2),默认值设为0。
CREATE TABLE book (
bookID INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
author VARCHAR(50),
publish VARCHAR(100),
price DECIMAL(10,2) DEFAULT 0
);
创建record表
stuID和bookID作为联合主键,同时作为外键关联student和book表;
borrowdate和returndate设为DATE 类型。
CREATE TABLE record (
stuID INT,
bookID INT,
borrowdate DATE,
returndate DATE,
PRIMARY KEY (stuID, bookID),
FOREIGN KEY (stuID) REFERENCES student(stuID),
FOREIGN KEY (bookID) REFERENCES book(bookID)
);
向student表插入 3 条记录
INSERT INTO student (name, gender, school) VALUES
('张三', '男', '第一中学'),
('李四', '女', '第二中学'),
('王五', '男', '第一中学');
INSERT INTO book (title, author, publish, price) VALUES
('MySQL从入门到精通', '张三', '机械工业出版社', 59.9),
('Python编程', '李四', '人民邮电出版社', 69.9),
('数据结构', '王五', '清华大学出版社', 45.0);
INSERT INTO record (stuID, bookID, borrowdate, returndate) VALUES
(1, 1, '2025-10-01', '2025-10-15'),
(2, 2, '2025-10-02', '2025-10-20'),
(3, 3, '2025-10-03', '2025-10-25');
3.8 修改表中数据

在WorkBench中,如果没有给表指定主键出于安全考虑会报错(因为通过WHERE定位的stu_man可能不唯一),但如果讲其复制到命令行中可以执行,证明命令行的操作权限更大
3.9 删除表中数据
删除姓名为“博文一”的记录
Delete From XX表名 WHERE name = ‘ 博文一’;
如果不加WHERE,则是删除表中所有数据
数据完整性约束
3.10 创建非空约束

第二行报错,不会被执行
3.11 创建Check约束
-- 判断表是否存在,如果存在则删除
DROP TABLE IF EXISTS tb_bibliography1;
CREATE TABLE tb_bibliography1(
ISBN CHAR(20),
name CHAR(32),
price INT CONSTRAINT checkprice CHECK(price>0 AND price<1000)
);
INSERT INTO tb_bibliography1 VALUES ('9787113254100', 'Python语言及其应用', 66);
INSERT INTO tb_bibliography1 VALUES ('9787113254101', 'Python语言及其应用——典藏版', 1000);
3.12 创建单一键值的主键约束
CREATE TABLE tb_student2(
stu_num CHAR(9) PRIMARY KEY,
name CHAR(20)
);
--插入两条数据
INSERT INTO tb_student2(stu_num,name)
VALUES("16100101","马诗"),
("17130203","马诗");
会发现如果插入的两个数据的主键值相同,数据都不会被插入,原因后面会提到是MYSQL事务处理机制
3.13 创建非单一键值的主键约束
创建借阅表(tb_record1),定义四个属性,学生的学号(stu_num),条码号(barcode)和借书日期(borrow_time),它们的组合作为借阅表的联合主键,还书日期(return_time)是借阅表的另外一个属性
CREATE TABLE tb_record1(
stu_num CHAR(20),
barcode CHAR(32),
borrow_time DATETIME,
return_time DATETIME,
CONSTRAINT PK_tb_record1 PRIMARY KEY(stu_num, barcode, borrow_time)
);
INSERT INTO tb_record1
VALUES('16100101', 'I247.56', '2019-04-17 16:35:54', '2019-04-18 17:36:15');
INSERT INTO tb_record1
VALUES('17130202', 'TP311.12', '2019-05-03 16:54:41', NULL);
非单一键值冲突会插入一条,并不像上面一样全部忽略

3.14 创建外键约束
CONSTRAINT 外键约束名 FOREIGN KEY (从表外键列) REFERENCES 主表名 (主表主键列)
外键(FOREIGN KEY)主要用于建立表与表之间的关联关系,确保数据的参照完整性。约束数据的一致性:在tb_book2中,ISBN作为外键参照tb_bibliography2的ISBN,意味着tb_book2中插入或修改的ISBN值,必须在tb_bibliography2的ISBN中存在(除非设为NULL),否则操作会被拒绝。
CREATE TABLE tb_bibliography2(
ISBN CHAR(20) PRIMARY KEY,
name CHAR(32),
price FLOAT(6, 2)
);
CREATE TABLE tb_book2(
barcode CHAR(9) PRIMARY KEY,
ISBN CHAR(32),
status ENUM('0', '1'),
CONSTRAINT FK_book2 FOREIGN KEY (ISBN) REFERENCES tb_bibliography2(ISBN)
);
INSERT INTO tb_bibliography2 VALUES ('9787113254100', 'Python语言及其应用', '62.20');
INSERT INTO tb_book2 VALUES('TP311.11', '9787113254100', '1');
INSERT INTO tb_book2 VALUES('TP122.32', '9787569302585', '1');
后面这条操作会被拒绝,因为tb_bibliography2中没有9787569302585
在设置外键的情况下,操作顺序很重要,要先删除被关联的内容在删除关联的内容,在这个例子中就是先删除tb_book2
DROP TABLE IF EXISTS tb_book2;
DROP TABLE IF EXISTS tb_bibliography2;
存储引擎

-- 创建主表 tb_student4
CREATE TABLE tb_student4(
stu_num CHAR(9) PRIMARY KEY,
name CHAR(20),
school CHAR(10)
) ENGINE INNODB;
-- 创建关联表 tb_inf_student4(含外键关联)
CREATE TABLE tb_inf_student4(
stu_num CHAR(9),
address CHAR(64),
CONSTRAINT FOREIGN KEY(stu_num) REFERENCES tb_student4(stu_num)
) ENGINE INNODB;
-- 问题(1)相关表操作
-- 判断表是否存在,存在则删除
DROP TABLE IF EXISTS tb_inf_student4;
DROP TABLE IF EXISTS tb_student4;
-- 插入数据(先插主表,再插关联表,符合外键约束)
INSERT INTO tb_student4 VALUES ('000000001','张三','信息学院');
INSERT INTO tb_inf_student4 VALUES ('000000001','北京市石景山区晋元庄路5号');
-- 创建主表 tb_student5(存储引擎为 MyISAM)
CREATE TABLE tb_student5(
stu_num CHAR(9) PRIMARY KEY,
name CHAR(20),
school CHAR(10)
) ENGINE MyISAM;
-- 创建关联表 tb_inf_student5(含外键关联,存储引擎为 MyISAM)
CREATE TABLE tb_inf_student5(
stu_num CHAR(9),
address CHAR(64),
CONSTRAINT FOREIGN KEY(stu_num) REFERENCES tb_student5(stu_num)
) ENGINE MyISAM;
-- 插入数据(先插主表,再插关联表,符合外键约束)
INSERT INTO tb_student5 VALUES ('000000001','张三','信息学院');
INSERT INTO tb_inf_student5 VALUES ('000000001','北京市石景山区晋元庄路5号');
InnoDB是默认的存储引擎,其能对外键约束进行判断但是MYISAM不能,所以代码最后的Insert并不会报错


补充:查看表结构
| 语句 | 特点 | 适用场景 |
|---|---|---|
DESC / DESCRIBE 表名 | 简洁、快速,核心信息一目了然 | 日常快速查看表结构 |
SHOW COLUMNS FROM 表名 | 与 DESC 功能一致,语法不同 | 习惯这种写法的场景 |
SHOW CREATE TABLE 表名 | 详细、完整,含约束 / 存储引擎等所有信息 | 需复制建表语句、排查约束问题等 |










