表的基本操作
数据库建好之后,我们就可以接着创建真正存储数据的表了。创建表的时候首先需要描述清楚这个表长什么样,它有哪些列,这些列都是用来存什么类型的数据等等,这个对表的描述称为表的结构
或者定义
。有了表的结构之后,我们就可以着手把数据塞到这个表里了。表中的一行叫做一条记录
,一列叫做一个字段
。
准备工作
- CREATE DATABASE IF NOT EXISTS testdemo; # 创建一个名为testdemo的数据库
- USE testdemo; # 使用testdemo数据库
展示当前数据库中的表
下边的语句用于展示当前数据库中有哪些表
SHOW TABLES;
我们的当前数据库是 testdemo,然后用上述语句查看下 testdemo 数据库中都有哪些表:
mysql> SHOW TABLES;
Empty set (0.00 sec)
mysql>
很抱歉,当前 testdemo 数据库中一个表也没有,所以得到的结果就是 Empty set。我们赶紧在当前数据库中创建几个表噻。
创建表
基本语法
创建一个表时至少需要完成下列事情:
给表起个名
给表定义一些列,并且给这些列都个名
每一个列都需要定义一种数据类型
如果有需要的话,可以给这些列定义一些列的属性.比如不允许存储
NULL
,设置默认值等等,具体的后面会介绍
创建表
MySQL 中创建表的基本语法如下:
CREATE TABLE 表名 (
列名 数据类型 [列属性],
列名 数据类型 [列属性],
....
列名 数据类型 [列属性],
);
也就说:
在
CREATE TABLE
后面写清楚我们要创建的表的名称然后在小括号
()
中定义上这个表的各个列的信息,包括列的名称、列的数据类型,如果有需要的话也可以定义这个列的属性(列的属性用中括号[]
引起来的意思就是这部分是可选的,也就是可有可无的)。列名、数据类型、列的属性之间用空白字符分开就好,然后各个列的信息之间用逗号
,
分隔开。
INFO
小贴士:
我们也可以把这个创建表的语句都放在单行中,而示例中将建表语句分成多行并且加上缩进仅仅是为了美观而已~
先创建一个超级简单的表
CREATE TABLE fist_TABLE(
ID INT UNSIGNED ,
age TINYINT UNSIGNED
)
这个表的名称叫做 first_table,它有两个列:ID 和 age。ID 列的数据类型是 INT UNSIGNED,age 列的数据类型是 TINYINT UNSIGNED。我们并没有给这两个列定义任何属性,所以这两个列都允许存储 NULL 值。
- 在客户端执行语句
CREATE TABLE fist_TABLE(
ID INT UNSIGNED ,
age TINYINT UNSIGNED
)
> OK
> 查询时间: 0.013s
为建表语句添加注释
- 注释里面必须使用单引号
我们可以在创建表时将该表的用处以注释的形式添加到语句中,只要在建表语句最后加上 COMMENT
语句就好,如下:
CREATE TABLE 表名 (
各个列的信息 ...
) COMMENT '表的注释信息';
比如我们可以这样写user
表的建表语句:
CREATE TABLE user(
id INT UNSIGNED,
age TINYINT UNSIGNED
) COMMENT '用户信息表';
注释没必要太长,言简意赅即可,毕竟是给人看的,让人看明白是个啥意思就好了。为了我们自己的方便,也为了阅读你创建的人的方便,请遵守一下职业道德,写个注释吧~
实操(创建现实生活中的表)
有了创建 user 的经验,我们就可以着手用 MySQL 把之前提到的学生基本信息表和成绩表给创建出来了,先把学生基本信息表搬下来看看:
学生基本信息表
学号 | 姓名 | 性别 | 身份证号 | 学院 | 专业 | 入学时间 |
---|---|---|---|---|---|---|
20180101 | 杜子腾 | 男 | 158177199901044792 | 计算机学院 | 计算机科学与工程 | 2018/9/1 |
20180102 | 杜琦燕 | 女 | 151008199801178529 | 计算机学院 | 计算机科学与工程 | 2018/9/1 |
20180103 | 范统 | 男 | 17156319980116959X | 计算机学院 | 软件工程 | 2018/9/1 |
20180104 | 史珍香 | 女 | 141992199701078600 | 计算机学院 | 软件工程 | 2018/9/1 |
很显然,这个表有学号、姓名、性别、身份证号、学院、专业、入学时间这几个列,其中的学号是整数类型的,入学时间是日期类型
的,由于身份证号是固定的 18
位,我们可以把身份证号这一列定义成固定长度的字符串类型,性别一列只能填男或女,所以我们这里把它定义为 ENUM
类型的,其余各个列都是变长的字符串类型。看一下创建学生基本信息表的语句:
CREATE TABLE STUDENT_INFO(
number INT,
name VARCHAR(255),
SEX ENUM('男','女'),
id_number CHAR(18),
department VARCHAR(30),
major VARCHAR(30),
enrollment_tme DATE
)COMMENT '学生信息表';
然后再看一下学生成绩表:
学号 | 科目 | 成绩 |
---|---|---|
20180101 | 母猪的产后护理 | 78 |
20180101 | 论萨达姆的战争准备 | 88 |
20180102 | 母猪的产后护理 | 100 |
20180102 | 论萨达姆的战争准备 | 98 |
20180103 | 母猪的产后护理 | 59 |
20180103 | 论萨达姆的战争准备 | 61 |
20180104 | 母猪的产后护理 | 55 |
20180104 | 论萨达姆的战争准备 | 46 |
这个表有学号、科目、成绩这几个列,学号和成绩是整数类型的,科目是字符串类型的,所以我们可以这样写建表语句
CREATE TABLE student_score ( number INT, SUBJECT VARCHAR ( 255 ), score TINYINT ) COMMENT '学生成绩表';
待这几个表创建成功之后,我们使用 SHOW TABLES 语句看一下当前数据库(testdemo 数据库)中有哪些表:
fist_table
student_info
student_score
user
我们刚才创建的表就都被展示出来了
IF NOT EXISTS
和重复创建数据库一样,如果创建一个已经存在的表的话是会报错的,我们来试试重复创建一下 student_score 表:
CREATE TABLE IF NOT EXISTS student_score ( number INT, SUBJECT VARCHAR ( 255 ), score TINYINT ) COMMENT '学生成绩表';
可以看到语句执行成功了,只是结果中有 1 个 warning 而已。
删除表
如果我们觉得某个表以后都用不到了,就可以把它删除掉。在真实工作环境中删除表一定要慎重谨慎,失去了的就再也回不来了~ 看一下删除的语法:
DROP TABLE 表1, 表2, ..., 表n;
- 我们试着删除一下创建的 user 表:
mysql> DROP TABLE user;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW TABLES;
+---------------------+
| Tables_in_testdemo |
+---------------------+
| student_info |
| student_score |
+---------------------+
2 rows in set (0.00 sec)
mysql>
IF EXISTS
如果我们尝试删除某个不存在的表的话会报错:
mysql> DROP TABLE first_table;
ERROR 1051 (42S02): Unknown table 'testdemo.first_table'
mysql>
执行结果提示了一个 ERROR,提示我们要删除的表并不存在,如果想避免报错,可以使用这种删除语法:
DROP TABLE IF EXISTS 表名;
然后再删除一下不存在的 first_table 表:
mysql> DROP TABLE IF EXISTS first_table;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql>
查看表结构
有时候我们可能忘记了自己定义的表的结构,可以使用下边这些语句来查看,它们起到的效果都是一样的:
DESCRIBE 表名;
DESC 表名;
EXPLAIN 表名;
SHOW COLUMNS FROM 表名;
SHOW FIELDS FROM 表名;
比如我们看一下 student_info 这个表的结构:
mysql> DESC student_info;
+-----------------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------------+------+-----+---------+-------+
| number | int(11) | YES | | NULL | |
| name | varchar(5) | YES | | NULL | |
| sex | enum('男','女') | YES | | NULL | |
| id_number | char(18) | YES | | NULL | |
| department | varchar(30) | YES | | NULL | |
| major | varchar(30) | YES | | NULL | |
| enrollment_time | date | YES | | NULL | |
+-----------------+-------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
mysql>
如果你看不惯这种以表格的形式展示各个列信息的方式,我们还可以使用下边这个语句来查看表结构:
SHOW CREATE TABLE 表名;
比如:
mysql> SHOW CREATE TABLE student_info;
+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| student_info | CREATE TABLE `student_info` (
`number` int(11) DEFAULT NULL,
`name` varchar(5) DEFAULT NULL,
`sex` enum('男','女') DEFAULT NULL,
`id_number` char(18) DEFAULT NULL,
`department` varchar(30) DEFAULT NULL,
`major` varchar(30) DEFAULT NULL,
`enrollment_time` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生基本信息表' |
+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
修改表
在表创建好之后如果对表的结构不满意,比如想增加或者删除一列,想修改某一列的数据类型或者属性,想对表名或者列名进行重命名,这些操作统统都算是修改表结构。MySQL
给我们提供了一系列修改表结构的语句。
修改表名
我们可以通过下边这两种方式来修改表的名称:
- 方式一
ALTER TABLE 旧表名 RENAME TO 新表名;
- 方式二
RENAME TABLE 旧表名 TO 新表名;
比如,我们想把 student_info
表的名称修改为 student_info_new
,那么我们可以使用下边这两种方式:
mysql> ALTER TABLE student_info RENAME TO student_info_new;
Query OK, 0 rows affected (0.00 sec)
增加列
我们可以使用下边的语句来增加表中的列:
ALTER TABLE 表名 ADD COLUMN 列名 数据类型 [列的属性];
比如我们向 first_table 里添加一个名叫 third_column 的列就可以这么写:
mysql> ALTER TABLE first_table ADD COLUMN third_column CHAR(4) ;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE first_table\G
*************************** 1. row ***************************
Table: first_table
Create Table: CREATE TABLE `first_table` (
`first_column` int(11) DEFAULT NULL,
`second_column` varchar(100) DEFAULT NULL,
`third_column` char(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='第一个表'
1 row in set (0.01 sec)
mysql>
增加列到指定的特定位置
默认的情况下列都是加到现有列的最后一列后面,我们也可以在添加列的时候指定它的位置,常用的方式如下:
- 添加到第一列:
ALTER TABLE 表名 ADD COLUMN 列名 列的类型 [列的属性] FIRST;
- 添加到指定列的后面:
ALTER TABLE 表名 ADD COLUMN 列名 列的类型 [列的属性] AFTER 指定列名;
比如,我们想向 first_table
表中添加一个 fourth_column
列,并且把它放到 first_column
列的后面,那么我们可以这么写:
mysql> ALTER TABLE first_table ADD COLUMN fourth_column CHAR(4) AFTER first_column;
Query OK, 0 rows affected (0.05 sec)
删除列
ALTER TABLE 表名 DROP COLUMN 列名;
比如,我们想删除 first_table
表中的 third_column
列,那么我们可以这么写:
mysql> ALTER TABLE first_table DROP COLUMN third_column;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE first_table DROP COLUMN fourth_column;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE first_table DROP COLUMN fifth_column;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE first_table\G
*************************** 1. row ***************************
Table: first_table
Create Table: CREATE TABLE `first_table` (
`first_column` int(11) DEFAULT NULL,
`second_column` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='第一个表'
1 row in set (0.00 sec)
mysql>
修改列的信息
- 方式一
ALTER TABLE 表名 MODIFY 列名 新数据类型 [新属性];
我们来修改一下 first_table 表的 second_column 列,把它的数据类型修改为 VARCHAR(2):
mysql> ALTER TABLE first_table MODIFY second_column VARCHAR(2);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE first_table\G
*************************** 1. row ***************************
Table: first_table
Create Table: CREATE TABLE `first_table` (
`first_column` int(11) DEFAULT NULL,
`second_column` varchar(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='第一个表'
1 row in set (0.00 sec)
mysql>
INFO
- 如果改完后新的列不能存储下原先的数据 比如 varchar(100)变成 varchar(2),那么就会直接报错
- 方式二
ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 [新属性];
我们也可以使用 CHANGE
关键字来修改列的信息,比如我们想把 first_table
表的 second_column
列修改为 third_column
列,并且把它的数据类型修改为 VARCHAR(2)
:
mysql> ALTER TABLE first_table CHANGE second_column second_column1 VARCHAR(2)
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE first_table\G
*************************** 1. row ***************************
Table: first_table
Create Table: CREATE TABLE `first_table` (
`first_column` int(11) DEFAULT NULL,
`second_column1` varchar(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='第一个表'
1 row in set (0.00 sec)
mysql>
修改列的排列位置
将列设为表的第一列
ALTER TABLE 表名 MODIFY 列名 列的类型 列的属性 FIRST;
- 举例
mysql> ALTER TABLE first_table MODIFY second_column1 VARCHAR(2) FIRST;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE first_table\G
*************************** 1. row ***************************
Table: first_table
Create Table: CREATE TABLE `first_table` (
`second_column1` varchar(2) DEFAULT NULL,
`first_column` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='第一个表'
1 row in set (0.00 sec)
mysql>
将列放到指定列的后边
语法
ALTER TABLE 表名 MODIFY 列名 列的类型 列的属性 AFTER 指定列名;
- 举例
mysql> ALTER TABLE first_table MODIFY second_column1 VARCHAR(2) AFTER first_column;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE first_table\G
*************************** 1. row ***************************
Table: first_table
Create Table: CREATE TABLE `first_table` (
`first_column` int(11) DEFAULT NULL,
`second_column1` varchar(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='第一个表'
1 row in set (0.00 sec)
mysql>
一条语句中包含多个修改操作
如果对同一个表有多个修改操作的话,我们可以把它们放到一条语句中执行,就像这样:
语法
ALTER TABLE 表名 操作1, 操作2, ..., 操作n;
- 举例
ALTER TABLE first_table DROP COLUMN third_column, DROP COLUMN fourth_column, DROP COLUMN fifth_column;