一、前言
很多博主总结的数据库知识很全面!
但如果作为测试的话,往往不需要掌握那么多,无论是日常工作还是面试仅需掌握一些基础和常用的点就足够了!
本文主要是针对测试小伙伴总结的精简重点版数据库sql知识点!能够让你花更少的时间致于应付绝大部分面试和工作!
二、前期准备
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.比较运算符
等于=
小于<
大于>
大于等于>=
小于等于<=
不等于!=或者<>
查询身高大于170的学生:SELECT * from student WHERE height>170;
查询体重小于等于70的学生:SELECT * from student WHERE weight<=70;
查询不在“三班”的学生:SELECT * from student WHERE class_id!=3;
2.逻辑运算符
- and
- or
- 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.模糊查询
- like
- _代表一个任意字符
- 代表多个任意字符
查询姓李的学生: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 语句。