库和表的基本操作


# 库和表的基本操作

以下用到的 SQL 语句中,大小写其实不作强制规定。但为了方便区分,关键词会用大写字母,自定义的表名、字段名、函数名等等会用小写字母。

# 数据库操作

# 展示数据库

mysql> SHOW DATABASES;
1

# 创建数据库

语法:

CREATE DATABASE 数据库名;
1

例如:

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

mysql>
1
2
3
4

如果创建一个已经存在的数据库会报错 ERROR。这个时候可以使用 IF NOT EXISTS 语句,这样不影响语句的执行,只是结果中有 1 个 warning

mysql> CREATE DATABASE IF NOT EXISTS school;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql>
1
2
3
4

# 切换数据库

语法:

USE 数据库名称;
1

例如:

mysql> USE school;
Database changed
mysql>
1
2
3

# 删除数据库

如果觉得某个数据库没用了,可以把它删掉。

语法:

DROP DATABASE 数据库名;
1

在真实的工作环境里,在删除数据库之前一定要反复找上级核实,就算要删最好不要自己删,「删库」这个责任很大。

不过这里演示的是学习环境,就无所谓了。删除刚才创建的 school 库:

mysql> DROP DATABASE school;
Query OK, 0 rows affected (0.02 sec)

mysql>
1
2
3
4

如果某个数据库并不存在,我们仍旧调用 DROP DATABASE 语句去删除它,不过会报错的。如果想避免这种报错,可以使用 IF EXISTS 语句来删除数据库:

mysql> DROP DATABASE IF EXISTS school;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>
1
2
3
4

# 表的操作

以下用到的 SQL 语句,需要先进入到一个新的数据库,就拿前面举例的 school 库好了。

# 展示当前数据库中的表

这条语句用于展示当前数据库中有哪些表:

mysql> SHOW TABLES;
Empty set (0.00 sec)

mysql>
1
2
3
4

因为是新创建的数据库,所以里面是空的,得到的结果就是 Empty set

# 创建表

# 基本语法

MySQL 中创建表的基本语法就是这样的:

CREATE TABLE 表名 (
    列名1    数据类型    [列的属性],
    列名2    数据类型    [列的属性],
    ...
    列名n    数据类型    [列的属性]
);
1
2
3
4
5
6

也就是说创建一个表时至少需要完成下列事情:

  • 给表起个名。
  • 然后在小括号 () 中定义上这个表的各个列的信息,包括列的名称、列的数据类型、列的属性(列的属性非必须,用中括号 [] 引起来)。
  • 列名、数据类型、列的属性之间用空白字符分开就好,然后各个列的信息之间用逗号 , 分隔开。

最后,将建表语句放到客户端执行,输出 Query OK, 0 rows affected (0.07 sec) 意味着创建成功了,这里的 0.07 表示耗时,实际耗时不一定就是这个数字。

小贴士

这个创建表的语句可以放在单行中完成,我把它分成多行并且加上缩进仅仅是为了美观而已。

# 为建表语句添加注释

可以在创建表时将该表的用处以注释的形式添加到语句中,只要在建表语句最后加上 COMMENT 语句就好,如下:

CREATE TABLE 表名 (
    各个列的信息 ...
) COMMENT '表的注释信息';
1
2
3

为了我们和他人的方便,最好写个注释。不过注释没必要太长,言简意赅即可,毕竟是给人看的,让人看明白是什么意思就好了。

# 创建两个实际的表

先创建一个学生信息表(student_info):

CREATE TABLE student_info (
    number INT,
    name VARCHAR(5),
    sex ENUM('男', '女'),
    id_number CHAR(18),
    department VARCHAR(30),
    major VARCHAR(30),
    enrollment_time DATE
) COMMENT '学生信息表';
1
2
3
4
5
6
7
8
9

这张表有如下字段:

  • 学号(number):整数类型
  • 姓名(name):变长字符串类型,最多 5 个字符
  • 性别(sex):枚举类型,只能填
  • 身份证号(id_number):固定长度字符串类型,因为身份证是固定的 18 位
  • 学院(department):变长字符串类型,最多 30 个字符
  • 专业(major):变长字符串类型,最多 30 个字符
  • 入学时间(enrollment_time):日期类型

再创建一个学生成绩表(student_score):

CREATE TABLE student_score (
    number INT,
    subject VARCHAR(30),
    score TINYINT
) COMMENT '学生成绩表';
1
2
3
4
5

这张表有如下字段:

  • 学号(number):整数类型
  • 科目(subject):变长字符串类型,最多 30 个字符
  • 成绩(score):小整数类型,成绩够用了

和重复创建数据库一样,如果创建一个已经存在的表的话是会报错的,这个时候也可以使用 IF NOT EXISTS 来避免这种错误发生:

CREATE TABLE IF NOT EXISTS 表名(
    各个列的信息 ...
);
1
2
3

# 删除表

删除表的语法:

DROP TABLE1,2, ..., 表n;
1

在真实工作环境中删除表一定要慎重、谨慎。

同样,如果尝试删除某个不存在的表的话会报错,可以使用 IF EXISTS 来避免报错:

DROP TABLE IF EXISTS 表名;
1

# 查看表结构

下边这些语句都可以用来查看表的结构,它们的效果是一样的:

DESCRIBE 表名;
DESC 表名;
EXPLAIN 表名;
SHOW COLUMNS FROM 表名;
SHOW FIELDS FROM 表名;
1
2
3
4
5

还可以使用下边这个语句来查看表结构,而它显示其实跟平时创建表的语句是一样的,所以可以用来反查建表语句:

SHOW CREATE TABLE 表名\G
1

\G 来代替原来用于标记语句结束的分号 ;,是为了让输出的结果显示效果更好一点。

# 显式指定表的数据库

有时候我们并没有使用 USE 语句来选择当前数据库,或者在一条语句中遇到的表分散在不同的数据库中,如果我们想在语句中使用这些表,那么就必须显式的指定这些表所属的数据库了。

比如不管当前数据库是不是 school,都可以调用这个语句来展示数据库 school 里边的表:

mysql> SHOW TABLES FROM school;
+------------------+
| Tables_in_school |
+------------------+
| student_info     |
| student_score    |
+------------------+
2 rows in set (0.01 sec)

mysql>
1
2
3
4
5
6
7
8
9
10

其他地方如果使用到表名的话,需要显式指定这个表所属的数据库,指明方式是 数据库名.表名。例如:

mysql> SHOW CREATE TABLE school.student_score\G
*************************** 1. row ***************************
       Table: student_score
Create Table: CREATE TABLE `student_score` (
  `number` int DEFAULT NULL,
  `subject` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `score` tinyint DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学生成绩表'
1 row in set (0.00 sec)

mysql>
1
2
3
4
5
6
7
8
9
10
11

# 修改表

# 修改表名

  • 方式一:
ALTER TABLE 旧表名 RENAME TO 新表名;
1
  • 方式二(可以用一条语句修改多个表的名称):
RENAME TABLE 旧表名1 TO 新表名1, 旧表名2 TO 新表名2, ... 旧表名n TO 新表名n;
1

如果在修改表名的时候指定了数据库名,还可以将该表转移到对应的数据库下,例如:

ALTER TABLE student_info RENAME TO company.student_info;
1

# 增加列

可以使用下边的语句来增加表中的列:

ALTER TABLE 表名 ADD COLUMN 列名 数据类型 [列的属性];
1

# 增加列到特定位置

默认的情况下列都是加到现有列的最后一列后面,我们也可以在添加列的时候指定它的位置,常用的方式如下:

  • 添加到第一列:
ALTER TABLE 表名 ADD COLUMN 列名 列的类型 [列的属性] FIRST;
1
  • 添加到指定列的后边:
ALTER TABLE 表名 ADD COLUMN 列名 列的类型 [列的属性] AFTER 指定列名;
1

# 删除列

可以使用下边的语句来删除表中的列:

ALTER TABLE 表名 DROP COLUMN 列名;
1

# 修改列信息

修改列的信息有下边这两种方式:

  • 方式一:
ALTER TABLE 表名 MODIFY 列名 新数据类型 [新属性];
1

不过在修改列信息的时候需要注意:修改后的数据类型和属性一定要兼容表中现有的数据,否则就会报错。

  • 方式二:
ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 [新属性];
1

这种修改方式需要我们填两个列名,也就是说在修改数据类型和属性的同时也可以修改列名。因此也可以用在不改变数据类型和属性,仅重命名列明的需求场景上。

# 修改列排列位置

可以使用下面这几条语句修改列的顺序:

  • 将列设为表的第一列:
ALTER TABLE 表名 MODIFY 列名 列的类型 列的属性 FIRST;
1
  • 将列放到指定列的后边:
ALTER TABLE 表名 MODIFY 列名 列的类型 列的属性 AFTER 指定列名;
1

# 一条语句中包含多个修改操作

如果对同一个表有多个修改操作的话,我们可以把它们放到一条语句中执行,就像这样:

ALTER TABLE 表名 操作1, 操作2, ..., 操作n;
1

比如连续删除三个列的语句,可以合并为一条:

# 合并前
ALTER TABLE test_table DROP COLUMN column_a;
ALTER TABLE test_table DROP COLUMN column_b;
ALTER TABLE test_table DROP COLUMN column_c;

# 合并后
ALTER TABLE test_table DROP COLUMN column_a, DROP COLUMN column_b, DROP COLUMN column_c;
1
2
3
4
5
6
7

这样敲的语句也少了,服务器也不用分多次执行从而效率也高了。

(完)