先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
=========================================================================
CREATE TABLE grade
(
gradeId
INT(8) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT COMMENT ‘年级ID’,
gradeName
VARCHAR(10) NOT NULL COMMENT ‘年级名字’,
PRIMARY KEY (gradeId
)
) ENGINE=INNODB DEFAULT CHARSET=utf8
– 学生表的gradeId字段要去引用成绩表的gradeId
CREATE TABLE student
(
id
INT(8) ZEROFILL NOT NULL AUTO_INCREMENT COMMENT ‘学生id’,
name
VARCHAR(10) NOT NULL COMMENT ‘学生姓名’,
gradeId
INT(8) ZEROFILL NOT NULL COMMENT ‘学生年级’,
gender
VARCHAR(3) NOT NULL COMMENT ‘性别’,
PRIMARY KEY(id
),
– 定义外键key
KEY FK_gradeId
(gradeId
),
– 给这个外键添加约束(执行引用) references引用
CONSTRAINT FK_gradeId
FOREIGN KEY(gradeId
) REFERENCES grade
(gradeId
)
)ENGINE INNODB DEFAULT CHARSET=utf8
– 创建表的时候没有外键关系
ALTER TABLE student
ADD CONSTRAINT FK_gradeId
FOREIGN KEY(gradeId
) REFERENCES grade
(gradeId
);
– ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 被引用表(被引用列)
删除有外键关系的表的时候,必须要先删除去引用的表(从表),在删除被引用的表(主表)
以上的操作都是物理外键,数据库级别的外键,不建议使用(避免数据库过多造成困扰)
最佳操作
-
数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
-
我们想使用多张表的数据,想使用外键(用程序实现)
数据库意义:数据存储,数据管理
DML语言:数据库操作语言
-
insert
-
update
-
delete
– 添加语句(插入)
– insert into 表名[(字段1,字段2,字段3)] values (‘值A1’,‘值A2’,‘值A3’),(‘值B1’,‘值B2’,‘值B3’)…
INSERT INTO grade(gradename
) VALUES (‘大四’);
– 没有设置NOT NULL的字段和设置了自增的键都可以不赋值,其他字段不赋值都会报错
– 如果省略表的字段,则会把所有字段与后面的值一一对应(即需要把每个字段的值都写出来,没有设置NOT NULL的字段和设置了自增的键如果不赋值也需要写NULL占位)
INSERT INTO student
VALUES (NULL, ‘陈彦亨’, NULL, ‘男’);
– 插入多个数据时values一般换行书写
INSERT INTO student
(name
, gender
)
VALUES (‘李四’, ‘男’), (‘王五’, ‘女’);
语法:insert into 表名[(字段1,字段2,字段3)] values ('值A1','值A2','值A3'),('值B1','值B2','值B3')...
注意事项:
-
字段和字段之间使用英文逗号隔开
-
字段是可以省略的,但是后面的值必须要一一对应,不能少
-
可以同时插入多条数据,values后面的值需要使用逗号隔开
– 修改语句(update)
– 修改学员名字,带了条件
UPDATE student
SET name
= ‘陈梓坤’ WHERE id = 1;
– 不指定条件(会导致所有数据被修改)
UPDATE student
SET gender
= ‘男’;
– 修改多个属性,逗号隔开
UPDATE student
SET name
= ‘臭弟弟’, gender
= ‘女’ WHERE id = 2;
语法:update 表名 set column_name = value, [column_name = value, ...] where 条件
条件语句where:返回布尔值
操作符:
-
= : 等于
-
<> 或 != :不等于
-
< 、>、<=、>= :小于,大于,小于等于,大于等于
-
between A and B :A和B的闭区间
-
A and B :A && B
-
A or B :A || B
-
is null :没有值
注意事项:
-
column_name 是数据库的列,尽量带上``
-
条件,筛选的条件,如果没有指定,则会修改所有的列
-
value,是一个具体的值,也可以是一个变量/函数
如current_time(获的当前时间)
delete命令
语法:delete from 表名 [where 条件]
– 删除数据(避免这样写,会删除所有数据)
delete from student
;
– 删除指定数据
delete from student
where id = 1;
truncate命令
作用:完全清空一个数据库表,表的结构和索引约束不会变
– 清空student表
truncate student
;
delete和truncate命令的区别
-
相同点:都能删除数据,都不会删除表结构
-
不同点:
-
truncate会重新设置自增列,计数器会归零,而delete的计数器不会归零
-
truncate不会影响事务
=======================================================================
简单的查询
SELECT CONCAT(StudentNo, CONCAT(‘:’, StudentName)) AS 结果 FROM student
– 查询表的全部字段
SELECT * FROM student;
– 查询表的指定字段
SELECT StudentNo
, StudentName
FROM student;
– 函数 concat(a, b)
SELECT CONCAT(StudentNo, CONCAT(‘:’, StudentName)) AS 结果 FROM student
语法:select 字段1,... from 表
输入字段名时不区分大小写,输出的结果列名大小写形式和输入时保持一致,和创建时不一定一致
别名与去重
as 起别名
– 别名:给结果起一个名字
– 给字段起别名
SELECT StudentNo AS 学生学号, studentname AS 学生姓名 FROM student
– 给表起别名
SELECT StudentNo, studentname 姓名 FROM student AS s
其别名时as可以省略,as后的内容可以带引号也可以不带
distinct 去重
– 查询有哪些学生参加了考试
– 查询所有成绩,每个学生有多个科目的成绩
select * from result;
– 查询所有学生,发现重复数据(此表中没有主键)
select StudentNo
from result;
– 去除重复数据
select distinct StudentNo
from result;
数据库表达式
数据库的列(表达式)
– 查询系统版本(函数)
SELECT VERSION();
– 查询计算结果(表达式)
SELECT 100*3-1 AS 计算结果;
– 查询自增的步长(变量)
SELECT @@auto_increment_increment;
– 查看学员考试成绩加一分后的结果
SELECT StudentNo
, StudentResult
+1 AS 加分后 FROM result;
格式:select 表达式 from 表;
数据库中的表达式:
-
文本值
-
列
-
null
-
函数
-
计算表达式
-
系统变量
作用:检索数据中符合条件的值
搜索的条件为一个或者多个表达式
逻辑运算符
| 运算符 | 语法 | 描述 |
| :-: | :-: | :-: |
| and && | A and B / A && B | 逻辑与 |
| or || | A or B / A || B | 逻辑或 |
| not ! | not A / !A | 逻辑非 |
尽量使用英文字母
– 查询考试成绩再95-100分之间的数据
– and
SELECT StudentNo
, StudentResult
FROM result
WHERE StudentResult
>= 95 AND StudentResult
<= 100;
– &&
SELECT StudentNo
, StudentResult
FROM result
WHERE StudentResult
>= 95 && StudentResult
<= 100;
– 模糊查询(区间)
SELECT StudentNo
, StudentResult
FROM result
WHERE StudentResult
BETWEEN 95 AND 100;
– 查询除了1000号学生意外的同学的成绩数据
– !=
SELECT StudentNo
, StudentResult
FROM result
WHERE StudentNo
!= 1000;
SELECT StudentNo
, StudentResult
FROM result
WHERE !StudentNo
= 1000;
– not
SELECT StudentNo
, StudentResult
FROM result
WHERE NOT StudentNo
= 1000;
模糊查询:比较字符串
| 运算符 | 语法 | 描述 |
| — | — | — |
| is null | A is null | A为null则为真 |
| is not null | A is not null | A不为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,A3…其中的一个值则为真 |
– 模糊查询
– 查询姓张的同学
– 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 ‘张__’;
– 查询名字中间有伟字的同学
SELECT StudentNo
,StudentName
FROM student
WHERE StudentName
LIKE ‘%伟%’;
– in(具体的一个或者多个值)
– 查询1001,1002,1003号学员
SELECT StudentNo
,StudentName
FROM student
WHERE StudentNo
IN (1001, 1002, 1003);
– 查询在北京或广东的学生(精确相等才返回true)
SELECT StudentNo
,StudentName
FROM student
WHERE Address
IN (‘北京’, ‘广东’);
– null
– 查询地址为空的学生
SELECT StudentNo
,StudentName
FROM student
WHERE Address
IS NULL OR NOT ‘’;
– 查询有出生日期的学生 不为空
SELECT StudentNo
,StudentName
FROM student
WHERE Address
IS NOT NULL OR ‘’;
示例
student表
| StudentNo | StudentName |
| — | — |
| 1001 | 小王 |
| 1002 | 小红 |
| 1003 | 小黑 |
result表
| StudentNo | SubjectNo | StudentResult |
| — | — | — |
| 1001 | 1 | 90 |
| 1001 | 2 | 89 |
| 1001 | 3 | 91 |
| 1002 | 1 | 90 |
| 1002 | 2 | 20 |
| 1002 | 3 | 61 |
| 1004 | 1 | 112 |
| 1004 | 2 | 20 |
| 1004 | 3 | 21 |
– 笛卡尔积
– 两表关联,把左表的列和右表的列通过笛卡尔积的形式表达出来。
– 语法:select * from t1 join t2
SELECT s.StudentNo, StudentName, SubjectNo, StudentResult
FROM Student AS s
INNER JOIN result AS r
/* 思路
1.分析需求,分析查询的字段来自哪些表
2.确定使用哪种连接查询
确定交叉点(这两个表中哪个字段数据是相同的)
判断的条件:学生表中的StudentNo = 成绩表的StudentNo
*/
– 内连接
SELECT s.StudentNo, StudentName, SubjectNo, StudentResult
FROM Student AS s
INNER JOIN result AS r
ON s.StudentNo = r.StudentNo;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ptHTmhDT-1634744437225)(C:\Users\Ken-Chy\AppData\Roaming\Typora\typora-user-images\image-20211014231356113.png)]
– 左外连接
SELECT s.StudentNo, StudentName, SubjectNo, StudentResult
FROM Student AS s
LEFT JOIN result AS r
ON s.StudentNo = r.StudentNo;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yt4ly9rb-1634744437226)(C:\Users\Ken-Chy\AppData\Roaming\Typora\typora-user-images\image-20211014231742670.png)]
– 右外连接
SELECT s.StudentNo, StudentName, SubjectNo, StudentResult
FROM Student AS s
RIGHT JOIN result AS r
ON s.StudentNo = r.StudentNo;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DrQxuBH9-1634744437227)(C:\Users\Ken-Chy\AppData\Roaming\Typora\typora-user-images\image-20211014231934402.png)]
Joins总结
| 操作 | 作用 |
| — | — |
| inner join:内连接 | 两表关联,保留两表中交集的记录 |
| left join:左外连接 | 两表关联,左表全部保留,右表关联不上用null表示 |
| right join:右外连接 | 两表关联,右表全部保留,左表关联不上用null表示 |
| full join:全连接 | 两表关联,两表的内容均保留,没有关联的字段用null表示 |
| 左表独有 | 两表关联,查询左表独有的数据,类似于集合中的t1 - t2 |
| 右表独有 | 两表关联,查询右表独有的数据,类似于集合中的t2 - t1 |
| 并集去交集 | 两表关联,取并集然后去交集 |
oracle里面有full join,但是在mysql中没有full join。我们可以使用union来达到目的。
练习
– 查询缺考的同学
SELECT s.StudentNo, StudentName, SubjectNo, StudentResult
FROM Student AS s
LEFT JOIN Result AS r
ON s.StudentNo = r.StudentNo
WHERE studentresult IS NULL;
思路
-
我要查询哪些数据:
select ...
-
从哪几个表中查:
from 表 xxx join 连接的表 on 交叉条件(两表的共有列)
-
假设存在多张表的查询,先两张查询再慢慢叠加
SELECT s.StudentNo, StudentName, SubjectName, StudentResult
FROM Student AS s
RIGHT JOIN Result AS r
ON s.StudentNo = r.StudentNo
LEFT JOIN subject
AS sub
ON r.SubjectNo = sub.SubjectNo
自己的表和自己的表联接
核心:一张表拆成两张一模一样的表
第一张表
| categoryId | pId | categoryName |
| — | — | — |
| 2 | 1 | 信息技术 |
| 3 | 1 | 软件开发 |
| 5 | 1 | 美术设计 |
第二张表
| categoryId | pId | categoryName |
| — | — | — |
| 4 | 3 | 数据库 |
| 8 | 2 | 办公信息 |
| 6 | 3 | web开发 |
| 7 | 5 | ps技术 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sHBiuyiS-1634744437228)(C:\Users\Ken-Chy\Desktop\父类(1).png)]
操作:查询父类对应的子类关系
| 父类 | 子类 |
| :-: | :-: |
| 信息技术 | 办公信息 |
| 软件开发 | 数据库 |
| 软件开发 | web开发 |
| 美术设计 | ps技术 |
– 查询父子信息:把一张表看成两张一样的表
SELECT a.categoryName
AS ‘父栏目’,
b.categoryName
AS ‘子栏目’
FROM category AS a, category AS b
WHERE a.categoryId = b.pId;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xNobz65j-1634744437229)(C:\Users\Ken-Chy\AppData\Roaming\Typora\typora-user-images\image-20211015005727262.png)]
排序
– 排序:升序ASC,降序DESC
– ORDER BY 通过哪个字段排序,怎么排
– 查询学生高等数学-3的成绩,结果按成绩降序排序
SELECT stu.studentNo, studentName, SubjectName, StudentResult
FROM student AS stu
INNER JOIN result AS re
ON stu.studentNo = re.studentNo
INNER JOIN subject
AS sub
ON re.subjectNo = sub.subjectNo
WHERE SubjectName = ‘高等数学-3’
ORDER BY StudentResult DESC
分页
为什么要分页?
缓解数据库压力,给人的体验更好 / 瀑布流
– 分页,每页只显示五条数据
– 语法: limit 数据索引起始值,每页数据数
– limit 0, 5 第1-5条数据
– limit 5, 5 第6-10条数据
SELECT stu.studentNo, studentName, SubjectName, StudentResult
FROM student AS stu
INNER JOIN result AS re
ON stu.studentNo = re.studentNo
INNER JOIN subject
AS sub
ON re.subjectNo = sub.subjectNo
ORDER BY StudentResult DESC
LIMIT 0, 3
– pagesize:页面大小(每页数据数)
– n:当前页
– (n-1)*pagesize:起始值
– (数据总数 + 每页数据数 - 1)/每页数据数 = 总页数
语法:limit(查询数据的起始下标, pagesize);
where(这个值是计算出来的(原本where后是一个定值或表中已有数据))
本质:在where语句中嵌套一个子查询语句
where (select * from)
查询 “ 数据库结构-1 ” 的所有考试结果,科目编号,成绩,降序排序
– 连表查询
SELECT studentNo, r.subjectNo, studentresult
FROM result AS r
INNER JOIN subject
AS s
ON r.subjectNo = s.subjectNo
WHERE subjectName = ‘数据库结构-1’
ORDER BY studentresult DESC
– 子查询
SELECT studentNo, subjectNo, studentresult FROM result
WHERE subjectNo = (
SELECT subjectNo FROM subject
WHERE subjectName = ‘数据库结构-1’
)
ORDER BY studentresult DESC
高等数学分数不小于80分的学生的学号和姓名
– 连表查询+子查询
SELECT DISTINCT s.studentNo, studentName
FROM result AS r
INNER JOIN student AS s
ON r.studentNo = s.studentNo
WHERE studentresult >= 80 AND subjectNo = (
SELECT subjectNo FROM subject
WHERE subjectName = ‘高等数学-1’
)
– 连表查询
SELECT DISTINCT s.studentNo, studentName
FROM result AS r
INNER JOIN student AS s
ON r.studentNo = s.studentNo
INNER JOIN subject
AS sub
ON r.subjectNo = sub.subjectNo
WHERE subjectName = ‘高等数学-1’
– 子查询
SELECT studentNo, studentName FROM student WHERE studentNo IN (
SELECT studentNo FROM result WHERE studentresult >= 80 AND subjectNo = (
SELECT subjectNo FROM subject
WHERE subjectName = ‘高等数学-1’
)
)
练习:查询C语言-1前5名同学的成绩信息(学号,姓名,分数)
使用子查询
SELECT s.studentNo, studentName, studentResult
FROM student AS s
INNER JOIN result AS r
ON s.studentNo = r.studentNo
WHERE subjectNo = (
SELECT subjectNo FROM subject
WHERE subjectName = ‘C语言-1’
)
ORDER BY studentResult DESC
LIMIT 0, 5
– 查询每个科目的平均分,最高分,最低分,平均分>80分-- 查询不同课程的
SELECT subjectName, AVG(studentResult) AS 平均分, MAX(studentResult), MIN(studentResult)
FROM result AS r
INNER JOIN subject
AS sub
ON r.subjectNo = sub.subjectNo
GROUP BY sub.subjectName
HAVING 平均分 > 80
having和where的差别
where在数据分组之前进行过滤,having在数据分组之后进行过滤。where排除的行不包括在分组中,这可能会改变计算值,从而影响having子句基于这些值过滤掉的分组
完整的select语法
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[AS alias1][,table.field2[AS alias2]][,…]}
FROM TABLE_NAME [AS table_alias]
[LEFT | RIGHT | INNER JOIN table_name2] – 联表查询
[WHERE …] – 指定结果需要的条件
[GROUP BY …] – 指定结果按照哪几个字段来分组
[HAVING …] – 过滤分组的记录必须满足的次要条件
[ORDER BY …] – 指定查询记录按一个或多个条件排序
[LIMIT {[OFFSET,]ROW_COUNT | row_countOFFset OFFSET}]; – 指定查询的数据从哪条到哪条
– []代表可选项,{}代表必选项
select 去重 要查询的字段 from 表(表和字段可以取别名)
xxx join 要连接的表 on 等值判断
where(具体的值 / 子查询语句)
group by(通过哪个字段来分组)
having(过滤分组后的信息,条件和where是一样的,位置不同)
order by …(通过那个字段排序)[升序 / 降序]
limit startindex, pagesize
顺序很重要!
=========================================================================
数学运算
-
abs(-8) – 绝对值
-
ceiling(9.4) – 向上取整
-
floor(9.4) – 向下取整
-
rand() – 返回一个0-1之间的随机数
-
sign() – 判断一个数的符号(0–>0,负数->-1,正数->1)
字符串函数
-
char_length(‘xxxx’) – 字符串长度
-
concat(‘x’,‘xx’,…) – 拼接字符串
-
insert(‘xxx’,fromindex,len,‘xx’) – 从某个位置开始替换某个长度的字符串,若长度为0则为插入,下标从1开始
-
lower(‘xxx’) – 转换为小写字母
-
upper(‘xxx’) – 转换为大写字母
-
instr(‘xxxxxx’, ‘xx’) – 返回第一次出现的字串的索引
-
replace(‘xxxx’,‘from’,‘to’) – 替换出现的指定字符串
-
substr(‘xxx’,fromindex,len) – 返回指定的子字符串,没有len则返回到字符串末尾
-
reverse(‘xx’) – 反转
时间和日期函数
-
current_date() – 获取当前时间(年月日)
-
curdate() – 获取当前日期
-
now() – 获取当前时间(年月日时分秒)
-
localtime() – 本地时间
-
sysdate() – 系统时间
-
year/month/day/hour/minute/second(now())
系统
-
system_user()
-
user()
-
version()
| 函数名称 | 描述 |
| — | — |
| count() | 计数 |
| sum() | 求和 |
| avg() | 平均值 |
| max() | 最大值 |
| min() | 最小值 |
| … | … |
统计表中数据
count(字段) – 会忽略所有的null值
count(*) – 不会忽略null值
cout(1) – 不会忽略null值
– 查询平均分,最高分,最低分
SELECT ANY_VALUE(subjectName), AVG(studentResult), MAX(studentResult), MIN(studentResult)
FROM result AS r
INNER JOIN subject
AS sub
ON r.subjectNo = sub.subjectNo
– 因为没有分组,所以结果为第一个科目的名字以及所有科目的所有分数的平均值和最大最小值
– 查询每个科目的平均分,最高分,最低分,平均分>80分
SELECT subjectName, AVG(studentResult) AS 平均分, MAX(studentResult), MIN(studentResult)
FROM result AS r
INNER JOIN subject
AS sub
ON r.subjectNo = sub.subjectNo
GROUP BY sub.subjectName
HAVING 平均分 > 80
MD5不可逆,相同的值的MD5是一样的
由上–>MD5破解网站原理:网站背后有一个字典存储各种密码MD5加密后的值,与需要破解的加密后密码进行对比,相同则可知其加密前密码
– 测试MD5加密
CREATE TABLE testmd5
(
id
INT(4) NOT NULL,
name
VARCHAR(20) NOT NULL,
pwd
VARCHAR(50) NOT NULL,
PRIMARY KEY(id
)
)ENGINE=INNODB DEFAULT CHARSET=utf8
– 明文密码
INSERT INTO testmd5 VALUES(4,‘张三’,‘123456’), (5,‘李四’,‘1234567’), (6,‘王五’,‘12345678’)
– 加密
UPDATE testmd5 SET pwd = MD5(pwd) WHERE id = 1 – 指定加密
UPDATE testmd5 SET pwd = MD5(pwd) – 全部加密
INSERT INTO testmd5 VALUES (0, ‘小米’, MD5(123)) – 插入时加密
– 如何校验:将用户传递进来的密码,进行md5加密,对比加密后的值
SELECT * FROM testmd5 WHERE name
= ‘小米’ AND pwd = MD5(‘123’)
==================================================================
要么都成功,要么都失败
1、SQL执行 A给B转账:A1000 —> 200 B200
2、SQL执行 B收到A钱:A800 —> B400
即将一组SQL放在一个批次中去执行!
事务原则(ACID原则)
- 原子性
原子性表示要么都成功,要么都失败,不能只发生其中一个动作
- 一致性
事务前后的数据完整性要保持一致,如转账前后两个用户账户金额总数保持不变
- 隔离性
多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事物的操作数据所干扰,事物之间要相互隔离
- 持久性
事务一旦提交则不可逆,被持久化到数据库中
如果在操作前(事务还没有提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为
A:800,B:200
如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为
A:600,B:400
事务的隔离级别
-
脏读:指一个事务读取了另外一个事务未提交的数据。
-
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。
-
虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致(一般是行影响,如下图所示:多了一行)
语法部分
– mysql是自动开启事务自动提交的
SET autocommit = 0 – 关闭
SET autocommit = 1 – 开启(默认设置)
– 手动处理事务
SET autocommit = 0 – 关闭自动提交
– 事务开启
START TRANSACTION – 标记一个事务的开始,从这个之后的sql都在同一个事务之内
INSERT xx
INSERT xx
– 提交:持久化(成功)
COMMIT
– 回滚:回到原来的样子(失败)
ROLLBACK
– 事务结束
SET autocommit = 1 – 开启自动提交
– 了解部分
SAVEPOINT 保存点名 – 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名 – 回滚到保存点
RELEASE SAVEPOINT 保存点名 – 撤销保存点
实战模拟部分
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop
CREATE TABLE account
(
id
INT(3) NOT NULL AUTO_INCREMENT,
name
VARCHAR(30) NOT NULL,
money
DECIMAL(9,2) NOT NULL,
PRIMARY KEY(id
)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO account
(name
,money
)
VALUES (‘A’,2000.00),(‘B’,1000.00)
SHOW VARIABLES LIKE ‘autocommit’; – 检查事务是否自动提交
– 模拟转账事务
SET autocommit = 0; – 关闭自动提交
START TRANSACTION; – 开始一个事务
UPDATE account
SET money=money-500 WHERE name
= ‘A’; – A减500
UPDATE account
SET money=money+500 WHERE name
= ‘B’; – B加500
COMMIT; – 提交事务
ROLLBACK; – 回滚
SET autocommit = 1;
==================================================================
在一个表中,主键索引只能有一个,唯一索引可以有多个
-
主键索引(PRIMARY KEY)
-
唯一的标识,主键不可重复,只能有一个字段作为主键
-
唯一索引(UNIQUE KEY)
-
避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引
-
常规索引(KEY/INDEX)
-
默认的,index/key关键字来设置
-
全文索引(FULLTEXT)
-
在特定的数据库引擎下才有
-
快速定位数据
基础语法
– 索引的使用
– 1、在创建表的时候给字段增加索引
– 2、创建完毕后增加索引
– 显示所有索引的信息
SHOW INDEX FROM student
;
– 增加一个全文索引列名
ALTER TABLE school.student
ADD FULLTEXT INDEX studentname
(studentname
);
– explain分析sql的执行状况
EXPLAIN SELECT * FROM student
; – 非全文索引
EXPLAIN SELECT * FROM student
WHERE MATCH(studentName) AGAINST(‘刘’);
– 建表
CREATE TABLE app_user
(
id
BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
name
VARCHAR(50) DEFAULT’’ COMMENT’用户昵称’,
email
VARCHAR(50) NOT NULL COMMENT’用户邮箱’,
phone
VARCHAR(20) DEFAULT’’ COMMENT’手机号’,
gender
TINYINT(4) UNSIGNED DEFAULT '0’COMMENT ‘性别(0:男;1:女)’,
password
VARCHAR(100) NOT NULL COMMENT ‘密码’,
age
TINYINT(4) DEFAULT’0’ COMMENT ‘年龄’,
create_time
DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id
)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT = ‘app用户表’
– 定义能创建一百万条数据的函数
DELIMITER $$
CREATE FUNCTION mock_data()
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i < num DO
INSERT INTO app_user(name
,email
,phone
,gender
,password
,age
)VALUES(CONCAT(‘用户’,i),‘24736743@qq.com’,CONCAT(‘18’,FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(),FLOOR(RAND()*100));
SET i = i + 1;
END WHILE;
RETURN i;
END $$
– 运行函数,创建一百万条数据
SELECT mock_data();
– 执行查询语句
SELECT * FROM app_user WHERE name
= ‘用户999999’; – 耗时0.775秒
– 分析该查询语句执行情况
EXPLAIN SELECT * FROM app_user WHERE name
= ‘用户999999’; – 需要查询数:992349
– 创建索引第三种方式
– create idnex 索引名 on 表(字段)
– 索引名命名形式:id_表名_字段名
CREATE INDEX id_app_user_name ON app_user(name
);
– 重新执行查询语句
SELECT * FROM app_user WHERE name
= ‘用户99999’; – 耗时0.001秒
EXPLAIN SELECT * FROM app_user WHERE name
= ‘用户99999’; – 需要查询数:1
索引在小数据量的时候,作用不大,但是在大数据的时候,区别十分明显
-
索引不是越多越好
-
不要给经常变动的数据加索引
-
小数据量的表不需要加索引
-
索引一般加载常用来查询的字段上
索引的数据结构
Hash类型的索引
Btree:InnoDB的默认数据结构
=======================================================================
SQLyog用户管理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L2FdYbwZ-1634744437231)(C:\Users\Ken-Chy\AppData\Roaming\Typora\typora-user-images\image-20211019210449008.png)]
SQL命令操作
用户表:mysql.user
本质:读这张表进行增删改查
– 创建用户 create user 用户名 identified by ‘密码’
CREATE USER ‘陈彦亨’ IDENTIFIED BY ‘129496’;
CREATE USER 陈梓坤 IDENTIFIED BY ‘129496’;
CREATE USER test@localhost IDENTIFIED BY ‘111111’;
– 修改密码(修改当前用户密码)
USER mysql;
ALTER USER ‘陈彦亨’@‘%’ IDENTIFIED BY ‘111111’;
– 重命名 rename user 原名 to 新名
RENAME USER 陈彦亨 TO cyh;
– 用户授权 grant 哪些权限 on 数据库.表 to 用户(给用户授予某个库中某张表的某种权限)
– all privileges全部的权限(除给他人授权的权限,此权限root拥有)
GRANT ALL PRIVILEGES ON . TO cyh;
– root用户的权限为:grant all privileges on . to root with grant option
最后
做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。
更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
查询语句
SELECT * FROM app_user WHERE name
= ‘用户99999’; – 耗时0.001秒
EXPLAIN SELECT * FROM app_user WHERE name
= ‘用户99999’; – 需要查询数:1
索引在小数据量的时候,作用不大,但是在大数据的时候,区别十分明显
-
索引不是越多越好
-
不要给经常变动的数据加索引
-
小数据量的表不需要加索引
-
索引一般加载常用来查询的字段上
索引的数据结构
Hash类型的索引
Btree:InnoDB的默认数据结构
=======================================================================
SQLyog用户管理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L2FdYbwZ-1634744437231)(C:\Users\Ken-Chy\AppData\Roaming\Typora\typora-user-images\image-20211019210449008.png)]
SQL命令操作
用户表:mysql.user
本质:读这张表进行增删改查
– 创建用户 create user 用户名 identified by ‘密码’
CREATE USER ‘陈彦亨’ IDENTIFIED BY ‘129496’;
CREATE USER 陈梓坤 IDENTIFIED BY ‘129496’;
CREATE USER test@localhost IDENTIFIED BY ‘111111’;
– 修改密码(修改当前用户密码)
USER mysql;
ALTER USER ‘陈彦亨’@‘%’ IDENTIFIED BY ‘111111’;
– 重命名 rename user 原名 to 新名
RENAME USER 陈彦亨 TO cyh;
– 用户授权 grant 哪些权限 on 数据库.表 to 用户(给用户授予某个库中某张表的某种权限)
– all privileges全部的权限(除给他人授权的权限,此权限root拥有)
GRANT ALL PRIVILEGES ON . TO cyh;
– root用户的权限为:grant all privileges on . to root with grant option
最后
做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。
更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务
[外链图片转存中…(img-tOZq4TJh-1713423636079)]
[外链图片转存中…(img-YjU89heg-1713423636079)]
[外链图片转存中…(img-ysQjs7BC-1713423636080)]
[外链图片转存中…(img-pU5Sfq0F-1713423636080)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-hQY3wtVr-1713423636080)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!