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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 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字段变成了主键

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
1天前
|
存储 关系型数据库 MySQL
MySQL索引详解
MySQL索引详解
|
2天前
|
存储 关系型数据库 MySQL
架构面试题汇总:mysql索引汇总(2024版)
架构面试题汇总:mysql索引汇总(2024版)
|
1天前
|
存储 关系型数据库 MySQL
MySQL 索引优化:深入探索自适应哈希索引的奥秘
MySQL 索引优化:深入探索自适应哈希索引的奥秘
|
1天前
|
存储 SQL 关系型数据库
MySQL索引下推:原理与实践
MySQL索引下推:原理与实践
|
1天前
|
关系型数据库 MySQL 数据库
MySQL索引优化:深入理解索引合并
MySQL索引优化:深入理解索引合并
|
1天前
|
SQL 运维 关系型数据库
|
1天前
|
存储 关系型数据库 MySQL
|
1天前
|
存储 关系型数据库 MySQL
|
2天前
|
关系型数据库 MySQL 数据库
Django与MySQL:配置数据库的详细步骤
Django与MySQL:配置数据库的详细步骤