一. 数据模型
介绍完了Mysql数据库的安装配置之后,接下来我们再来聊一聊Mysql当中的数据模型。学完了这一小节之后,我们就能够知道在Mysql数据库当中到底是如何来存储和管理数据的。
在介绍 Mysql的数据模型之前,需要先了解一个概念:关系型数据库。
SQL语句是操作关系型数据库的统一标准
关系型数据库(RDBMS):Relational Database Management System
概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
而所谓二维表,指的是由行和列组成的表,如下图:
二维表的优点:
-
使用这种表结构存储数据,格式统一,便于数据的管理与维护
-
使用这种表结构来存储数据,我们可以使用标准的SQL语句来操作,标准统一,使用方便,因为SQL语句可以操作所有的关系型数据库,而且使用SQL语句还可以很方便的进行一些复杂查询
什么是复杂查询?
比如,我要查询2号员工张无忌他到底归属于哪一个部门的?
此时我们可以看到在员工表当中记录了张无忌,他是归属于2号部门的,2号部门属于哪个部门?此时我们可以去部门表当中查看,部门表当中就记录了2号部门是教研部,这样我就知道了张无忌他是属于教研部的。此时我们就将这两张表通过部门这一列连接起来查询了,这就是所谓的复杂查询。当然我们将来除了在多张表之间使用这种复杂查询以外,我们还可以在一张表当中进行一些统计分析,排序分页等这种复杂的查询操作。
我们之前提到的MySQL、Oracle、DB2、SQLServer这些都是属于关系型数据库,里面都是基于二维表存储数据的。
结论:基于二维表存储数据的数据库就成为关系型数据库,不是基于二维表存储数据的数据库,就是非关系型数据库(比如大家后面要学习的Redis,就属于非关系型数据库)。
基于这种二维表来存储数据的数据库,我们就称之为关系型数据库。
反之,不是通过表结构来存储数据的,我们就称之非关系型数据库。
2). 数据模型
介绍完了关系型数据库之后,接下来我们再来看一看在Mysql数据库当中到底是如何来存储数据的,也就是Mysql 的数据模型。
刚才我们在本机上已经安装好了MySQL数据库,那其实现在我们的计算机就作为了一台MySQL数据库服务器。
那此时,我们要想操作这台MySQL数据库,就需要通过MySQL的客户端来连接上这台MySQL数据库服务器,然后才可以操作里面的数据。
在MySQL数据库服务器当中,其实就内置了一个软件,就是这个DBMS --- 数据库管理系统,我们通过数据库管理系统这个软件就可以操作数据库当中的数据了。比如我们可以通过客户端来发送一条SQL语句给数据库管理系统,告诉它我们要创建一个数据库,那此时,数据库管理系统就会根据我们的指令创建出对应的数据库,而这个数据库在我们的磁盘文件当中就是以文件夹的形式来体现的。data文件夹下存放的就是MySQL数据库的数据。
在一个数据库服务器当中,我们是可以创建多个数据库的,而且多个数据库之间它们是相互独立,互不影响的。而在这个数据库下面,我们就可以来创建表结构来存放数据,一个数据库下面我们是可以创建多张表结构的,而表结构当中存储的就是一条一条的数据。这个表最终体现在磁盘当中就是一个磁盘文件,这个文件当中存放的就是表结构当中的数据。
而我们在查询这张表中数据的时候,它就会把磁盘文件当中的数据加载出来,然后以二维表的形式呈现给我们。
总结:在MySQL数据库服务器当中存储数据,需要先去创建数据库,然后在这个数据库下再去创建对应的表结构,然后再将数据存放在这个表结构当中,而且在一个数据库服务器当中,我们可以创建多个数据库,而且多个数据库之间是相互独立的互不影响的,而一个数据库下面我们又可以创建多张表,一张表当中又可以存储多条数据,这就是MySQL的数据模型。
MySQL是关系型数据库,是基于二维表进行数据存储的,具体的结构图下:
-
通过MySQL客户端连接数据库管理系统DBMS,然后通过DBMS操作数据库
-
使用MySQL客户端,向数据库管理系统发送一条SQL语句,由数据库管理系统根据SQL语句指令去操作数据库中的表结构及数据
-
一个数据库服务器中可以创建多个数据库,一个数据库中也可以包含多张表,而一张表中又可以包含多行记录。
在Mysql数据库服务器当中存储数据,你需要:
先去创建数据库(可以创建多个数据库,之间是相互独立的)
在数据库下再去创建数据表(一个数据库下可以创建多张表)
再将数据存放在数据表中(一张表可以存储多行数据)
二. SQL简介
SQL语句书写的通用语法以及常见的SQL分类
SQL:结构化查询语言。一门操作关系型数据库的编程语言,定义了一套操作所有关系型数据库 的统一标准。
学习数据库技术,最重要的就是学习SQL语句。
show databases; --- 用来查看数据库服务器当中所有的数据库的。
1.3.1 SQL通用语法
1. SQL语句可以单行或多行书写,以分号结尾。指令结束需要加上分号或者反斜杠\g
2. SQL语句可以使用空格 / 缩进来增强语句的可读性。
3. MySQL数据库的SQL语句不区分大小写。
4. 注释:
- 单行注释:-- 注释内容 或 # 注释内容(MySQL特有) 注意:-- 后面有个空格
- 多行注释: /* 注释内容 */
1.3.2 SQL语句的分类
SQL语句根据其功能被分为四大类:DDL、DML、DQL、DCL
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(包括定义数据库,定义数据库当中的表,定义数据库表中的字段,所谓字段指的就是这一列) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录,就是用来查询数据库表结构当中的数据的 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
我们数据库安装好之后,已经有了一个默认的用户 --- root,也就是超级管理员用户。
那如果我们在项目当中需要再去创建一个用户,再去给这个用户分配相关权限的话,我们就需要借助于DCL语句,DCL语句就可以创建出数据库的用户,并给这个用户分配对应的权限,来指定这个用户你能够操作的数据库是哪些,你能够操作这个数据库下的哪些表,能够对这些表执行什么样的操作,那通过DCL语句就可以控制了。
重点学习DDL、DML、DQL这三类SQL语句。
对于DCL这一类的SQL语句,其实主要是用来管理数据库的,管理数据库当中的用户,管理数据库的权限,那这类的SQL语句在企业当中主要是数据库管理员也就是dba经常会用到,我们作为Java开发人员,一般很少会用到。
2. 数据库设计 / 操作
下面我们就正式的进入到SQL语句的学习,在学习之前先给大家介绍一下我们要开发一个项目,整个开发流程是什么样的,以及在流程当中哪些环节会涉及到数据库。
2.1 项目开发流程
需求文档:
-
在我们开发一个项目或者项目当中的某个模块之前,会先会拿到产品经理给我们提供的页面原型及需求文档。
设计:
-
拿到产品原型和需求文档之后,我们首先要做的不是编码,而是要先进行项目的设计,其中就包括概要设计、详细设计、接口设计、数据库设计等等。
-
数据库设计根据产品原型以及需求文档,要分析各个模块涉及到的表结构以及表结构之间的关系,以及表结构的详细信息。最终我们需要将数据库以及数据库当中的表结构设计并创建出来。
开发/测试:
-
参照页面原型和需求进行编码,实现业务功能。在这个过程当中,我们就需要来操作设计出来的数据库表结构,来完成业务的增删改查操作等。
部署上线:
-
在项目的功能开发测试完成之后,项目就可以上线运行了,后期如果项目遇到性能瓶颈,还需要对项目进行优化。优化很重要的一个部分就是数据库的优化,包括数据库当中索引的建立、SQL 的优化、分库分表等操作。
在上述的流程当中,针对于数据库来说,主要包括三个阶段:
-
数据库设计阶段
参照页面原型以及需求文档设计数据库表结构 -
数据库操作阶段
根据业务功能的实现,编写SQL语句对数据表中的数据进行增删改查操作 -
数据库优化阶段
通过数据库的优化来提高数据库的访问性能。优化手段:索引、SQL优化、分库分表等
接下来我们就先来学习第一部分数据库的设计,而数据库的设计就是来定义数据库,定义表结构以及表中的字段。
2.2 数据库操作 / 设计-DDL
讲解DDL当中关于数据库操作的SQL语句
我们在进行数据库设计,需要使用到刚才所介绍SQL分类中的DDL语句。
DDL英文全称是Data Definition Language(数据定义语言),用来定义数据库对象(数据库、表),包括定义数据库,定义表结构。
第一个部分,先来讲解数据库的常见操作
第二个部分,再来讲解表结构的常见操作
DDL中数据库的常见操作:查询、创建、切换 / 使用、删除。
注意:创建数据库时,在MySQL当中数据库的名字是不允许重复的。
2.2.1 查询数据库
查询所有数据库: show databases;
命令行中执行效果如下:
- 第一个是我们之前创建的数据库,下面的四个是我们安装完MySQL之后自带的数据库,是系统数据库,我们不要去操作它。
假如我们使用了一段时间之后,我这里已经不知道我到底在操作哪个数据库了,那这个时候我们就可以查看一下当前正在操作的数据库。
查询当前数据库:select database();
- 我们要操作某一个数据库,必须要切换到对应的数据库中。
- 通过指令:select database() ,就可以查询到当前所处的数据库 ,select dababase后面这对小括号这是MySQL当中的函数的调用语法,其实类似于Java当中的方法。
2.2.2 创建数据库
语法:创建数据库:create database [ if not exists ] 数据库名 ; -- 不存在我再新建 / 添加
案例: 创建一个db01数据库:create database db01;
报错了,提示:不能创建db01数据库 数据库已存在
注意:在同一个数据库服务器中,不能创建两个名称相同的数据库,否则将会报错。
在MySQL当中数据库的名字是不允许重复的。
- 可以使用if not exists来避免这个问题
-- 数据库不存在,则创建该数据库;如果存在则不创建
create database if not extists itcast;
换一个名字,创建db02,创建db02可以复用前面的这一条指令,可以按上下箭头来切换历史指令
,切换出来之后在这条指令的基础上改一下即可。
- 出现OK,说明数据库创建成功!!!
此时,再查询一下:
注:在create database后面可以加上一个可选项,这个可选项叫做if not exists,我们加上这么一 个可选项,就代表这个数据库不存在我再创建,如果数据库存在我不创建,我也不会报错, 不会执行任何操作。
语法:创建数据库:create database [ if not exists ] 数据库名 ;
演示:数据库db02已经存在,按照上述语法再次创建数据库db02,回车之后没有报错。
2.2.3 切换 / 使用数据库
语法:use 数据库名 ;
我们要操作某一个数据库下的表时,就需要通过该指令,切换到对应的数据库下,否则不能操作。
比如,我要使用db01这个数据库:
指的就是我们切换数据库成功了!!!
假如我们使用了一段时间之后,我这里已经不知道我到底在操作哪个数据库了,那这个时候我们就可以查看一下当前正在操作的数据库。
查询当前数据库:select database();
- 我们要操作某一个数据库,必须要切换到对应的数据库中。
- 通过指令:select database() ,就可以查询到当前所处的数据库 ,select dababase后面这对小括号这是MySQL当中的函数的调用语法,其实类似于Java当中的方法。
我们可以看到当前正在操作的数据库是db02
2.2.4 删除数据库
语法:drop database [ if exists ] 数据库名 ; -- itcast数据库存在时删除 存在我再删除
- 如果删除一个不存在的数据库,将会报错。
- 可以加上参数 if exists ,如果数据库存在,再执行删除,否则不执行删除。
- 如果不存在,不执行任何操作。
案例:删除db02数据库
删除db03数据库,db03数据库不存在,直接删除会报错:
注意事项:
上述语法中的database,也可以替换成 schema。如:create schema db01;
在我们日常开发当中,基本上用的都是database,因为database见名知意,翻译过来就是数据库
-
如:create schema db01;
-
如:show schemas;