MySQL 的核心基础语法

前言

用来记录一下 MySQL 的主要代码,方便初步学习和后续复习。。。专业人士路过就当看个乐子好了。

以下的所有操作都以新数据库 Example 为例进行。

本教程测试环境

硬件与系统:MacOS Sequoia 15.1 MacBook Pro 2024

软件:MySQL Workbench 8.0.41 Community

创建与添加

创建数据库

1
CREATE DATABASE Example;

同名(不区分大小写)数据库只能创建一次,重复执行同一条创建代码会报错。

进入数据库

1
USE Example;

当根目录中含有多个数据库时,需要选定数据库执行下一步操作。在 MySQL Workbench 中,你可以通过上面的 USE 代码来进入指定数据库,也可以直接双击进入。

创建表格

数据库的下一级是表格,可以使用 CREATE TABLE 命令来创建表格。创建时需要指定创建表格的列名,以及每个列名对应的数据类型(类似于声明变量)。

在这里假设需要创建一个学生信息登记表,要用到的数据有 学生 ID,姓名,出生日期,代码如下:

1
2
3
4
5
6
7
USE Example;

CREATE TABLE Student_Info (
id INT PRIMARY KEY AUTO_INCREMENT,
std_name VARCHAR(15) NOT NULL,
birthday DATE NULL
);

这里设置了三个变量:INT 类型的 id,VARCHAR(15) 类型的 std_name,DATE 类型的 birthday。

INT 表示整数类型,VARCHAR(15) 代表长度为 15 的字符串类型,DATE 代表日期类型,对应格式为 年-月-日 (yyyy-mm-dd)。

AUTO_INCREMENT 代表这个 INT 类型的数值可以自动增加(类似索引),后期添加数据时可以直接使用 DEFAULT 来设为使用自动增加。NOT NULLNULL 指定该值是否可以为空值。

其中,id 代表学生个人 ID,每个人的 ID 都是唯一的,可以通过 ID 快速找到相应学生,所以这里设置为 PRIMARY KEY 来作为索引,通过索引可以快速找到该行数据。同时,索引数据一定不为空,所以这里可以省略掉 NOT NULL 的设置。

插入数据

创建出来的表格是没有数据的,要想存入数据,需要使用 INSERT INTO 命令。插入数据需要同时指定要插入的列名和每个列名的对应值。

在这里我们给创建出的表格的每一列都插入数据,代码如下:

1
2
3
4
5
6
7
8
9
10
USE Example;

INSERT INTO Example.Student_Info (id, std_name, birthday)
VALUES (1, 'James Well', '2006-07-17');

INSERT INTO Example.Student_Info
VALUES (2, 'Micheal Lee', '2005-11-09');

INSERT INTO Example.Student_Info
VALUES (DEFAULT, 'Odem Medo', NULL);

这里插入了三名学生的数据,每个数据使用的语法都不一样。

比如,当你需要向表格中的每一列都添加数据时,指定列名的 (id, std_name, birthday) 就可以选择省略。同时,指定了 AUTO_INCREMENT 的变量可以直接使用 DEFAULT 来实现自动递增;指定了 NULL 的变量可以直接设为空值。

修改数据

现在我们想要向表格中添加一列,用来存放每个学生的班级名称。我们可以使用 ALTER TABLE 来修改创建完成的 Student_Info 表格。类似于创建表格,在表格中新建一列也需要指明新列的列名和对应的数据类型。

现在来添加“班级名称”一列,代码如下:

1
2
ALTER TABLE Example.Student_Info
ADD class VARCHAR(10) NULL;

这里新增了一个存储 10 个 字符的字符串类型变量,用来存储班级名称,且可以为空值。

修改完表格后,我们就需要更新之前的数据,这个时候就需要用到 UPDATE-SET-WHERE 指令了。这里的 UPDATE 后接表格名称,SET 后接设置的值,WHERE 后接需要设置的数据索引(如 id)。

现在来给每个学生添加一个班级名称,代码如下:

1
2
3
4
5
6
7
8
9
10
11
UPDATE Example.Student_Info
SET class = 'Class4'
where id = 1;

UPDATE Example.Student_Info
SET class = 'Class4'
where id = 2;

UPDATE Example.Student_Info
SET class = 'Class5'
where id = 3;

需要注意的是,MySQL 中单个等号在不同条件下,同时具备相等判断和赋值功能,不需要使用双等号来判断是否相等。

删除数据

我们先从删除单个数据开始。假如 James Well 同学离开了学校,这里就需要删除掉 id = 1 的整条数据。我们可以使用 DELETE FROM 指令来删除相应的数据。

现在我们来删除 James Well 的全部信息,代码如下:

1
2
DELETE FROM Example.Student_Info
WHERE id = 1;

接下来,如果需要删除整个表格(比如学校倒闭了),就直接使用 DROP TABLE 数据库名.表格名 指令;如果需要删除整个数据库,就直接使用 DROP DATABASE 数据库名 指令即可。代码如下:

1
2
3
DROP TABLE Example.Student_Info;

DROP DATABASE Example;

注意:使用 DROP 命令删除数据库之前不会有任何确认提醒,所以请务必确保保存有重要数据的数据库不会被误操作删除。

查询数据

查询数据之前需要有数据,这里我们使用 b 站 up 主“技术蛋老师”提供的新冠感染人数数据库为例。你可以在下面的网址中复制全部代码,然后粘贴到你的 Workbench 的 Query 代码行中,执行即可生成需要的数据库。

数据库网址:https://gitee.com/eggtoopain/my-sql-introductory-courseware/blob/master/Egg_database.sql

查询全部数据

接下来我们使用 SELECT 指令来查看数据,查询的两种方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
USE Egg_database;

# 查询全部数据
SELECT *
FROM Covid_month;

# 查询特定列数据: 各国的确诊数量
SELECT Country, Confirmed, Continent
From Covid_month;

# 查询出现病例的国家
SELECT DISTINCT Country
From Covid_month;

这个数据库包含两个表格:Covid_month 和 Covid_total。在 SELECT 后使用 * 即代表查询该表格中的全部数据,相当于 Excel 中的全选;而输入特定列的列名即可查询该列的全部数据,相当于 Excel 中的选中一列。

这里,由于统计的是不同地区的新冠病例情况,所以查询的 Country 和 Continent 会出现大量重复的数据(国家名称、大洲名称),如果想要查看哪些国家有病例,而不想被重复的国家名称影响,可以在 SELECT 后使用 DISTINCT

排序查看数据

如果需要在查看数据时对数据进行排序,需要使用 ORDER BY 关键字,以下是排序的所有语法内容:

1
2
3
4
5
6
7
8
9
10
11
USE Egg_database;

# 根据确诊病例从低到高排序
SELECT *
FROM Covid_month
ORDER BY Confirmed ASC; # ASC 就是 Ascending 的缩写

# 根据确诊病例从高到低排序
SELECT *
FROM Covid_month
ORDER BY Confirmed DESC; # 不加 DESC 就是默认使用 ASC

过滤查看数据

如果需要对查看的数据进行过滤,需要使用 WHERE 关键字,以下是过滤的部分语法内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
USE Egg_database;

# 筛选出康复数量大于 1000000 的国家
SELECT *
FROM Covid_month
WHERE Recovered >= 1000000 # WHERE 语句的位置不能改变, 不然会报错
ORDER BY Confirmed DESC;

# 在康复数量大于 1000000 的国家结果中删掉 巴西
SELECT *
FROM Covid_month
WHERE Recovered >= 1000000 AND Country != 'Brazil'
ORDER BY Confirmed DESC;

# 不查看排除了 巴西 的康复数量大于 1000000 的国家
SELECT *
FROM Covid_month
WHERE NOT Recovered >= 1000000 AND Country != 'Brazil' # 此处 AND 优先级最高, 先计算 AND 再计算 NOT
ORDER BY Confirmed DESC;

# 查看康复数量在 10000001500000 之间的国家
SELECT *
FROM Covid_month
WHERE Recovered BETWEEN 1000000 AND 1500000
ORDER BY Confirmed DESC;

# 只查看 巴西 和 印度 两个国家
SELECT *
FROM Covid_month
WHERE Country IN ('Brazil', 'India')
ORDER BY Confirmed DESC;

# 查看名字以 B 开头的国家
SELECT *
FROM Covid_month
WHERE Country LIKE 'B%'
ORDER BY Confirmed DESC;

# 查看名字以 a 结尾的国家
SELECT *
FROM Covid_month
WHERE Country LIKE '%a'
ORDER BY Confirmed DESC;

# 模糊查询名字第三个字母为 b 的国家
SELECT *
FROM Covid_month
WHERE Country LIKE '__b%' # 下划线 _ 可以代表任意字符
ORDER BY Confirmed DESC;

合并查看数据

如果需要合并两个表格的数据,需要使用 JOIN 关键字,通过交集合并使用 INNER JOIN,而通过并集合并使用 UNION,详细代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
USE Egg_database;

# 通过交集合并
# 此处的意思是: 将两个表格合并之后, 通过合并国家名称的方式展现出来
# 两个表格一开始并非按照相同的国家顺序排序数据, 但现在会按照 FROM 中的国家顺序排列并展现
# 展示时, FROM 的表格在左, INNER JOIN 的表格在右, 将左右两边的值以国家名称为条件合并放在一起
SELECT *
FROM Covid_month
INNER JOIN Covid_total
ON Covid_month.Country = Covid_total.Country;

# 通过并集合并
# 并集合并是将两个表格中选定的列数据上下拼接在一起
SELECT Country
FROM Covid_month
UNION ALL # 没有 ALL 关键字会默认去除重复值, 删去 ALL 会保留所有重复值
SELECT Country
FROM Covid_total

# 左连接合并两个表格
# 即保留左边表格的全部数据, 同时将另一个表格符合条件的数据通过交集合并到右侧
# 此处选择的合并条件与交集合并相同
SELECT *
FROM Covid_month
LEFT JOIN Covid_total
ON Covid_month.Country = Covid_total.Country;

# 右连接合并两个表格
# 即保留右边表格的全部数据, 同时将另一个表格符合条件的数据通过交集合并到左侧
# 此处选择的合并条件与交集合并相同
# 此处使用了 AS 进行简写, 实际情况可以省略 AS 直接给出简写
SELECT *
FROM Covid_month AS cm
LEFT JOIN Covid_total AS ct
ON cm.Country = ct.Country;