JavaSE学习笔记 2023-12-28 --MySQL

MySQL

个人整理非商业用途,欢迎探讨与指正!!


文章目录


1.数据库介绍

数据库:数据仓库
DataBase:简称DB,用于长期存储有结构的,大量的,共享的数据

长期的:持久存储,永久存储
有结构:
	有类型,有内部的数据类型
	有关系,数据与数据之前是有关联的
大量的:
	大多数据库都是以文件系统存在的,可以将数据存储在磁盘中
共享的:
	多个应用之间可以共享一个或多个数据库资源

2.数据库的分类

关系型数据库
	关系型数据库采用关系表的形式进行数据的存储
	可以通过表与表之间的关系来维护数据的关系
		例如:用户 --- 购买 --- 商品
	用户信息 --- 用户类 --- 用户表
	常用的库:MySQL,Oracle,SQLServer...
非关系型数据库
	采用键值对的数据模型来存储数据的,只完成数据的记录,不会有任何的关联关系
	NoSQL:Not Only SQL
	常见的库:redis,MongoDB...

3.数据库中的常用术语

数据库(DataBase):存储数据的集合
数据(Data):被描述的事物符号记录
数据库管理系统(DBMS,DataBase Management System) 用于管理数据库软件系统
数据库管理员(DBA,DataBase Administrator) 负责创建数据库,使用以及维护数据库的专业人员
数据库系统(DBS,DataBase System) 数据库管理员,数据库管理系统以及数据库组成的整个单元结构

4.数据库安装和配置

MySQL环境准备
	下载,安装,配置,卸载
版本:
	企业中主流的版本5.x和8.x
	本次使用mysql8
安装:
	参考攻略
mysql服务的启动和停止:
	此电脑--->右键--->管理--->服务和应用程序--->服务--->mysql相关
	服务停止的原因:1.计算机改名 2.手动停止 3.外部的一些游戏加速器会停止该服务
软件卸载:
	官方:关闭服务--->控制面板点击程序卸载--->自带的卸载程序--->删除目录:mysql安装目录--->删除注册表:win+r输入regedit
	geek:直接卸载所有内容
管理工具:
	可视化工具,数据库的一个图形管理工具
		mysql自带clc(免费的)
		Navicat for MySql(需要破解的) mysql8配合navicat12+ mysql5配合navicat11-
		SQLyog(需要破解的)
		DBeaver(免费的)

5.MySQL的逻辑结构

MySQL在数据库存储时是按照一定的结构进行存储的,MySQL的常见结构是表
MySQL本质是一个服务器(数据库服务器)
navicat是一个客户端(进行数据库的访问操作)
数据库软件都可以管理很多的数据库,每个库中可以管理若干张表,表中用于存储数据
记录/元组:表中的一条(行)数据就是记录/元组 在JDBC中一条数据库记录就是一个java对象
学号姓名性别年龄身高体重出生时日期入学日期毕业日期休学日期
1张三19190200200001012007090120130601

6.SQL语句

Structured Query Language
	结构化查询语句,关系型数据库的主要使用语言,用于数据的增删改查,数据库管理对象等操作.
	
SQL作为关系型数据库的通用语言,对不同的数据库的支持是不一样的,有7成左右的相似度
	例如:oracle中分页使用rownum,mysql中使用limit,SQLServer中使用top
SQL的扩展名为.sql

SQL语句的分类:
	根据不同的功能,可以将SQL划分为多类
		DML:数据操作语言,用于对数据的增删改查操作
			DQL:数据查询语言,用于对数据的查询
		DDL:数据定义语言,用于完成对数据库对象(表,视图,索引等)的操作(创建,删除,修改)
		TCL:事务控制语言
		DCL:数据控制语言,权限操作

7.DML

7.1DQL

数据查询语言
SQL可以在mysql中自带的工具中或者第三方工具(navicat)中使用
SQL语法:
	不区分大小写
	每天SQL以分号结尾,但不是强制的
	SQL中关键字之间使用空格进行分割
	SQL之间不限制换行,有空格的位置就可以使用换行
	SQL的注释:
		单行注释: --注释内容
		单行注释: # 注释内容
		多行注释: /*注释内容*/
7.1.1基本查询
语法
select 列名1,列名2,列名3... | *
from 表名;
* 表示的是所有字段,在测试环境使用,但数据库调优时会进行调整
	*是不会写的,使用具体的字段名称
-- 基本查询
select empno,ename,job
from emp;

select *
from emp;

select *
from dept;
7.1.2过滤查询
语法
select 列名1,列名2,列名3... | *
from 表名
where 条件;

进行数据的筛选,等到我们需要的数据,过滤掉不符合的数据
-- 过滤查询
-- 查询工资高于5000的人
select *
from emp
where sal > 5000;

-- 查询工资低于5000的人
select *
from emp
where sal <= 5000;
7.1.2.1条件运算符
=	等于
!=
<>	不等于
>
>=
<
<=
-- 条件运算符
-- 查询工资不为5000的人
select *
from emp
where sal <> 5000;
select *
from emp
where sal != 5000;

-- 查询名字为九元 单引号表示字符串
select *
from emp
where ename = '九元';
7.1.2.2逻辑运算符
not and or
-- 逻辑运算符
select *
from emp
where sal >= 5000
and ename = '九元';

select *
from emp
where sal >= 5000
or ename = '九元';

select *
from emp
where deptno is not null;

select *
from emp
where deptno is null;
7.1.2.3特殊的比较运算符
is null 判断数据是否为空;为空显示,不为空不显示
in(值的列表) 返回符合值列表中的数据
like 模糊查询*****
between ... and ... 在范围之内,包含范围的

上述的四个可以和not配合使用
-- 特殊的比较运算符
select *
from emp
where deptno is null;

select *
from emp
where deptno is not null;

-- 查询在10和20号部门的员工 属于or的关系
select *
from emp
where deptno in (10,20);

select *
from emp
where deptno = 10 or deptno = 20;

select *
from emp
where deptno not in (10,20);

select *
from emp
where deptno != 10 and deptno != 20;

-- 模糊查询
-- _一个字符的占位 %>=0符号的占位
-- 查询名字中有6的人
select *
from emp 
where ename like '%6%';

-- 表示6开始
select *
from emp 
where ename like '6%';

-- 表示6结尾
select *
from emp 
where ename like '%6';

-- 第三个位置为6的
select *
from emp 
where ename like '__6%';

-- 倒数第三个字符
select *
from emp 
where ename like '%6__';

-- 不像
select *
from emp 
where ename not like '%6%';

-- 查询工资在3000-5000范围内的
select *
from emp
where sal between 3000 and 5000;

-- 等价的
select *
from emp
where sal >= 3000 and sal <= 5000;

-- 可以执行的,但是可读性差 建议将字段写在前面,具体的数值在后面
select *
from emp
where 3000 <= sal and 5000 >= sal;

-- 查询工资不在3000-5000范围内的(不带边界)
select *
from emp
where sal not between 3000 and 5000;

select *
from emp
where sal < 3000 or sal > 5000;
7.1.3计算列
可以对查询的记录进行一定的计算之后进行显示
可以使用 + - * / 四个运算符
-- 计算列
select ename,sal + 500,comm - 100
from emp;
7.1.4列别名
使用 as 和 空格为某个列去添加别名
-- 列别名
select ename,sal + 500 as 工资,comm - 100 奖金
from emp;
7.1.5 distinct去除重复行
-- 去除重复行
select distinct deptno
from emp;
7.1.6 order by排序
必须是查询的最后一个字句
asc表示升序,默认不写就是
desc表示降序
-- 排序
select *
from emp
order by sal;

select *
from emp
order by sal asc;

select *
from emp
order by sal desc;

select *
from emp
order by hiredate;
7.1.7组合函数
组函数,聚合函数
类似于java中的方法
-- 组函数
-- 计数
select count(empno) from emp;
-- count(1)
select count(1) from emp;
select count(*) from emp;

-- 最值
select min(sal) from emp;
select max(sal) from emp;

-- 总和
select sum(sal) from emp;

-- 平均值
select avg(sal) from emp;
7.1.8日期函数
可以通过字符串进行赋值,格式为"yyyy-MM-dd hh:mm:ss"
表示当前的日期函数:now() sysdate()
-- 日期函数
select *
from emp
where hiredate < '2023-01-01';

select *
from emp
where hiredate < '2023-01-01 08:00:00';

select *
from emp
where hiredate between '2023-01-01' and now();

select *
from emp
where hiredate between '2023-01-01' and sysdate();
7.1.9字符函数
处理字符使用
-- 字符函数
select concat(ename,job)
from emp;

select concat(ename,'-',job)
from emp;

select upper(ename) from emp;

select lower(ename) from emp;
-- 数据库中的下标从1开始的
select ename,substring(ename,2,1) from emp;
7.1.10分组查询
group by
配合组函数进行使用,分组后的过滤使用having
语法:
    select 字段
    from 表名
    where 条件
    group by 分组字段
    having 分组后的过滤
    order by 排序
-- 查询每个部门的人数
select deptno,count(*)
from emp
group by deptno;

-- 查询部门人数大于3的部门
select deptno,count(*)
from emp
group by deptno
having count(*) > 3;
7.1.11分页查询
一次性将所有数据都展示给用户,体验太差了,可以使用分页查询
limit关键字
limit param1,param2
parma1:从指定位置开始,不包含这个位置
param2:查几个
-- 查询1~3条数据
select *
from emp
limit 0,3;

-- 查询4~6条数据
select *
from emp
limit 3,3;

7.2连接查询

我们无法从一张表获取到所有的数据,需要将多张表关联在一起
n张表需要至少n-1个条件连接在一起
7.2.1笛卡尔积
笛卡尔积/集,叉积/集
多张表连接在一起,没有使用过滤条件,会将多张表的数据乘在一起
语法
	select *
	from a表,b表;
-- 笛卡尔积
select *
from emp,dept;

select *
from emp,dept,users;

-- 消除笛卡尔积,使用多张表的共有字段
-- 默认忽略空值的
select *
from emp,dept
where emp.deptno = dept.deptno;

-- 查询1号员工的个人信息和部门信息
select *
from emp,dept
where emp.deptno = dept.deptno
and empno = 1;
7.2.2内连接
查询出只符合条件的数据
消除笛卡尔积就是内连接
-- 查询1号员工的个人信息和部门信息
select *
from emp,dept
where emp.deptno = dept.deptno
and empno = 1;

-- 查询小白666 的所有信息
select *
from emp,dept
where emp.deptno = dept.deptno
and ename = '小白666';
7.2.3表别名
简化表名的操作
-- 表别名
-- 空格
select *
from emp e,dept d
where e.deptno = d.deptno
and ename = '小白666';

-- as (在oracle中不支持)
select *
from emp as e,dept as d
where e.deptno = d.deptno
and ename = '小白666';
7.2.4SQL语法分类
92语法
	上面写的内连接是92语法,在mysql中不支持其他的92语法
99语法
	使用join将多张表连接在一起
7.2.4.1 99语法-内连接
-- 99 内连接
select *
from emp e inner join dept d
on e.deptno = d.deptno;

select *
from emp e inner join dept d
on e.deptno = d.deptno
where empno = 1;
7.2.4.2 99语法-外连接
可以查询到不符合条件的数据
外连接分为左外连和右外连
outer left join ... on 条件
outer right join ... on 条件
inner/outer关键字可以省略
-- 99 外连接
-- 左外连 左侧表的数据是完全的
select *
from emp e left outer join dept d
on e.deptno = d.deptno;
-- 左右外连是可以互换的
select *
from dept d right outer join emp e
on e.deptno = d.deptno;

-- 右外连 右侧表的数据是完全的
select *
from emp e right outer join dept d
on e.deptno = d.deptno;

-- 满外连 左右两表的数据都可以查询不符合条件的(mysql中是不支持的)
select *
from emp e full outer join dept d
on e.deptno = d.deptno;
7.2.5子查询
又称查询嵌套,内部查询的数据可以被外部查询所使用
-- 子查询
-- 查询工资比九元高的
-- 1.查询九元的工资
select sal from emp where ename = '九元';

-- 2.查询比上面工资高的
select * from emp where sal > 50000;

select * from emp where sal > (select sal from emp where ename = '九元');

7.3DML

数据操作语言
主要用于数据的删除,修改,插入
7.3.1添加数据
语法
insert into 表名(列名1,列名2...)
values (值1,值2....)

列与值一一对应
-- 添加操作
-- 注意不要违反主键约束(主键的值不能重复)
-- 向dept表添加数据
insert into dept(deptno,dname,city)
values (50,'小卖部','昌图');

-- 若添加时的数据是全部数据,则列列表可以省略
insert into dept
values (60,'外联部','庄河');

-- 只添加一部分值 不是所有那么就需要列列表和值列表一一对应
insert into dept(deptno,dname)
values (70,'技术部');

-- 不是所有列都添加时,是不能省略的
-- insert into dept
-- values (80,'技术部');

-- 批量添加(mysql支持,oracle中不支持)
insert into dept(deptno,dname,city)
values (80,'小卖2部','昌图'),(90,'小卖3部','昌图'),(100,'小卖4部','昌图');
7.3.2删除数据
语法
delete from 表名 where 条件;

oracle中from可以省略,但是mysql中不行
where 条件可以省略,省略了就是删除全部数据,在oracle中可以回滚的,在mysql中默认不可以回滚
-- 删除操作
delete from users;-- 别写

delete from dept where deptno = 80;
逻辑删除:
	本质修改,改变某个字段
	Goods(id,name,type,status[状态:0启动,1禁用])
物理删除:
	本质删除,从磁盘下将数据删除了
7.3.3修改数据
语法
	update 表名 set 列 = 值,列 = 值... where 条件;
	
where 可以省略,但是修改全部
-- 修改操作
update emp set ename = '张三';-- 别写

update emp set ename = '李四',sal = 1000000 where empno = 11;

8.DDL(表操作)

数据库对象操作

8.1创建数据库

数据库的创建类似于java中二维数组,外部的一维表名,内部就是字段(字段名,类型,默认值,约束等)
-- 建表
-- 表名/字段名:数字 字母 下划线 连接符 井字符 可以使用 长度最长30个字符
create table student(
	stu_no char(8), -- 字符串
	stu_name varchar(20), -- 字符串
	stu_gender char(2),
	stu_age int,
	stu_qq varchar(12)
)

insert into student 
values (1,'王成輝','未知',22,'1233456678'),(2,'王成輝2号','未知',22,'1233456678');

8.2修改表

8.2.1添加列
alter table 表名 add 列名 类型;
-- 添加列
alter table student add birthday date;
8.2.2修改列(列名和类型)
alter table 表名 change 旧列名 新列名 类型;
-- 修改列 名字和类型
alter table student change stu_name name varchar(30);
8.2.3修改列(类型)
alter table 表名 modify 列名 类型;
-- 修改列 类型
alter table student modify stu_no char(30);
8.2.4删除列
alter table 表名 drop 列名;
-- 删除列
alter table student drop stu_qq;
8.2.5表改名
alter table 表 rename to 新名;
-- 表改名
alter table student rename to stu;

8.3删除表

drop table 表名;
	若没有对应的表,则报错
drop table if exists 表名;
	若没有对应的表,则报错,也不删除;存在则删除
-- 删除表
drop table student;-- 不存在报错

drop table if exists student;-- 只删除存在的

drop table if exists stu;

9.MySQL数据类型

存储数据时,支持的类型

9.1数值型

int/integer 整数 4byte
double 双精度浮点型 8byte
其他:
tinyint 特小的整数型 1byte
smallint 小整数型 2byte
bigint 大整数型 8byte
float 单精度浮点型 4byte

9.2字符型

char 
	定长字符串,长度0~255 若存储的长度不足时,使用'\u0000'进行补位
	用于存储长度的固定的内容,例如:手机号,身份证号,性别...
varchar
	变长字符串,长度0~65535
	
其他:
blob 
	存储二进制字符串
longblob
	存储二进制字符串
longtext
	存储文本内容的,例如:小说,博客,base64的图片

9.3日期型

date
	日期型,存储的是年月日
datetime
	日期型,存储的是年月日 时分秒
	
其他
time
	时间,存储时分秒
year
	年,年份

10.约束

创建表时,为指定的字段添加限定条件
来保证数据的准确,完整和正确
约束的分类:
	非空约束 not null 被限定的字段不能为null
	唯一约束 unique 被限定的字段不能重复
	主键约束 primary key 非空且唯一,每张表中的唯一表示
	外键约束 foreign key 必须依赖主键才能使用(先有主键才能有外键)
	检查约束 check	对某个字段进行限制(mysql5中不支持 mysql8中支持)

10.1非空约束

-- 非空约束
create table goods (
	goods_id char(4),
	goods_name varchar(20) not null,
	goods_pirce double default 0 -- 默认值,若不添加对应的字段,则使用默认值
)

insert into goods 
values (1,'黑人牙膏',2);

-- name是不可以使用null添加的
insert into goods (goods_id) value (2);

-- 默认值
insert into goods (goods_id,goods_name) value (2,"白人药膏");

10.2唯一约束

-- 唯一约束
create table student (
	stu_no char(4),
	stu_name varchar(20) unique
);

insert into student (stu_no,stu_name) values (1,'张春啸');
insert into student (stu_no,stu_name) values (1,'张春啸');-- 重复名字不能添加

10.3主键约束

10.3.1主键的基本使用
一张表的唯一表示,主键一张表中只能有一个
唯一且非空的

唯一和非空在一张表中可以有多个

主键一般是自增的数值,所有的表中都会有xxx_id、xxx_no的字段
-- 主键
create table teacher (
	tea_id int primary key,
	tea_name char(3)
);

insert into teacher values (1,'殷亮');
insert into teacher values (1,'殷亮');-- 不能重复
insert into teacher values (null,'殷亮');-- 不能为空
10.3.2主键自增长
主键希望有一个自动增长的字段为其服务
mysql中有自增长功能
oracle中需要是sequence对象进行服务

定义int类型的主键,设置自动增长,auto_increment
-- 自增长的主键
create table pet (
	pet_id int primary key auto_increment,
	pet_name varchar(20)
)

insert into pet (pet_name) values ('咪咪');
10.3.3联合主键
一张表中的多个字段共同承担主键的任务,是一个主键由多个值组成
定义联合主键比较少
-- 联合主键
create table kecheng (
	stu_no int,
	cls_no int,
	score int,
	primary key (stu_no,cls_no)
)

insert into kecheng values (1,1,80);
-- 不可添加
insert into kecheng values (1,1,80);-- 两个字段不能同时重复
insert into kecheng values (1,null,80);-- 字段不能为空
insert into kecheng values (null,1,80);
insert into kecheng values (null,null,80);
-- 可添加
insert into kecheng values (1,2,80);
insert into kecheng values (2,1,80);
学生表
学号(主键)姓名性别年龄
1张三19
2李四20
课程表
课程编号(主键)课程名学分
1JavaSE4
2MySQL3
3WEB3
选课(关联表:可以使用联合主键,不用也不会影响,关联表往往都没有主键)
学号课程号成绩补考成绩
118890
1277
2366

10.4外键约束

10.4.1表之间的关系
四种:
	一对一	人和身份证
	一对多 
	多对一
		 班级和学生
	多对多
		 讲师和学生
在sql中使用主外键的形式来体现这种关联关系
	主键所在表,称之为主表
	外键所在表,称之为从表
	
外键必须依赖主键,有主键了才能有外键
外键的值都是从主键中选的
外键可以重复,可以为空,必须依赖主键
10.4.2外键约束
语法
	constraint 外键的名字 foreign key(当前表的外键字段) references 主表名(主表的主键字段)
	名字:fk_主表名_从表名
-- 外联约束
-- 学生和班级为例
-- 主表
create table classes (
	c_id int primary key auto_increment,
	c_name varchar(20) not null,
	c_info varchar(200)
);

-- 从表
create table students (
	s_id int primary key auto_increment,
	s_name varchar(20) not null,
	s_gender char(1) default '0',-- 0是性别男 1是性别女
	s_age int not null,
	c_id int,
	constraint fk_stu_cls foreign key(c_id) references classes(c_id)
);

-- 添加数据
insert into students (s_name,s_age,c_id) values ('zs',19,null);-- 外键的值是从主键中选出来的
insert into students (s_name,s_age,c_id) values ('ls',19,null);

-- 想为外键添加值,先在主表添加数据
insert into classes (c_name,c_info) values ('4教室','班级可以容纳47人');
insert into classes (c_name,c_info) values ('3教室','班级可以容纳44人');

-- 添加学生
insert into students (s_name,s_age,c_id) values ('ww',19,1);
10.4.3外键的级联操作
级联删除:主键数据删除,对应的外键数据一起删除
级联置空:主键数据删除,对应者外键字段赋值为null
级联修改:主键的id修改,外键对应的字段会同步修改
10.4.3.1级联删除
-- 级联删除
-- 主表
create table classes (
	c_id int primary key auto_increment,
	c_name varchar(20) not null,
	c_info varchar(200)
);

-- 从表
create table students (
	s_id int primary key auto_increment,
	s_name varchar(20) not null,
	s_gender char(1) default '0',
	s_age int not null,
	c_id int,
	constraint fk_stu_cls foreign key(c_id) references classes(c_id) on delete cascade
);

-- 主表数据
insert into classes (c_name,c_info) values ('4教室','班级可以容纳47人');
insert into classes (c_name,c_info) values ('3教室','班级可以容纳44人');

-- 从表数据
insert into students (s_name,s_age,c_id) values ('zs',19,1);
insert into students (s_name,s_age,c_id) values ('ls',19,2);

-- 删除
delete from classes where c_id = 1;
10.4.3.2级联置空
-- 级联置空(项目中常用的)
-- 主表
create table classes (
	c_id int primary key auto_increment,
	c_name varchar(20) not null,
	c_info varchar(200)
);

-- 从表
create table students (
	s_id int primary key auto_increment,
	s_name varchar(20) not null,
	s_gender char(1) default '0',
	s_age int not null,
	c_id int,
	constraint fk_stu_cls foreign key(c_id) references classes(c_id) on delete set null
);

-- 主表数据
insert into classes (c_name,c_info) values ('4教室','班级可以容纳47人');
insert into classes (c_name,c_info) values ('3教室','班级可以容纳44人');

-- 从表数据
insert into students (s_name,s_age,c_id) values ('zs',19,1);
insert into students (s_name,s_age,c_id) values ('ls',19,2);

-- 删除
delete from classes where c_id = 1;
10.4.3.3级联更新
-- 级联更新
-- 主表
create table classes (
	c_id int primary key auto_increment,
	c_name varchar(20) not null,
	c_info varchar(200)
);

-- 从表
create table students (
	s_id int primary key auto_increment,
	s_name varchar(20) not null,
	s_gender char(1) default '0',
	s_age int not null,
	c_id int,
	constraint fk_stu_cls foreign key(c_id) references classes(c_id) on update cascade
);

-- 主表数据
insert into classes (c_name,c_info) values ('4教室','班级可以容纳47人');
insert into classes (c_name,c_info) values ('3教室','班级可以容纳44人');

-- 从表数据
insert into students (s_name,s_age,c_id) values ('zs',19,1);
insert into students (s_name,s_age,c_id) values ('ls',19,2);

-- 更新主表
update classes set c_id = 3 where c_name = '4教室';

10.5检查约束

mysql5.x没有该约束
mysql8.x中添加该约束
oracle中任何版本都可以使用
-- 检查约束 (mysql中length是判断字节数)
create table person (
	p_id int primary key,
	p_name varchar(20) check(length(p_name) >= 3)
);


insert into person values (1,'王成輝6');

insert into person values (2,'王成');

insert into person values (3,'ab');

11.DDL(库操作)

11.1 MySQL Command Line Cilent

mysql自带的管理工具,纯命令行的
打开:
	开始菜单--->MySQL--->CLC工具
连接MySQL:
	在CLC中输入密码即可,若闪退说明密码输出错误
关闭CLC:
	输入exit指令即可

11.2DDL(库操作)

11.2.1查询库
show databases;查询本地所有数据库的列表
show create database mysql;显示指定名称的数据库的创建SQL指令
11.2.2创建库
create database 库名;创建指定数据库名字的库
create database if not exists 库名;若库名不存在时则创建
create database 库名 character set 字符集;创建库时采用何种编码集
11.2.3删除库
drop database 库名;
drop database if exists 库名;
11.2.4使用库
use 库名;

12.视图

命名化查询,由数据库中的一张或者多张表组成,构成的虚拟表
视图是基于表存在的,简化查询,安全性高,可以只公开表的部分数据

12.1视图的创建

语法
create view 视图名
as
子查询;

视图只能通过子查询创建
视图的分类:简单视图,复杂视图
12.1.1简单视图
由一张表组成
-- 简单视图
-- 通过emp表创建myemp视图
create view myemp
as
select empno,ename,sal from emp;

-- 查询视图,将表中的其他数据就隐藏起来了
select * from myemp;
12.1.2简单视图和表中的数据关系
简单视图和表中的数据添加是会同步的
-- 向emp表中添加数据,myemp视图的数据是同步的
insert into emp values (23,'王成輝','总经理助理','2022-12-12',1200,500,40);

-- 向myemp视图中添加数据,同步到emp表中
insert into myemp values (24,'李昊阳睡着了',1200);
简单视图和表中的数据删除是会同步的
-- 删除
-- 删除表中数据,视图同步
delete from emp where empno = 24;
-- 删除视图中数据,表中数据同步
delete from myemp where empno = 23;
简单视图和表中的数据修改是会同步的
-- 修改
-- 改表,视图同步
update emp set ename = '王成輝' where empno = 22;
-- 改视图,表同步
update myemp set ename = '李昊阳' where empno = 21;
12.1.3复杂视图
-- 复杂视图
create view mydept_emp
as
select empno,ename,d.deptno,dname
from emp e,dept d
where e.deptno = d.deptno;
12.1.4复杂视图和表中的数据关系
添加
	向表中添加数据,可以同步到视图中
	向视图中添加数据
		只能向对应的某一张表的视图去添加数据
		添加的数据不能是连接字段(外键)
		可以添加到复杂视图中的数据是单表
-- 添加
-- 添加数据到表中,视图同步
insert into emp values (23,'王成輝','总经理助理','2022-12-12',1200,500,40);
-- 添加数据到视图中,
-- 向视图中添加数据,不能每个字段都添加
insert into mydept_emp values (24,'毕明辉',40,'行政部');
-- 只添加到emp表中对应视图部分,可以添加
insert into mydept_emp (empno,ename) values (24,'毕明辉');
-- 只添加到dept表中对应视图部分,可以添加非共有字段(deptno是两张表中都有字段)
insert into mydept_emp (dname) values ('毕明辉部');
删除
	删除表中数据,复杂视图同步
	无法删除复杂视图中的数据
-- 删除
-- 删除表,视图同步
delete from emp where empno = 23;
-- 删除视图,是无法完成
delete from mydept_emp where empno = 21;
delete from mydept_emp where ename = '李昊阳';
delete from mydept_emp where deptno = '101';
delete from mydept_emp where dname = '毕明辉部';
修改
	修改表,视图中数据同步
	修改视图,表中数据同步
-- 修改
-- 修改表,视图同步
update emp set ename = '王成輝' where empno = 18;
-- 修改视图,表中同步
update mydept_emp set ename = '王成輝66' where empno = 18;
-- 修改视图,通过dname,修改ename字段 可以改
update mydept_emp set ename = '王成輝66' where dname = '总部';
-- 通过empno,修改depname
update mydept_emp set dname = '王成輝66部' where empno = 18;

13.索引

提供查询效率,增强用户的体验

13.1索引的分类

主键索引:被primary key修饰,就自动的添加了主键索引,每张表中只有一个主键索引
唯一索引:添加唯一键时就添加唯一索引
	主键索引和唯一索引都自动的添加的

13.2索引的优缺点

优点:
	提高查询效率,减少磁盘IO的过程
缺点:
	占用磁盘资源,做DML时慢

14.数据库事务

事务就同时完成一组DML操作,或者一个DDL操作
事务就是一个功能,也是业务中的某个功能,按照指定的步骤去完成DML操作

14.1事务的特性

ACID
原子性:一个事务中多个DML操作,要么同时执行成功,要么同时执行失败
一致性:事务执行前后,数据库中的数据要保持一致,完整的不能被破坏的
隔离性:多个事务之间执行操作是互不干扰的
持久性:事务完成之后,数据库中的数据是永久保存的

14.2MySQL中的事务管理

MySQL中的事务默认是自动提交的
	只要执行了一个DML语句,那么自动的进行数据同步
事务管理
	1.开启事务管理,关闭自动提交
	2.在执行DML操作前,执行strat transcation(事务管理开启)
	3.以此的执行DML操作
	4.若执行成功,选择使用commit(提交)事务语句
	5.若执行失败,选择使用rollback(回滚)事务语句
		commit提交,将数据保存
		rollback回滚,数据恢复原样
			commit和rollback只能需要一个
-- 使用默认的事务,自动提交的,每条DML都需要使用事务语句进行提交或者回滚
-- 开启MySQL的事务管理,关闭自动提交,每次都需要手动的开启
start TRANSACTION;
-- 转账功能
update t_user set u_balance = u_balance - 200 where u_id = 1;

update t_user set u_balance = u_balance + 200 where u_id = 2;

-- 手动提交
commit;

-- 手动回滚
rollback;

-- navicat一个窗口就是一个新的事务开始
-- 每个事务之间是相互独立的,默认是看不到别人事务的操作(隔离性)
select * from t_user;

14.3事务的隔离级别

在数据库中是允许多个事务并行的操作,多个事务之间是互不干扰的,相互独立的;若多个事务之间没有隔离操作,可能会导致多个事务之间同时操作同一条数据,可能会破坏数据的一致性
读未提交:
	read uncommitted,两个事务同时执行,T2可以读取到T1未提交的数据,可能造成脏读。脏读:一个事务读取到另一个事务未提交的数据。
读已提交:
	read committed,T2只能读取到T1以提交的数据,避免了脏读,但可能出现虚读。虚读(重复读取数据):在一个事务中的两次查询结果不一致。
可重复读:(mysql中事务隔离级别的默认值)
	repeatable read:T2执行查询时,无论T1进行了任何操作,都不会影响到T2,避免了虚读。可能会出现幻读:T1在做操作的同时T2也在做操作,T1和T2是互不干扰的,但是T1执行完成之后,T2也执行完成了,T1看到了T2数据。
串行化:
	serializable,同时只能允许一个事务对一张表进行操作(单线程的),效率非常低的。可以避免脏读,幻读,虚读。
隔离级别脏读虚读幻读
read uncommitted
read committed×
repeatable read××
serializable×××

14.4MySQL中设置事务的隔离级别

MySQL默认的隔离级别为可重复读
-- 查看事务的隔离级别
select @@transaction_isolation; -- 默认为可重复读

-- 设置隔离级别
set session transaction isolation level serializable;

15.数据库设计

MySQL数据库作为数据存储的介质,需要为应用程序提供数据存储功能,那么就要设计出合理的数据和数据表

15.1数据库设计流程

1.根据应用系统的功能,分析数据实体(数据对象)
	学生管理系统:学生,课程,成绩...
	外卖管理系统:商家,客户,骑手...
2.提取实体的数据项(实体属性)
	学生:学号,姓名,性别,爱好,生日...
3.根据数据库设计的三大范式进行数据表的设计
	数据设计有自己的规则,遵循规则会使得我们的数据库更加的合理,使用起来更方便
	若不满足三大范式,会导致数据冗余,维护困难
4.绘制ER图
	展现出实体与实体之间的关联关系,直观的展现出每个实体之间的联系
5.进行数据库建模
	三线图进行数据库设计
	...
6.创建数据库
	编写sql指令完成库和表的创建
7.CRUD的SQL功能测试

15.2数据库设计的三大范式

在数据设计时不止三大范式,但是三大范式是我们必须遵守的
第一范式:要求数据表中的字段不可分割的
下面的联系方式可以被分割
ID姓名性别联系方式(手机号,QQ,微信…)
1张三
联系方式字段可以被分割为若干字段,不合理,至少可以被分为3个字段
遵循第一范式进行设计,如下
ID姓名性别手机号QQ微信
1zs134xxxxxxxxx12xxxxxxxxxxxxx
第二范式:在满足第一范式的基础上,不存在非关键字段对关机字段段的部分依赖
	下面例子中有部分的依赖
		学号和课程号,是这张表的联合主键,我们就认定学号和课程号是关键字段,除了关键字段以外都是非关键字段
	姓名和性别只依赖于学号,课程名只依赖于课程号,就存在非关键字段对关键字段的部分依赖
学号课程号姓名性别课程名称成绩
10011张三java88
10021李四mysql76
遵循第二范式,设计上述表结构如下:
	非关键字段只依赖于关键字段
学号姓名性别
1zs
课程编号课程名
1java
成绩编号(可以没有的,只是关联表)学号课程号成绩
1188
第三范式:在满足第二范式的基础上,不存在非关键字段之间的传递依赖
	如下就不符合
		姓名,性别,年龄,院系编号是依赖学号;但是存在院系名称和院系描述依赖于院系编号
学号姓名性别年龄院系编号院系名称院系描述
遵循第三范式设计如下:
学号姓名性别年龄院系编号
1zs191
2ls201
院系编号院系名称院系描述
1计算机科学与计算挺好

15.3ER图

数据库建模
可以直观的体现出实体与实体之间的联系
图形:
	矩形:实体
	菱形:关系
	直线:连接
	椭圆:属性

15.4三线表

每个实体都会对应着一个三线表

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象编程是一种编程范式,它将程序的构建和设计思路以面向对象的方式进行组织和实现。在Java中,面向对象编程是基于Java SE(Standard Edition)的一种编程方式。第07讲主要介绍了面向对象编程中的一些基本概念和关键术语。 在面向对象编程中,我们将程序中的数据和对数据的操作(方法)封装在一起,形成一个对象。对象由两部分构成:属性和方法。属性是用来描述对象的特征,而方法则是对象可以执行的操作。对象之间通过消息(方法调用)进行通信和交互。面向对象的核心思想是通过封装、继承和多态实现程序的复用和扩展。 封装是面向对象编程中的一个重要概念,它指的是将类的属性和方法进行封装,使得外部无法直接访问和修改对象的内部状态,只能通过公共的方法来操作属性和执行方法。封装提供了一种将数据和行为组合在一起的方式,可以保护数据的完整性和安全性。 继承是面向对象编程中的另一个重要概念,它指的是通过定义一个新的类来继承现有类的属性和方法。通过继承,子类可以继承父类的属性和方法,并可以在此基础上进行扩展和修改。继承提供了一种代码复用的机制,可以减少重复编码的工作量。 多态是面向对象编程的又一个重要概念,它指的是同一类型的对象在不同的情况下可以有不同的表现形式。多态通过方法的重写和方法的重载实现。方法的重写指的是在子类中重新定义和实现父类的方法,方法的重载指的是在同一个类中可以定义多个同名但参数列表不同的方法。 总结来说,面向对象编程是一种将程序组织和设计思路以对象为中心的编程方式。在JavaSE中,我们可以通过封装、继承和多态来实现面向对象编程的目标。封装可以提高程序的可维护性和可复用性,继承可以减少重复编码的工作量,多态可以灵活地操作对象。掌握这些基本概念和关键术语,可以帮助我们更好地理解和应用面向对象编程的思想。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值