MySQL-表相关(DDL & DML)

文章目录

表的基本操作

在介绍DDL和DQL的操作语句之前, 我们先来熟悉一下表的基础相关操作

表的创建

下面的sql语句是创建一个学生表

sql 复制代码
create table if not exists t_student(
    id int,
    name varchar(25),
    gender char(1) default '男'
);

插入几条数据进行测试

sql 复制代码
# default是默认约束
insert into t_student(id, name, gender) values (1, 'll', '男');
insert into t_student(id, name) values (2, 'rr');
insert into t_student(id, name, gender) values (3, 'hh', '女');
select * from t_student;

# 测试结果
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|    1 | ll   | 男     |
|    2 | rr   | 男     |
|    3 | hh   | 女     |
+------+------+--------+

表的删除

只需要下面的sql语句即可

sql 复制代码
# 如果数据库中没有这张表就会报错
drop table t_student;
# 即使数据库中没有这张表也不会报错
drop table if exists t_student;

MySQL中的数据类型

之前我们并没有介绍MySQL中的数据类型都有什么, 我们下面介绍一下MySQL中的数据类型

数据类型(data_type)是指系统中所允许的数据的类型。数据库中的每个列都应该有适当的数据类型,用于限制或允许该列中存储的数据。例如,列中存储的为数字,则相应的数据类型应该为数值类型。如果使用错误的数据类型可能会严重影响应用程序的功能和性能,所以在设计表时,应该特别重视数据列所用的数据类型。更改包含数据的列不是一件小事,这样做可能会导致数据丢失。因此,在创建表时必须为每个列设置正确的数据类型和长度。MySQL 的数据类型可以分为整数类型、浮点数类型、定点数类型、日期和时间类型、字符串类型、二进制类型等。

整数类型

tinyint:1个字节(微小整数)smallint:2个字节(小整数)mediumint:3个字节(中等大小的整数)**int(integer):4个字节(普通大小整数)**bigint:8个字节(大整数)

浮点数类型

float:4个字节,单精度(最多5位小数)double:8个字节,双精度(最多16位小数)

定点数类型

decimal:定点数类型。底层实际上采用字符串的形式存储数字。语法:decimal(m, d)例如:decimal(3, 2) 表示3个有效数字,2个小数。(有效数字最多65个,小数位最多30个)

日期和时间类型

year:1个字节,只存储年,格式YYYYtime:3个字节,只存储时间,格式HH:MM:SS / HHMMSSdate:3个字节,只存储年月日,格式:YYYY-MM-DDdatetime:8个字节,存储年月日+时分秒,格式:YYYY-MM-DD HH:MM:SS(从公元1000年公元9999年)timestamp:4个字节,存储年月日+时分秒,格式:YYYY-MM-DD HH:MM:SS(从公元1980年公元2040年)或者格式为 YYYYMMDDHHMMSS(采用这种格式不需要使用单引号,当然你使用单引号也可以)

字符串类型

char

char(m): m长度是0~255个字符。固定长度字符串,在定义时指定字符串列长。当保存时,在右侧填充空格以达到指定的长度。m表示列的长度,范围是 0~255 个字符。例如,CHAR(4) 定义了一个固定长度的字符串列,包含的字符个数最大为 4。当插入的字符长度大于4,则报错(除非超过4个长度之后都是空格字符,则空格字符会自动被删除用来保证插入的成功)。

varchar

varchar(m): m长度是0~16383个字符长度可变的字符串。varchar 的最大实际长度由最长的行的大小和使用的字符集确定,而实际占用的空间为字符串的实际长度加 1。例如,varchar(50) 定义了一个最大长度为 50 的字符串,如果插入的字符串只有 10 个字符,则实际存储的字符串为 10 个字符和一个字符串结束字符。varchar在值保存和检索时尾部的空格仍保留。

text

text类型:

  • tinytext 表示长度为 255字符的 TEXT 列。

  • text 表示长度为 65535字符的 TEXT 列。

  • mediumtext 表示长度为 16777215字符的 TEXT 列。

  • longtext 表示长度为 4294967295 或 4GB 字符的 TEXT 列。

    enum类型:

  • 语法:<字段名> enum('值1','值2',...)

  • 该字段插入值时,只能是指定的枚举值。

    set类型:

  • 语法:<字段名> set('值1','值2','值3',...) 注意:值不可重复。

  • 该字段插入值时,只能是指定的值。

二进制类型

BLOB类型:二进制大对象,可以存储图片、声音、视频等文件。

  • blob:小的,最大长度65535个字节

  • mediumblob:中等的,最大长度16777215个字节

  • longblob:大的,最大长度4GB的字节

这里注意一下, 使用命令行是无法进行BLOB类型的添加的, 需要调用Java程序中的IO流相关辅助实现

还有就是日常开发中一般是不会在数据库中保留一个视频这种非常大的文件的, 一般都是保存一个字符串

视频文件远程托管到服务器上, 这个字符串就是这个托管的地址, 所以一般保留的都是varchar/char

DDL语句

DDL语句是我们SQL语句中的一种, 下面是DDL的相关简介, 其实也就是修改表本身的结构, 其实这个内容相对不是特别重要, 因为开发的过程中, 当以及拥有庞大用户量之后, 修改表的结构其实时一件很危险的行为

数据定义语言 (Data Definition Language, DDL) 是SQL语言集中,负责数据结构定义与数据库对象定义的语言,由CREATE、ALTER与DROP三个语法所组成,最早是由 Codasyl (Conference on Data Systems Languages) 数据模型开始,现在被纳入 SQL 指令中作为其中一个子集。

还是创建一个数据表并且插入几条数据用来测试

sql 复制代码
create table test_ddl(
    a bigint primary key auto_increment,
    b varchar(255) not null,
    c char(10) unique
);

insert into test_ddl(b, c) values ('hh', 'hhx');
insert into test_ddl(b, c) values ('bb', 'bbx');
insert into test_ddl(b, c) values ('ff', 'ffx');

select * from test_ddl;

# 测试结果如下
+---+----+------+
| a | b  | c    |
+---+----+------+
| 1 | hh | hhx  |
| 2 | bb | bbx  |
| 3 | ff | ffx  |
+---+----+------+

查看建表语句

我们之前学习的那个是查看表的结构

sql 复制代码
# desc + 表名
desc test_ddl;

查看建表语句

sql 复制代码
# 语法
show create table [表名]

执行下面的sql语句

sql 复制代码
show create table test_ddl;

上面可以查看我们建表时的语句, 以及存储引擎(这里是InnoDB), 字符集以及排序规则

其实上面也解释了一个问题, 就是MySQL中的所有的标识符其实都隐式加上了反引号`

当我们想用关键字当成标识符的时候, 就要加上反引号

修改表名

从下面开始我们所有的DDL语句都是以alter table开头

基础语法

sql 复制代码
alter table [表名] rename [新名字]

假如我们想要修改表的名字, 比如把我们上面的test_ddl变为test_ddlt

执行下面的SQL

sql 复制代码
alter table test_ddl rename test_ddlt;
show tables;

# 执行结果如下(表名已经发生了改变)
+------------------------+
| Tables_in_java113mysql |
+------------------------+
| dept                   |
| emp                    |
| salgrade               |
| t_student              |
| test_ddlt              |
+------------------------+

这时我们用上面的查看建表语句就会发现表名已经发生改变

新增字段

基础语法

sql 复制代码
alter table [表名] add [新字段名] [数据类型]

我们尝试执行下面的SQL语句

sql 复制代码
alter table test_ddlt add d varchar(10) not null;

思考一下, 我们新添加的d字段, 带有非空约束, 但是我们之前是没有加入过d这一列数据的, 那么会执行成功么, 答案是会执行成功的, 但是之前的所有位置的这个d列都是空, 不是null, 就是空(什么都没有)

sql 复制代码
insert into test_ddlt (b,c, d) values ('cc', 'ccx', 'ccxy');
select * from test_ddlt;

# 执行结果如下(就是空, 而不是null)
+---+----+------+------+
| a | b  | c    | d    |
+---+----+------+------+
| 1 | hh | hhx  |      |
| 2 | bb | bbx  |      |
| 3 | ff | ffx  |      |
| 4 | cc | ccx  | ccxy |
+---+----+------+------+

修改字段(名+类型)

这个SQL语句适用于修改一个字段的名称以及数据类型

基础语法

sql 复制代码
alter table [表名] change [旧字段名] [新字段名] [新字段类型];

尝试执行下面的SQL

sql 复制代码
alter table test_ddlt change d dx varchar(5);

执行结果以及表的前后结构对比如下

修改字段(仅类型)

基础语法

sql 复制代码
alter table [表名] modify column [字段名] [数据类型]

执行下面的SQL

sql 复制代码
alter table test_ddlt modify column dx varchar(7);
desc test_ddlt;

执行结果如下

删除字段

基础语法

sql 复制代码
alter table [表名] drop [字段名]

尝试执行下面的SQL

sql 复制代码
select * from test_ddlt;
alter table test_ddlt drop dx;
select * from test_ddlt;

执行结果如下

DML语句

当我们对表中的数据进行增删改的时候就会用到DML语句(数据操纵语言, 就三种, insert into, delete from, update set), 所有的DML语句都是支持事务的, 也就是操作之后还可以通过回滚恢复, 但是truncate table语句执行之后是不能进行恢复的(不属于DML语句, 下面会介绍)

DML语句简介

数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。

insert 增

基本的语法格式我们在先前的博客中已经介绍过了

基础语法

sql 复制代码
insert into [表名] (字段1, 字段2, 字段3...) values (值1, 值2, 值3...);

当表名后面的小括号当中的字段名如果省略掉, 表示自动的将所有的字段都列出来了, 并且字段的顺序和建表时的顺序是一致的, 一般为了可读性强, 建议把字段名加上

基础语法

sql 复制代码
insert into [表名] values (值1, 值2, 值3...);

同时一次可以插入多条记录

基础语法

sql 复制代码
insert into [表名] (字段1, 字段2...) values ((值1, 值2,...), (值1, 值2,...)...;

这一块就暂不进行演示了, 我们先前的博客介绍过这个点

delete 删

基础语法

sql 复制代码
# 执行这条SQL会导致所有的记录都会被删除, 所以我们要加入where条件判断
delete from [表名];

删除符合条件的记录

sql 复制代码
delete from [表名] where [条件];

假设我们现在有这张数据表

sql 复制代码
select * from t_student;
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|    1 | ll   | 男     |
|    2 | rr   | 男     |
|    3 | hh   | 女     |
+------+------+--------+

# 我们要把名字为 ll 的删除
delete from t_student where name = 'll';
select * from t_student;
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|    2 | rr   | 男     |
|    3 | hh   | 女     |
+------+------+--------+

# 我们要把所有人都删除, 那么就直接不用加where条件就可以了
# 下面是SQL执行的结果显示
mysql> delete from t_student;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from t_student;
Empty set (0.00 sec)

truncate 语句

上面介绍的删除语句是可以恢复的, 删除属于DML的方式删除,这种删除的数据是可以通过事务回滚的方式重新恢复的,但是删除的效率较低。(这种删除是支持事务的。)

另外还有一种删除表中数据的方式,但是这种方式不支持事务,不可以回滚,删了之后数据是永远也找不回来了。这种删除叫做:表被截断; 也可以理解为数据在硬盘中的内存地址被丢弃了

注意:这个语句删除效率非常高,巨大的表,瞬间干掉所有数据。但不可恢复

基础语法

sql 复制代码
truncate table [表名];

update 改

基础语法

sql 复制代码
updata [表名] set 字段1 = 值1, 字段2 = 值2, ... where;
# 和delete语句是一致的, 如果不适用where条件限制的话, 会导致所有的字段都发生改变

下面我们在学生表中插入几条数据进行更新操作

sql 复制代码
# 插入几条数据
insert into t_student(id, name, gender) values (23, 'lhh', '女');
insert into t_student(id, name, gender) values (22. 'qtw', '男');
insert into t_student(id, name, gender) values (55, 'gyl', '男');
insert into t_student(id, name, gender) values (45, 'swj', '男');

# 查一下当前的数据情况
select * from t_student;
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|   23 | lhh  | 女     |
|   55 | gyl  | 男     |
|   45 | swj  | 男     |
|   22 | qtw  | 男     |
+------+------+--------+

# 更新id编号为 45 的人的性别为 '女';
update t_student set gender = '女' where id = 45;
# 查看一下当前的数据
select * from t_student;
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|   23 | lhh  | 女     |
|   55 | gyl  | 男     |
|   45 | swj  | 女     |
|   22 | qtw  | 男     |
+------+------+--------+

# 把所有人的 性别都改成 '未知'
update t_student set gender = '未知';
# 查看一下当前数据
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|   23 | lhh  | 未知   |
|   55 | gyl  | 未知   |
|   45 | swj  | 未知   |
|   22 | qtw  | 未知   |
+------+------+--------+
相关推荐
Oak Zhang42 分钟前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
长亭外的少年1 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
聂 可 以1 小时前
Windows环境安装MongoDB
数据库·mongodb
web前端神器1 小时前
mongodb多表查询,五个表查询
数据库·mongodb
门牙咬脆骨1 小时前
【Redis】redis缓存击穿,缓存雪崩,缓存穿透
数据库·redis·缓存
门牙咬脆骨1 小时前
【Redis】GEO数据结构
数据库·redis·缓存
wusong9992 小时前
mongoDB回顾笔记(一)
数据库·笔记·mongodb
代码小鑫2 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
changuncle2 小时前
MongoDB数据备份与恢复(内含工具下载、数据处理以及常见问题解决方法)
数据库·mongodb
久醉不在酒2 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql