MySQL基础下篇[表的创建/约束的使用/事务和范式以及索引的使用]~1

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL基础下篇[表的创建/约束的使用/事务和范式以及索引的使用]~

创建表:

建表的语法格式:(建表属于DDL语句,DDL包括: create, drop, alter)

方式1:

create table 表名(字段名1 数据类型,字段名2,数据类型,字段名3,数据类型);

表名:建议以t_或者tbl_开始,可读性强,顾名思义

字段名:顾名思义

表名和字段名都属于标识符

数据类型:

其实在MySQL中包含了很多数据类型,但是我们只需要掌握一些常见的即可

char(最长255): 定长字符串

在上述实例中,我们规定名字的字段为10个字符,但是现在传入的Jack只有4个字符,由于char是定长字符长,因此即使传入的对象的字段小于10个,他依然会开辟10个内存空间大小,剩下未被占据的空间,将有空格补充

varchar(最长255): 可变长度的字符串

举例:


上述实例中,我们规定名字的字段为10个字符,但是现在传入的实例对象“jack”只有4个字符,那么此时varchar就会动态的分配4个字符的内存空间


对比于char,varchar的优点在于它比较智能,能够根据实际的数据长度动态分配空间,在一定程度上节省了空间,而char不论实际的数据长度是多少,都会分配定义时的固定长度去存储数据,使用不恰当的时候,可能会导致空间的浪费


既然如此,char就没有一丁点的好处吗?


当然不是,varchar虽然有那么多的优点,但是它有一个很大的缺点就是需要动态分配空间,速度慢,而char因为不需要动态分配内存空间,所以速度会比较快一些


那么他们二者该如何选择呢?

根据实际字段灵活变通

举例:


性别只包含两种:男or女,那么我们对于性别字段当然是选char,大可不必选择varchar


再比如名字字段,我们就必须选择varchar,因为它的长度并不是固定不变的


int(最长11):数字中的整数型,等价于Java中的int

bigint:数字中的长整形,等价于Java中的long

float:单精度浮点型数据

double:双精度浮点型

date:短日期类型

datetime:长日期类型

clob:字符串大对象

最多可以存储4G的字符串,比如:存储一篇文章,存储一个说明,超过255个字符的都需要使用该对象存储


blob:二进制大对象

专门用来存储照片声音,视频等流媒体数据


往blob类型的字段上插入数据的时候,例如插入一个图片,视频等,必须使用IO流才能完成


举例;

create table student1
(
id int,
name varchar(10),
age int(3),
sex char(1),
email varchar(255)
);

执行该命令后左边刷新:

删除表:

-- 建议采用第二种方式删除表
-- 第一种:
drop table t_student;-- 当这张表不存的时候会报错
-- 第二种
drop table if exists t_student ;-- 如果这张表存在,删除

插入数据:

语法格式:

-- 字段名和值需要一一对应,数量和数据类型都要相互对应
insert into 表名(字段名1,字段名2,字段名3......) values(值1,值2,值3);

举例:

-- 完整插入
insert into student1 (id,name,age,sex,email) 
values(21100,'张三',10,'男','3242841279@qq.com');

查询结果:

-- 部分插入
insert into student1 (id) values(21100);

查询结果:

上述的部分插入,将数据成功插入了指定的字段id中,那么我们是否可以用同样的方法,将名字也插入呢?

insert into student1 (name) values('jack');

查询结果如下:

名字并没有成功插入我们上一条记录中的名字字段中,而是产生了一条新的记录

由此我们可以得出一个结论,insert语句但凡是执行成功了,那么必然会多一条记录,没有给其他字段指定字段值的话,默认值是NULL


修改默认值NULL:

修改某个字段的默认值:default

举例:

email varchar(255) default "无"

查询结果:

省略insert后面的字段名:

如果要省略字段名进行数据的插入,那么必须将数据与字段对应起来,比如第一个字段是id,那么你传输的第一个数据就必须需是id的值,顺序是不能颠倒的

insert into student2 values(2,"张三",18,'男',"75986@qq.com");

不能传入单个字段的数据,例如下述所举例的这种就是不可以的

insert into student2 values(2);

insert插入日期:

MySQL给出了一种函数:str_to_data()函数:

不过需要注意的是,该函数并不是专门的日期插入函数,而是将字符串转换为日期格式

语法格式:

str_to_date('字符串日期','日期格式')

MySQL的日期格式:

%y---年
%m---月
%d---日
%h---时
%i---分
%s---秒

举例:

insert into t_user(id,name,birth)values(21100234,张三,str_to_date('12-1900-1','%m-%Y-%d'));

但并不是所有的日期在插入的时候需要使用该函数进行转换,当你所插入的日期恰好满足%m-%Y-%d时,此时该字符串会被自动转换成日期类型

举例:

insert into t_user(id,name,birth)values(21100234,'张三','1999-12-1');

以默认格式显示日期:

举例:

select id,name,birth as birth from t_user;

查询结果:

以特定格式显示日期:

使用date_format()函数

举例:

select id,name,date_format(birth,'%m/%d/%y') as birth from t_user;

查询结果:

date和datetime的区别:

date是短日期:只包括年月日信息

MySQL默认短日期格式:%y-%m-%d

datetime是长日期:包括年月日时分秒信息

MySQL默认长日期格式:%y-%m-%d %h:%i:%s

获取系统当前时间:

now()函数

在定义时,应设置为datetime类型的,这样才能够精准的获取当前系统时间

修改表中的数据:update[DML]

语法格式:

update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3......where 条件;

注意:没有条件限制会导致所有数据全部更新

举例:


- 将id号为10的学生的姓名改变为"jason",年龄改变为10岁,生日改变为2000-10-10
update student set name='jason',age=10,birth='2000-10-10' where id=10;

注意:日期的格式在输入时,必须按照MySQL默认的格式来写

删除数据:delete[DML]

语法格式:

delete from 表名 where 条件;

注意:如果没有条件限制,整张表的数据会全部被删除

举例:

-- 删除student表中id为2的这条记录
delete from student from id=2;
-- 删除student表中的所有数据
delete from student;

上述这种删除数据的方式:执行效率比较慢,表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放,因此它支持回滚,可以通过rollback;命令恢复已被删除的数据;


truncate语句:[DDL]


删除数据的效率比较高,表被一次截断,数据在硬盘上的真实存储空间也会得到释放,但是它并不支持回滚,数据一旦被删除就无法恢复

语法:

truncate table 表名;

上述所说的delete和truncate,都是删除表中的数据,而表结构并没有被删除,而下述的这种方法才是将表结构都给删除了

drop table 表名;  //删除表,将表中的数据连同表结构一起删除

插入数据:insert[DML]

语法格式:

插入单条数据:
insert  into 表名(字段1,字段2,字段3....)values(值1,值2,值3......);
插入多条数据:

语法格式:

insert into 表名(字段1,字段2,字段3....) values (值1,值2,值3......),(值1,值2,值3......),(

快速创建表:

语法格式:

-- 将as后的查询结果当做要创建的新表
create table 表名 as select.....;

这可以完成表的快速复制,表在创建的瞬间,表中的数据也存在了

将查询结果插入到一张表当中:

-- 将select语句的查询结果插入到student表中
insert into student select......;

约束:

在创建表的时候,,我们可以给表中的字段增加一些约束,来保证这个表中数据完整性,有效性

非空约束:not null

举例:

当我们在创建表的时候,对于名字字段增加了约束条件不能为空,因此,当给该表插入数据时,名字部分的数据不能是空的

注:该约束只有列级约束,并没有表级约束

create table teacher(
  id int,
  name varchar(255) not null
);

小tip:xxxx.sql这种文件被称为sql脚本文件


sql脚本文件中编写了大量的sql语句,当我们执行sql脚本文件时,该文件中所有的sql语句都会被执行,如果想要批量的执行sql脚本文件,那么在MySQL中可通过source D:\course\03-Mysql\document\xxx.sql命令


唯一性约束:unique

唯一性约束的字段不能重复,但是可以为null


举例:


当我们在创建表的时候,对于id字段增加了约束条件不能为空,因此,当给该表插入数据时,id字段的数据不能重复

create table person(
  id int unique,
  age int,
);

两个字段联合起来具有唯一性:

假设我们要求表中的name和email联合起来具有唯一性:

错误写法:

create table t_vip(
  id int,
  name varchar(255) unique, -- 约束添加到某个字段后面的约束属于列级约束
  name varchar(255) unique,
);

上述这种创建表是不符合我们的需求的,因为这样创建出来的表的含义是:email具有唯一性,name具有唯一性


那么对于下面将要插入表中的两组数据来说,并不能成功插入,原因是名字字段重复了


但是我们的需求是email+name联合具有唯一性即可,也就是说下面的两组数据,虽然名字字段重复,但是email字段并不重复,所以它们联合起来也是不重复的,理论上应该是可以插入数据的,因此上述这种创建表的方式是错误的

insert into t_vip(id,name,email) values(1,'张三','zhangsan@123.com');
insert into t_vip(id,name,email) values(1,'张三','zhangsan@sina.com');

正确写法:

create table t_vip(
  id int,
  name varchar(255),
  name varchar(255),
  unique(name,email), //这种没有添加到某个列级后面的约束属于表级约束
);

此时才表示email+name唯一

当多个字段联合起来需要添加约束时,适用表级约束,单个字段需要添加约束,适用列级约束

not null和unique联合使用:

举例:

create table t_vip(
  id int,
  name varchar(255) not null unique -- 表示name字段既不能为空,也不能重复
);

我们查看t_vip表结构,发现name字段变成了主键

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
40 9
|
9天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
50 18
|
1天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
23 8
|
2天前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(04)事务隔离级别、AICD、CAP、BASE原则一直搞不懂? | 看这篇就够了
本文详细介绍了数据库事务的四大特性(AICD原则),包括原子性、隔离性、一致性和持久性,并深入探讨了事务并发问题与隔离级别。同时,文章还讲解了分布式系统中的CAP理论及其不可能三角关系,以及BASE原则在分布式系统设计中的应用。通过具体案例和图解,帮助读者理解事务处理的核心概念和最佳实践,为应对相关技术面试提供了全面的知识准备。
|
8天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
17 7
|
7天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
27 5
|
12天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
81 15
|
5天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
12天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
17天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
下一篇
DataWorks