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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 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 语句。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
29天前
|
SQL 分布式计算 监控
Sqoop数据迁移工具使用与优化技巧:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入解析Sqoop的使用、优化及面试策略。内容涵盖Sqoop基础,包括安装配置、命令行操作、与Hadoop生态集成和连接器配置。讨论数据迁移优化技巧,如数据切分、压缩编码、转换过滤及性能监控。此外,还涉及面试中对Sqoop与其他ETL工具的对比、实际项目挑战及未来发展趋势的讨论。通过代码示例展示了从MySQL到HDFS的数据迁移。本文旨在帮助读者在面试中展现Sqoop技术实力。
66 2
|
29天前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
123 2
|
29天前
|
XML 分布式计算 监控
Oozie工作流管理系统设计与实践:面试经验与必备知识点解析
【4月更文挑战第9天】本文详述了Oozie工作流管理系统的核心概念,包括安装配置、Workflow XML、Action、Coordinator和Bundle XML定义。此外,讨论了工作流设计实践,如监控调试、自动化运维,并对比了Oozie与其他工作流工具的差异。文中还分享了面试经验及解决实际项目挑战的方法,同时展望了Oozie的未来发展趋势。通过学习,读者能提升Oozie技术能力,为面试做好充分准备。
32 0
|
3天前
|
监控 Java 数据库连接
总结Spring Boot面试知识点
Spring Boot是一个基于Spring框架的开源项目,它简化了Spring应用的初始搭建以及开发过程。通过提供“约定优于配置”的方式,Spring Boot可以帮助开发者快速构建出生产级别的Spring应用。
11 0
|
10天前
|
存储 大数据 测试技术
矢量数据库的性能测试与评估方法
【4月更文挑战第30天】本文探讨了矢量数据库的性能测试与评估方法,强调其在大数据和AI时代的重要性。文中介绍了负载测试、压力测试、容量测试、功能测试和稳定性测试五大评估方法,以及实施步骤,包括确定测试目标、设计用例、准备环境、执行测试和分析结果。这些方法有助于确保数据库的稳定性和高效性,推动技术发展。
|
16天前
|
SQL 关系型数据库 MySQL
stream-query多数据库进行CI测试
stream-query多数据库进行CI测试
15 0
|
18天前
|
前端开发 测试技术 C++
Python自动化测试面试:unittest、pytest与Selenium详解
【4月更文挑战第19天】本文聚焦Python自动化测试面试,重点讨论unittest、pytest和Selenium三大框架。unittest涉及断言、TestSuite和覆盖率报告;易错点包括测试代码冗余和异常处理。pytest涵盖fixtures、参数化测试和插件系统,要注意避免过度依赖unittest特性。Selenium的核心是WebDriver操作、等待策略和测试报告生成,强调智能等待和元素定位策略。掌握这些关键点将有助于提升面试表现。
25 0
|
21天前
|
数据可视化 Python
Python模型评估与选择:面试必备知识点
【4月更文挑战第17天】本文深入探讨了Python模型评估与选择在面试中的关键点,包括性能度量、过拟合与欠拟合识别、模型比较与选择、模型融合和偏差-方差权衡。强调了避免混淆评估指标、忽视模型验证和盲目追求高复杂度模型的常见错误,并提供相关代码示例,如交叉验证、网格搜索和超参数调优。通过理解这些概念和技巧,可在面试中展示出色的数据科学能力。
33 12
|
21天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
310 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
21天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
33 6

热门文章

最新文章