一 数据库分类
1、关系型数据库 SQL
mysql数据库,适用与互联网项目,微服务应用非常广泛。免费
Oracle 数据库,大型的,重量级的数据库。政府部分,政务系统。收费的
DB2 大型关系型数据库 ,一般商业,应用与ERP系统。
Sqlserver数据库,微软公司开发的数据库。T-Sql,使用C#语言
2、非关系型数据库,Nosql数据库
Redis,MongoDB
DB 数据库
DBMS 数据库管理软件 -MySQL
RDBMS 关系型数据库管理软件
二 卸载Mysql
如果曾经安装过Mysql
1、停止服务
此电脑-右键-管理-服务和应用程序-服务-MySql-停止此服务
2、应用程序中进行卸载
此电脑-双击打开-窗口上点击计算机-卸载或更改程序-Mysql卸载
3、删除安装盘符的mysql包
打开C盘,C:\Program Files下面的Mysql,点击删除
打开C盘,C:\ProgramData下面的Mysql,点击删除
4、删除环境变量配置
此电脑-右键属性-高级系统设置-环境变量-Path-删除Mysql配置项
C:\Program Files\MySQL\MySQL Server 5.5\bin
5、在注册表中删除
win+r 输入regedit打开注册表
第一步:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\EventLog\Application\MySQL 删除
第二步:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\MySQL 删除
删除mysql即可
6、重启计算机
三 windows系统上安装并操作mysql
3.1 安装Mysql
双击安装包,安装即可。
3.2 操作命令
1、win+r 输入cmd
2、mysql -uroot -p,回车输入密码
3、show databases; --显示所有数据库
4、use mysql; --使用test数据库
5、show tables; --显示test数据库下的所有数据表
6、select * from user; --查询数据表的数据记录
7、create database my_db; 创建数据库
8、use my_db; --使用自己创建好的数据库my_db
9、create table user(
userId int primary key,
userName varchar(20) null
); --创建了一个user数据表
10、exit; 退出
安装sqlyog可视化工具。
四 结构化查询语句SQL
4.1 SQL分类
DDL
:数据定义语言,包括 create ,drop alter
DML
:数据操作语言,包括,insert update ,delete
DQL
:数据查询语言 包括select,分支很多
DCL
:数据控制语言,commit,rallback,grant
4.2 DDL
1. 操作数据库
CREATE DATABASE IF NOT EXISTS news_db; -- 创建数据库
USE news_db; -- 使用数据库
DROP DATABASE IF EXISTS news_db; -- 删除数据库
SHOW DATABASES; -- 查询
2. 操作数据表
- 创建表
--设置当前数据表自动增长的增量、步长
SET @@auto_increment_increment=3
CREATE TABLE IF NOT EXISTS news(
newsId INT PRIMARY KEY AUTO_INCREMENT COMMENT '资讯ID',
newsTitle VARCHAR(100) NOT NULL COMMENT '资讯标题',
createTime DATETIME NULL COMMENT '创建时间'
) ENGINE=INNODB DEFAULT CHARSET=utf8;
-- AUTO_INCREMENT --自动增长
-- ENGINE=INNODB 存储引擎为INNODB
-- AUTO_INCREMENT=1 设定表自增的步长为1
-- DEFAULT CHARSET=utf8; 默认的编码格式
- 删除表
DROP TABLE IF EXISTS news;
- 修改列
-- 修改列
ALTER TABLE news ADD author VARCHAR(10) COMMENT '作者'
- 查看数据表的基本信息
DESC news
4.3 DML
- 删除数据表记录
DELETE FROM news
TRUNCATE TABLE news
--区别
--相同点:都可以删除数据表记录
--不同点:delete只能删除数据表记录,不会初始化数据表结构,TRUNCATE不能作用在有外键关联的表上。
- 新增语句
INSERT INTO student(studentName,age,gradeId,birthday)
VALUE('李四',22,4,'2000-01-03')
--字段名与给定的值的位置个数,类型要保持一致
-- 主键如果是自增的情况就不需要给他指定值
- 修改语句
UPDATE student SET studentName='李四四',age=32
WHERE studentId=14
-- 需要特别指定条件
- where 条件
UPDATE student SET studentName='李思3',age=32
-- where studentId between 13 and 15
WHERE studentId>=13 AND studentId<=15
数据库引擎:
MyISAM:适用于这张表,有大量的查询操作。
InnoDB:增删改业务居多
主键:
对数据记录的唯一标识,不能重复。PRIMARY KEY
列数据
char 固定长度的字符串
varchar 可变长度的字符串
主键,外键
主从关系
当一个表引用了其他表的主键,那么在主从关系中,这个表就是引用了的表的从表。
在从表上添加外键索引,主从关系中,在执行插入语句的时候,应该先插入主表,再插入从表。在执行删除操作的时候,先删除从表,再删除主表。
4.4 DQL语句
4.1 Distinct去重
去除重复的行数据,一般用于统计运算中
-- 成绩表中记录的参加了考试的课程有哪些
SELECT DISTINCT subjectNo FROM result;
4.2 as子句
数据库字段与表上都可以添加别名,在表连接查询的时候,方便使用别名.字段名来区分某个字段来源与哪张表。如果在定义的字段名与类的属性名不一致的时候,也可以使用别名来重新命名。
SELECT
subjectName AS 课程名,
classHour AS 总课时 ,
ClassHour/10 AS '均课时/天'
FROM SUBJECT;
4.3 like
用与模糊查询,与通配符一起配合使用。
通配符:%代表可以匹配任意多个字符 ,_代表匹配一个字符。
语法
... where userName like '李%'
4.4 in
用于子查询语句,用来在指定的范围内进行查询,区别于等值的查询。
子查询的概念:在一个完整的查询语句中,又嵌套另外一个查询语句,这样的结构就叫做子查询。
例:批量删除
delete from student where studentId in (1,5,7,13)
4.5 连接查询
1 内连接
inner join
匹配连接的表中全部都拥有的数据
-- 表连接查询,共分为 内连接-外连接
-- 笛卡尔积
-- 内连接1
SELECT * FROM student t1
INNER JOIN grade t2
ON t1.gradeId=t2.gradeId;
-- 内连接2
SELECT * FROM student t1,grade t2
WHERE t1.gradeId=t2.gradeId
-- 子查询3
SELECT * FROM student t1
WHERE t1.gradeId IN (
SELECT gradeId FROM grade
)
2 外连接
左外连接
left join
从表作为左表,则与内连接的结果一致
匹配左表所有的数据
-- 外连接
-- 左外连接 :查询的是从表,连接的是主表,则结果与内连接相同。
SELECT * FROM student t1 RIGHT
JOIN grade t2
ON t1.gradeId=t2.gradeId
--
SELECT * FROM grade t1
LEFT JOIN student t2
ON t1.gradeId=t2.gradeId
右外连接
right join
匹配右表所有的数据
主表作为右表,则与内连接的结果一致
3 自连接
典型应用就是定义字母表,来进行自身连接查询。
CREATE TABLE IF NOT EXISTS category(
categoryId INT(10) AUTO_INCREMENT PRIMARY KEY,
categoryName VARCHAR(32) NOT NULL ,
pid INT(10)
);
-- 子母表 可以存储无限层级关系的数据
-- 自连接
SELECT
t2.`categoryId`,t2.`categoryName`,
t1.`categoryName`
FROM category t1
INNER JOIN category t2
ON t1.`categoryId`=t2.`pid`
4.6 order by 排序
DESC :倒序排列,(降序),由高到低
ASC :正序排列,(升序,由低到高,可以省略不写。
SELECT * FROM result ORDER BY studentResult DESC
SELECT * FROM student ORDER BY BornDate DESC,sex ASC
如果按照日期进行倒序排列,则离现在日期最近的时间会排在首行。要使用有意义的列进行排序
4.7 Limit分页
Mysql数据库所特有的关键字,使用它来进行分页查询
-- 分页的几个核心指标
-- 共多少条记录数 19
-- 每页要显示多少条 5
-- 可以分为几页? 19%5!=0 (19/5)+1
-- 要查询哪页的数据(当前的页码)
SELECT * FROM student ORDER BY BornDate DESC
LIMIT 0,5;
SELECT * FROM student ORDER BY BornDate DESC
LIMIT 5,5;
SELECT * FROM student ORDER BY BornDate DESC
LIMIT 10,5;
SELECT * FROM student ORDER BY BornDate DESC
LIMIT 15,5;
-- limit 后面的两个参数的意义
-- 第一个参数代表 从第几行的索引值开始查询 【偏移量】
-- 第二个参数代表 每页显示多少条记录
4.8 子查询案例
-- 查询课程为《高等数学-2》且分数不小于80分的学生的学号和姓名
-- 3个连接
-- 表连接
SELECT t1.studentNo,t1.StudentName FROM student t1
INNER JOIN result t2
ON t1.`StudentNo`=t2.StudentNo
INNER JOIN SUBJECT t3
ON t2.subjectNo=t3.subjectNo
WHERE t3.subjectName='高等数学-2' AND t2.StudentResult>=80;
-- 子查询
-- 由里到外
SELECT t3.`StudentNo`,t3.`StudentName` FROM student t3
WHERE t3.`StudentNo` IN(
SELECT t2.StudentNo FROM result t2
WHERE t2.StudentResult>=80
AND t2.subjectNo IN (
SELECT t1.subjectNo FROM SUBJECT t1
WHERE t1.subjectName='高等数学-2'
)
)
4.9、统计函数
统计函数也叫聚合函数。共有五个,操作的是行的数据。
count() 统计行数、SUM()求所有行上的数据的总和,AVG()平均值, MAX()最大值,MIN()最小值
SELECT COUNT(1) FROM student;
SELECT SUM(studentResult)/COUNT(1) FROM result;
SELECT AVG(studentResult) FROM result;
SELECT MAX(studentResult) FROM result;
SELECT MIN(studentResult) FROM result;
4.10 分组查询
group by 进行分组
HAVING 分组后的筛选条件,注意此处不能使用where
SELECT
t2.subjectName '课程名称',
MAX(t1.studentResult) '最高分',
MIN(t1.studentResult) '最低分',
AVG(t1.studentResult) '平均分'
FROM result t1
INNER JOIN SUBJECT t2
ON t1.subjectNo=t2.subjectNo
GROUP BY t1.subjectNo HAVING AVG(t1.studentResult)>=80
五、 事务
5.1 事务的概念
事务就是将一组SQL语句放在同一批次内去执行,
一条SQL,同一个处理批次,当里面有任意一条SQL语句执行失败,则整个操作将会回滚,反之,则会进行提交。
事务的执行基本原理:
关联执行,只要其中一条SQL执行失败,则会回滚,反之,就会提交。在执行事务的时候,首页先关闭mysql的自动提交。
注意:Mysql只支持InnoDB类型的数据库引擎。
没有加入事务的SQL语句
-- 转账操作,核心业务流程
-- 1、先查询张三的余额,判断余额是否满足转账金额
SELECT money FROM USER WHERE userId=1;
-- 2、如果张三余额够,则进行转账操作。反之,业务就中断
-- 2.1 转账,进行账号扣款
UPDATE USER SET money=money-1000 WHERE userId=1;
程序执行异常....
-- 3、给李四账号增加转账的金额
UPDATE USER SET money=money+1000 WHERE userId=2;
5.2 事务的四大特性
事务的ACID原则
1. 原子性
放在事务之中的SQL语句,无论是一条还是多条,它都将被视作一个不可分割的整体。如果执行成功,则会提交,如果但凡有一条SQL执行失败,则会把之前执行成功的操作进行撤销。要么保证全部执行成功,要么就全部回滚。
2.一致性
指的是事务在执行前,与执行后,数据的一致性不会改变。
3. 隔离性
指的的多个事务之间操作同一数据的时候,彼此是一个隔离状态,它们拥有独立的运行环境。彼此互不影响。
(事务的传播机制,与事务的隔离级别。(Spring的声明式事务,数据的脏读,幻读,不可重复读)
4. 持久性
在数据库操作中,事务执行之后,给数据库带来的影响是永久性的。
(IO操作,数据的持久化技术。)
5.3 事务执行的语法
使用事务的时候首先应该关闭自动提交
SELECT @@autocommit; -- 查看自动提交是否开启,如果为1,则说明是开启状态
SET @@autocommit=0; -- 关闭自动提交
START TRANSACTION;
UPDATE account SET money=money-1000 WHERE user_id=1;
UPDATE account SET money=money+1000 WHERE user_id=2;
ROLLBACK;
-- commit; -- 提交
SET @@autocommit=1; -- 开启自动提交
注意:TRANSACTION,ROLLBACK,commit后面的封号不要丢
六、索引
6.1 索引的分类
1、主键索引
2、普通索引
3、唯一索引
4、全文索引
6.2 索引的作用
mysql简历索引机制,目的就是为了提高查询的速度。索引一般会建立在MyISAM类型的数据表上。
-
提高查询速度
-
确保数据的唯一性
-
可以加速表和表之间的连接,实现表与表之间的参照完整性
-
使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间
-
全文检索字段进行搜索优化
6.3 索引管理
1、索引的添加
ALTER TABLE student ADD INDEX bd (BornDate); --常规索引
ALTER TABLE news ADD FULLTEXT content (newsCotent) --全文索引
2、查看索引:
SHOW INDEX FROM student; -- 查看表上的全部索引 SHOW INDEX(或KEYS) FROM 表名
3、删除索引
DROP INDEX content ON news
--删除主键索引的时候,如果主键上有自增属性的时候,要先取消自增
DROP INDEX `PRIMARY` ON news
6.4 常见问题
问题1 :如何提高查询的速度?
1、在必要的查询的条件的列上添加索引。
2、Redis技术 -缓存数据库
3、热搜词,分词以后,配合 Elaticsearch。
4、分库,分表。一个表只存储10000条数据。编号为1-10000的数据,10001-20000存储在第二个表中。
问题2:Mysql中主键的生成策略有哪些?
1、自动增长
2、UUID
3、Mybatisplus -雪花算法 UUID的数据
4、可以借助算法,自己根据规则来进行自定义主键值 || 20位编号 ||