JAVA集中学习第四周学习记录(二)

系列文章目录

第一章 JAVA集中学习第一周学习记录(一)
第二章 JAVA集中学习第一周项目实践
第三章 JAVA集中学习第一周学习记录(二)
第四章 JAVA集中学习第一周课后习题
第五章 JAVA集中学习第二周学习记录(一)
第六章 JAVA集中学习第二周项目实践
第七章 JAVA集中学习第二周学习记录(二)
第八章 JAVA集中学习第二周课后习题
第九章 JAVA集中学习第二周学习记录(三)
第十章 JAVA集中学习第二周学习记录(四)
第十一章 JAVA集中学习第三周学习记录(一)
第十二章 JAVA集中学习第三周小组项目开发
第十三章 JAVA集中学习第四周学习记录(一)
第十四章 JAVA集中学习第四周学习记录(二)



前言

本文集中介绍数据库的知识,包含MySQL的介绍,DML数据管理语言,DDL数据查询语言和视图、事务、索引的理论知识。不要看DML、DDL好像多高级,其实就是基础的增删改查,数据库的发明家为了能买个高价钱取了个高大上的名字罢了。在下攸攸太上,因为没人申请成为ൠ♄§星的大使,我们恼羞成怒,决定开启地球人类甄别计划。


一、数据库总体介绍

1. 数据库分类

数据库类型:网状数据库、层次数据库、关系型数据库、非关系型数据库。
主流的是关系型数据库和非关系型数据库。

2. 关系型数据库SQL

建立在一个或多个表格上的,我们使用结构化查询语言SQL对关系型数据库进行操作
数据以二维表形式进行存储,表和表之间可以建立关联关系的。(1对1,1对N,N对N通过主外键关系建立的;添加,删除,修改都是有约束的,所以我们一般不做除了主键的任何约束)
对比: 非关系型数据库NotOnlySQL
为了解决大规模数据集合多重数据种类的问题,无事务处理

3. MySQL

MySQL是一种开放源代码轻量级关系型数据库 ,MySQL数据库使用最常用的结构化查询语言(SQL)对数据库进行管理。 由于MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个人需要对其缺陷进行修改。
由于MySQL数据集体积小、速度快、成本低、开放源码 等优点,现已被广泛应用于互联网上的中小型网站中,并且大型网站也开始使用MySQL数据库,如网易、新浪等。
是一款操作关系型数据库的语言——SQL(结构化查询语言)。

4. sql组成部分

DQL数据查询语言(查询)、
DML数据管理语言(增删改)、
TCL事务的控制语言、
DCL数据控制语言、
DDL数据控制语言

二、增删查详解

表介绍:
学生表:
在这里插入图片描述
班级表:
在这里插入图片描述

1. DML数据管理语言

1.1 insert新增

新增表:

create table t_class(
        cno int(4) primary key auto_increment,
        cname varchar(10) not null,
        room char(4)
)

给表里所有字段赋值,表名后面可以不写字段名:

insert into t_student values(null, 'Elun', '女', 23, now(), 'kanban',  'bfuk@qq.com')
insert into t_student values(null, 'Ulun', '女', 23, sysdate(), 'kanban',  'fcuk@qq.com')

1.2 delete删除

删除语句:

delete from t_class where cno = 1

如果设置了外键并且cno = 1有相应的学生数据
delete和truncate和drop的区别:
从最终的结果来看,虽然使用TRUNCATE操作和使用DELETE操作都可以删除表中的全部记录,但是两者还是有很多区别的,其区别主要体现在以下几个方面:
(1)DELETE为数据操作语言DML;TRUNCATE为数据定义语言DDL。
(2) DELETE操作是将表中所有记录一条一条删除直到删除完;TRUNCATE操作则是保留了表的结构,重新创建了这个表,所有的状态都相当于新表。因此,TRUNCATE操作的效率更高。
(3)DELETE操作可以回滚;TRUNCATE操作会导致隐式提交,因此不能回滚(在第十章中会讲解事务的提交和回滚)。
(4)DELETE操作执行成功后会返回已删除的行数(如删除4行记录,则会显示“Affected rows:4”);截断操作不会返回已删除的行量,结果通常是“Affected rows:0”。DELETE操作删除表中记录后,再次向表中添加新记录时,对于设置有自增约束字段的值会从删除前表中该字段的最大值加1开始自增;TRUNCATE操作则会重新从1开始自增。

1.3 修改

哈哈,不讲嘞。

2. DDL数据查询语言

表是数据库存储数据的形式,可以将复杂的数据结构用较为简单的二维表来表示。
表中行称为记录,列称为字段
约束:
主要作用为限制字段,以确保数据库中数据的准确性和一致性 ,这种机制就是完整性约束 ,完整性——数据的准确性。

1、主键约束:非空 + 唯一
2、非空约束:不可为空
3、唯一约束:不可重复
4、检查约束:可以限定取值范围,条件
5、默认值约束:有默认值
6、自增约束:自动增长
7、外键约束:跟别的表进行关联

感觉好像RE0里的权能,写写看

1、剑主权能:不死+最强
2、不死权能:死不了,获得剑圣权能后自动获得
3、唯一权能:世界最强,只属于一人,一般属于剑主
4、检查权能:能看到他人的权能和属性值
5、默认权能:未来被世界确定,一生会按照既定的路线走,被认为是推进历史发展之人、世界代言人
6、自增权能:获取经验值加倍
7、异界权能:可以游走于此世界与异世界之间,可以做到隐身,传送等

2.1 约束

约束分为表级约束和行级约束

2.1.1 行级约束

直接写在字段名后面
约束代码:

create table t_student(
        sno int(6) primary key auto_increment,    
        sname varchar(5) not null, 
        sex char(1) default '男' check(sex='男' || sex='女'),
        age int(3) check(age>=18 and age<=50),
        enterdate date,
        classname varchar(10),
        email varchar(15) unique);
2.1.2 表级约束

脱离建表语句或写在建表语句的最下方,外键约束是表级约束。
新增一个外键:

alter table t_student add constraint fk_stu_cno foreign key(cno) references t_class (cno)

2.2 查询语句

select 字段名 from 表名 where 字段 = 值 group by 字段名 having 分组后的筛选条件order by 字段名(desc倒序)

2.2.1 select 字段名1, 字段名2(或*)

as可以给字段设置别名,可以做简单的运算(使用ifnull函数),可以使用distinct关键字去重

2.2.2 from 表名1[ , 表名2(多表查询)]

as可以给表设置别名
inner join on都属于from

2.2.3 where 字段 = 值 and/or 字段 = 值

等值查询:

select * from emp where deptno=20 and(mgr=7361 or mgr=7788)

select * from emp where deptno=20 and mgr in(7361,7788)

有()先运行()里的
范围查询:

select * from emp where deptno=20 and mgr >= 7361  and mgr<=7788

select *from emp where deptno=20 and mgr between 7361 and 7788

select ename,sal,grade,LOSAL,HISAL from emp inner join salgradeon emp.sal>= salgrade.LOSAL and emp.sal<=salgrade.HISAL

模糊查询:
like替换=
%代表0位或者多位
_代表1位

select e.* , d.dname from emp e natural join dept d where dname like '%A%' or ename like '%A%'
2.2.4 group by 字段名

分组查询

2.2.5 having 分组后的筛选条件
2.2.6 order by 字段名, 字段名
select ename, hiredate from emp where hiredate >= '1981-01-01' and hiredate <= '1981-12-31' ORDER BY HIREDATE desc limit 0, 2

desc倒序

2.2.7 空值判断
select * from emp where comm = 0 or comm is null

空值不能用=, 只能用is或is not

2.3 介绍sql的函数

2.3.1 单行函数

多条数据得到多个结果
种类:字符串函数、数值函数、日期与时间函数、流程函数、JSON函数、其他
计算自己具体活了多少天

select datediff('2024-08-07', '2004-05-29')
2.3.1 多行函数

多条数据只得到一个结果
count():求总个数
sum():求总和
avg():求平均
max():求最大值
min():求最小值
如果select出现了多行函数,那么剩余的字段必须要出现在group by子句里。要不然对不上

利用多行函数计算、取别名并输出结果

select count(empno) as 员工个数, sum(sal) as 工资总和, max(sal) as 最大工资, min(sal) as 最小工资, avg(sal) as 平均工资 from emp

利用多行函数,刨除2000以下工资的员工并计算其他员工的平均工资并倒序排序

select avg(sal), deptno from emp where sal > 2000 group by deptno having avg(sal) > 3400 ORDER BY avg(sal) desc

2.4 多表查询

分为内连接和外连接两种“
内连接:两张表之间没有主次之分,数据相等一起显示,数据不等都不显示;
外连接:有主次关系,主表所有的都会进行显示,子表的数据相等的显示,不等的不显示

2.4.1 内连接多表查询

内连接的两张表,没有主次之分,
所有数据根据关联字段进行判断显示

2.4.2 外连接多表查询

外连接的两张表有主次之分
主表的数据一定会都显示出来
次表的数据只会显示值对等的
再查询语句里,出现的第一个表名为左表,第二本表为右表
左外连接:左表是主表,左表数据全显示,右表显示值相等的数据
右外连接:右表是主表,右表数据全显示,左表显示值相等的数据
外连接左外连接左表为主表,右外连接右表为主表

2.4.3 关联

关联表中,关联列名字要相同才可以用

2.4.4 自然关联

关联表中,关联列名字要相同、类型要相同、字段长度要相同才可以用

2.4.5 各种关联的实例演示
select empno, ename, sal, grade 
from emp inner join salgrade
on emp.sal >= salgrade.LOSAL and emp.SAL <= salgrade.HISAL

select empno, ename, sal, grade 
from emp inner join salgrade
on emp.sal >= salgrade.LOSAL and emp.SAL <= salgrade.HISAL


select empno, ename, emp.deptno, dname, loc
from emp emp inner join dept on emp.DEPTNO = dept.deptno

select empno, ename, deptno, dname, loc
from emp inner join dept using (deptno)


select empno, ename, deptno, dname, loc 
from emp natural join dept 

2.5 子查询

简单来说就是在外层查询语句的判断条件中,再塞一个查询语句
利用子查询,查询与SCOTT在同一个工资等级的人

select * from emp where deptno = (select deptno from emp where ename = 'SCOTT')

select * from emp where deptno = (select deptno from emp where sal = (select min(sal) from emp))

select emp.* from emp inner join salgrade on Grade = (select grade from emp inner join salgrade on emp.sal>= salgrade.LOSAL and sal <= salgrade.HISAL where ename = 'SCOTT' )

select * from emp where sal >= (select LOSAL from salgrade inner join emp on emp.sal >= salgrade.LOSAL and emp.sal <= salgrade.HISAL and ename = 'SCOTT') and sal <= (select HISAL from salgrade inner join emp on emp.sal >= salgrade.LOSAL and emp.sal <= salgrade.HISAL and ename = 'SCOTT')


select * from emp where YEAR(hiredate) = (select year(hiredate) from emp where ename = 'SCOTT')

3. 数据库对象

3.1 视图

学习视图的原因:保证查看者在权限范围内查看对应的字段
创建一个视图

create view V_empnoAndSal as select empno, sal from emp

只能看到empno, sal这两列
可以帮忙简化复杂的查询语句

create view info as
select e.*,d.dname,d.loc,s.*
from emp e inner join dept d on e.deptno=d.deptno inner join salgrade s on e.sal>=s.LOSAL and e.sal<=s.HISAL

只能看到三个表的所有数据,所以我们想查看这三个表的数据,操作这个视图就可以了

3.2 事务

3.2.1 事务基础知识

应用在业务层:在业务层做功能的整合。
京东下单——控制层只调用下业务层的付款方法——业务层调用十七个Dao层里的方法,只要有一个不成功,就都应该失败,事务能把不同的方法视为同一个整体
作用: 让多个DML语句作为一个整体,要么同时成功Commit,要么同时失败Rowback
特征: ACID
原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability

3.2.2 事物的并发问题

脏读: 一个事务修改了一条数据,但还没有提交,另一个事务获取了还没来得及提交的数据,这个数据就是脏数据

不可重复读: 读到了另一个事务改后提交了的数据,但这个事务还在运行中。例如微信,可以看到对方实时发的消息,数据库认为这个不可重复读是不好的,认为可重复读的你得先退出微信,在登陆微信才能看到我新发的消息是好的。但我们可以接受这种并发问题。

幻读: 类似不可重复读,是读到了另一个事务新增或更改后提交的数据。

针对上面三种事务的并发问题,MySQL给我们提供的解决方法是:改变事务的隔离级别

READ UNCOMMITTED脏读、不可重复读、幻读都会出现
READ COMMITTED不可重复读、幻读会出现
REPEATABLE READ(默认)幻读会出现
SERIALIZABLE都不会出现
隔离级别越高,效率越低

3.3 索引

三、杂项知识

1. 枚举

1.1 创建枚举

public enum Season {,;
}

1.2 使用枚举

以参数的形式存在一个类里

2. 注解

!!!不是注释!!!
反射 + 设计模式 + 注解 = 框架
注解是代码里的特殊标记,可以在不改变原有逻辑的情况下,在源文件嵌入一些补充信息。
使用注解要在前面增加@符号,并把该注解当成一个修饰符使用,用于修饰它支持的程序元素。
使用注解:
包、类、方法、属性、局部变量上方都可以加注解
@单词[(参数)]

2.1 JavaSE常用的注解

jdk:@SuppressWarnings(“All”);抑制编译器警告
@Deprecated设置资源过失
@Override重写
JavaDao里常用注解
@param参数
@return返回值

2.2 Junit单元测试

@Test
测试单元之前一定会运行public void before(){}(一般放需要的属性)
测试单元之后一定会运行public void after(){}

3. 类的组成:

属性,构造器,方法,内部类,代码块


总结

本文详细讲述了有关数据库的知识,
其中查询是重中之重,
其中多表查询是重中之重中之重,
其中内连接多表查询是重中之重中之重中之重。哈哈,递归好玩吧。请跟进本系列,关注地球人类甄别计划。

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值