SpringBoot(三)--- 数据库基础
目录
前言
一、MySQL
1. 关系型数据库
2.数据模型
二、SQL语句
1.DDL语句
1.1 数据库操作
1.1.1 查询数据库
1.1.2 创建数据库
1.1.3 使用数据库
1.1.4 删除数据库
1.2 表操作
1.2.1 创建表
1.2.2 约束
1.2.3 数据类型
2.DML语句
2.1 增加(insert)
2.2 修改(update)
2.3 删除(delete)
3.DQL语句
3.1 基本查询
3.2 条件查询
3.3 聚合函数
3.4 分组查询
3.5 排序查询
3.6 分页查询
前言
在开发SpringBoot项目时,我们一般将web应用程序分为三层,即:Controller、Service、Dao 。
web开发调用流程图如下所示:
下面讲解一下数据库的基础知识。
数据库有两个概念,第一个是DBMS(数据库管理系统),是操作和管理数据库的大型软件。第二个是SQL(结构化查询语言),它是操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。
一、MySQL
下图是一些目前主流的数据库:
MySQL数据库是开源免费的中小型数据库,目前Oracle推出两个版本的Mysql:社区版(开源免费)、商业版(收费)。对于初学者来说,使用社区版就足够了。
MySQL安装配置教程:Mysql的安装和配置教程
DataGrip安装配置教程(操作数据库图形化工具):DataGrip下载安装及使用教程
1. 关系型数据库
关系型数据库就是建立在关系模型基础上,由多张相互连接的二维表组成的数据库。而所谓二维表,指的是由行和列组成的表,如下图:
二维表的优点:
-
使用表存储数据,格式统一,便于维护
-
使用SQL语言操作,标准统一,使用方便,可用于复杂查询
结论:基于二维表存储数据的数据库就成为关系型数据库,不是基于二维表存储数据的数据库,就是非关系型数据库。
2.数据模型
MySQL数据库的数据模型是关系型数据库,是基于二维表进行数据存储的,具体的结构图下:
-
通过MySQL客户端连接数据库管理系统DBMS,然后通过DBMS操作数据库。
-
使用MySQL客户端,向数据库管理系统发送一条SQL语句,由数据库管理系统根据SQL语句指令去操作数据库中的表结构及数据。
-
一个数据库服务器中可以创建多个数据库,一个数据库中也可以包含多张表,而一张表中又可以包含多行记录。
二、SQL语句
SQL:结构化查询语言。一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准。SQL语句根据其功能被分为四大类:DDL、DML、DQL、DCL 。
1.DDL语句
1.1 数据库操作
1.1.1 查询数据库
查询所有数据库:
show databases;
命令行中给出了当前所有的数据库
查询当前数据库:
select database();
1.1.2 创建数据库
语法:
create database [ if not exists ] 数据库名 [default charset utf8mb4];
案例:
-- 数据库不存在,则创建该数据库;如果存在则不创建
create database if not exists itcast;
1.1.3 使用数据库
语法:
use 数据库名 ;
案例:切换到itcast数据库
use itcast;
1.1.4 删除数据库
语法:
drop database [ if exists ] 数据库名 ;
-
如果删除一个不存在的数据库,将会报错。
-
可以加上参数 if exists ,如果数据库存在,再执行删除,否则不执行删除。
1.2 表操作
1.2.1 创建表
语法:
create table 表名(字段1 字段1类型 [约束] [comment 字段1注释 ],字段2 字段2类型 [约束] [comment 字段2注释 ],......字段n 字段n类型 [约束] [comment 字段n注释 ]
) [ comment 表注释 ] ;
[约束]是对当前字段进行约束
示例:
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 '用户表';
但是对于上面的表,我们能添加两条id为1的数据:
因为我们没有对字段添加约束,所以任何数据都可以填入。
1.2.2 约束
在MySQL数据库当中,提供了以下5种约束:
在上述的表结构中:
-
id 是一行数据的 唯一标识
-
username 用户名字段是非空且唯一的
-
name 姓名字段是不允许存储空值的
-
gender 性别字段是有默认值,默认为男
create table tb_user (id int primary key auto_increment comment 'ID,唯一标识', #auto_increment表示主键自动增长username varchar(20) not null unique comment '用户名',name varchar(10) not null comment '姓名',age int comment '年龄',gender char(1) default '男' comment '性别' # default表示默认值
) comment '用户表';
1.2.3 数据类型
数值类型主要有以下几种:
画红线的是常用的。
字符串类型主要有char类型和varchar类型:
char 与 varchar 都可以描述字符串,char是定长字符串,指定长度多长,就占用多少个字符,和字段值的长度无关 。而varchar是变长字符串,指定的长度为最大占用长度 。相对来说,char的性能会更高些。
示例: 用户名 username ---长度不定, 最长不会超过50username varchar(50)手机号 phone ---固定长度为11phone char(11)
日期时间类型如下:
示例: 生日字段 birthday ---生日只需要年月日 birthday date创建时间 createtime --- 需要精确到时分秒createtime datetime
2.DML语句
2.1 增加(insert)
向指定字段添加数据
insert into 表名 (字段名1, 字段名2) values (值1, 值2);
-- 因为设计表时create_time, update_time两个字段不能为NULL,所以也做为要插入的字段
insert into emp(username, name, gender, phone, create_time, update_time)
values ('wuji', '张无忌', 1, '13309091231', now(), now());
全部字段添加数据
insert into 表名 values (值1, 值2, ...);
批量添加数据(指定字段)
insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2);
批量添加数据(全部字段)
insert into 表名 values (值1, 值2, ...), (值1, 值2, ...);
2.2 修改(update)
语法:
update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [where 条件] ;
示例:
将id为1的数据,name改为“张三”,update_time改为当前时间。
update emp set name='张三', update_time=now() where id=1;
2.3 删除(delete)
语法:
delete from 表名 [where 条件] ;
示例:
删除emp表中id为1的那一行数据。
delete from emp where id = 1;
3.DQL语句
DQL语句用来查询数据库表中的记录,是最常用的SQL语句。
3.1 基本查询
查询多个字段:
select 字段1, 字段2, 字段3 from 表名;
查询所有字段:
select * from 表名;
3.2 条件查询
语法:
select 字段列表 from 表名 where 条件列表 ; -- 条件列表:意味着可以有多个条件
示例:
查询名字为杨逍的那一行数据。
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where name = '杨逍'; -- 字符串使用''或""包含
比较运算符:
逻辑运算符:
3.3 聚合函数
常用的聚合函数如下:
示例:
统计平均工资
select avg(salary) from emp;
统计emp表中有多少数据:
-- count(*) 推荐此写法(MySQL底层进行了优化)
select count(*) from emp;
3.4 分组查询
-
分组: 按照某一列或者某几列,把相同的数据进行合并输出。
-
分组其实就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类完的数据进行合并计算。
-
分组查询通常会使用聚合函数进行计算。
-
语法:
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
示例:
根据性别分组 , 统计男性和女性员工的数量
select gender, count(*)
from emp
group by gender; -- 按照gender字段进行分组(gender字段下相同的数据归为一组)
查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
select job, count(*)
from emp
where entry_date <= '2015-01-01' -- 分组前条件
group by job -- 按照job字段分组
having count(*) >= 2; -- 分组后条件
where与having区别
-
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
-
判断条件不同:where不能对聚合函数进行判断,而having可以。
3.5 排序查询
语法:
select 字段列表
from 表名
[where 条件列表]
[group by 分组字段 ]
order by 字段1 排序方式1 , 字段2 排序方式2 … ;
-
排序方式:
-
ASC :升序(默认值)
-
DESC:降序
-
示例:
根据entry_date,进行降序排序
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
order by entry_date DESC; -- 按照entrydate字段下的数据进行降序排序
3.6 分页查询
语法:
select 字段列表 from 表名 limit 起始索引, 查询记录数 ;
示例:
从起始索引0开始查询数据, 每页展示5条记录
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
limit 0 , 5; -- 从索引0开始,向后取5条记录
查询 第2页 员工数据, 每页展示5条记录
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
limit 5 , 5; -- 从索引5开始,向后取5条记录