MySQL_DDL的基本命令

DDL (Data Definition Language) :定义数据语言,用于定义数据库对象。其中有数据库、表、列、索引的操作。

注意:在下面的介绍中的 代表者可有可无意思。

like 就是通配符 只有两个 % 和 _

%:匹配任意零个或多个字符

_:匹配任意单个字符

在下面会介绍具体的用法

数据库的操作

查看数据库

查看数据库

复制代码
show databases [like 条件]; #注意有s,必须以分号结尾(类似C语言)
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb1_test         |
| mydb2_stuinfo      |
| mydb3_employee     |
| mydb4_product      |
| mydb5_sales        |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
​
这条SQL从英语的角度来记忆会相对轻松,show 展示 databases 数据库(数据库中不止有一个数据库所以要加s表示复数)。
​
在这里我介绍一下 like的用法。
比如我想查找数据库名称中存在s的数据库
show databases like "%s%";
+--------------------+
| Database (%s%)     |
+--------------------+
| information_schema |
| mydb1_test         |
| mydb2_stuinfo      |
| mydb5_sales        |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
​
比如我想查找数据库名称只有三个字母的数据库。
show databases like "___";
+----------------+
| Database (___) |
+----------------+
| sys            |
+----------------+
​
    %一般用于模糊查找,十分类似于LINUx中的grep。
    _一般用于长度查找,也就是有几个下划线就会出现相对应的长度的名称。
​

查看当前数据库的时间

复制代码
select now();
+---------------------+
| now()               |
+---------------------+
| 2026-10-29 14:50:19 |
​
select 在英语中是选择的意思,在数据库中是查看具体某一个数据库对象里的具体内容
注意是某一个
​
show 是用于查看多个对象 所以show 展示的内容一般要加s
select 是用于查看数据库对象里的具体内容

查看数据库的版本

复制代码
 select version();
+-----------+
| version() |
+-----------+
| 8.0.45    |
+-----------+
​

查看当前登录的用户及主机名

复制代码
select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
​

创建数据库

语法

复制代码
create database 数据库名;

示例

复制代码
create database te;
Query OK, 1 row affected (0.00 sec)
​
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb1_test         |
| mydb2_stuinfo      |
| mydb3_employee     |
| mydb4_product      |
| mydb5_sales        |
| mysql              |
| performance_schema |
| sys                |
| te                 |
+--------------------+

查看创建数据库的语句

复制代码
show create database 数据库名;
​
show create database te;
+----------+------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                                              |
+----------+------------------------------------------------------------------------------------------------------------------------------+
| te       | CREATE DATABASE `te` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
​
​
由于内容太长所以出现了折行显示
可以在语句末尾加上\G 来改善这一情况
​
 show create database te\G
*************************** 1. row ***************************
       Database: te
Create Database: CREATE DATABASE `te` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */
1 row in set (0.00 sec)
​

Mysql的反引号

复制代码
在MySQL中是不能使用关键字来作为名称的,但可通过``反引号可以解决这个问题(虽然可以但是也不建议使用)。
​
mysql> create database database;
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 'database' at line 1
mysql> create database `database`;
Query OK, 1 row affected (0.00 sec)
​
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| database           |
| information_schema |
| mydb1_test         |
| mydb2_stuinfo      |
| mydb3_employee     |
| mydb4_product      |
| mydb5_sales        |
| mysql              |
| performance_schema |
| sys                |
| te                 |
+--------------------+
11 rows in set (0.00 sec)

切换数据库

查看当前使用的数据库

复制代码
select database();
​
+------------+
| database() |
+------------+
| NULL       |
+------------+
​

选择数据库

复制代码
use 数据库名;
​
mysql> use te;
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| te         |
+------------+
1 row in set (0.00 sec)
​
​

删除数据库

  • 语法
复制代码
drop database 数据库名;
  • 示例
复制代码
drop database `database`;
Query OK, 0 rows affected (0.00 sec)
​

表的操作

数据类型

  • 整型
类型 说明 存储空间
TINYINT 极小整数,范围 -128 ~ 127(无符号 0~255) 1 字节
SMALLINT 小整数,范围 -32768 ~ 32767(无符号 0~65535) 2 字节
MEDIUMINT 中等整数,范围 -8388608 ~ 8388607 3 字节
INT/ INTEGER 普通整数,范围约 ±21亿(无符号更大) 4 字节
BIGINT 大整数,范围非常大 8 字节
FLOAT(M,D) 单精度浮点数,M总位数,D小数位 4 字节
DOUBLE(M,D)/ REAL 双精度浮点数 8 字节
DECIMAL(M,D)/ NUMERIC 定点数,精确存储,适合金额 M+2 字节

创建表

  • 语法
复制代码
create table [if not exists] 表明 (表选项);
​
表选项:列名1 列类型1 [约束]... 列明n 列类型n [约束]
约束会在之后介绍
​
[if not exists] 如果不存在就创立,可加可不加,不加上在创建重复的表会报错,加上了就不会报错 区别不大。
​
  • 示例
复制代码
mysql> create table student1(id int, name varchar(30), sex char(2), age int  unsigned, score float, addr varchar(50));
Query OK, 0 rows affected (0.00 sec)
​

查看表

  • 语法
复制代码
show tables [from 数据库名] [like 条件]
​
直接show tables 会展示你当前所在数据库中的所有表
​
show tables from 数据库 可以查看其他数据库的表
​
  • 示例
复制代码
mysql> show tables;
+--------------+
| Tables_in_te |
+--------------+
| student1     |
+--------------+
1 row in set (0.00 sec)
​
mysql> show tables from mysql\G
*************************** 1. row ***************************
Tables_in_mysql: columns_priv
*************************** 2. row ***************************
Tables_in_mysql: component
*************************** 3. row ***************************
Tables_in_mysql: db
*************************** 4. row ***************************
Tables_in_mysql: default_roles
*************************** 5. row ***************************
Tables_in_mysql: engine_cost
*************************** 6. row ***************************
Tables_in_mysql: func
*************************** 7. row ***************************
Tables_in_mysql: general_log
*************************** 8. row ***************************
Tables_in_mysql: global_grants
*************************** 9. row ***************************
Tables_in_mysql: gtid_executed
*************************** 10. row ***************************
Tables_in_mysql: help_category
*************************** 11. row ***************************
Tables_in_mysql: help_keyword
*************************** 12. row ***************************
Tables_in_mysql: help_relation
​

删除表

  • 语法
复制代码
drop table [if exists] 表名;
​
drop database 数据库名;
​
可以看到mysql中的语法是十分类似的
  • 示例
复制代码
drop table student1;
Query OK, 0 rows affected (0.00 sec)

修改表

修改表名

语法

法1: alter table 表名 rename 新表名;

法2: rename table 表名 to 新表名;

示例

mysql> create table student1( id int, name varchar(30), salary float);
Query OK, 0 rows affected (0.01 sec)

mysql> alter table student1 rename student2;
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+--------------+
| Tables_in_te |
+--------------+
| student2 |
+--------------+
1 row in set (0.01 sec)

mysql> rename table student2 to student1;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+--------------+
| Tables_in_te |
+--------------+
| student1 |
+--------------+
1 row in set (0.00 sec)

新增列
  • 语法
复制代码
alter table 表名 add  新列名 列类型  [after|first] 列名;
​
# after:在指定列之后插入新列
# first:在第一列插入新列
# 注意:无before关键字
  • 示例
复制代码
#例:在student1增加一列 birthday
​
alter table student1 add birthday date;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
​
desc student1;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | YES  |     | NULL    |       |
| name     | varchar(30) | YES  |     | NULL    |       |
| salary   | float       | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
​
#注:desc 表名 是用于查看表结构
​
删除列
  • 语法
复制代码
alter table 表明 drop 列名;
  • 示例
复制代码
#例:删除 student1的birthday这一列
​
mysql> alter table student1 drop birthday;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
​
mysql> desc student1;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int         | YES  |     | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
​
修改列名
  • 语法
复制代码
alter table 表名 change 旧列名 新列名 列类型;
​
#change 可以列名和列类型一起修改
  • 示例
复制代码
#例 将student1中的id 改成 it
​
mysql> alter table student1 change id it int;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
​
mysql> desc student1;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| it     | int         | YES  |     | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
​
修改列类型
  • 语法
复制代码
alter table 表名 modify 列名 列类型;
  • 示例
复制代码
#例: 将student1中 it 的类型 修改成 varchar(5)
​
mysql> alter table student1 modify it varchar(5);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
​
mysql> desc student1;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| it     | varchar(5)  | YES  |     | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
​
修改列位置
  • 语法
复制代码
#将列名放在某列的后面
alter table 表名 modify  列名  列类型 after 某列;
​
#将列名放在第一列
alter table 表名 modify  列名  列类型 first;
  • 示例
复制代码
#将it放在name的后面
mysql> alter table student1 modify it varchar(5) after name;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
​
mysql> desc student1;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(30) | YES  |     | NULL    |       |
| it     | varchar(5)  | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
​
#将it放在第一列
mysql> alter table student1 modify it varchar(5) first;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
​
mysql> desc student1;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| it     | varchar(5)  | YES  |     | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
​
change和modify的区别
复制代码
change 可以修改列名和列类型
​
modify 可以修改列类型/约束 和 列位置
​
#注 change也可以修改列约束(之后会提到),但可以修改的约束十分有限 若修改约束使用 modify
相关推荐
9624561 小时前
补打一条卡,为什么要从前一天重新算:人工补录与实时重算业务复盘
java·mysql·kafka
是程序喵呀2 小时前
Redis实现持久化
数据库·redis·缓存
余槐i2 小时前
PostgreSQL 加索引后查询反而更慢:优化器弃用索引的 3 种情形
spring boot·redis·mysql·postgresql·事务
z06.2 小时前
MySQL存储引擎
数据库·mysql
小徐不徐说2 小时前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
JackLam2 小时前
Gitea HTTPS 反向代理配置
数据库
量子物理学2 小时前
oracle plsql instantclient 安装
数据库·oracle
草莓熊Lotso2 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生
ClickHouseDB11 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构