SQL笔记(2)——MySQL的表操作与索引(收藏吃灰版)

news2025/6/19 10:57:11

本文详细记录如何通过命令的方式修改MySQL的表结构,例如新增列、删除列等;不止学会了,你还学懂了,收藏吃灰~

  • 开始之前

    上一篇文章创建了一些表,ER图如下。本文针对score表进行操作,场景就是新增一个备注remarks字段,数据类型为varchar,长度1000,允许为null,默认值为

    测试表er图

查看表结构

查看MySQL数据库中特定表的详细设计信息,可以使用DESCRIBE命令,该命令可以显示出表中所有列的名称、数据类型、默认值、空值约束、键约束等信息。例如:

  • 查看score表的结构
mysql> describe score;
+------------+--------+------+-----+---------+----------------+
| Field      | Type   | Null | Key | Default | Extra          |
+------------+--------+------+-----+---------+----------------+
| id         | int    | NO   | PRI | NULL    | auto_increment |
| student_id | int    | NO   | MUL | NULL    |                |
| course_id  | int    | NO   | MUL | NULL    |                |
| score      | double | NO   |     | NULL    |                |
+------------+--------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

输入命令describe score;便能显示出score表的所有字段,以及每个字段对应的名称、数据类型、默认值、空值约束、键约束等信息;

这里 Key为MUL主要是因为这两个字段有外键约束,约束其与另一个表的对应字段要对应;

  • 查看某个表的某一列的结构
mysql> describe score id;
+-------+------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra          |
+-------+------+------+-----+---------+----------------+
| id    | int  | NO   | PRI | NULL    | auto_increment |
+-------+------+------+-----+---------+----------------+
1 row in set (0.00 sec)

输入describe score id;即可查看score表的id列的结构信息;用法就是describe 表名 列名;

这里也可以使用show columns的方式来查看结构

查看某个表结构:SHOW COLUMNS FROM table_name;

查看某个表某个字段结构:SHOW COLUMNS FROM table_name LIKE 'column_name';

增加列

接上文的场景,给score表新增一个备注remarks字段,数据类型为varchar,长度1000,允许为null,默认值为

mysql> ALTER TABLE score ADD remarks VARCHAR(1000) NULL DEFAULT '无';
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

上面的命令就完成了数据列的插入;下面查看新增列之后的表结构:

mysql> describe score;
+------------+---------------+------+-----+---------+----------------+
| Field      | Type          | Null | Key | Default | Extra          |
+------------+---------------+------+-----+---------+----------------+
| id         | int           | NO   | PRI | NULL    | auto_increment |
| student_id | int           | NO   | MUL | NULL    |                |
| course_id  | int           | NO   | MUL | NULL    |                |
| score      | double        | NO   |     | NULL    |                |
| remarks    | varchar(1000) | YES  |     | 无      |                |
+------------+---------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

如上就完成了我们的场景需求;

其中新增命令中,ALTER TABLE用于修改表结构,score是要修改的表名,ADD remarks表示添加一个名为remarks的列,VARCHAR(1000)表示数据类型为varchar,长度为1000NULL表示该列允许为nullDEFAULT '无'表示默认值为

修改列

这里以修改备注列的值不允许为空,默认值为空备注为场景;

mysql> alter table score modify column remarks varchar(1000) not null default '无备注';
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

使用alter table score modify column remarks varchar(1000) not null default '无备注';即可以完成我们的需求,改变后的结构:

mysql> describe score;
+------------+---------------+------+-----+-----------+----------------+
| Field      | Type          | Null | Key | Default   | Extra          |
+------------+---------------+------+-----+-----------+----------------+
| id         | int           | NO   | PRI | NULL      | auto_increment |
| student_id | int           | NO   | MUL | NULL      |                |
| course_id  | int           | NO   | MUL | NULL      |                |
| score      | double        | NO   |     | NULL      |                |
| remarks    | varchar(1000) | NO   |     | 无备注    |                |
+------------+---------------+------+-----+-----------+----------------+
5 rows in set (0.00 sec)

命令格式:ALTER TABLE table_name MODIFY COLUMN column_name column_type NOT NULL DEFAULT '默认值';

table_name表示需要修改的表名,column_name表示需要修改的列名,column_type表示该列原有的数据类型,NOT NULL表示设置该列为非空约束,DEFAULT '默认值'表示设置该列的默认值为默认值

注意column_type是必须的。在SQL中,修改表中某一列的数据类型是一个重要的操作,因为数据类型决定了该列可以存储的数据种类和范围。如果不指定数据类型,MySQL无法解析该语句,就会出现错误:

mysql> alter table score modify column remarks not null default '无备注';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'not null default '无备注'' at line 1

重命名列

这里将remarks重命名为new_remarks;

mysql> alter table score rename column remarks TO new_remarks;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

效果:

mysql> describe score;
+-------------+---------------+------+-----+-----------+----------------+
| Field       | Type          | Null | Key | Default   | Extra          |
+-------------+---------------+------+-----+-----------+----------------+
| id          | int           | NO   | PRI | NULL      | auto_increment |
| student_id  | int           | NO   | MUL | NULL      |                |
| course_id   | int           | NO   | MUL | NULL      |                |
| score       | double        | NO   |     | NULL      |                |
| new_remarks | varchar(1000) | NO   |     | 无备注    |                |
+-------------+---------------+------+-----+-----------+----------------+
5 rows in set (0.01 sec)

命令用法:ALTER TABLE table_name RENAME COLUMN old_column_name TO new_column_name;

table_name表示需要操作的表名,old_column_name是需要被重命名的列名,new_column_name是新的列名,关键字是RENAME

更改列的位置

这个场景很简单,就是改变备注列的位置,但是由于SQL语法的原因,需要区别一下的是,移到某列后面或移到表开始列命令是不一样的;

mysql> ALTER TABLE score MODIFY COLUMN new_remarks varchar(1000) AFTER student_id;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

这是移动到某列之后的命令,效果如下:

mysql> describe score;
+-------------+---------------+------+-----+---------+----------------+
| Field       | Type          | Null | Key | Default | Extra          |
+-------------+---------------+------+-----+---------+----------------+
| id          | int           | NO   | PRI | NULL    | auto_increment |
| student_id  | int           | NO   | MUL | NULL    |                |
| new_remarks | varchar(1000) | YES  |     | NULL    |                |
| course_id   | int           | NO   | MUL | NULL    |                |
| score       | double        | NO   |     | NULL    |                |
+-------------+---------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

下面是移动到表头的命令:

mysql> alter table score modify column new_remarks varchar(1000) first;
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0

移动之后的效果:

mysql> describe score;
+-------------+---------------+------+-----+---------+----------------+
| Field       | Type          | Null | Key | Default | Extra          |
+-------------+---------------+------+-----+---------+----------------+
| new_remarks | varchar(1000) | YES  |     | NULL    |                |
| id          | int           | NO   | PRI | NULL    | auto_increment |
| student_id  | int           | NO   | MUL | NULL    |                |
| course_id   | int           | NO   | MUL | NULL    |                |
| score       | double        | NO   |     | NULL    |                |
+-------------+---------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)
  • 移动到某列后的命令:ALTER TABLE table_name MODIFY COLUMN column_name column_definition AFTER other_column_name;

    table_name表示需要操作的表名,column_name表示需要被更改位置的列名,column_definition表示列定义,可以包括数据类型、默认值等信息,AFTER关键字后面是该列需要被放置在哪个列的后面,other_column_name是其他列的列名。

  • 移到最开始:ALTER TABLE table_name MODIFY COLUMN column_name column_definition FIRST;

    table_name 是需要操作的表名,column_name 是需要移动的列名,column_definition 是该列的定义,FIRST 表示该列将被移动到表格的最开头位置。

注意

  1. 在使用 ALTER TABLE 命令修改列时,如果省略了数据类型,会报错,因为必须指定新的数据类型。也就是上面的命令不能省略varchar(1000)字段;
  2. 在 MySQL 中,LAST 并不是一个合法的关键字,会导致语法错误。要将列移动到表的最后位置,可以使用 AFTER 关键字指定该列所要移动到的列的名字。也就是:alter table score modify column new_remarks varchar(1000) LAST;是错误的语句!

删除列

这里我们将新建的备注字段删除掉:

mysql> alter table score drop column new_remarks;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

删除后就恢复了最初的效果:

mysql> describe score;
+------------+--------+------+-----+---------+----------------+
| Field      | Type   | Null | Key | Default | Extra          |
+------------+--------+------+-----+---------+----------------+
| id         | int    | NO   | PRI | NULL    | auto_increment |
| student_id | int    | NO   | MUL | NULL    |                |
| course_id  | int    | NO   | MUL | NULL    |                |
| score      | double | NO   |     | NULL    |                |
+------------+--------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

我们使用了 DROP COLUMN 子句来指示删除该列。请注意,这会永久性地从表中删除该列!

Q&A

表结构中的Extra是什么意思

MySQL表结构中的Extra字段是用于显示额外的信息和注释,该字段提供了一些重要的信息,例如自增、默认值、主键信息等。它可以告诉用户更多关于该列的信息,帮助用户更好地理解该列的作用和用途。

常见的Extra字段的取值包括:

  • auto_increment:表示该列是自增主键。
  • on update CURRENT_TIMESTAMP:表示该列设置了自动更新时间戳功能。
  • DEFAULT ‘xxx’:表示该列设置了默认值为xxx。

表结构的key代表什么

  • PRI:表示该列是主键,主键是一种特殊的索引,用于唯一标识表中的每一行数据。每个表最多只能有一个主键,主键限制表中的数据不能重复,并且不能为NULL。
  • MUL:非唯一索引,该索引包括多个重复的键值时,Key属性值就会显示为mul
  • UNI: 表示该列是唯一键。唯一键也可以用于唯一标识表中的每一行数据,但是它允许NULL值。一个表可以有多个唯一键。
  • FULLTEXT: 表示该列是全文索引。全文索引用于优化全文搜索,例如对文章标题和正文进行关键字搜索。一个表最多只能有一个全文索引。
  • ``(空): 表示该列既不是主键,也不是唯一键。

例如,当使用DESCRIBE命令查看一个名为students的表时,可能会得到以下输出:

mysql> DESCRIBE students;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| name     | varchar(50) | YES  |     | NULL    |       |
| gender   | char(1)     | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| email    | varchar(80) | YES  | UNI | NULL    |       |
| address  | varchar(100)| YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

其中,id列的KeyPRI,表示它是主键;email列的KeyUNI,表示它是唯一键;其他列的Key""(空),表示它们既不是主键,也不是唯一键。

什么是索引

MySQL索引是一种帮助MySQL快速获取数据的数据结构,就像是书的目录一样可以快速访问特定信息。它可以提高数据库查询的速度,基本原理是使用空间换取时间,将索引存储在磁盘上的文件中以加快读写速度。使用索引可以对表中的一列或多列的值进行排序,从而快速访问表中的特定信息。索引的实现依赖于数据库的存储引擎和数据检索引擎的设计,因此选用合适的数据结构能够提高数据检索性能,并且对于大规模数据存储的数据库而言,选择合适的高效查找算法是非常重要的。

  • 主键索引:索引列中的值必须是唯一的,不允许有空值。
  • 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。
  • 唯一索引:索引列中的值必须是唯一的,但是允许为空值。
  • 全文索引:只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。 MyISAM和InnoDB中都可以使用全文索引。
  • 空间索引:MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。
  • 前缀索引:在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。
  • 其他(按照索引列数量分类)
    • 单列索引
    • 组合索引:组合索引的使用,需要遵循最左前缀匹配原则(最左匹配原则)。一般情况下在条件允许的情况下使用组合索引替代多个单列索引使用。

如何查看某个表中的索引

SHOW INDEX FROM score;

image-20230414164537667

下面是这些字段的解释:

  1. Table:索引所在的表名。
  2. Non_unique:该索引是否允许出现重复值,0表示唯一索引,1表示允许重复值。
  3. Key_name:索引的名称。
  4. Seq_in_index:索引中该列的顺序,从1开始。
  5. Column_name:索引中包含的列名。
  6. Collation:对该列使用的字符集排序规则,如果该列不在任何索引中,则为NULL。
  7. Cardinality:索引中唯一值的数量估计,不一定准确。
  8. Sub_part:如果是前缀索引,则表示被索引字符串的长度,否则为NULL。
  9. Packed:如果是PACK_KEYS索引类型,则表示使用的压缩率,否则为NULL。
  10. Null:该列是否允许NULL值,如果允许,则为YES,否则为NO。
  11. Index_type:索引类型,例如Btree、Hash等。
  12. Comment:索引的注释。
  13. Index_comment:索引注释的字符集和排序规则。
  14. Visible:该索引是否可见,0表示隐藏,1表示可见。
  15. Expression:如果该索引是函数或表达式的结果,则为表达式或函数名,否则为NULL。

如何查看某个表的约束

mysql> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE
    -> FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    -> WHERE TABLE_SCHEMA = 'student_score_db' and table_name='score';
+------------------+-----------------+
| CONSTRAINT_NAME  | CONSTRAINT_TYPE |
+------------------+-----------------+
| PRIMARY          | PRIMARY KEY     |
| fk_score_course  | FOREIGN KEY     |
| fk_score_student | FOREIGN KEY     |
+------------------+-----------------+
3 rows in set (0.00 sec)

上述SQL语句将会返回给定表的所有约束名称和类型,例如PRIMARY KEY、FOREIGN KEY、UNIQUE等。如果要查看特定约束的详细信息(例如包含的列),可以使用INFORMATION_SCHEMA.KEY_COLUMN_USAGE表进行查询。


原文链接:https://blog.jiumoz.com/archives/sql-bi-ji-2mysql-de-biao-cao-zuo-yu-suo-yin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化测试面试一周拿到3个offer,只因为我记下了这个文档

目录 一、接口测试基础 二、 接口测试工具 三、自动化测试 四、自动化测试工具 五、总结 一、接口测试基础 1、公司接口测试流程是什么? 从开发那边获取接口设计文档、分析接口并进行用例设计、并提前录入到接口测试工具 jmeter,等开发那边进行…

客户关系管理小程序实战教程01-需求分析

日常企业经常需要在网上拓展业务,通过互联网工具来宣传自己的产品。用户在看到企业宣传的内容后,如果有需要就会通过各种方式联系到企业。 为了方便的跟踪这些销售的机会,我们开发一款企业内部销售团队使用的小程序,便于管理潜在…

Win11的两个实用技巧系列之磁盘分区后再恢复的方法、调高进程的优先级方法

Win11磁盘分区后怎么恢复到分区前?Win11磁盘分区后在恢复的方法 很多人不知道win11磁盘分区怎么恢复回去?今日为你们带来的文章是win11磁盘分区的恢复方法,还有不清楚小伙伴和小编一起去学习一下吧 有不少小伙伴在使用电脑的时候经常会根据自身需求对其进行磁盘的…

【CSS】轮播图案例开发 ( 基本设置 | 子绝父相 | 浏览器水平居中 | 圆角设置 | 绝对定位居中设置 )

文章目录一、开发要点1、基本设置 - 取消默认内外边距 / 取消基本样式 / 图片自适应2、外层父容器设置 - 子绝父相 / 盒子浏览器水平居中 / 设置圆角 / 设置溢出隐藏3、左右按钮设置 - 绝对定位垂直居中设置 / 使用圆角矩形设置半圆 / 文字垂直居中4、底部小圆点设置 - 绝对定位…

Web_python_template_injection(Python模块注入)

打开链接,提示是Python的模块注入 我们先了解一些基本概念: 模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这大大提升了开发效率,良好的设计也使得代码重用变得更加容…

智慧停车场解决方案,停车场导航技术怎么实现

停车场导航技术怎么实现?随着城市化的不断发展,停车场建的越来越大,同时也越来越复杂,停车、找车成为很多人感到十分头疼的问题。在这种情况下,一个高效的停车场电子地图应用已经成为城市交通管理中不可缺少的组成部分…

架构设计三原则

作为程序员,很多人都希望成为一名架构师,但并非简单地通过编程技能就能够达成这一目标。事实上,优秀的程序员和架构师之间存在一个明显的鸿沟——不确定性。 编程的本质是确定性的,也就是说,对于同一段代码&#xff0c…

【Java虚拟机】JVM类加载机制和双亲委派模型

文章目录1.JVM虚拟机类加载子系统2.双亲委派机制和JDK9模块化系统3.ClassLoader源码解读和自定义类加载器场景4.自定义ClassLoader类加载器案例实战5.不同类加载器加载同个class类1.JVM虚拟机类加载子系统 (1)什么是类加载子系统 是Java虚拟机的一个重…

MinIO基础教程

MinIO 1.MinIO安装 Minio 是个基于 Golang 编写的开源对象存储服务,存储非结构化数据,如:图片,视频,音乐等 官网地址:https://min.io/ 中文地址:http://minio.org.cn 官网文档( …

【LeetCode: 300. 最长递增子序列 | 暴力递归=>记忆化搜索=>动态规划】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【Vue】收集表单数据 过滤器

收集表单数据 收集表单数据&#xff1a; 若&#xff1a;<input type"text"/>,则v-model收集的是value值&#xff0c;用户输入的就是value值若&#xff1a;<input type"radio"/>,则v-model收集的是value值&#xff0c;且要给标签配置value值若…

树莓派与STM32(rt1064)串口通信

目录 一、树莓派通信 1、硬件连线准备 2、安装Serial和打开树莓派串口 2.1安装Serial 2.2打开树莓派串口 2.3修改串口映射关系 3、树莓派代码 4、上位机 5、运行uart.py代码进行测试 5.1 树莓派发送&#xff0c;上位机接收 5.2上位机发送&#xff0c;树莓派接收 二、…

HopeHomi脚手架(四)redis、redisson模块

项目结构 Redis RedisSpiModuleImport 基于SPI。在项目启动的时候返回待加载类名 public class RedisSpiModuleImport implements SpiEnvironmentModuleImport {Overridepublic String[] readyImportClassName() {return new String[]{RedisConfiguration.class.getName()};…

裸机配置Java环境,解决 -bash: jps: command not found

目录 配置JDK 1、第一步&#xff1a;使用yum命令查找JDK 2、第二步&#xff1a;执行安装命令 3、第三步&#xff1a;验证是否安装成功 4、第四步&#xff1a;验证是否可用 5、第五步&#xff1a;安装开发环境 6、第六步&#xff1a;配置环境变量 今天申请了公司的开发机器&…

【openGauss实战10】备份与恢复

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

视觉SLAM ch12 建图(RGB-D)

一、RGB-D稠密建图 RGB-D相机通结构光和飞行时间获取深度。 稠密重建方法&#xff1a;根据估计的相机位姿&#xff0c;将RGB-D数据转化为点云&#xff0c;然后进行拼接&#xff0c;最终得到由离散的点组成的点云地图。 在此基础上&#xff0c;如果希望估计物体的表面&#x…

Python 实验二 Python语言基础

1.运用输入输出函数编写程序&#xff0c;将华氏温度转换成摄氏温度。换算公式&#xff1a;C(F-32)*5/9,其中 C为摄氏温度&#xff0c;F为华氏温度。 Ffloat(input("请输入你要转换的华氏温度&#xff1a;")) C(F-32)*5/9 print("转换为摄氏温度为&#xff1a;&…

opencv:介绍 SIFT(尺度不变特征变换)及其使用(一)

在本章中 我们将了解 SIFT 算法的概念 我们将学习如何找到 SIFT 关键点和描述符。 理论 在过去的几章中,我们了解了一些角点检测器,如 Harris 等。它们具有旋转不变性,这意味着即使图像旋转,我们也可以找到相同的角点。这是显而易见的,因为旋转后的图像中的角点仍然是角点…

Cairo 1 实战入门:编写测试部署ERC-20代币智能合约

概述 读者可以前往 我的博客 获得更好的阅读体验。 Cairo 是 ZK Rollup 的领域专用语言&#xff0c;目前仅用于 StarkNet 项目。随着 Rollup 叙事的发展&#xff0c;我们认为 cairo 在未来一定会成为智能合约开发的核心语言。 本文类似我之前编写的 Foundry教程&#xff1a;…

BART模型简单介绍

目录 一、概要 二、深入扩展 2.1 预训练任务 2.2 模型精调 一、概要 BART&#xff08;Bidirectional and Auto-Regressive Transformers&#xff09;模型使用标准的基于Transformer的序列到序列结构&#xff0c;主要区别在于用GeLU&#xff08;Gaussian Error Linerar Units…