SpringBoot(三)--- 数据库基础

news2025/7/17 19:15:02

目录

前言

一、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 ---长度不定, 最长不会超过50
    username varchar(50)
    
    手机号 phone ---固定长度为11
    phone 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条记录

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【漫话机器学习系列】268. K 折交叉验证(K-Fold Cross-Validation)

图解 K 折交叉验证&#xff08;K-Fold Cross-Validation&#xff09;| 原理 数学公式 实践应用 原图作者&#xff1a;Chris Albon&#xff0c;手绘风格清晰易懂&#xff0c;本文基于其图解做详细扩展&#xff0c;适用于机器学习、深度学习初学者及进阶者参考学习。 一、什么是…

【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核

如果你在conda的base环境运行了jupyter lab打开了一个ipynb文本&#xff0c;此时选择的内核是base虚拟环境的Python内核&#xff0c;如果我想切换成其他conda虚拟环境来运行这个文件该怎么办&#xff1f;下面我们试着还原一下问题&#xff0c;并且解决问题。 【注】 这个问题出…

【Boost搜索引擎】构建Boost站内搜索引擎实践

目录 1. 搜索引擎的相关宏观原理 2. 正排索引 vs 倒排索引 - 搜索引擎具体原理 3. 编写数据去标签与数据清洗的模块 Parser 去标签 编写parser 用boost枚举文件名 解析html 提取title ​编辑 去标签 构建URL 将解析内容写入文件中 4. 编写建立索引的模块 Index 建…

Nginx配置记录访问信息

文章目录 方法一&#xff1a;使用Nginx原生配置记录访问信息方法二&#xff1a;使用Nginx_headers_more模块记录更加详细的信息 Nginx被广泛应用于各种场景如&#xff1a;Web服务器、反向代理服务器、负载均衡器、Web应用防火墙(WAF)等 在实际的产品开发中&#xff0c;无论是功…

HomeAssistant开源的智能家居docker快速部署实践笔记(CentOS7)

1. SGCC_Electricity 应用介绍 SGCC_Electricity 是一个用于将国家电网&#xff08;State Grid Corporation of China&#xff0c;简称 SGCC&#xff09;的电费和用电量数据接入 Home Assistant 的自定义集成组件。通过该应用&#xff0c;用户可以实时追踪家庭用电量情况&…

JAVA EE(进阶)_HTML

思如云烟&#xff0c;行若磐石。 ——陳長生. ❀主页&#xff1a;陳長生.-CSDN博客❀ &#x1f4d5;上一篇&#xff1a;JAVA EE&#xff08;进阶&#xff09;_进阶的开端-CSDN博客 1.HTML HTML&#xff08;HyperText Mark…

职坐标AIoT技能培训课程实战解析

职坐标AIoT技能培训课程以人工智能与物联网技术深度融合为核心&#xff0c;构建了“理论实战行业应用”三位一体的教学体系。课程体系覆盖Python编程基础、传感器数据采集、边缘计算开发、云端服务部署及智能硬件开发全链路&#xff0c;通过分层递进的知识模块帮助学员建立系统…

8-游戏详情制作(Navigation组件)

1.1 需求 使用Navigation实现游戏主详情视图&#xff0c;从瀑布流容器中的游戏项&#xff08;游戏中心首页-游戏瀑布流列表&#xff09;点击游戏后进入游戏详情页&#xff0c;从游戏详情页可以返回游戏列表主页。 1.2 界面原型 从瀑布流组件进入&#xff1a; 游戏详情&#…

Unity引擎源码-物理系统详解-其二

继续我们关于Unity的物理系统的源码阅读&#xff0c;不过这一次我们的目标是PhysX引擎——这个Unity写了一堆脚本来调用API的实际用C写成的底层物理引擎。 Github的地址如下&#xff1a;NVIDIA-Omniverse/PhysX: NVIDIA PhysX SDK (github.com) 下载后发现由三个文件组成&…

1.3.3 数据共享、汇聚和使用中的安全目标

探索数据共享、汇聚与使用中的安全目标 在当今数字化时代&#xff0c;数据的价值愈发凸显&#xff0c;数据共享、汇聚与使用成为了推动业务发展、促进创新的重要环节。然而&#xff0c;在这一过程中&#xff0c;数据安全至关重要&#xff0c;我们需要明确并保障保密性、完整性…

【Docker】Docker安装Redis

目录 1.下载镜像 1.1查看下载的镜像 2.创建挂载目录 3.创建容器并启动 4.测试连接 1.下载镜像 根据指令下载镜像文件 docker pull redis#上面指令是下载最新&#xff0c;如需下载指定版本可带版本号 docker pull redis:xxx 响应内容&#xff1a; 1.1查看下载的镜像 下载完…

Oc语言学习 —— Foundation框架总结

1、NSString类 我们对一个NSString对象赋值的方法是直接将字符串常量赋给对象&#xff0c;例如&#xff1a;NSString *str "hello"; 因为我们的NSString是不可变的&#xff0c;所以我们只能通过一些方法来在我们原来的字符串后面追加或初始化我们的字符串来间接修改…

LWIP的Socket接口

Socket接口简介 类似于文件操作的一种网络连接接口&#xff0c;通常将其称之为“套接字”。lwIP的Socket接口兼容BSD Socket接口&#xff0c;但只实现完整Socket的部分功能 netconn是对RAW的封装 Socket是对netconn的封装 SOCKET结构体 struct sockaddr { u8_t sa_len; /* 长…

Better Faster Large Language Models via Multi-token Prediction 原理

目录 模型结构&#xff1a; Memory-efficient implementation&#xff1a; 实验&#xff1a; 1. 在大规模模型上效果显著&#xff1a; 2. 在不同类型任务上的效果&#xff1a; 为什么MLP对效果有提升的几点猜测&#xff1a; 1. 并非所有token对生成质量的影响相同 2. 关…

Spring的Validation,这是一套基于注解的权限校验框架

为了保证数据的正确性、完整性&#xff0c;作为一名后端开发工程师&#xff0c;不能仅仅依靠前端来校验数据&#xff0c;还需要对接口请求的参数进行后端的校验。 controller 全局异常处理器 在项目中添加一个全局异常处理器&#xff0c;处理校验异常 RestControllerAdvice p…

MySQL - 如何突破单库性能瓶颈

数据库服务器硬件优化 我们来看看对数据库所在的服务器是如何进行优化的&#xff0c;服务器是数据库的宿主&#xff0c;其性能直接影响了数据库的性能&#xff0c;所以服务器的优化也是数据库优化的第一步。 数据库服务器通常是从 CPU、内存、磁盘三个角度进行硬件优化的&…

apisix透传客户端真实IP(real-ip插件)

文章目录 apisix透传客户端真实IP需求和背景apisix real-ip插件为什么需要 trusted_addresses&#xff1f;安全架构的最佳实践 示例场景apisix界面配置 apisix透传客户端真实IP 需求和背景 当 APISIX 前端有其他反向代理&#xff08;如 Nginx、HAProxy、云厂商的 LB&#xff…

Oracle 数据库的默认隔离级别

Oracle 数据库的默认隔离级别 默认隔离级别&#xff1a;READ COMMITTED Oracle 默认使用 读已提交(READ COMMITTED) 隔离级别&#xff0c;这是大多数OLTP(在线事务处理)系统的标准选择。 官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/da…

代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I

每日被新算法方式轰炸的一天&#xff0c;今天是dijkstra&#xff08;堆优化版&#xff09;以及Bellman_ford &#xff0c;尝试理解中&#xff0c;属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra&#xff08…

开启健康生活的多元养生之道

健康养生是一门值得终身学习的学问&#xff0c;在追求健康的道路上&#xff0c;除了常见方法&#xff0c;还有许多容易被忽视却同样重要的角度。掌握这些多元养生之道&#xff0c;能让我们的生活更健康、更有品质。​ 室内环境的健康不容忽视。定期清洁空调滤网&#xff0c;避…