DML、DDL、数据库对象学习

系列文章目录

JavaSE
基础知识、数据类型学习万年历项目代码逻辑训练习题
代码逻辑训练习题方法、数组学习图书管理系统项目
面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习
集合学习IO流、多线程学习仓库管理系统JavaSE项目
员工管理系统、多表查询、反射实现DBHelper学习DML、DDL、数据库对象学习
JavaWeb
网络编程、各种标签、CSS学习ECMAScript、BOM学习DOM、jQuery学习
Servlet、JSP、Cookie、Ajax学习融资管理系统JavaWeb项目
框架
MyBatis框架学习逆向工程、Spring框架IOC、AOP学习SpringMVC框架学习
SpringBoot框架学习招聘网站框架项目Vue介绍、窗体内操作、窗体间操作学习
Vue路由配置、网络请求访问框架项目、element组件介绍学习标准管理系统Vue项目
微服务
Linux安装、Nginx反向代理、负载均衡学习Docker学习Jenkins学习
Nexus学习Spring Security学习RabbitMQ学习
Redis学习MongoDB学习MongoDB学习
Nacos学习Spring Session学习Spring Gateway学习
JSR 303学习OpenFeign学习Hystrix学习


前言

本文集中介绍数据库的知识,包含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. 类的组成:

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

最后提一个重点:泛型只在编译期起作用


总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攸攸太上

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值