数据库介绍
一.数据库的概念
1.常见的数据库
Database:
数据库,储存和管理数据的仓库
DBMS:Database Mangement System 数据库管理系统
软件
RDBMS:关系型数据库管理系统
NoSQL:非关系型数据库管理系统
Redis:保存键值对类型的数据
MongoDB:保存json
Neo4j:图数据库
2.关系型数据库管理系统
MySQL,ProgressSQL,Oracle,SqlServer...
使用二维表格来保存数据:
行:记录 -> 一条数据 -> 和Java实体类实例化出的对象一一对应
列:字段 -> 数据的名称 -> 和java的实体类一一对应
为什么叫关系型数据库?
因为表和表之间是通过关系(外键关系)来连接起来的
3.MySQL
开源免费的RDBMS
C/S架构的软件 client/server 客户端/服务器架构
MySQL的服务器叫做mysqlid,因为配置了一个服务,所以开机会自启,
不管是cmd里面打出的mysql -u root -p 还是使用navicat连接到服务器,
其实都是客户端
IP:
identification protrocal -> 用来在网络上唯一标识一台计算机
4.端口号
在一台计算机上唯一标识一个进程
8080:tomcat默认的端口号
80: HTTP协议默认的端口号
ip+端口号:
访问到一台计算机上面的一个进程
二.数据表及sql介绍
1.介绍
structured query language -> 结构化查询语句
用来在RDBMS里面去检索,管理一些信息
有一个标准化的,但是每一个RDBMS都可能有一些自己的方言
2.SQL
DDL:Data Define Language - > 建库建表语句 create table ...
DML:Data Manipulate Language - > 数据操纵语句 insert delete
update 语句
DQL:Data Query Language - > 数据查询语句 select 语句
DCL:Data Control Language - > 数据空值语句 建立用户,管理权限
三.数据库数据类型
数据库的数据类型:
1 .varchar 动态字符串 空间大小根据字符串的长度自动分配 -> String
2 .int -> 整形 长度是有多少位数字 -> int
3 .tinyInt -> boolean 1 是true 0 是false
4 .date -> yyyy-MM-dd -> Date
5 .datetime -> yyyy-MM-DD hh:mm:ss -> TimeStamp
6 .longtext -> 长文本 保存一些文章可以用
四.数据库的完整性约束
1 .非空约束 -> 设置字段的时候 勾选上 NOT NULL
2 .唯一约束 -> 对字段设置一个unique索引
3 .主键约束 -> 设置一个或者多个字段作为主键
主键:唯一标识一行记录 主键的选取标准:不能有任何的业务含义
4 .外键约束 ->
如果一个键在一张表里作为主键的话,在另一张表里出现,就可以作为
外键
举例:
部门表 id 如果在员工表里出现的话 就可以作为外键了 表示一个员工
属于一个部门
五.表和表之间的关系
1. 1对1 2. 1对多 3. 多对多
一对一:
一张表中的一条记录 唯一对应另一张表中的一条记录
不常见,一般来说做权限分离的时候会用,应用场景很少
一对多:
一张表中的一条记录 对应另一张表的多条记录
怎么完成一对多关系?
在多的那张表里面建立外键
多对多:
两张表里面的记录都互相对应多小记录
举例:
商品表 顾客表
一个商品可以被多个顾客购买,一个顾客也可以购买多个商品
怎么完成多对多关系?
使用一张交叉引用表(中间表),在中间表里面建立 两张表的外键
六.SQL语句
1.增删改查
1.1.insert
1. insert into 表名 values (列1 ,列2. ..)
- > 按照字段的顺序来插 入值 ps:字段的顺序是由建表语句的定义字段的顺序来决定的,跟navicat里 面用鼠标调左右那个顺序没关系
2. insert into 表名 (字段1 ,字段2. ..) valus (值1 ,值2. ..)
- > 向指定的字段来插入一些值
1.2.delete
delete from 表名 where xxx
- > 删除表里面符合条件的记录
1.3.update
update 表名 set 字段1 = 值1 ,字段2 = 值2. ..where xxx
- > 修改表 里符合条件的记录对应的字段值
1.4.select
select 字段 6 from 表名 1 join 表名 on 条件 2 where xxx 3 group by 字段 4 having xxx 5 order by 字段 7 limit offset,count 8
2.查询语句关键字
2.1.from语句
先把一张表里面的所有的数据全部获取出来
2.2.join语句:
内连接:
1. 做笛卡尔积 将第一张表里面的所有的字段和第二表里面的所有字段拼接到一起
2. 根据on 的条件进行筛选,筛选出符合条件的记录(满足on 后面的布尔表达式的结果为true )
外连接:
第一种理解方式:
1. 做笛卡尔积 将第一张表里面的所有的字段和第二表里面的所有字段拼接到一起
2. 根据on 的条件进行筛选,筛选出符合条件的记录(满足on 后面的布尔表达式的结果为true )
3. 将左连接/右连接 表里面的外部行(不满足on 条件的记录)拼接到表的下面
第二种理解方法:
1. 如果是左连接的话,以左表为基准,先将左表中的所有数据显示出来
2. 将右表中的每一条记录和左表的记录拼接到一起,如果满足on 的条件的话,就拼接到临时表里面
内连接和外连接有什么区别?
内连接的结果在两张表中都有对应的记录
外连接的话,可能会出现不满足on 条件的记录
2.3.where子句
从临时表中筛选,如果这条记录满足where 自己的条件(如果能使where 自己的结果为true 的话,添加到临时表里面)
like -> 模糊查询 % 多个字符 _单个字符 like "%张" -> 以张结尾的字符串
like运算符后面必须写引号 ""
bewteen ... and ... -> 在...之间
in -> 在...里面 a in (500 ,100 ) 可以和or运算符互换 a = 500 or a = 100 ->
可以用在子查询里面,当作一些值来用
需要子查询的结果是一个1 *N的表
not -> 取反
2.4.group by子句
分组查询是将一些结果集 按照字段进行分组,字段值相同的为一组,如果只分组,结果集里面只会显示每一组的第一条数据
group by 子句一般会搭配聚合函数使用,这样的话分组才有意义,比如:统计每一组的平均值,最大值,最小值,数量等
聚合函数:
count () - > 统计数量
max () min () - > 最大值
avg () - > 平均值
sum () - > 求和
group_concat() - > 将每一组某个字段的值,通过,分隔开,拼接成一个字符串
如果没用指定分组的话,默认是把整张表的数据作为一组来使用
group by 可以指定多个字段作为一组,如果指定了多个字段的话,表示的是这些字段的值全部一样的记录会分为一组
2.5.having子句
-> 用来对分组后的结果进行筛选
having子句里面可以使用聚合函数,但是where 子句里面不行,为什么?
因为where 子句执行的时候,还没有group by 还没有分组,所以用不了聚合函数
2.6.select子句
从以上得到的结果集里面筛选出想要的字段
2.7.order by
排序 根据一些字段进行排序
ASC - > 升序 从小到大
DESC - > 降序 从大到小
order by 子句如果指定了多个字段的话,第一个字段一样的字段,就通过第二个字段进行排序,以此类推
2.8.limit
limit是mysql的一个方言,在以前的RDBMS里面也有会类似的语句,但是不是limit
通过limit子句可以完成分页
前端:
<script > var offset = 0 ; $.get ("/user?offset=" +offset+"&limit=10" ,
function (data ){
offset+=10 ;
})
</script >
后端:
select * from user limit 前端传入的offset,前端传入的limit
七、SQL注入
select * from user where username = 'zhangsan' and password = '' or 1 = '1'
如果用户输入的密码是 'or 1=' 1 , 就会把数据库所有的信息全部返回回去,爆库了
SQL 注入原理:通过猜别人的sql 语句,输入一个特殊的字符串,构建一个不合理的sql 语句
八、索引,事务,存储引擎
1.索引
1.1索引
索引就是一个数据结构,数据库里面的数据可以按照索引的方式来构建成一颗B +树,从而大大提高数据的查找速
索引是不是越多越好?
不是,因为虽然索引可以大大增加查询的速度,但是索引会占用空间,而且当我们增加,删除,修改的时候,会动态维护索引,到底增删改的速度变慢
1.2聚簇索引和非聚簇索引
聚簇索引:
聚簇索引将索引和主键存放在一起,如果使用了聚簇索引,找到索引的同时就找到了主键,就找到了数据,速度非常快,但是每一张表只能设置一个聚簇索引
聚餐索引很珍贵,不要把聚簇索引设置到主键上,一定要设置到最常用的那个字段
非聚簇索引:
非聚簇索引可以看作是一个指向主键的指针,找到了设置非聚簇索引的字段以后,还要根据非聚簇索引找到主键才能找到数据,速度会比较慢一点,但是一张表可以随意设置非聚簇索引
索引的最左匹配原则:
where子句使用了多个字段,如果最左边的字段没有设置索引的话,就不会走索引了,会全表查找
1.3.SQL优化
索引怎么建立最好
1. 在经常使用where 语句的字段上建立索引
2. 在join 表的外键上键索引
3. 分组的字段上可以建立索引
4. 根据业务需求,如果where 语句里面使用了多个字段的话,可以建立联合索引(将几个字段一起建立索引)
5. 在列值重复比较多的列上不易建立索引
6. blob ,longtext等数据值很大的列上不宜建立索引
2.事务
2.1.什么是事务
什么叫做事务:
事务就是将一组sql语句作为一个不可分割的整体一起来执行,这些语句要么全部执行成功,要么都不成功
事务有什么用?
防止一些安全性问题
比如:转账,订单,仓库管理系统...
2.2事务的四个特性ACID
A -> 原子性每一个事务都是不可拆分的最小单位
C -> 一致性事务执行前和执行后,系统的状态是一致的
I -> 隔离性 每一个事务对于其他事务而言都是隔离状态,不会相互影响
D -> 持久性 事务执行后的结果会实际影响到磁盘
2.3事务的隔离级别:
两个事务之间相互影响的程度
1 .UNCOMMITED READ (未提交读):
时间点 事务A 事务B
1 ) 开启事务
2 ) 开启事务
3 ) 查询数据为100 条
4 ) insert一条数据
5 ) 再查询,结果为101 条
一个事务读取到了另一个事务还没有提交就修改的数据 -> 脏读
2 .COMMITED READ(提交读)
虽然解决了脏读问题,但是第二个事务提交以后,事务一发现两次读取的结果还是不一样 ->不可重复读
3 .REPEATABLE READ(可重复读)
- MySQL默认的隔离级别
时间点 事务A 事务B
1 开启事务
2 开启事务
3 查询数据“张三”,不存在
4 插入数据“张三”
5 提交事务
6 查询数据“张三”,不存在
7 插入数据“张三”,不成功
虽然说解决了刚才的不可重复度问题,即使事务B 提交了以后,查询的结果还是和以前保持一致,但是此时要新增一条数据的话,就会不成功了,就像感觉到了一个幻影的数据 -> 幻读
4 .SERIALIZABLE (可串行化)
将所有的事物串行处理,什么现象都不会产生,但是速度极慢!性能最差!
3.存储引擎:
MyIsam:MySQL5.1之前的默认的存储引擎
优点:CRUD速度比较快
缺点:
1.不支持事务
2.不支持外键
Innodb:MySQL5.1之后的默认的存储引擎
虽然CRUD速度会慢一点,但是支持事务,外键,同时如果数据损坏了,也容易恢复
MEMEORY:内存 速度最快,但是没法持久化保存
九.JDBC
1.JDBC是什么?
JDBC是什么?
JDBC是java官方提供的一套操作数据库的标准
JDBC是一整套接口,开发者调用这些接口就可以操作数据库,设计者实现这些接口,就可以完成对应RDBMS的数据库操作功能
2.步骤
1 .加载驱动
class.forname(“com.mysql.jdbc.Driver”)
2 .建立连接
Connection:
生成一个客户端,用来保持java和数据库的连接状态
DriverManger.getConnection (url,username,password)
MySQL的URL: jdbc:mysql:
connection.setAutoCommit (false ) -> 自动提交,默认为true ,默认以一条
sql语句作为一个事务
connection.commit () -> 提交事务
connection.rollback () -> 回滚事务
3 .创建一个prepareStatement用来执行sql语句
int executeUpdate () -> 执行增删改语句 返回影响的行数
ResultSet executeQuery () -> 执行查询语句 返回一个ResultSet对象结果集
4 .遍历ResultSet
ResultSet是一张表的结构,内置了一个游标,游标指向的位置是第一行的上方
next () -> 将游标移动到下一行
while (resultSer.next ()){
resultSet.getString ("列名" ) -> 通过列名来获得一个varchar类型的数据xxx}
5 .关闭连接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构