一. 图形化工具
1. 介绍
前面学习了DDL中关于数据库操作的SQL语句,在编写这些SQL时,都是在命令行当中完成的。在命令行当中来敲这些SQL语句很不方便,主要的原因有以下 3 点:
- 没有任何代码提示。(全靠记忆,容易敲错字母造成执行报错)
- 操作繁琐,影响开发效率。(所有的功能操作都是通过SQL语句来完成的)
- 编写过的SQL代码无法保存。
在项目开发当中,通常为了提高开发效率,都会借助于现成的图形化管理工具来操作数据库。
目前MySQL主流的图形化界面工具有以下几种:MySQL客户端工具-图形化工具
我们只需要熟悉这众多工具当中的一个就可以了,因为其它工具的使用都大同小异。
DataGrip是JetBrains旗下的一款数据库管理工具,是管理和开发MySQL、Oracle、PostgreSQL 的理想解决方案。
2.3.2 安装
说明:DataGrip这款工具可以不用安装,因为Jetbrains公司已经将DataGrip这款工具的功能已经 集成到了 IDEA当中,所以我们就可以使用IDEA来作为一款图形化界面工具来操作Mysql数 据库。
2.3.3 MySQL图形化管理工具使用
2.2.3.1 连接数据库
1、打开IDEA自带的Database
2、配置MySQL
3、输入相关信息
4. 驱动下载完成之后, 点击 Test Connection。 如果显示 Successed 就说明连接成功了。 然后点 击 OK 按钮,连接数据库。
5、测试数据库连接
6、保存配置
4.3 展示所有数据库
默认情况下,连接上了MySQL数据库之后, 数据库并没有全部展示出来。 需要选择要展示哪些数据库。具体操作如下:
2.2.3.2 操作数据库
创建数据库:
- 有了图形化界面工具后,就可以方便的使用图形化工具:创建数据库,创建表、修改表等DDL操作。
- 其实工具底层也是通过DDL语句操作的数据库,只不过这些SQL语句是图形化界面工具帮我们自动完成的。
查看所有数据库:
切换数据库:
删除数据库:
如果我们使用了图形化界面工具,我在这个console控制台当中所编写的sql语句,我将这个标签页一关,下一次怎么找到之前所编写的SQL呢?
- 点击这个连接,右键Jump to Query Console
- 点击Console
- 然后就可以看到之前所编写的SQL语句了:
总结:通过图形化工具来简化数据库的操作,从而来提高开发效率。
二. 表操作
2.1 MySQL-DDL-表结构操作-创建
学习完了DDL语句当中关于数据库的操作之后,接下来我们继续学习DDL语句当中关于表结构的操作。
关于表结构的操作也是包含四个部分:创建表、查询表、修改表、删除表。
2.3.1 创建表结构
重点掌握创建表结构的基本语法,以及在建表的时候如何位字段来添加对应的约束。
2.3.1.1 语法
create table 表名(
字段1 字段1类型 [约束] [comment 字段1注释 ],
字段2 字段2类型 [约束] [comment 字段2注释 ],
......
字段n 字段n类型 [约束] [comment 字段n注释 ]
) [ comment 表注释 ] ;
注意: [ ] 中的内容为可选参数; 最后一个字段后面没有逗号
- comment 表注释:就是给这个表来添加一个注释信息,就相当于是一个备注,来标识一下这 张表它是用来存放什么数据的。
- 括号当中定义表结构当中一个一个的字段,comment来描述这个字段是用来做什么的。
- 一个字段描述完毕之后,通过逗号来进行分隔,然后再来描述第二个字段,最后一个字段描述完毕之后就不用再加逗号了。
在字段的基本信息描述完毕之后来指定约束,如果有多个约束,用空格隔开。
案例:创建tb_user表
-
对应的结构如下:
- 建表语句:
-- DDL:表结构
-- 创建:基本语法
create table tb_user(
id int comment 'ID,唯一标识', # id是一行数据的唯一标识,不能重复
username varchar(20) comment '用户名',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) comment '性别'
) comment '用户表';
- 进行字段描述时要指定各个字段的字段类型。
- 在MySQL当中字符串类型用varchar(),不用String,括号里面指定这个字符串最长可以存储多少位,比如我就指定20,就代表这个字段最长只能存储20个字符,超出这个范围就会报错。
- 另外一个字符串类型char(),如果括号里面指定1就代表它里面只能存储1位。
数据表创建完成,接下来我们还需要测试一下是否可以往这张表结构当中来存储数据。
双击打开tb_user表结构,大家会发现里面没有数据:
添加数据:
此时我们再插入一条数据:
我们之前提到过:id字段是一行数据的唯一标识,不能有重复值。但是现在数据表中有两个相同的id值,这是为什么呢?
-
其实我们现在创建表结构的时候, id这个字段我们只加了一个备注信息说明它是一个唯一标识,但是在数据库层面呢,并没有去限制字段存储的数据。所以id这个字段没有起到唯一标识的作用。
想要限制字段所存储的数据,就需要用到数据库中的约束。
2.3.1.2 约束
导学:掌握各种约束以及约束的具体作用
概念:所谓约束就是作用在表中字段上的规则,用于限制存储在表中的数据,用来限制这个字段 当中所存储的数据的。
作用:就是来保证数据库当中数据的正确性、有效性和完整性。
在MySQL数据库当中,提供了以下5种约束:
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段值不能为null | not null |
唯一约束 | 保证字段的所有数据都是唯一、不重复的 | unique |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | primary key(auto_increment自增) |
默认约束 | 保存数据时,如果未指定该字段值,则采用默认约束当中所指定的默认值 | default |
外键约束 | 让两张表的数据建立连接,从而保证数据的一致性和完整性 | foreign key |
- 通过auto_increment关键字就可以让主键自动往上增长,默认它会从1自动往上增长。
-
主键自增:auto_increment,在图形化界面工具当中叫做:Auto inc
-
每次插入新的行记录时,数据库自动生成id字段(主键)下的值
具有auto_increment的数据列是一个正数序列开始增长(从1开始自增) - 对于外键约束我们要想操作,至少得有两张表。
案例:创建tb_user表
-
对应的结构如下:
要求在上述的表结构中:
- id 是一行数据的唯一标识
- username 用户名字段是非空且唯一的
- name 姓名字段是不允许存储空值的
- gender 性别字段是有默认值,默认为男
-- 创建:基本语法(约束)
create table tb_user(
id int primary key auto_increment comment 'ID,唯一标识', # id是一行数据的唯一标识,不能重复
username varchar(20) not null unique comment '用户名',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) default '男' comment '性别'
) comment '用户表';
在运行之前删除刚才所创建的表结构,然后再来执行新创建的表。
generated:自动增长的意思。
2.2 MySQL-DDL-表结构操作-数据类型
导学:创建表结构的时候所需要指定的字段的数据类型以及各种数据类型之间的区别是什么,以 及如何来选择合适的数据类型。
char()和varchar()都是用来描述字符串的,这两种数据类型之间又有什么区别呢?
掌握MySQL当中常见的数据类型以及它们的区别:
在上面建表语句中,我们在指定字段的数据类型时,用到了int 、varchar、char,那么在MySQL中除了以上的数据类型,还有哪些常见的数据类型呢? 接下来,我们就来详细介绍一下MySQL的数据类型。
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
在SQL语句当中,字符串以及日期时间类型都需要引号引起来,单引号双引号都可以。
数值类型
类型 | 大小 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
---|---|---|---|---|
TINYINT / tinyint | 1byte | (-128,127) | (0,255) | 小整数值 |
SMALLINT / smallint | 2bytes | (-32768,32767) | (0,65535) | 大整数值 |
MEDIUMINT / mediumint | 3bytes | (-8388608,8388607) | (0,16777215) | 大整数值 |
INT/INTEGER int / integer | 4bytes | (-2147483648,2147483647) | (0,4294967295) | 大整数值 |
BIGINT / bigint | 8bytes | (-2^63,2^63-1) | (0,2^64-1) | 极大整数值 |
FLOAT / float | 4bytes | (-3.402823466 E+38,3.402823466351 E+38) | 0 和 (1.175494351 E-38,3.402823466 E+38) | 单精度浮点数值 |
DOUBLE / double | 8bytes | (-1.7976931348623157 E+308,1.7976931348623157 E+308) | 0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308) | 双精度浮点数值 |
DECIMAL / decimal | 依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 小数值(精确定点数) |
- 所谓有符号取值范围指的是允许出现负数的话,它的取值范围是多少。
- 而无符号取值范围指的就是如果不允许出现负数,它的取值范围又是多少。
- 无论是有符号取值范围还是无符号取值范围,它们的取值范围的宽度都是一样的,只不过就是在无符号取值范围当中就是将有符号取值范围负数的这一部分宽度是扩充到了正数这一部分而已。
- 随便写一个数值类型默认是有符号的,如果想指定的是无符号的,需要在数值类型后面加unsigned,这就代表这个数值类型它是一个无符号的。
-
unsigned:无符号的,无符号整数
-
在进行浮点数运算的时候是很容易出现精度损失问题的,所以在JDK当中给我们提供了一个类叫做BigDecimal,而在MySQL当中也给我们提供了一种数据类型,叫做Decimal,这种数据类型它在底层是以字符串的形式来处理小数的,这样就可以避免精度损失。
-
在指定float,double,decimal这三种数据类型的时候,需要指定两个参数,分别是整个数字的长度(整数位 + 小数位)以及小数位个数。
-
所谓整个数字长度指的是整数位+小数位,小数位也就是说最多只能保留x位小数
示例:
年龄字段 ---不会出现负数, 而且人的年龄不会太大
age tinyint unsigned
分数 ---总分100分, 最多出现一位小数
score double(4,1)
-
我们要尽可能在业务允许的情况下选择占用磁盘小的数据类型,这样就可以节省磁盘空间。
字符串类型
类型 | 大小 | 描述 |
---|---|---|
char | 0-255 bytes | 定长字符串(需要指定长度) |
varchar | 0-65535 bytes | 变长字符串(需要指定长度) |
TINYBLOB / tinyblob | 0-255 bytes | 不超过255个字符的二进制数据 |
TINYTEXT / tinytext | 0-255 bytes | 短文本字符串 |
BLOB / blob | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT / text | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
char(10) --- 定长字符串: 最多只能存10个字符,如果超出十个字符它直接报错,如果不足10个字符, 它也会占用10个字符空间,其它空位它会使用空字符来占位。举例,如果你存储的是AB,它依然占用十个空间,其它的八位它也会使用空字符来占位,也就是说,只要你存储的字符数是小于等于10的,全部占十个空间,而如果你存储超过了十个字符,它就直接报错了。
varchar(10) --- 变长字符串:最多只能存10个字符,如果超出十个字符它直接报错,如果不足10个 字符, 它需要判断字符的长度,按照实际长度存储。举例:假如说我就存储一个A,它就只会占用一个字符空间;如果存储的是AB,它就会占用两个字符空间;如果存储的是ABC,它就只会占用三个字符空间。
char()与varchar()区别:
- 对于char()这种数据类型来说,相对于varchar()它不需要判断字符的长度,所以它的性能相对来说会高一点。而对于varchar()来说,它的性能相对来说会低一点,因为它需要去判断字符的长度,根据实际长度进行存储。
- 但是,对于varchar()来说,由于它是按照实际长度存储的,所以它会更节省空间一些。而对于char(10)来说,我即使存储一个字符,它也占用十个空间,我存储两个字符,它也占用十个空间,所以相对来说会浪费空间一些。
- char()就是所谓的使用空间来换时间,而varchar()就是使用时间来换空间。
- 长度固定选择char(),长度不固定选择varchar()。
char 与 varchar 都可以描述字符串:
- char是定长字符串,指定长度多长,就占用多少个字符,和字段值的长度无关 。
- 而varchar是变长字符串,指定的长度为最大占用长度 。相对来说,char的性能会更高些。
对于下面这些数据类型,主要是分为两类:一个是blob后缀,一个是text后缀。
如果是blob后缀,存储的是二进制的数据,比如我们要存储一些视频,音频这些文件,我们就可以使用blob后缀的这种数据类型。而在真实的企业开发当中,像图片,音频,视频这些文件,其实并不会直接存储在数据库当中,而是存储在专业的文件服务器当中,所以blob后缀的这些数据类型其实也是非常少用的。
而text后缀它是存储的是文本字符串。比如我们要存储一篇长篇小说,那我们就可以使用带text后缀的这些数据类型。
而不同的数据类型它能够支持的存储范围也是不一样的。
示例:
用户名 username ---长度不定, 最长不会超过20
username varchar(20)
手机号 phone ---固定长度为11
phone char(11)
日期时间类型
类型 | 大小 | 范围 | 格式 | 描述 |
---|---|---|---|---|
DATE | 3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | -838:59:59 至 838:59:59 | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901 至 2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:01 至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值,时间戳 |
示例:
生日字段 birthday ---生日只需要年月日
birthday date
创建时间 createtime --- 需要精确到时分秒
createtime datetime / update_time datetime
2.3.1.4 案例
导学:怎么样基于图形化界面的方式去创建表结构 ?我们怎么样去设计一张表,设计一张表的基 本依据和流程是什么?
表结构创建的语法、约束以及数据类型都已经学习完了,接下来就来完成一个案例,通过这个案例要能够掌握图形化工具的方式来创建表结构,并清楚表结构的设计依据以及基本流程。
需求:根据产品原型/需求创建表(设计合理的数据类型、长度、约束)
案例需求:根据页面原型以及需求来创建表,为这张表结构要设计合理的数据类型,合理的字段 长度以及约束。
- 资料中提供的《黑马-tlias智能学习辅助系统》页面原型,设计员工管理模块的表结构(暂不考虑所属部门字段)
产品的页面原型及需求文档如下:
在新增员工这个对话框当中承载了这么一个form表单:
我们要设计的这张表是用来存储员工信息的,也就是员工表。那我们要设计这张表,我们就得清楚这张表当中包括哪些字段,各个字段的类型,字段的长度限制,字段的约束。
所以,我们在设计表结构的时候只需要根据页面原型以及需求文档当中的这些描述来定义表结构当中的字段以及约束就可以。
步骤:
- 阅读(参照)产品原型及需求文档,看看里面涉及到哪些字段。
- 查看需求文档说明,确认各个字段的类型以及字段存储数据的长度限制。
- 在页面原型中描述的基础字段的基础上,再增加额外的基础字段。
我们创建一张表上来之后,我们先加一个字段就是id,id就是这一行数据的唯一标识,comment:主键ID。
使用SQL创建表:
create table emp (
id int unsigned primary key auto_increment comment 'ID',
username varchar(20) not null unique comment '用户名',
password varchar(32) default '123456' comment '密码',
name varchar(10) not null comment '姓名',
gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
image varchar(300) comment '图像',
job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管',
entrydate date comment '入职时间',
create_time datetime not null comment '创建时间',
update_time datetime not null comment '修改时间'
) comment '员工表';
直接基于图形化界面方式来操作这也是现在企业项目开发当中创建表结构的主要方式。
除了使用SQL语句创建表外,我们还可以借助于图形化界面来创建表结构,这种创建方式会更加直观、更加方便。
操作步骤如下:
1. 在指定操作的数据库上,右键New ==> Table
2. 编辑表结构的相关信息
我们创建一张表上来之后,我们先加一个字段就是id,id就是这一行数据的唯一标识,comment:主键ID。
- 在性别当中,它要存储的就是男或者女,马上想到字符串char(1),但是在项目开发阶段,我们一般并不会直接这么去存,因为我们在界面展示的时候,有时候这个性别我们要展示的是男性女性,有时候要展示的是男士女士,有时候可能展示的还是英文的很灵活,所以在数据库当中我们并不会直接存储男或者是女,我可以存储一个数字,使用编号来存储,比如我就约定用1来代表男,来代表女,那也就意味着这个字段要么存1,要么存2,那我就可以使用范围最小的整型 --- tinyint,而由于gender性别里面它存储的就是1或者是2,而且不需要存储负数,所以在后面可以加上关键字 --- unsigned,代表着是一个无符号的tinyint。
- 图像就是图片,它的字段类型我们需要做一个说明:这里并不是直接存图片,而是存储图片的访问路径,我们打开浏览器可以看到每一张图片它都有对应的访问路径,我们存储的其实这个图片的访问路径,就是一个字符串,而且这个字符串是比较长的而且也不是固定长度的,所以我们可以设置一个varchar()类型,存储的就是图片的访问路径。
- 对于我们这一类后台管理系统的表结构来说,我们一般都会在表结构当中先加两个通用字段,一个是创建时间,一个是修改时间。
- 创建时间它是用来记录这条数据产生的时间,也就是插入的时间。
- 而修改时间,代表的是每一次修改我都需要更新一下这个时间,将其更新为当前时间。
2.3.1.5 设计表流程
- 直接基于页面原型所分析出来的这些字段我们叫原型字段。那我们就可以分析出这些字段它的类型,我们要给这些字段建立什么样的约束,这些基于我们所提供的页面原型以及需求文档都可以分析出来。
- 那分析出来之后,我们还需要再加上一部分基础字段:比如像id这样的主键字段,create_time、update_time这样的基础字段。
- 原型字段再加上这一部分基础字段之后,就组成了这样一个表结构,这就是我们表结构设计的基本流程。
说明:
- create_time --- 创建 / 插入时间:记录的是当前这条数据插入的时间。
-
update_time --- 修改 / 更新时间:记录当前这条数据最后更新的时间。
-
我们每一次更新这条数据,都需要将update_time更新为当前时间。
通过上面的案例,我们明白了,设计一张表,基本的流程如下:
- 阅读页面原型及需求文档
- 基于页面原则和需求文档,确定原型字段(类型、长度限制、约束)
- 分析出这些原型字段之后再增加表设计所需要的业务基础字段(id主键、插入时间、修改时间 / 更新时间)就组成了一张完整的表结构。
2.3.1 MySQL-DDL-表结构操作-查询&修改&删除
表结构的查询,修改和删除操作:对于这一部分的DDL语句,可以不做重点掌握,但是需要掌握的是图形化界面的操作方式。
2.3.2 表结构的查询
表结构的查询这里涉及到三条SQL语句:
- 关于表结构的查询操作,工作中一般都是直接基于图形化界面操作。
-- DDL:查看表结构
-- 查看:查询当前数据库下所有的表
show tables;
-- 查看:查看指定表的表结构
desc tb_emp;
-- 查看:数据库的建表语句
show create table tb_emp;
查询当前数据库所有表:show tables;
查看指定表结构:desc 表名 ;
desc 表名 ; 查看指定的表结构
可以查看指定表的字段、每个字段的类型以及这个字段是否可以为NULL / 存null值,以及这个字段是否存在 / 有默认值等信息。
查询指定表的建表语句:show create table 表名 ;
2.3.3 修改
- 关于表结构的修改操作,工作中一般都是直接基于图形化界面操作。
- 修改表结构,主要涉及到两个部分,一个部分就是关于表中字段的操作,另外一个方面就是表名的操作。
- 我们要修改某一张表当中的字段,前面都需要加上一个关键字:alter table,后面指定我们要操作哪一个表名。
- 如果是添加字段,后面跟上关键字add,后面指定字段的信息
- 如果是修改字段类型,需要用到的关键字是modify,后面跟上字段的描述信息。
- 如果需要修改字段名,我们需要加上关键字change,后面跟上字段的描述信息。
- 如果是删除字段,后面跟上关键字drop column,后面跟上字段名。
- 这是关于表中字段的操作。
- 如果是修改表名,我们只需要通过关键字rename table 指定要操作的表名 to之后跟上新的表名。
- alter:修改
-- DDL:修改表结构
-- 修改:为表 tb_emp 添加字段 qq varchar(11)
alter table tb_emp add qq varchar(11) comment 'QQ';
-- 修改:修改 tb_emp 字段类型 qq varchar(13)
alter table tb_emp modify qq varchar(13) comment 'QQ';
-- 修改:修改 tb_emp 字段名 qq 为 qq_num varchar(13)
alter table tb_emp change qq qq_num varchar(13) comment 'QQ';
-- 修改:删除 tb_emp 的 qq_num字段
alter table tb_emp drop column qq_num;
-- 修改:将tb_emp 表名修改为emp
rename table tb_emp to emp;
添加字段
alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];
案例: 为tb_emp表添加字段qq,字段类型为 varchar(11)
alter table tb_emp add qq varchar(11) comment 'QQ号码';
图形化操作:添加字段
修改数据类型
alter table 表名 modify 字段名 新数据类型(长度);
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];
案例:修改qq字段的字段类型,将其长度由11修改为13
alter table tb_emp modify qq varchar(13) comment 'QQ号码';
案例:修改qq字段名为 qq_num,字段类型varchar(13)
alter table tb_emp change qq qq_num varchar(13) comment 'QQ号码';
图形化操作:修改数据类型和字段名
删除字段
alter table 表名 drop 字段名;
案例:删除tb_emp表中的qq_num字段
alter table tb_emp drop qq_num;
图形化操作:删除字段
修改表名
rename table 表名 to 新表名;
案例:将当前的tb_emp表的表名修改为emp
rename table tb_emp to emp;
图形化操作:修改表名
2.3.4 删除
关于表结构的删除操作,工作中一般都是直接基于图形化界面操作。
删除表语法:
drop table [ if exists ] 表名;
- if exists :只有表名存在时才会删除该表,表名不存在,则不执行删除操作(如果不加该参数项,删除一张不存在的表,执行将会报错)。
- 注意:当我们在删除表结构的时候,表中的全部数据也都会被删除。
案例:如果tb_emp表存在,则删除tb_emp表
drop table if exists tb_emp; -- 在删除表时,表中的全部数据也会被删除。
图形化操作:删除表
小结:
- 通过DDL语句来操作数据库以及操作表结构,也就是数据库设计部分的内容。
- 在实际的项目开发当中,DDL语句的操作已经被图形化界面工具替代了,而且使用图形化界面工具很方便的就可以来操作数据库以及表结构,
至此数据库设计部分的基础内容学习完毕!