MySQL 初步了解

任务描述

  • 大一的同学们,请各自在自己的电脑安装mysql,安装完后学习建表,了解表、字段、数据类型、索引、关联等概念,并自行建二个表,配置字段,并建立关联,任务截止下周三

任务分析

通过ai工具,得到涉及到的知识点

MySQL安装:

  • 安装MySQL数据库服务器。
  • 建表操作:
    • 了解如何创建数据库表。
    • 熟悉表的基本结构,包括表名、字段、数据类型等。
  • 表、字段、数据类型:
    • 了解表是数据库中的数据组织方式,由字段(列)和数据行组成。
    • 学习不同的数据类型,例如整数、字符串、日期等。
  • 索引:
    • 了解索引的作用和优势,它可以提高查询效率。
    • 学习如何在表中创建索引。
  • 关联:
    • 理解关联的概念,即在不同表之间建立关系。
    • 学习如何在表中定义外键,以建立关联。
  • 配置字段:
    • 学习如何配置字段,包括选择合适的数据类型、定义约束等。
  • 实际操作:
    • 根据任务要求,在自己的电脑上创建两个表,配置字段,并建立它们之间的关联。

安装 MySQL

1
docker run --name mysql -e MYSQL_ROOT_PASSWORD=pw -d mysql:5.7 -p 3306:3306

建表

准备建立两个表,一个存班级,一个存学生,学生表中的班级字段必须对应班级表中的某一项,即存在外键

建库

1
2
mysql> CREATE DATABASE school;
Query OK, 1 row affected (0.01 sec)

建表

首先创建classes表

1
2
3
4
5
CREATE TABLE `classes`  (
`class_number` int(11) NOT NULL,
`class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`class_number`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;

接着创建students表

1
2
3
4
5
6
7
8
9
CREATE TABLE `students`  (
`id` int(11) NOT NULL,
`name` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
`class` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `student2classes`(`class`) USING BTREE,
INDEX `name`(`name`) USING HASH;
CONSTRAINT `student2classes` FOREIGN KEY (`class`) REFERENCES `classes` (`class_number`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;

外键测试

此时,先向classes表中填入数据

然后向students表中插入数据

首先,如果class字段的值在classes表中存在,则插入成功

1
2
mysql> INSERT INTO students (id,name,class) VALUES (3,'nnnm',5);
Query OK, 1 row affected (0.01 sec)

反之,则会报错

1
2
mysql> INSERT INTO students (id,name,class) VALUES (4,'nnnm',50);
1452 - Cannot add or update a child row: a foreign key constraint fails (`school`.`students`, CONSTRAINT `student2classes` FOREIGN KEY (`class`) REFERENCES `classes` (`class_number`) ON UPDATE CASCADE)

说明外键约束起到了作用

连接测试

无连接情况

首先最朴素的查询所有数据

1
2
3
4
5
6
7
8
9
mysql> SELECT * FROM students;
+----+------+-------+
| id | name | class |
+----+------+-------+
| 1 | 1 | 1 |
| 2 | nnn | 5 |
| 3 | nnnm | 5 |
+----+------+-------+
3 rows in set (0.03 sec)

可见正常返回表内的内容

使用连接

然后使用 INNER JOIN,连接classes表中的class_name字段

1
2
3
4
5
6
7
8
9
mysql> SELECT students.*,classes.class_name FROM students INNER JOIN classes ON students.class = classes.class_number;
+----+------+-------+-------------------------------+
| id | name | class | class_name |
+----+------+-------+-------------------------------+
| 1 | 1 | 1 | Kaneko Electronic Corporation |
| 2 | nnn | 5 | Tsubasa Corporation |
| 3 | nnnm | 5 | Tsubasa Corporation |
+----+------+-------+-------------------------------+
3 rows in set (0.04 sec)

可见,返回的数据中包含了在classes表中对应的class_name字段的值

杜家楷

11月19日01:18