MySQL入门语法(视频学习笔记)

2.6、修改删除表


修改

– 修改表名:alter table 旧表名 raname 新表名

ALTER TABLE teacher RENAME AS teacher1

– 增加表的字段:alter table 表名 add 字段名 列属性

ALTER TABLE teacher1 ADD wage INT(10)

– 修改表的字段:重命名、修改约束

– 修改约束 alter table 表名 modify 字段名 列属性[]

ALTER TABLE teacher1 MODIFY wage VARCHAR(11)

– 字段重命名 alter table 表名 change 旧名字 新名字 列属性[]

ALTER TABLE teacher1 change age age1 INT(1)

– 删除表的字段 alter table 表名 drop 字段名

ALTER TABLE teacher1 DROP age1

删除

– 删除表

drop table if exists teacher1

3、MySQL数据管理

=========================================================================

3.1、外键(了解)


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 被引用表(被引用列)

删除有外键关系的表的时候,必须要先删除去引用的表(从表),在删除被引用的表(主表)

以上的操作都是物理外键,数据库级别的外键,不建议使用(避免数据库过多造成困扰)

最佳操作

  • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)

  • 我们想使用多张表的数据,想使用外键(用程序实现)

3.2、DML语言


数据库意义:数据存储,数据管理

DML语言:数据库操作语言

  • insert

  • update

  • delete

3.3、添加


– 添加语句(插入)

– 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')...

注意事项:

  1. 字段和字段之间使用英文逗号隔开

  2. 字段是可以省略的,但是后面的值必须要一一对应,不能少

  3. 可以同时插入多条数据,values后面的值需要使用逗号隔开

3.4、修改


– 修改语句(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(获的当前时间)

3.5、删除


delete命令

语法:delete from 表名 [where 条件]

– 删除数据(避免这样写,会删除所有数据)

delete from student;

– 删除指定数据

delete from student where id = 1;

truncate命令

作用:完全清空一个数据库表,表的结构和索引约束不会变

– 清空student表

truncate student;

delete和truncate命令的区别

  • 相同点:都能删除数据,都不会删除表结构

  • 不同点:

  • truncate会重新设置自增列,计数器会归零,而delete的计数器不会归零

  • truncate不会影响事务

4、DQL查询数据

=======================================================================

4.1、DQL


简单的查询

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

  • 函数

  • 计算表达式

  • 系统变量

4.2、where条件子句


作用:检索数据中符合条件的值

搜索的条件为一个或者多个表达式

逻辑运算符

| 运算符 | 语法 | 描述 |

| :-: | :-: | :-: |

| 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 ‘’;

4.3、联表查询


示例

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总结

img

| 操作 | 作用 |

| — | — |

| 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;

思路

  1. 我要查询哪些数据:select ...

  2. 从哪几个表中查:from 表 xxx join 连接的表 on 交叉条件(两表的共有列)

  3. 假设存在多张表的查询,先两张查询再慢慢叠加

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

4.4、自联接


自己的表和自己的表联接

核心:一张表拆成两张一模一样的表

第一张表

| 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)]

4.5、分页和排序


排序

– 排序:升序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);

4.6、子查询


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

4.7、分组和过滤


– 查询每个科目的平均分,最高分,最低分,平均分>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子句基于这些值过滤掉的分组

4.8、总结


完整的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

顺序很重要!

5、MySQL常用函数

=========================================================================

5.1、常用函数(不常用)


数学运算

  • 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()

5.2、聚合函数(常用)


| 函数名称 | 描述 |

| — | — |

| 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

5.3、数据库级别的MD5加密


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’)

6、事务

==================================================================

6.1、什么是事务


要么都成功,要么都失败


1、SQL执行 A给B转账:A1000 —> 200 B200

2、SQL执行 B收到A钱:A800 —> B400


即将一组SQL放在一个批次中去执行!

事务原则(ACID原则)

  • 原子性这里写图片描述

原子性表示要么都成功,要么都失败,不能只发生其中一个动作

  • 一致性

事务前后的数据完整性要保持一致,如转账前后两个用户账户金额总数保持不变

  • 隔离性

多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事物的操作数据所干扰,事物之间要相互隔离

  • 持久性

事务一旦提交则不可逆,被持久化到数据库中

如果在操作前(事务还没有提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为

A:800,B:200

如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为

A:600,B:400

事务的隔离级别

  • 脏读:指一个事务读取了另外一个事务未提交的数据。

  • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。

  • 虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致(一般是行影响,如下图所示:多了一行)

6.2、测试事务实现转账


语法部分

– 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;

7、索引

==================================================================

7.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(‘刘’);

7.2、测试索引


– 建表

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

索引在小数据量的时候,作用不大,但是在大数据的时候,区别十分明显

7.3、索引原则


  • 索引不是越多越好

  • 不要给经常变动的数据加索引

  • 小数据量的表不需要加索引

  • 索引一般加载常用来查询的字段上

索引的数据结构

Hash类型的索引

Btree:InnoDB的默认数据结构

8、权限管理与备份

=======================================================================

8.1、用户管理


最后

Java架构进阶面试及知识点文档笔记

这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理

image

Java分布式高级面试问题解析文档

其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!

image

互联网Java程序员面试必备问题解析及文档学习笔记

image

Java架构进阶视频解析合集

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

索引在小数据量的时候,作用不大,但是在大数据的时候,区别十分明显

7.3、索引原则


  • 索引不是越多越好

  • 不要给经常变动的数据加索引

  • 小数据量的表不需要加索引

  • 索引一般加载常用来查询的字段上

索引的数据结构

Hash类型的索引

Btree:InnoDB的默认数据结构

8、权限管理与备份

=======================================================================

8.1、用户管理


最后

Java架构进阶面试及知识点文档笔记

这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理

[外链图片转存中…(img-L942ORy1-1714424083167)]

Java分布式高级面试问题解析文档

其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!

[外链图片转存中…(img-KPoRGgdg-1714424083168)]

互联网Java程序员面试必备问题解析及文档学习笔记

[外链图片转存中…(img-bF70Ptwd-1714424083168)]

Java架构进阶视频解析合集

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值