数据库知识点太多?作为测试掌握这些就够了【精简重点版 >直击面试>建议收藏】

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 数据库知识点太多?作为测试掌握这些就够了【精简重点版 >直击面试>建议收藏】

一、前言


很多博主总结的数据库知识很全面!

但如果作为测试的话,往往不需要掌握那么多,无论是日常工作还是面试仅需掌握一些基础和常用的点就足够了!

本文主要是针对测试小伙伴总结的精简重点版数据库sql知识点!能够让你花更少的时间致于应付绝大部分面试和工作!


二、前期准备


1.安装Navicat Mysql或navicat Premium

2.安装mysql(若有公司测试服务器地址可以不安装直连测试数据库即可)

3.打开navicat连接mysql服务


20210719152724532.png


20210719152751596.png

4.打开navicat连接,创建一个数据库(无须考虑字符集、排序规则为什么要这样填写,测试不需要了解,可自行私下了解)


20210719135341490.png

5.我们需要准备一些班级数据和学生数据,在创建的数据库中新建一个查询


20210719135901655.png



6.粘贴如下sql


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class`  (
  `id` int(11) NOT NULL,
  `class_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `created` datetime(6) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES (1, '一班', '2021-07-17 13:40:30.000000');
INSERT INTO `class` VALUES (2, '二班', '2021-07-18 13:40:48.000000');
INSERT INTO `class` VALUES (3, '三班', '2021-07-19 13:40:48.000000');
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` int(11) NOT NULL,
  `created` datetime(6) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `class_id` int(11) NOT NULL,
  `gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `height` int(3) NOT NULL,
  `weight` int(3) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '2021-07-19 13:42:35.000000', '张顺', 1, 'male', 170, 65);
INSERT INTO `student` VALUES (2, '2021-07-19 13:42:35.000000', '张玲', 1, 'female', 170, 65);
INSERT INTO `student` VALUES (3, '2021-07-19 13:42:35.000000', '李广', 2, 'male', 180, 68);
INSERT INTO `student` VALUES (4, '2021-07-19 13:42:35.000000', '李三四', 2, 'female', 170, 65);
INSERT INTO `student` VALUES (5, '2021-07-19 13:42:35.000000', '赵云', 3, 'male', 199, 100);
INSERT INTO `student` VALUES (6, '2021-07-19 13:42:35.000000', '马超', 3, 'female', 171, 66);
INSERT INTO `student` VALUES (7, '2021-07-19 13:42:35.000000', '诸葛亮', 3, 'male', 170, 65);
INSERT INTO `student` VALUES (8, '2021-07-19 13:42:35.000000', '刘备', 3, 'male', 202, 105);
INSERT INTO `student` VALUES (9, '2021-07-19 13:42:35.000000', '曹操', 3, 'male', 181, 80);
INSERT INTO `student` VALUES (10, '2021-07-19 13:42:35.000000', '黄忠', 2, 'female', 166, 50);
SET FOREIGN_KEY_CHECKS = 1;


7.按图中操作


20210719140026147.png


8.点击目录的表名可查看到创建的数据

20210719140115255.png


9.两张表的结构


class表字段(列)说明

1.id:班级id(唯一)

2.class_name:班级名称

3:created:创建班级的时间


student表字段(列)说明

1.id:学生id(唯一)

2.name:学生名称

3:created:创建学生的时间

4:class_id:所属班级,与班级id做关联

5.gender:学生性别

6.height:学生身高

7.weight:学生体重


三、增删改查数据(下列的Sql无须区分大小写)

1.增加数据(INSERT INTO)


语法:INSERT INTO 表名 VALUES (‘表字段名1’,‘表字段名2’,.....);

例如我们想新增一条班级id为4,班级名称为“自建一班”,创建时间为“2021-07-19 13:40:30.000000”的数据就可以这样写

INSERT INTO `class` VALUES (4, '自建一班', '2021-07-19 13:40:30.000000');

20210719140322126.png


刚插入的数据

20210719140433898.png

2.删除数据(delete和truncate)


2.1 delete

语法:DELETE FROM 表名 WHERE 字段名 = 值

例如我们想删除刚刚创建的班级数据,我们知道刚刚创建的班级数据它的id为4,名称为自建一般,那我们可以有如下两种写法


DELETE FROM class WHERE id=4;
DELETE FROM class WHERE class_name='自建一班';

2.2 truncate

语法:truncate 表名

例如我们想删除所有班级数据,则可以这样写


truncate class;


它会把班级表的所有数据都删除掉


20210719141747417.png


2.3drop(删表)

语法:drop 表1名,表2名,...;

例如我们想删除class表和student表,则可以这样写


DROP TABLE class,student;


他会把两张表全部删除掉

删除后,记得重新执行步骤一第6步的sql,为后续教程的数据做准备


2.4delete、truncate、drop的区别

简单来说:

drop用于删表(表中数据会全部删除,无法回滚),delete和truncate用于删除表中的数据(delete也可删表)。通过delete删除的数据可以回滚,而truncate删除的则不能。

他们的级别为:drop>truncate>delete

delete操作不会减少表或索引所占用的空间,truncate会将占用的恢复至初始大小。

举个例子:如果设置了自增id,有id为1、2、3的三条数据,如果通过delete全部删除后,下次插入的数据如果没有指定id的话,那它的id会为4

如果通过truncate删除这三条数据的话,那它的id会为1


3.修改数据(update)


语法:update 表名 set 字段名=值

例如我们想把三班的名称改为“自建三班”,则可以这样写


UPDATE class set class_name='自建三班' WHERE id=3


就可以把三班的名称改为“自建三班”,如果没有带where id=3则所有的班级名称都会变为“自建三班”


4.查询数据


语法:SELECT 字段名1,字段名2,... FROM 表名

4.1例如我想查学生的姓名和性别,则可以这样写

SELECT `name`,gender  from student;

20210719144048558.png

4.2 如果想查学生的全部信息那sql字段名处可以用*号代替


SELECT * from student;


查询结果

20210719144226366.png

4.3只想查性别为男的学生信息,可以这样写

SELECT * from student where gender='male';


查询结果

20210719144511495.png


4.4 查询姓张的女同学


SELECT * from student where `name` like '张%' and gender='female';

查询结果

20210719144648406.png

四、条件查询讲解


查询符合设定条件的数据

语法:select * from 表名 where 条件;


1.比较运算符


等于=

小于<

大于>

大于等于>=

小于等于<=

不等于!=或者<>

查询身高大于170的学生:SELECT * from student WHERE height>170;


20210720115355843.png

查询体重小于等于70的学生:SELECT * from student WHERE weight<=70;

20210720115444869.png


查询不在“三班”的学生:SELECT * from student WHERE class_id!=3;

20210720115535402.png

2.逻辑运算符


  1. and
  2. or
  3. not
    查询性别为女且身高大于170的女生:SELECT * from student WHERE gender='female' and height>170;


20210720115759552.png

查询性别为男或者体重小于70的学生:SELECT * from student WHERE gender='male' or weight<70;

20210720115918686.png


查询不在三班的学生:SELECT * from student WHERE not class_id=3;

20210720120446581.png

3.模糊查询


  1. like
  2. _代表一个任意字符
  3. 代表多个任意字符


查询姓李的学生:SELECT * from student WHERE name like '李%';

20210720120731266.png

查询姓李且名字有三个字的学生:SELECT * from student WHERE name like '李__';

20210720120828813.png


4.集合查询


in,代表是否在这个集合中

查询身高为165,170的学生:SELECT * from student WHERE height in (165,170);

20210720121038527.png

查询身高不为165,170的学生:SELECT * from student WHERE height not in (165,170);

20210720121118650.png


1.5优先级


1.小括号>not>比较运算符>逻辑运算符

2.and>or


五、十个必须掌握的关键字查询


1.BETWEEN


查询两个值之间的数据

语法:select * from 表名 where 字段名 between 值 and 值;

查询体重在65-70的学生:

select * FROM student WHERE weight BETWEEN 65 AND 70;

018a1cbb55568077deba66de4f40e3d1.png


2.AS

为字段名指定别名

语法:select 字段名1 AS 别名,字段名2 AS 别名,.... from 表名

将字段名name改为别名学生名称显示:

select name AS '学生名称' FROM student


b7efbb5c01deff1d288c130869abaab5.png


3.Distinct

查询时忽略重复值

语法:SELECT DISTINCT 字段名 FROM 表名

查询学生所在的班级有哪些:

select DISTINCT class_id FROM student


4e07b9b4e74c20f564d46c7e70804a09.png


4.SUM

求和

语法:select SUM(字段名) from 表名;

查询学生总身高:

select SUM(height) AS '学生总身高' FROM student;


6479babb9dfe091c14b6e3006bfc7b86.png


5.COUNT

返回匹配指定条件的行数。

语法:select COUNT(字段名) from 表名;

查询有多少学生:

select count(*) FROM student;


6d77f17db6ed941d43e61560119efa0f.png


6…AVG

计算平均值

语法:select AVG(字段名) from 表名;

计算学生平均身高:

select AVG(height) AS '学生平均身高' FROM student;


5c75ce630d5758fb6823de7c53405cc0.png


7.GROUP BY


根据一或多个字段对查询结果集进行分组

语法: select 字段名 关键字(字段名) from 表名 group by 字段名;

查询男生、女生各有多少:

SELECT gender,count(id) FROM student GROUP BY gender

5e4089f61603df49fd4e40266a3f6780.png


8.ORDER BY


对结果集进行排序

语法:select 字段名 from 表名 order by 字段名 升/降序关键字;

对学生身高降序排列(由高到矮):

SELECT * FROM student ORDER BY height desc;


2d951c5531658713146f95581223088f.png

对学生体重升序排列(由轻到重):

SELECT * FROM student ORDER BY weight asc;

484a919fd82ab6282495a30f1bb9f339.png


9.limit

返回查询结果的数目

语法:select 字段名 from 表名 limit 开始条数,结尾条数;

返回前三条学生信息:

SELECT * FROM student LIMIT 1,3;

8e40ad8aa5fd0b98c3c24f401e2a1b54.png



10.having


当我们用到聚合函数(sum、count等),又需要筛选条件时,having就派上用场了,因为WHERE是在聚合前筛选记录的,having和group by是组合一起再聚合后使用

语法:没有固定语法

查班级人数大于等于3的班级:

SELECT count(*) FROM student GROUP BY class_id HAVING COUNT(id)>=3;


560f1bcfe0c3615379067a7f42a585b7.png


六、高频面试问题(连接查询、索引、事务)

一、连接查询

1.左连接——LEFT JOIN(需掌握)


说明:返回左表中的所有记录和右表中与连接字段相等的记录,如果右表没有匹配的记录,那么就以空(Null)代替显示

语法:

select 字段 from 左表表名 左表的变量名(自定义) LEFT JOIN 右表表名 右表的变量名(自定义)on 左表变量名.左表字段=右表变量名.右表字段


举例:


1)查询学生及其所在的班级信息:

SELECT * FROM student a LEFT JOIN class b on a.class_id=b.id

结果:

6af6535e51134cd9897b867fb3e02c45.png


2)如果有学生在四班(class_id=4),但在班级表没有四班(id=4),它的查询结果会是怎样的呢?

现在我们插入一名在四班的学生:

INSERT INTO student VALUES (11, '2021-07-26 13:42:35.000000', '刘德华', 4, 'male', 180, 76);

插入后,student表的数据:


0476552e38d3420a8e780996ee4a330a.png


再执行查询学生及其所在的班级信息的sql:

SELECT * FROM student a LEFT JOIN class b on a.class_id=b.id

结果:

f5b3ef2ad68b48fcb9882120b694b4ca.png

新插入名叫“刘德华”的学生的班级信息显示为空了。


所以,左连接就是:返回左表中的所有记录和右表中与连接字段相等的记录,如果右表没有匹配的记录,那么就以空(Null)代替显示。


2.右连接——RIGHT JOIN


说明:与左连接相反:返回右表中的所有记录和左表中与连接字段相等的记录,如果左表没有匹配的记录,那么就以空(Null)代替显示。**


3.内连接——INNER JOIN(需掌握)


说明:只返回两个表都与连接字段相等的记录

举例:

1)还是以查询学生及其所在的班级信息:

SELECT * FROM student a INNER JOIN class b on a.class_id=b.id;


结果:

9c8f30cbf70e4a97a3309b49dca4a944.png

发现名叫“刘德华”的学生没有显示在查询结果中了

而最开始通过左连接的方式查询,会将“刘德华”查询出来,但它对应的班级信息会显示为空:

f5b3ef2ad68b48fcb9882120b694b4ca.png


所以,内连接就是:只返回两个表都与连接字段相等的记录


4.复合条件连接查询——带where条件的连接查询(了解就行)


说明:连接查询还可以与where条件联用


举例:

1)查询性别为男的学生及其所在的班级信息:

SELECT * FROM student a LEFT JOIN class b on a.class_id=b.id WHERE a.gender='male';


结果:

47cabb4d6a6e497e9071e8a58c2c2015.png


二、索引

说明:实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

面试会经常问你数据库索引是什么?

答:索引类似于一本书前面的目录,能够提高检索效率从而提升性能。


作为测试我们一般有如此回答就够了,但有一些比较高级测试岗位或面试官问的比较多的时候,还会问索引的优缺点是什么:

答:

优点:

1.大大加快数据的检索速度,这也是创建索引的最主要的原因

2.加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

3.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。


缺点:

1.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大

2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。


我们还需要掌握一些索引知识:


索引常用哪几种类型:

1.普通索引:仅快速查询

b5fa15b7d2634ca18b3964477eb71de6.png

2.唯一索引:加速查询+列值唯一(可以有null)

9baa61f90d5646d4ba7b0f6a465b8011.png


3.主键索引:加速查询+列值唯一(不可以有null)+表中只有一个

6675dc8e39fc4bab9b0254af4091ce19.png


4.全文索引:对本文的内容进行分词,进行搜索

9a0f00338713494f896e23f585a80386.png


三、事务

对于测试而言,事务只需要知道它是用来保证数据库一致性这个概念就足够了


下面再对事务的特点简单介绍一下:


1.在 MySQL 中只有使用了 Innodb 数据库引擎的库或表才能够使用事务!

2.事务能够用来维护数据库的完整性,保证 SQL 语句要么全执行,要么都不执行,举个简单的例子:

去ATM机取钱,如果这个时候发现余额扣款了。但未出钞!事务会进行回滚将你的银行卡余额重新变回去。


3.事务用来管理 insert,update,delete 语句。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
架构师 数据库
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
|
1月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
29 1
|
3月前
|
存储 关系型数据库 MySQL
【Java面试题汇总】MySQL数据库篇(2023版)
聚簇索引和非聚簇索引、索引的底层数据结构、B树和B+树、MySQL为什么不用红黑树而用B+树、数据库引擎有哪些、InnoDB的MVCC、乐观锁和悲观锁、ACID、事务隔离级别、MySQL主从同步、MySQL调优
【Java面试题汇总】MySQL数据库篇(2023版)
|
2月前
|
NoSQL 测试技术 Redis
第一次面试总结 - 迈瑞医疗 - 软件测试
本文是作者对迈瑞医疗软件测试岗位的第一次面试总结,面试结果非常好,但面试过程中没有提问太多技术性问题,主要围绕个人介绍、互相了解、个人规划和项目亮点进行,因此作者认为这次面经的学习意义不大。作者还提到了实习岗位的待遇和工作内容,以及对不同阶段求职者的建议。
54 2
|
3月前
|
JavaScript 前端开发 数据库
测试开发之路--Flask 之旅 (三):数据库
本文介绍了在 Flask 应用中实现权限管理的过程,包括使用 Flask-SQLAlchemy、Flask-MySQLdb、Flask-Security 和 Flask-Login 等扩展模块进行数据库配置与用户权限设置。首先创建数据库并定义用户、环境和角色模型,接着通过 Flask-Security 初始化用户和角色,并展示了如何便捷地管理权限。后续将深入探讨权限控制的具体应用。
82 4
测试开发之路--Flask 之旅 (三):数据库
|
3月前
|
关系型数据库 MySQL 数据库
6-2|测试连接数据库的命令
6-2|测试连接数据库的命令
|
3月前
|
关系型数据库 MySQL 测试技术
《性能测试》读书笔记_数据库优化
《性能测试》读书笔记_数据库优化
35 7
|
4月前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
4月前
|
SQL 安全 测试技术
[go 面试] 接口测试的方法与技巧
[go 面试] 接口测试的方法与技巧
下一篇
DataWorks