十二创建和管理表

Posted Amo Xiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十二创建和管理表相关的知识,希望对你有一定的参考价值。

文章目录

前置知识:

一、数据库开发与实战专栏导学及数据库基础概念入门
二、MySQL 介绍及 MySQL 安装与配置
三、MySQL 数据库的基本操作
四、MySQL 存储引擎及数据类型
五、数据导入与基本的 SELECT 语句
六、MySQL 数据库练习题1(包含前5章练习题目及答案)
七、MySQL 多表查询详解(附练习题及答案----超详细)
八、MySQL 常用函数汇总(1)
九、MySQL 常用函数汇总(2)
十、MySQL 聚合函数、分组查询及过滤分组
十一、子查询详解

在对 mysql 数据表进行操作之前,必须首先使用 USE 语句选择数据库,才可在指定的数据库中对数据表进行操作,如创建数据表、查看表结构、修改表结构,以及重命名、复制或删除数据表等,否则无法对数据表进行操作。本文将对数据表的操作方法进行详细介绍,本文知识架构及重难点如下:

一、基础知识

1.1 一条数据存储的过程

存储数据是处理数据的第一步。 只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只能是一团乱麻,无从下手。那么,怎样才能把用户各种经营相关的、纷繁复杂的数据,有序、高效地存储起来呢? 在 MySQL 中, 一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据,如下图所示:

我们要先创建一个数据库,而不是直接创建数据表呢?因为从系统架构的层次上看,MySQL 数据库系统从大到小依次是 数据库服务器 、 数据库 、 数据表 、 数据表的 行与列 。MySQL 数据库服务器之前已经安装且创建数据库以及数据类型分别在 三、MySQL 数据库的基本操作四、MySQL 存储引擎及数据类型 两文中已经进行讲解,所以我们直接就从创建数据表开始。

1.2 标识符命名规则

  1. 数据库名、表名不得超过 30 个字符,变量名限制为 29
  2. 必须只能包含 A–Z、a–z、0–9、_63 个字符
  3. 数据库名、表名、字段名等对象名中间不要包含空格
  4. 同一个 MySQL 软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名。必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在 SQL 语句中使 用 `(着重号) 引起来
  5. 保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了

1.3 数据类型及数据库操作

https://blog.csdn.net/xw1680/article/details/128526435
https://blog.csdn.net/xw1680/article/details/128503229

注意:DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删旧库完成的。要操作表格和数据之前必须先说明是对哪个数据库进行操作,否则就要对所有对象加上 数据库名.
命令补充: 查看指定库下所有表 SHOW TABLES FROM 数据库名;

二、创建表

必须具备: CREATE TABLE 权限、存储空间。语法格式如下:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 数据表名
     [(create_definition,)][table_options] [select_statement]

CREATE TABLE 语句的参数说明如下表所示:

下面介绍列属性 create_definition 部分,每一列定义的具体格式如下:

属性 create_definition 的参数说明如下表所示:

以上是创建一个数据表的一些基础知识,看起来十分复杂,但在实际的应用中使用最基本的格式创建数据表即可,具体格式如下:

CREATE TABLE [IF NOT EXISTS] 表名(
	字段1, 数据类型 [约束条件] [默认值], 
	字段2, 数据类型 [约束条件] [默认值], 
	字段3, 数据类型 [约束条件] [默认值],
	……
	[表约束条件]
);

约束条件会在后续章节进行详细讲解,本文不进行过多赘述。加上了 IF NOT EXISTS 关键字,则表示:如果当前数据库中不存在要创建的数据表,则创建数据表; 如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表。

【示例1】使用CREATE TABLE语句在MySQL数据库db_admin中创建一个名为tb_admin的数据表,该表包括id、user、password和createtime等字段。

#如果不存在名称为db_admin的数据库,那么需要先创建该数据库
mysql> CREATE DATABASE db_admin;
Query OK, 1 row affected (0.01 sec)

#切换数据库
mysql> USE db_admin;
Database changed
mysql> #创建表
mysql> CREATE TABLE tb_admin(
    -> id INT AUTO_INCREMENT PRIMARY KEY,
    -> user VARCHAR(30) NOT NULL,
    -> password VARCHAR(30) NOT NULL,
    -> createtime DATETIME);
Query OK, 0 rows affected (0.03 sec)

创建表的 CREATE TABLE 语句还有另外一种语法结构:在一个已经存在的数据表的基础上创建该表的备份,也就是复制表。这种用法的语法格式如下:

参数说明如下:

  1. [IF NOT EXISTS]:可选项,如果使用该子句,表示当要创建的数据表名不存在时,才会创建。如果不使用该子句,当要创建的数据表名存在时,将出现错误。
  2. 数据表名:表示新创建的数据表的名称,该数据表名必须是在当前数据库中不存在的表名。
  3. LIKE源数据表名|(LIKE源数据表名):必选项,用于指定依照哪个数据表来创建新表,也就是要为哪个数据表创建副本。

说明: 使用该语法复制数据表时,将创建一个与源数据表结构相同的新表,源数据表的列名、数据类型和索引都将被复制,但是表的内容不会复制。因此,新创建的表是一个空表。如果想要复制表中的内容,可以通过使用 AS(查询表达式)子句 来实现。

【示例2】根据employees表分别创建emp1与emp2表。

#补充: 创建表 tb_admin_new
mysql> SELECT * FROM tb_admin;
+----+----------+-----------+---------------------+
| id | username | password  | createtime          |
+----+----------+-----------+---------------------+
|  1 | Amo      | 123456 | 2023-01-25 00:00:00 |
+----+----------+-----------+---------------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE tb_admin_new LIKE tb_admin;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM tb_admin_new;
Empty set (0.00 sec)

mysql> USE mysql_study;
Database changed
mysql> CREATE TABLE emp1 AS SELECT * FROM employees;
Query OK, 107 rows affected, 2 warnings (0.01 sec)
Records: 107  Duplicates: 0  Warnings: 2

mysql> CREATE TABLE emp2 AS SELECT * FROM employees WHERE 1=2;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 2
#查看当前数据库下所有的表
mysql> SHOW TABLES;

三、查看表结构

对于一个创建成功的数据表,可以使用 SHOW COLUMNSDESCRIBE 语句查看指定数据表的表结构。下面分别对这两个语句进行介绍。

3.1 使用 SHOW COLUMNS 语句查看

MySQL 中,使用 SHOW COLUMNS 语句可以查看表结构,SHOW COLUMNS 语句的基本语法格式如下:

SHOW [FULL] COLUMNS FROM 数据表名 [FROM 数据库名];
SHOW [FULL] COLUMNS FROM 数据库名.数据表名;

【示例3】使用SHOW COLUMNS语句查看数据表tb_admin的结构。

mysql> SHOW COLUMNS FROM tb_admin FROM db_admin;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int         | NO   | PRI | NULL    | auto_increment |
| user       | varchar(30) | NO   |     | NULL    |                |
| password   | varchar(30) | NO   |     | NULL    |                |
| createtime | datetime    | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

其中,各个字段的含义分别解释如下:

  1. Null:表示该列是否可以存储 NULL 值。
  2. Key:表示该列是否已编制索引。PRI 表示该列是表主键的一部分;UNI 表示该列是 UNIQUE 索引的一部分;MUL 表示在列中某个给定值允许出现多次。
  3. Default:表示该列是否有默认值,若有的话指定值是多少。
  4. Extra:表示可以获取的与给定列有关的附加信息,例如 AUTO_INCREMENT 等。

【示例4】使用SHOW FULL COLUMNS语句查看数据表tb_admin的结构。如下图所示:

3.2 使用 DESCRIBE 语句查看

MySQL 中,还可以使用 DESCRIBE 语句查看数据表结构。DESCRIBE 语句的基本语法格式如下:

DESCRIBE 数据表名;#DESCRIBE可以简写成DESC

在查看表结构时,也可以只列出某一列的信息。其语法格式如下:

DESCRIBE 数据表名 列名;

【示例5】使用DESCRIBE语句的简写形式查看数据表tb_admin中的某一列信息。

mysql> USE db_admin;
Database changed
mysql> DESC tb_admin user;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| user  | varchar(30) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

3.3 查看表详细结构语句 SHOW CREATE TABLE

SHOW CREATE TABLE 语句可以用来显示创建表时的 CREATE TABLE 语句,语法格式如下:

SHOW CREATE TABLE <表名\\G>;

提示: 使用 SHOW CREATE TABLE 语句,不仅可以查看表创建时候的详细语句,还可以查看存储引擎和字符编码。如果不加 \\G 参数,显示的结果可能非常混乱,加上参数 \\G 之后,可使显示结果更加直观,易于查看。

【示例6】使用SHOW CREATE TABLE查看表tb_admin的详细信息,SQL语句如下:

mysql> SHOW CREATE TABLE tb_admin\\G;
*************************** 1. row ***************************
       Table: tb_admin
Create Table: CREATE TABLE `tb_admin` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user` varchar(30) NOT NULL,
  `password` varchar(30) NOT NULL,
  `createtime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

四、修改表结构

修改表结构指增加或者删除字段、修改字段名/类型以及修改表名等,可以使用 ALTER TABLE 语句实现,语法如下:

ALTER [IGNORE] TABLE 数据表名 alter_spec[,alter_spec]|  table_options

参数说明如下:

  1. [IGNORE]:可选项,表示如果出现重复关键的行,则只执行一行,其他重复的行被删除。
  2. 数据表名:用于指定要修改的数据表的名称。
  3. alter_spec 子句:用于定义要修改的内容,其语法格式如下:

    上面的语法中,各参数说明如下:
    ① create_definition:用于定义列的数据类型和属性,与第二节CREATE TABLE语句中的语法相同。
    ② [FIRST | AFTER column_name ]:用于指定位于哪个字段的前面或者后面,使用FIRST关键字时,表示位于指定字段的前面;
    使用AFTER关键字时,表示位于指定字段的后面。其中的column_name表示字段名。
    ③ [index_name]:可选项,用于指定索引名。
    ④ (index_col_name,...):用于指定索引列名。
    ⑤ SET DEFAULT literal | DROP DEFAULT子句:为字段设置或者删除默认值。其中literal参数为要设置的默认值。
    ⑥ old_col_name:用于指定要修改的字段名。
    ⑦ new_tbl_name:用于指定新的表名。
    
  4. table_options:用于指定表的一些特性参数,其中大多数选项涉及的是表数据如何存储及存储在何处,如 ENGINE 选项用于定义表的存储引擎。多数情况下,用户不必指定表选项。

说明: ALTER TABLE 语句允许指定多个动作,其动作间使用逗号分隔,每个动作表示对表的一个修改。

4.1 添加新字段和修改字段定义

MySQLALTER TABLE 语句中,可以通过使用 ADD [COLUMN] create_definition [FIRST |AFTER column_name ] 子句来添加新字段;使用 MODIFY [COLUMN] create_definition 子句修改已定义字段的定义。下面将通过一个具体实例演示如何为一个已有表添加新字段,并修改已有字段的定义。
【示例7】添加一个新的字段email,类型为varchar(50),not null;将字段user的类型由varchar(30)改为varchar(40)。

mysql> USE db_admin;
Database changed
mysql> DESC tb_admin;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int         | NO   | PRI | NULL    | auto_increment |
| user       | varchar(30) | NO   |     | NULL    |                |
| password   | varchar(30) | NO   |     | NULL    |                |
| createtime | datetime    | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> ALTER TABLE tb_admin ADD email VARCHAR(50) NOT NULL;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE tb_admin MODIFY user VARCHAR(40);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

#或者
ALTER TABLE tb_admin ADD email VARCHAR(50) NOT NULL, MODIFY user VARCHAR(40);
mysql> DESC tb_admin;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int         | NO   | PRI | NULL    | auto_increment |
| user       | varchar(40) | YES  |     | NULL    |                |
| password   | varchar(30) | NO   |     | NULL    |                |
| createtime | datetime    | YES  |     | NULL    |                |
| email      | varchar(50) | NO   |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

补充:在表的第一列添加一个字段以及在表的指定列之后添加一个字段。

mysql> DESC tb_admin;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int         | NO   | PRI | NULL    | auto_increment |
| username   | varchar(40) | YES  |     | NULL    |                |
| password   | varchar(30) | NO   |     | NULL    |                |
| createtime | datetime    | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> ALTER TABLE tb_admin ADD first_column INT FIRST;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE tb_admin ADD after_column INT AFTER username;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC tb_admin;
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| first_column | int         | YES  |     | NULL    |                |
| id           | int         | NO   | PRI | NULL    | auto_increment |
| username     | varchar(40) | YES  |     | NULL    |                |
| after_column | int         | YES  |     | NULL    |                |
| password     | varchar(30) | NO   |     | NULL    |                |
| createtime   | datetime    | YES  |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

4.2 修改字段名/类型

MySQLALTER TABLE 语句中,使用 CHANGE [COLUMN] old_col_name create_definition 子句可以修改字段名或者字段类型。【示例8】将数据表tb_admin的字段名user修改为username。

mysql> DESC tb_admin;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int         | NO   | PRI | NULL    | auto_increment |
| user       | varchar(50) | YES  |     | NULL    |                |
| password   | varchar(30) | NO   |     | NULL    |                |
| createtime | datetime    | YES  |     | NULL    |                |
| email      | varchar(50) | NO   |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> ALTER TABLE tb_admin CHANGE COLUMN user username VARCHAR(40) NULL DEFAULT NULL;
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> DESC tb_admin;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int         | NO   | PRI | NULL    | auto_increment |
| username   | varchar(40) | YES  |     | NULL    |                |
实验十二:表空间管理与维护

Mysql数据库理论基础之十二 ---- 备份与还原

python之路十二

五十二.用户配额管理 云主机类型管理 镜像管理 网络管理 案例和实例管理 安装额外计算节点

SQL教程

管理心得之六十二浅谈“项目状态会议”