当前位置: 首页 > news >正文

MySQL基础(四)DML、数据表操作DDL操作

目录

六、DML操作(重要)

6.1 新增(insert)

6.2 修改(update)

6.3 删除(delete)

6.4 常见问题

七、数据表操作DDL操作

7.1 MySQL中的数据类型

7.1.1 数值类型

7.1.2 时间类型

7.1.3 字符串类型

7.2 创建表

7.3 表的其他操作(了解)

7.3.1 添加一个列

7.3.2 修改表中的列

7.3.3 删除表中的列

7.3.4 修改表名

7.3.5 修改列名和类型

7.3.6 清空表数据

7.3.7 删除表

7.4 常见问题


六、DML操作(重要)

关于DML,只需要保证可以完成三个操作即可。

6.1 新增(insert)

语法1:insert into 表名 (列1,列2,列3,列4...) values (值1,值2,值3,值4...);

语法2:insert into 表名 values (值1,值2,值3,值4...);

语法3:insert into 表名 (列1,列2,列3,列4...) values (值1,值2,值3,值4...),(值1,值2,值3,值4...)……;(批量添加)

MySQL中最长见的三个数据类型,数值,字符串,时间。

给t_jobs表添加一条数据。 记得确保前面给的列数,和后面的值的个数需要保持一致。

# 给t_jobs表添加一条数据
insert into 
t_jobs 
(job_id,job_title,min_salary,max_salary) 
values
('运营','运营',500,50000);

给t_employees表添加一条数据,采用语法2的方式。 需要确保表中的所有字段的值都要给上。

针对时间类型数据的添加,在MySQL端可以直接输入字符串的方式,MySQL可以帮助咱们做一些数据类型的转换。

# 给t_employees表添加一条数据,采用语法2的方式
insert into 
t_employees
values 
(100001,'张','三','123@123.com','18888888888','1999-11-11','程序员',5000,0.20,100,90);
​

给t_jobs表中基于一条SQL语句追加多行数据。而且可以看到受影响行数的信息。

insert into 
t_jobs 
(job_id,job_title,min_salary,max_salary) 
values
('A','做A',5000,8000),
('B','做B',5000,8000),
('C','做C',5000,8000);

image.png

6.2 修改(update)

语法:update 表名 set 列1 = 新值1,列2 = 新值2 …… [where 条件];

正常修改语句从语法的角度讲,可以不追加where条件,但是咱们再实际操作时, 一定要追加上条件,不然整张表都要被修改成一模一样的数据。

修改job_id标识为A的数据,将薪资最小和最大调整为3000,5000

update 
t_jobs 
set 
min_salary = 3000,
max_salary = 5000 
where 
job_id = 'A';

如果返回的受影响行数为1,说明当前标识为A的这行数据发生了变化。

如果返回的受影响行数为0,不代表SQL执行失败,只是单纯的这行数据没变化。

6.3 删除(delete)

语法:delete from 表名 [where 条件];

从删除语句的语法来说,where条件可以不写,但是如果不写,就相当于清空了整张表。正常业务情况下是需要追加where。

将之前添加进去的测试数据,全部都删除

我这里是针对t_jobs和t_employees表追加了数据,现在都干掉~

# 删除t_jobs表中的,标识为A,B,C,程序员,运营这5条数据
delete from 
t_jobs 
where 
job_id in ('A','B','C','程序员','运营');
# 删除t_employees表中标识为100001,100002,100003,100004的员工信息干掉
delete from 
t_employees
where 
employee_id in (100001,100002,100003,'100004');

6.4 常见问题

image.png

七、数据表操作DDL操作

7.1 MySQL中的数据类型

7.1.1 数值类型

跟Java中的几乎是一致的,但是比Java会更丰富一些,不过大类别依然是整形和浮点型

浮点型的数值中,所有的M,D,都必须保证M >= D

类型大小范围描述
tinyint1byte(-128~127)小整数,映射Java中的Byte
smallint2byte…………小整数,映射Java中的Short
int4byte…………默认整数,映射Java中的Integer
bigint8byte…………长整数,映射Java中的Long
float(10,2)4byte…………单精度浮点类型,映射Java中的Float
double(10,2)8byte…………双精度浮点类型,映射Java中的Double
decimal(M,D)看下面~…………映射Java中的BigDecimal

decimal存储的空间大小:

每9位数最多占用4字节,整数和小数要分开算,如果小于9位数,基于下述表格计算

位数大小
00
1–21
3–42
5–63
7–94

如果指定的 DECIMAL(18,9),这个数值是小数点前,占用4字节,小数点后,也占用4字节。一共占用8字节。

如果指定的 DECIMAL(20,6),这个数值是小数点前有14位,9位占用4子节,剩下5位占用3字节。小数点后的6位,占用3字节。一共占用10字节。

7.1.2 时间类型

MySQL中的时间类型比Java中要丰富一些。Java中有Date,LocalDate之类的,MySQL相对更多一些。

类型大小范围格式描述
date3byte用到死!yyyy-MM-dd存储日期
time3byte够用!HH:mm:ss存储时间
datetime8byte用到死!yyyy-MM-dd HH:mm:ss存储日期和时间
timestamp4byte1970-01-01 00:00:00~ 2038-01-19 03:14:07yyyy-MM-dd HH:mm:ss存储日期和时间

datetime和timestamp的区别:

  • 存储的大小不一样。

    • datetime占用8字节。

    • timestamp占用4字节。

  • 存储的范围不一样。

    • datetime可以持续到9999年。

    • timestamp是从1970年~2038年。

  • 存储的时区问题。

    • datetime存储时,不考虑时区,存储什么就是什么,取的时候也就是什么。

    • timestamp存储时,会将时间从当前时区转换为UTC进行存储,查询时,将其再转换为当前客户端的时区。

其次,在5.6.5版本后,datetime和timestamp对于行级数据变化,自动更新为当前系统时间,都是支持的。(后面创建表会演示这个操作)

7.1.3 字符串类型

MySQL中的字符串类型那就多了,Java中就String。

类型描述
char(长度)定长字符串
varchar(长度)变长字符串
text大文本类型
blob以二进制的形式存储大文本数据

char和varchar核心区别:

  • char指定好长度后,无论存储多少数据,就占这个长度的大小。

  • varchar指定好长度后,你写入了多大的数据,他就占用多少大小。

7.2 创建表

创建表的语法:

create table 表名(
列名 数据类型 [约束],
列名 数据类型 [约束],
…………
列名 数据类型 [约束]     -- 最后一行不要在后面追加逗号
);

创建一张学生表,student。表名和列名如果存在多个单词,用_分开,不要出现大写字母。

列名数据类型约束描述
student_idbigint学员编码
student_namevarchar(32)学员名称
student_genderchar(1)学员性别
student_birthdaydate学员生日

创建学生表的SQL语句

create table student(
student_id bigint comment '学员编号',
student_name varchar(32) comment '学员名称',
student_gender char(1) comment '学员性别',
student_birthday date comment '学员生日'
)comment '学生表';

Ps:如果构建完之后,通过Navicat查看注释信息时,发现有乱码,需要设置系统的一些内容,如果没乱码,你不需要做任何事情!!!!

1、打开cmd,输入chcp,如果是936,那就开始设置当前操作系统的语言

image.png

2、更改系统区域设置

image.png

3、修改完毕后,需要重启电脑才可以生效!! 可以在重启后,再次打开cmd,查看chcp的返回内容

image.png

7.3 表的其他操作(了解)

语法:alter table 表名 操作

7.3.1 添加一个列

语法:alter table 表名 add 列名 类型;

给student表追加一个student_phone的列。类型是varchar(16)

# 添加一列
alter table 
student 
add 
student_phone varchar(16);

7.3.2 修改表中的列

语法:alter table 表名 modify 列名 类型;

将student表中的student_phone的列中的varchar长度设置为11。

# 修改一列
alter table 
student 
modify 
student_phone varchar(11) comment '学生手机号';

7.3.3 删除表中的列

语法:alter table 表名 drop 列名;

将前面用navicat随便添加的列删掉。删除ssss这个列。

# 删除一列
alter table 
student 
drop 
ssss;
​

7.3.4 修改表名

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

将student表修改为table_student

# 修改表名
alter table 
student 
rename 
table_student;

7.3.5 修改列名和类型

语法:alter table 表名 change 旧列名 新列明 类型;

将table_student表中的student_gender修改为student_sex,并且类型指定为tinyint

# 修改列的名称和类型
alter table 
table_student 
change 
student_gender 
student_sex tinyint;

7.3.6 清空表数据

这个操作的语法跟前面完全不同。单独的语法。

这个清空表不是单独的删除数据,而是直接将表摧毁掉,再重新创建一张一模一样的表。

语法:truncate 表名;

直接将table_student中的数据直接干掉。

# 摧毁表,重新创建
truncate table_student;

7.3.7 删除表

这个跟前面的操作也不一样。

语法:drop table 表名;

删除table_student表。

drop table table_student;

7.4 常见问题

image.png


image.png

八、约束

问题:往一张表中插入完全一致的数据,可行不。

从功能的维度来说,完全没有问题。但是从业务方向来考虑,两个完全一模一样的数据没有什么意义。

从行数据的维度来考虑,需要保证 实体完整性约束 。需要确保每行数据不重复,数据唯一。

8.1 主键约束(重要)

primary key 主键的约束,标识表中的一行数据,当前指定的主键列的 值不可以重复,并且不能为NULL

主键在表中只能值有一个,指定多个主键,就会报错。

create table student(
student_id bigint primary key comment '学员编号' ,
student_name varchar(32) comment '学员名称',
student_gender char(1) comment '学员性别',
student_birthday date comment '学员生日'
)comment '学生表';
​
insert into 
student
values
(1,'李四','男','2001-11-11');

Ps:一般咱们推荐给表添加一个主键约束,一般情况下,可以针对有意义数据设置主键约束,也可以单独搞一个列来作为主键(推荐是有序自增的最好)

这里推荐主键最好是自增的,这样后期在做一些范围查询的时候效率会更好。

现在student_id是主键,每次咱们需要自己指定1,2,3,4,5,6,7…………很麻烦。

可以给主键设置一个自动增长的效果。

auto_increment 放在约束后面即可,就配合主键使用,其他列不用。

create table student(
student_id bigint primary key auto_increment comment '学员编号' ,
student_name varchar(32) comment '学员名称',
student_gender char(1) comment '学员性别',
student_birthday date comment '学员生日',
student_phone varchar(11) unique comment '学员手机号'
)comment '学生表';
​
insert into 
student
values
(NULL,'李四','男','2001-11-12','18888888855');

8.2 唯一约束

unique 唯一约束。标识表中的一行数据,当前指定的唯一约束的列的 值不允许重复,可以为NULL

唯一约束可以在一张表中指定多个列。

允许为NULL,并且,多个NULL可以同时存在。

create table student(
student_id bigint primary key comment '学员编号' ,
student_name varchar(32) comment '学员名称',
student_gender char(1) comment '学员性别',
student_birthday date comment '学员生日',
student_phone varchar(11) unique comment '学员手机号'
)comment '学生表';
​
insert into 
student
values
(1,'李四','男','2001-11-12','18888888888');

域完整性约束:限制列的数据完整性。

8.3 非空约束

not null ,在列的后面指定上这个约束即可。

给学生生日指定为非空!

create table student(
student_id bigint primary key auto_increment comment '学员编号' ,
student_name varchar(32) comment '学员名称',
student_gender char(1) comment '学员性别',
student_birthday date not null comment '学员生日',
student_phone varchar(11) unique comment '学员手机号'
)comment '学生表';
​
insert into 
student
values
(NULL,'王五','男',NULL,'18888888434');

8.4 默认值约束

default 默认值 ,当前列如果没有指定任何的值,会采用这个默认值填充。

给学员名称列设置默认值,如果没指定姓名就叫 '张三'。

测试默认值时,需要采用下述方式使用insert语句,跳过student_name字段的赋值。

create table student(
student_id bigint primary key auto_increment comment '学员编号' ,
student_name varchar(32) default '张三' comment '学员名称',
student_gender char(1) comment '学员性别',
student_birthday date not null comment '学员生日',
student_phone varchar(11) unique comment '学员手机号'
)comment '学生表';
​
drop table student;
​
insert into 
student
(student_gender,student_birthday,student_phone)
values
('男','2011-11-11','18888888433');

8.5 检查约束

check (检查约束要求) ,这个是MySQL8.x提供的约束功能,约束某一个列的值满足一定的条件要求

给student表中的性别字段,指定一个检查约束,要求添加的值只能是男、女。不允许添加其他内容。

-- 是单独指定约束信息
create table student(
student_id bigint primary key auto_increment comment '学员编号' ,
student_name varchar(32) default '张三' comment '学员名称',
student_gender char(1) comment '学员性别',
student_birthday date not null comment '学员生日',
student_phone varchar(11) unique comment '学员手机号',
constraint student_gender_check check (student_gender = '男' or student_gender = '女')
)comment '学生表';
​
--  在字段后直接编写。
create table student(
student_id bigint primary key auto_increment comment '学员编号' ,
student_name varchar(32) default '张三' comment '学员名称',
student_gender char(1) check (student_gender = '男' or student_gender = '女') comment '学员性别',
student_birthday date not null comment '学员生日',
student_phone varchar(11) unique comment '学员手机号'
)comment '学生表';
​
-- 测试
insert into 
student
(student_gender,student_birthday,student_phone)
values
('弯','2011-11-11','18888888435');

8.6 数值的约束

UNSIGNED,数值的约束,保证这个数值必须是正数,不允许存储负数。

同时取值范围还可以增加接近一倍。

比如tinyint,存储范围是-128到127,如果追加上了UNSIGNED,就可以标识0到255。

# 添加unsigned约束后,数值就不允许存储负数了。
create table yyy(
id tinyint unsigned 
);
​
insert into yyy values (-1);

zerofill,根据指定的数值长度,如果当前数值的长度不满足指定的长度,会自动在前面填充0。

可以在数值类型后面追加这个约束。

image.png

8.7 常见错误

image.png


image.png


image.png

相关文章:

  • MAX3490
  • 关于双网卡优先级:有效跃点数的解析(设置值×2)
  • Levenberg-Marquardt算法详解和C++代码示例
  • 代驾数据库
  • Java逻辑运算符常见错误分析与规避指南
  • 使用 Python 和 HuggingFace Transformers 进行对象检测
  • 位运算(Bitwise Operations)深度解析
  • 基于J2EE架构的在线考试系统设计与实现【源码+文档】
  • 机器学习算法时间复杂度解析:为什么它如此重要?
  • C/C++ 中附加包含目录、附加库目录与附加依赖项详解
  • 波士顿房价预测(线性回归模型)
  • c++重点知识总结
  • VMware 安装 CentOS8详细教程 (附步骤截图)附连接公网、虚拟机yum源等系统配置
  • SQLAlchemy 中的 func 函数使用指南
  • CVAT标注服务
  • Python训练营---Day46
  • 使用pwm控制舵机来回摆动的中心位置
  • 深入解析JVM工作原理:从字节码到机器指令的全过程
  • Unity | AmplifyShaderEditor插件基础(第五集:简易移动shader)
  • 大模型编程助手-windsurf
  • 注册网站用的信用卡/网络推广员一个月多少钱
  • 北京高端网站建设公司/网络口碑营销名词解释
  • 惠州做网站多少钱/南昌搜索引擎优化
  • 做做网站需要多少钱/广告公司排名
  • wordpress后台账号密码忘记/成都百度网站排名优化
  • 中山做网站排名/中国新闻最新消息今天