数据库
1.初识Mysql
1.1javaee:企业级Java开发web
前端:页面展示数据
后台:()连接点:连接数据库JDBC,连接前端:控制,(控制视图跳转,和给前端传递数据))
数据库:存数据,Txt,Excel,word
只会写代码,学好数据库,基本混饭吃
操作系统,数据结构与算法!当一个不错的程序员
离散数学,数字电路,体系结构,编译原理。+实战经验,高级程序员,优秀程序员
为什么学习数据库库
1.2.岗位需求
2.1.现在世界大数据时代,得数据得天下
2.2.被迫需求:存数据,去IO
2.3.数据库是所有软件体系最核心的---DBA数据库管理员
1.3.什么是数据库
数据库(DB,DataBase)
概念:数据仓库,软件,安装在操作系统上(window,linux,mac..)SQL是操作数据库的语句,可以存大量的数据,500万
作用:存数据,管理数据,
1.4.数据库分类
1.4.1.关系型数据库(sql)
代表:Oracle、SQL Server、MySQL、DB2、SQLlite
通过表和表之间,行和列之间的关系数据库进行存储,学员信息表,考勤表,.......
随着时代的进步与发展的需要,非关系型数据库应运而生。
代表:Redis、Mongodb、nosql、
NoSQL数据库在存储速度与灵活性方面有优势,也常用于缓存
非关系数据库,对象存储,通过自身的属性来决定
1.5.DBMS数据库管理系统
数据库的管理软件,科学有效的管理我们的数据。维护和获取数据
Mysql,数据库管理系统
1.6Msql简介
MySQL是一个关系型数据库管理系统
前世:瑞典MySQL AB 公司
今生:属于 Oracle 旗下产品
MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
体积小、速度快、总体拥有成本低,找人成本比较低
中小型网站,或者大型网站,集群
1.7数据库的列类型
数值
tinyint 十分小的数据 1个字节
smallin 较小的数据 2个字节
mediumint 中等大小的数据 3个字节
int 标准的整数 4个字节 常用的 int
bigint 较大的数据 8个字节
float 浮点数 4个字节
double 浮点数 8个字节
decimal 字符串形式的浮点数 金融计算的时候,一般是使用 decimal
字符串
char 字符串固定的大小 0~255
varchar 可变字符串 0~65535 常用的变量 String
tinytext 微型文本 2^8-1
text 文本串 2^16-1 保存大文本
时间日期
java.util.Date
date YYYY-MM-DD,日期格式
time HH:mm:ss 时间格式
datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
timestamp 时间戳,1970.1.1 到现在的毫秒数 也较为常用!
year 年份表示
null
没有值,未知
== 注意,不要使用NULL进行运算,结果为null
1.8MYISAM和INNODB的区别
MYISAM | INNODB | |
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大,约为2倍 |
MYISAM: 节约空间,速度较快
INNODB: 安全性高,事务的处理,多表多用户操作
1.9外键:创建表的时候没有外键关系
ALTER table 表 add constraint 约束名 foreign key(作为外键的列)REFERENCES 那个表(哪个字段)
删除有外键关系的表的时候,必须要先删除引用别人的表(从表),在删除被引用的表(主表)
物理外键是数据库级别的外键,我们不建议使用(避免数据库过多造成困扰)
数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
我们想使用多张表的数据,想使用外键(程序去实现)
2.数据库语言四大类
2.1数据定义语言(DDL)
2.1.1.创建、删除、使用、查看数据库里面的数据结构
如:创建和删除数据库(创建数据库:create database 数据库名/删除数据库 :drop create database 数据库名)
使用和查看数据库(使用数据库:use 数据库名 /查看数据库 show databases /查看指定的数据库 show create database 数据库名 )
2.1.2创建、删除、修改、查看表
创建表 :create table[if not exists] 表名() primary key 主键 auto_increment 自增
删除表 :drop[if exists]table 表名 删除表的字段 alter table 表名 drop 字段名
修改表:alter table 表名 rename 新表名 增加表的字段:alter table 表名 add 字段名 列属性
修改表的字段 :alter table 表名 modify 字段名 列属性 --修改类型和约束 alter table 表名 change 字段名 新字段名 列属性 --修改字段名
查看表:查看一个数据库中的表:show tables 查看表的结构 show create table 表名 ,desc 表名
2.2 DML语句
数据库意义:数据存储,数据管理
DML语言:数据操作语言
增删改 insert delete update
增
插入语句(添加)
insert into 表名([字段名1,字段2,字段3,])values ('值1'),('值2'),('值3'),.....('值4');
一般插入语句,我们一定要数据和字段一一对应!
由于主键自增我们可以省略(如果不写表的字段,他就会一一匹配)
注意事项:
1.字段和字段之间使用英文逗号隔开
2.字段可以省略
改
操作符 | 含义 | 范围 | 结果 |
= | 等于 | 5=6 | false |
<>或!= | 不等于 | 5<>6 | true |
> | 大于 | 5>6 | false |
< | 小于 | 5<6 | true |
<= | 小于等于 | 5<=6 | false |
>= | 大于等于 | 5>=6 | false |
Between... and... | 在某个范围内 | [2,5] | |
and | 我和你&& | 5>1and1>2 | false |
or | 我或你|| | 5>1or1>2 | true |
语法
update 表名 set 字段名=value,[字段名=value,....] where[条件]
修改多个属性,逗号隔开
通过多个条件定位数据,无上限
条件, 筛选的条件,如果没有条件指定,则会修改所有的列
value,是一个具体的值,也可以是一个变量
多个设置属性之间,使用英文逗号隔开
删
delete 命令
语法:delete from 表名 [where 条件]
删除数据(避免这样写,会全部删除) delete from 表名;
删除指定数据 delete from 表名 where 条件;
delete 与trucate区别
相同点:都能删除数据,多不会删除表结构
不同:
truncate 重新设置 自增列 计数器会归零
truncate 不会影响事务
DELETE 删除问题 重启数据库
INNODB 自增列会从1 开始(存在内存当中的,断电即失)
MyISAM 继续从上一个自增量开始(存在文件中的,不会丢失)
2.3DQL语句(重点)
(Data Query LANGUAGE:数据查询语言 )
所有的查询操作都用它 select
简单的查询,复杂的查询它都能做
数据库中最核心的语言,最重要的语句
使用频率最高的语句
语法: select 字段1,[字段2,字段3......]from 表名
有的时候,列名字不是那么的见名知意。我们起别名 as 字段名 as 别名 表名 as 别名
去重 distance
作用:去除select 查询出来的结果中重复的数据,重复的数据只显示一条
比如:select distinct 字段名 from 表名;
数据库的列(表达式)
select VERSION();-- 查询系统版本(函数)
select 100*3-1 as 计算结果; -- 用来计算(表达式)
select @@auto_increment_increment; -- 查询自增的步长(变量)
select studentNo ,studentResult from result;
select studentno ,studentResult+1 as 提分后 from result;
语法 :select 表达式 from 表
数据库中的表达式:文本值,列,null,函数,计算表达式,系统变量
where条件字句
作用:检索数据中符合条件的值
搜索的条件由一个或者多个表达式组成!结果 布尔值
运算符 | 语法 | 描述 |
and && |
a and b a&&b |
逻辑与,两个都为真,结果为真 |
or || | a or b a||b | 逻辑或,其中一个为真,则结果为真 |
not ! | not a ! a | 逻辑非,真为假,假为真! |
查询成绩90~100之间的成绩
select studentNo ,studentResult from result where studentResult between 90 and 100;
select studentNo ,studentResult from result where studentResult>=90 and studentResult<=100;
查询除了1000号学生之外的同学的成绩
select studentNo ,studentResult from result where not studentNo=1000 and not studentNo=1001 and not studentNo=1002 ;
模糊查询:比较运算符
运算符 | 语法 | 描述 |
is null | a is null | 如果操作符为null,结果为真 |
is not null | a is not null | 如果操作符不为null ,结果为真 |
between | a between b and c | 若a 在b 和c之间,则结果为真 |
like | a like b | sql 匹配 如果a匹配b 则结果为真 |
in | a in (a1,a2,a3.....) | 假设a在a1,或者a2....其中的某一个值中,结果为真 |
-- 查询姓刘的同学
-- like 结合 %(代表0到任意个字符) 、_(一个字符)
seleCt studentNo ,studentname from student where studentname LIKE '刘%';
-- 查询姓刘的同学后面名字只有一个字的
seleCt studentNo ,studentname from student where studentname LIKE '刘_';
-- 查询姓刘的同学后面名字只有两个字的
seleCt studentNo ,studentname from student where studentname LIKE '刘__';
-- 查询名字中带有人字的同学%人%
seleCt studentNo ,studentname from student where studentname LIKE '%人%';
-- =============in(具体的一个或者多个值)===========
-- 查询1001,1002,1003号学员
select studentNo ,studentname from student WHERE studentNo in(1001,1002,1003);
-- 查询在北京的学生
select studentNo ,studentname from student WHERE address in('北京海淀区');
-- ===================null not null==============
-- 查询地址为空的学生null
select studentNo ,studentname from student WHERE address='' or address is null;
-- 查询有出生日期的同学 不为空
select studentNo ,studentname from student WHERE borndate is not null;
-- 查询没有出生日期的同学 为空
select studentNo ,studentname from student WHERE borndate is null;
联表查询
-- ===================联表查询=========================
-- 查询参加了考试的同学(学号,姓名,科目编号,分数)
SELECT from student;
SELECT from result;
/*思路
1.分析需求,分析查询的字段来自哪些表(连接查询)
2.确定使用哪种连接查询? 7种
确定交叉点(这两个表中哪个数据是相同的)
判断的条件:学生表中的 studentno = 成绩表 studentno
*/
-- jion(连接的表) on(判断的条件) 连接查询
-- where 等值查询
SELECT s.studentno, studentname, subjectno, studentresult FROM
student s INNER JOIN result r on s.studentno=r.studentno;
-- RIGHT JOIN
SELECT s.studentno, studentname, subjectno, studentresult FROM
student s right JOIN result r on s.studentno=r.studentno;
-- LEFT JOIN
SELECT s.studentno,studentname,subjectno,studentresult FROM
student s left JOIN result r on s.studentno=r.studentno;
操作 | 描述 |
inner join | 如果表中最少有一个匹配,就返回行 |
left join | 会从左表中返回所有的值,即使右表中没有匹配 |
right join | 会从右表中返回所有的值,即使左表中没有匹配 |
自连接:自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
分页和排序:分页limit 排序order by
排序:
order by 语法:select *from 表名 order by 字段名 ; desc 降序 ,asc 升序
分页:
应用:网页应用 当前,总的页数,页面的大小
limit 语法:select *from 表名 order by 字段名 limit (n-1)*pagesize,pagesize;
第一页 limit 0~5 (1-1)*5
第二页 limit 5~5 (2-1)*5
第三页 limit 10~5 (3-1)*5
第n页 limit 0~5 (n-1)*pagesize,pagesize
[pagesize: 页面大小]
[(n-1)*pagesize:起始值]
[n: 当前页]
[数据总数/页面大小=总页数]
子查询:本质:在where语句中嵌套一个子查询语句
嵌套查询:在嵌套一条查询语句where 字段名 in(查询字段名对应的语句)
函数:
数学计算
select ABS(-8); -- 绝对值
select CEILING(9.4); -- 向上取整
select FLOOR(9.4); -- 向下取整
select RAND(); -- 返回一个0~1的随机数
select SIGN(10) -- 判断一个数的符号 0-0 负数返回-1 正数返回1
字符串函数
select CHAR_LENGTH('即使在小的帆也能远航') -- 字符串长度
select CONCAT('我','爱','变成'); -- 拼接字符串
select `INSERT`('我爱编程helloword',1,2,'超级热爱'); -- 查询,从某个位置开始替换某个长度
select LOWER('KuangSheng') -- 小写字母
select UPPER('KuangSheng') -- 大写字母
select INSTR('kuangsheng','h') -- 返回第一次出现的字符串索引
select REPLACE('狂胜说坚持就能成功','坚持','努力'); -- 替换出现的指定字符串
select SUBSTR('狂胜说坚持就能成功',4,6) -- 返回指定的字符串(源字符串,截取的位置,)
select REVERSE('清晨我上马') -- 反转
查询姓 周的同学,名字 邹
SELECT REPLACE(studentname,'周','邹')FROM student WHERE studentname like '周%'
时间和日期函数
select CURRENT_DATE() -- 获取当前日期
select CURDATE() -- 获取当前日期
select NOW() -- 获取当前的时间
SELECT LOCALTIME() -- 本地时间
select SYSDATE() -- 系统时间
-- ==========================聚合函数============================
-- 都能统计表中的数据(想查询一个表中有多少个记录,就使用这个count())
select count(address) from student; -- count(字段),会忽略所有的null值
SELECT count(*) from student -- count(*),不会忽略null值 ,本质 计算行数
select COUNT(1) from student -- count(1),不会忽略所有的null值 本质 计算行数
select SUM(studentresult) as 总和 from result
select avg(studentresult) as 平均分 from result
select max(studentresult) as 最高分 from result
select min(studentresult) as 最低分 from result
MD5:
什么是MD5
主要增强算法复杂度补课逆性
Md5 不可逆,具体的值的md5 一样的
MD5破解网站,背后有一个字典,MD5加密后的值 加密前的值
3.事务
事务原则:ACID原则 原子性 持久性 一致性 隔离性(脏读,幻读........)
原子性(Atomicity):
要么都成功,要么都失败
一致性(Consistency):
事务前后的数据完整性要保持一致
持久性(Durability)--事务提交
事务一旦提交则不可逆,被持久化到数据库中
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他的事务操作数据所干扰,事务之间要相互隔离。
隔离所导致的一些问题
脏读:指一个事务读取了另外一个事务未提交的数据
不可重复读
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
mysql 是默认开启事务自动提交的
set autocommit=0 -- 关闭
set autocommit=1 -- 开启(默认的)
commit 提交事务 rollback 回滚事务,回滚到原来的样子
索引:索引在小数据量的时候,用处不大,但在大数据的时候,区别非常明显
索引原则
1.索引不是越多越好
2.不要对进程变动数据加索引
3.小数据的表也不需要加索引
4.索引一般加在常用来查询的字段上
mysql备份:
为什么要备份:
保证重要的数据不丢失
数据转移
使用命令行到处 mysqldump 命令行使用
备份数据库
mysqldump -hlocalhost -uroot -p密码 数据库 >物理磁盘位置\文件名
备份数据库中的表格
mysqldump -hlocalhost -uroot -p密码 数据库 表名>物理磁盘位置\文件名
还原数据
mysql -hlocalhost -uroot -p密码 jdsc_new<物理磁盘位置\文件名
登陆的状态下
source d:/a.sql
三大范式
第一范式(1NF)
原子性:保证每一列不可再分
第二范式(2NF)
前提:满足第一范式
每张表只描述一件事
第三范式(3NF)
前提:满足第一范式和第二范式
第三范式需要确保数据表中的每一列都和主键有关,而不能间接相关
(规范数据库的设计)
规范性和性能的问题
关联查询不能超过3个表
1.考虑商业化的需求和目标,(成本,用户体验!)数据库的性能更重要
2.在规范性能的问题的时候,需要适当的考虑一下 规范性
3.故意给某些表加一些冗余的字段(从多表查询变为单表查询)
4.故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)