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


一、前言

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

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

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

【Python测试交流群:8140 78962】


二、前期准备

1.安装Navicat Mysql或navicat Premium
2.安装mysql(若有公司测试服务器地址可以不安装直连测试数据库即可)
3.打开navicat连接mysql服务
在这里插入图片描述


在这里插入图片描述


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


5.我们需要准备一些班级数据和学生数据,在创建的数据库中新建一个查询
在这里插入图片描述


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.按图中操作
在这里插入图片描述


8.点击目录的表名可查看到创建的数据在这里插入图片描述


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

在这里插入图片描述


刚插入的数据
在这里插入图片描述


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;

它会把班级表的所有数据都删除掉
在这里插入图片描述
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;

在这里插入图片描述
4.2 如果想查学生的全部信息那sql字段名处可以用*号代替

SELECT * from student;

查询结果
在这里插入图片描述
4.3只想查性别为男的学生信息,可以这样写

SELECT * from student where gender='male';

查询结果
在这里插入图片描述
4.4 查询姓张的女同学

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

查询结果
在这里插入图片描述


四、条件查询讲解

查询符合设定条件的数据
语法:select * from 表名 where 条件;

1.比较运算符

  1. 等于=
  2. 小于<
  3. 大于>
  4. 大于等于>=
  5. 小于等于<=
  6. 不等于!=或者<>

查询身高大于170的学生:SELECT * from student WHERE height>170;
在这里插入图片描述
查询体重小于等于70的学生:SELECT * from student WHERE weight<=70;
在这里插入图片描述
查询不在“三班”的学生:SELECT * from student WHERE class_id!=3;
在这里插入图片描述
2.逻辑运算符

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

在这里插入图片描述

查询性别为男或者体重小于70的学生:SELECT * from student WHERE gender='male' or weight<70;
在这里插入图片描述

查询不在三班的学生:SELECT * from student WHERE not class_id=3;
在这里插入图片描述
3.模糊查询

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

查询姓李的学生:SELECT * from student WHERE name like '李%';
在这里插入图片描述
查询姓李且名字有三个字的学生:SELECT * from student WHERE name like '李__';
在这里插入图片描述
4.集合查询

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

查询身高为165,170的学生:SELECT * from student WHERE height in (165,170);
在这里插入图片描述
查询身高不为165,170的学生:SELECT * from student WHERE height not in (165,170);
在这里插入图片描述
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;
在这里插入图片描述


2.AS

为字段名指定别名
语法:select 字段名1 AS 别名,字段名2 AS 别名,.... from 表名
将字段名name改为别名学生名称显示:
select name AS '学生名称' FROM student
在这里插入图片描述


3.Distinct

查询时忽略重复值
语法:SELECT DISTINCT 字段名 FROM 表名
查询学生所在的班级有哪些:
select DISTINCT class_id FROM student
在这里插入图片描述


4.SUM

求和
语法:select SUM(字段名) from 表名;
查询学生总身高:
select SUM(height) AS '学生总身高' FROM student;
在这里插入图片描述


5.COUNT

返回匹配指定条件的行数。
语法:select COUNT(字段名) from 表名;
查询有多少学生:
select count(*) FROM student;
在这里插入图片描述


6…AVG

计算平均值
语法:select AVG(字段名) from 表名;
计算学生平均身高:
select AVG(height) AS '学生平均身高' FROM student;
在这里插入图片描述


7.GROUP BY

根据一或多个字段对查询结果集进行分组
语法: select 字段名 关键字(字段名) from 表名 group by 字段名;
查询男生、女生各有多少:
SELECT gender,count(id) FROM student GROUP BY gender
在这里插入图片描述


8.ORDER BY

对结果集进行排序
语法:select 字段名 from 表名 order by 字段名 升/降序关键字;
对学生身高降序排列(由高到矮):
SELECT * FROM student ORDER BY height desc;
在这里插入图片描述
对学生体重升序排列(由轻到重):
SELECT * FROM student ORDER BY weight asc;
在这里插入图片描述


9.limit

返回查询结果的数目
语法:select 字段名 from 表名 limit 开始条数,结尾条数;
返回前三条学生信息:
SELECT * FROM student LIMIT 1,3;
在这里插入图片描述


10.having

当我们用到聚合函数(sum、count等),又需要筛选条件时,having就派上用场了,因为WHERE是在聚合前筛选记录的,having和group by是组合一起再聚合后使用
语法:没有固定语法
查班级人数大于等于3的班级:
SELECT count(*) FROM student GROUP BY class_id HAVING COUNT(id)>=3;
在这里插入图片描述


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

一、连接查询

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

说明:返回左表中的所有记录和右表中与连接字段相等的记录,如果右表没有匹配的记录,那么就以空(Null)代替显示
语法:
select 字段 from 左表表名 左表的变量名(自定义) LEFT JOIN 右表表名 右表的变量名(自定义)on 左表变量名.左表字段=右表变量名.右表字段

举例:

1)查询学生及其所在的班级信息:
SELECT * FROM student a LEFT JOIN class b on a.class_id=b.id
结果:在这里插入图片描述
2)如果有学生在四班(class_id=4),但在班级表没有四班(id=4),它的查询结果会是怎样的呢?
现在我们插入一名在四班的学生:
INSERT INTO student VALUES (11, '2021-07-26 13:42:35.000000', '刘德华', 4, 'male', 180, 76);
插入后,student表的数据:
在这里插入图片描述
再执行查询学生及其所在的班级信息的sql:
SELECT * FROM student a LEFT JOIN class b on a.class_id=b.id
结果:
在这里插入图片描述
新插入名叫“刘德华”的学生的班级信息显示为空了。

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

2.右连接——RIGHT JOIN

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

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

说明:只返回两个表都与连接字段相等的记录
举例:
1)还是以查询学生及其所在的班级信息:
SELECT * FROM student a INNER JOIN class b on a.class_id=b.id;

结果:
在这里插入图片描述
发现名叫“刘德华”的学生没有显示在查询结果中了
而最开始通过左连接的方式查询,会将“刘德华”查询出来,但它对应的班级信息会显示为空:
在这里插入图片描述
所以,内连接就是:只返回两个表都与连接字段相等的记录

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

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

举例:
1)查询性别为男的学生及其所在的班级信息:
SELECT * FROM student a LEFT JOIN class b on a.class_id=b.id WHERE a.gender='male';

结果:
在这里插入图片描述


二、索引

说明:实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
面试会经常问你数据库索引是什么?
答:索引类似于一本书前面的目录,能够提高检索效率从而提升性能。

作为测试我们一般有如此回答就够了,但有一些比较高级测试岗位或面试官问的比较多的时候,还会问索引的优缺点是什么:
答:
优点:
1.大大加快数据的检索速度,这也是创建索引的最主要的原因
2.加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
3.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

缺点:
1.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

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

索引常用哪几种类型:
1.普通索引:仅快速查询
在这里插入图片描述


2.唯一索引:加速查询+列值唯一(可以有null)
在这里插入图片描述


3.主键索引:加速查询+列值唯一(不可以有null)+表中只有一个
在这里插入图片描述


4.全文索引:对本文的内容进行分词,进行搜索
在这里插入图片描述


三、事务

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

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

1.在 MySQL 中只有使用了 Innodb 数据库引擎的库或表才能够使用事务!
2.事务能够用来维护数据库的完整性,保证 SQL 语句要么全执行,要么都不执行,举个简单的例子:
去ATM机取钱,如果这个时候发现余额扣款了。但未出钞!事务会进行回滚将你的银行卡余额重新变回去。

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


七、总结

作为测试,掌握这些的数据库知识已经足够应付日常工作和绝大部分面试了

分享暂时到这里,小伙伴们点赞、收藏、评论是对我最大的支持!!


往期博文

元组不可变,你真的确定吗?有了列表,元组存在的意义又是什么?【一文搞懂】

Python通过字符串来执行函数甚至代码!这么顶的操作快来了解下!

Pycharm用着卡还收费!何不试试VSCode!一文学会VSCode使用python

  • 109
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 104
    评论
评论 104
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曲鸟

不要打赏,没必要!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值