系列文章目录
文章目录
前言
本文集中介绍数据库的知识,包含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. 类的组成:
属性,构造器,方法,内部类,代码块
最后提一个重点:泛型只在编译期起作用
总结
本文详细讲述了有关数据库的知识,
其中查询是重中之重,
其中多表查询是重中之重中之重,
其中内连接多表查询是重中之重中之重中之重。哈哈,递归好玩吧。请跟进本系列,关注地球人类甄别计划。