MySQL数据库:表及其表相关的操作

本篇我们就来介绍MySQL中表相关的操作

目录

表的组成要素

列定义(Schema)

行数据

表的元数据与物理属性

存储引擎

字符集与校对规则

索引

分区

表空间

表的类型

创建表

表达式

核心参数解析

修改表

表达式

核心参数解析

查看表

[查看表列表(SHOW TABLES)](#查看表列表(SHOW TABLES))

[查看表结构(DESCRIBE / SHOW COLUMNS)](#查看表结构(DESCRIBE / SHOW COLUMNS))

[查看创建表语句(SHOW CREATE TABLE)](#查看创建表语句(SHOW CREATE TABLE))

[查看表状态(SHOW TABLE STATUS)](#查看表状态(SHOW TABLE STATUS))

清空表

表达式

说明

简单示例

删除表

表达式

参数解析

简单示例


在MySQL这样的关系型数据库管理系统(RDBMS)中,表(Table) 是数据存储的核心逻辑单元,也是我们日常操作中最常打交道的对象

MySQL 遵循关系模型理论,表是"关系"的具体实现。从用户视角看,它是一个二维结构

行(Row):也称记录(Record),代表一个实体的具体实例。例如,一张员工表中的每一行对应一位具体的员工。

列(Column):也称字段(Field),代表实体的一种属性。例如,员工表中的"姓名"、"工号"、"部门"等列。

表的组成要素

列定义(Schema)

每一列都有明确的定义,包括:

  • 列名:在同一表中唯一,通常遵循小写加下划线的命名规范。

  • 数据类型 :规定该列能存储什么类型的值,如 INT(整数)、VARCHAR(n)(可变长字符串)、DATE(日期)、DECIMAL(精确小数)等。选择合适的数据类型对性能至关重要。

  • 约束(Constraints):对列的值施加规则,保证数据完整性。

    • NOT NULL:禁止空值。

    • DEFAULT:指定默认值。

    • PRIMARY KEY:主键,唯一标识一行。

    • UNIQUE:列值必须唯一。

    • FOREIGN KEY:外键,引用另一张表的主键,维护参照完整性。

    • CHECK:检查条件(MySQL 8.0+ 支持)。

  • 其他属性 :如 AUTO_INCREMENT(自动递增)、COMMENT(注释)等。

行数据

行是实际存储的数据记录。MySQL 将行数据按照表的定义格式存储在磁盘上(或内存中)。每行都有一个隐式的行ID(除非有主键),用于内部管理。

表的元数据与物理属性

除了列和行,表还拥有一系列元数据,控制其行为和物理存储。

存储引擎

MySQL 采用插件式存储引擎架构,表可以由不同的引擎管理。最常用的引擎是 InnoDB (默认),它支持事务、行级锁、外键和崩溃恢复。其他引擎如 MyISAM (不支持事务,表级锁,适合只读或日志型应用)、MEMORY (数据存于内存,速度快但易失)等。创建表时可通过 ENGINE=InnoDB 指定。

字符集与校对规则

表可以设置默认的字符集和校对规则,该设置将作为表中字符串类型列(如 CHAR, VARCHAR, TEXT)的默认值。例如:

sql 复制代码
CREATE TABLE t (name VARCHAR(50)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

索引

索引是提高查询效率的数据结构,与表紧密相关。MySQL 使用 B+树(InnoDB)或哈希(MEMORY)等结构实现索引。索引可以建在一列或多列上,有普通索引、唯一索引、全文索引、空间索引等类型。创建索引的语句:

sql 复制代码
CREATE INDEX idx_name ON t (name);

索引在逻辑上属于表,但在物理上与表数据分开存储(但 InnoDB 的聚簇索引将数据和主键索引存储在一起)。

分区

对于超大型表,MySQL 支持分区表,即将一张表的数据按规则(如范围、列表、哈希)分散存储在不同的物理分区中,但逻辑上仍是一张表。这有助于管理、备份和查询性能。

表空间

InnoDB 引擎将表数据和索引存储在表空间(tablespace)中。默认情况下,每张表对应一个独立的 .ibd 文件(独立表空间),也可以使用通用表空间。这是物理层面的概念,但对用户透明。

表的类型

普通表:永久存储数据的基础表。

临时表 :使用 CREATE TEMPORARY TABLE 创建,只在当前会话可见,会话结束自动删除,常用于复杂查询的中间结果存储。

派生表:查询中由子查询生成的虚拟表,仅存在于查询执行期间。

视图(View):虽然名字中有"表",但视图是虚拟表,不存储数据,只存储定义(SELECT 语句),对视图的查询会被重写为对基表的查询。

创建表

表达式

sql 复制代码
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition, ...)
    [table_options]
    [partition_options]
  • create_definition:列定义、索引、约束等。

  • table_options:表级选项,如引擎、字符集、注释等。

  • partition_options:分区选项(高级)。

核心参数解析

  • 列定义

    sql 复制代码
    col_name data_type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [COMMENT 'string']
    • data_type:如 INT, VARCHAR(50), DATE 等。

    • NOT NULL:不允许空值。

    • DEFAULT:指定默认值。

    • AUTO_INCREMENT:自动增长,通常用于主键。

    • COMMENT:列注释。

  • 约束

    • PRIMARY KEY (col1, col2):主键。

    • UNIQUE KEY (col):唯一约束。

    • FOREIGN KEY (col) REFERENCES parent_tbl (parent_col):外键(需 InnoDB)。

    • CHECK (expr):检查约束(MySQL 8.0+ 支持)。

  • 索引{INDEX | KEY} [index_name] (col_list),可加速查询。

  • 表选项

    • ENGINE = storage_engine:指定存储引擎,如 InnoDB(默认)、MyISAM

    • AUTO_INCREMENT = n:设置自增起始值。

    • DEFAULT [CHARACTER SET | CHARSET] = charset_name:默认字符集。

    • COLLATE = collation_name:默认校对规则。

    • COMMENT = 'string':表注释。

    • ROW_FORMAT = {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}:行格式。

  • 分区选项PARTITION BY ...,用于将大表分割为多个物理部分。

修改表

表达式

sql 复制代码
ALTER TABLE tbl_name
    [alter_option [, alter_option] ...]

其中 alter_option 可以是多种操作,如添加列、修改列、删除列、重命名表、修改表选项等。

核心参数解析

  • 添加列ADD [COLUMN] col_name definition [FIRST | AFTER col_name]

  • 删除列DROP [COLUMN] col_name

  • 修改列定义

    • MODIFY [COLUMN] col_name new_definition [FIRST | AFTER col_name](保留列名)

    • CHANGE [COLUMN] old_col_name new_col_name definition(可同时改名)

  • 重命名表RENAME [TO | AS] new_tbl_name

  • 添加/删除约束

    • ADD PRIMARY KEY (col_list)

    • DROP PRIMARY KEY

    • ADD FOREIGN KEY ...

    • DROP FOREIGN KEY fk_name

  • 添加/删除索引

    • ADD INDEX index_name (col_list)

    • DROP INDEX index_name

  • 修改表选项 :如 ENGINE=InnoDBAUTO_INCREMENT=100COMMENT 'new comment' 等。

  • 其他ENABLE/DISABLE KEYS(用于 MyISAM 批量插入优化),RENAME INDEX old_name TO new_name(MySQL 8.0+)等。

查看表

查看表列表(SHOW TABLES)

  • 表达式

    sql 复制代码
    SHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr]
  • 参数

    • FULL:显示表类型(BASE TABLE 或 VIEW)。

    • FROM:指定数据库,默认为当前库。

    • LIKE:模式匹配表名。

    • WHERE:条件过滤(MySQL 5.7.6+)。

  • 示例

    sql 复制代码
    SHOW TABLES FROM mydb LIKE 'emp%';

查看表结构(DESCRIBE / SHOW COLUMNS)

  • 表达式

    sql 复制代码
    {DESCRIBE | DESC} tbl_name [col_name | LIKE 'pattern']
    SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern' | WHERE expr]
  • 参数SHOW COLUMNS 支持 FULL 显示额外信息(如权限、注释)。

  • 示例

    sql 复制代码
    DESC employees;
    SHOW FULL COLUMNS FROM employees;

查看创建表语句(SHOW CREATE TABLE)

  • 表达式

    sql 复制代码
    SHOW CREATE TABLE tbl_name
  • 示例

    sql 复制代码
    SHOW CREATE TABLE employees\G 
    (\G 纵向显示,美观)

查看表状态(SHOW TABLE STATUS)

  • 表达式

    sql 复制代码
    SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern' | WHERE expr]
  • 参数:显示表的详细信息,如引擎、行数(近似)、数据长度、索引长度、创建时间等。

  • 示例

    sql 复制代码
    SHOW TABLE STATUS FROM mydb WHERE Name = 'employees';

清空表

表达式

sql 复制代码
TRUNCATE [TABLE] tbl_name

说明

  • 快速删除表中所有数据,并重置自增值(相当于 DROP + CREATE,但更快)。

  • 属于 DDL 操作,不可回滚。

  • 对于 InnoDB,如果是基于全局共享表空间,重置自增值;如果是独立表空间,效果类似。

简单示例

sql 复制代码
TRUNCATE TABLE employees;   -- 清空数据,表结构保留

删除表

表达式

sql 复制代码
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE]

参数解析

  • TEMPORARY:只删除临时表。

  • IF EXISTS:防止因表不存在而报错(会生成警告)。

  • RESTRICT | CASCADE:在 MySQL 中无实际效果(仅为语法兼容),可忽略。

简单示例

sql 复制代码
DROP TABLE IF EXISTS temp_employees;

本期内容介绍到这里了。

封面图自取:

相关推荐
ZTLJQ2 小时前
驾驭高并发:Python协程与 async/await 完全解析
服务器·数据库·python
百年੭ ᐕ)੭*⁾⁾2 小时前
DataFrame存入mysql以及读取操作
数据库·mysql·numpy·pandas·ipython
²º²²এ松2 小时前
vs code连接ubuntu esp项目
linux·数据库·ubuntu
四谎真好看2 小时前
Redis学习笔记(实战篇3)
redis·笔记·学习·学习笔记
Maverick062 小时前
02-SQL执行计划与优化器:Oracle是怎么决定“该怎么查“的
数据库·sql·oracle·ffmpeg
大傻^2 小时前
SpringAI2.0 向量存储生态:Redis、Amazon S3 与 Bedrock Knowledge Base 集成
数据库·人工智能·向量存储·springai
炽烈小老头2 小时前
【 每天学习一点算法 2026/03/19】子集
学习·算法
轩情吖2 小时前
MySQL之索引
android·数据库·mysql·b+树·索引·page·