目录

  • 一、前言
  • 二、前期准备
  • 三、增删改查数据(下列的Sql无须区分大小写)
  • 四、条件查询讲解
  • 五、十个必须掌握的关键字查询
  • 六、高频面试问题(连接查询、索引、事务)
    • 一、连接查询
    • 二、索引
    • 三、事务
  • 七、总结
    • 往期博文

一、前言

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

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

本文主要是针对测试小伙伴总结的精简重点版数据库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

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

  1. 河海大学数据库知识点归纳整理

    河海大学数据库知识点归纳整理 前言 该文档主要包含了对河海大学数据库这一门课程进行的知识点归纳,并且提供了ppt等其他复习资料. 河海大学许卓明老师数据库期末考点! 1 CH01 CH02 数据模型与 ...

  2. 管理mysql表知识点,数据库知识点整理(全)

    <数据库知识点整理(全)>由会员分享,可在线阅读,更多相关<数据库知识点整理(全)(12页珍藏版)>请在人人文库网上搜索. 1.UNIT 1四个基本概念1.数据(Data):数 ...

  3. mysql数据库建表失败_mysql数据库文件太大导致建表失败,如何避免

    [求助]mysql数据库文件太大导致建表失败,如何处理? 目录下各文件大小如下: root /mbsc/mysql/data # ll total 120646812 -rw-rw---- 1 mys ...

  4. 后端代码之服务端 - MongoDB数据库的连接、重启测试与(Studio3T)查看 - 讲解篇

    文章目录 前言 一. 在项目中安装Mongoose中间件 二. 安装完毕,新建一个路由作为测试路由 通过WebStorm软件,打开项目,编辑index.js文件: 三.重启服务,浏览器查看:测试连接是 ...

  5. MySQL8数据库知识点概述

    MySQL8数据库知识点概述 MySQL数据库简介 一.为什么要学习数据库 二.数据库的相关概念 三.数据库存储数据的特点 表设计三大范式 MySQL数据库简介 MySQL数据库是由瑞典的MySQL ...

  6. Java知识点太多?北大教授点破Java学习秘籍

    知识点太多??? 那是你没有彻底了解Java的学习方法!!! 在Java学习中什么该学什么不该学习,或者学到那为止,又或者学到那里才算完结一个知识点,就像23个设计模式你真的要在初学Java的过程中, ...

  7. 达梦DM8数据库异机数据迁移测试

    达梦 DM8 数据库异机数据迁移测试 一.源库备份 源库DMOA,主机名:dm3   目标库 DMOA 主机名:db 在DMTEST模式里创建了T_EMP01.T_EMP02.T_EMP03.T_TE ...

  8. oracle导入命令,记录一下 数据库日志太大,清理日志文件

    oracle导入命令,记录一下 工作中用到了,这个命令,记录一下,前提要安装imp.exe imp PECARD_HN/PECARD_HN@127.0.0.1:1521/orcl file=E:\wo ...

  9. 数据库知识点总结——转载

    数据库知识点总结归纳 一.基本概念 1.数据 (1)数据的定义:对客观事物的符号表示,如图形符号.数字.字母等,数据是数据库中存储的基本对象. (2)数据的种类:文字.图形.图像.声音 (3)数据的特 ...

最新文章

  1. 数据蒋堂 | 还原分组运算的本意
  2. Server 2012 Hyper-v新功能之一:客户端 Hyper-V
  3. PYTHON __main__
  4. 强化学习(三)用动态规划(DP)求解
  5. go语言 数组 map整体json
  6. 动态改变stage桢数
  7. 【项目管理】三球模型
  8. 拓扑排序:如何确定代码源文件的编译依赖关系
  9. 通过YAJL生成json语句
  10. 容器技术Docker K8s 48 服务网格(ASM)-阿里云服务网格使用
  11. VSCode调试JavaScript代码方法
  12. win2008 php,Windows Server 2008(R2) 一键安装PHP环境(PHP5.3+FastCGI模式)
  13. 基于吸盘的scara机械臂
  14. 英文系统下手工安装五笔86版
  15. mysql 获取农历年份_ASP获取农历日期程序代码
  16. 自建CA 颁发证书
  17. PHP设置谷歌验证器(Google Authenticator)实现操作二步验证
  18. matlab 非a到z,matlab命令及函数A到Z
  19. spark streaming 整合kafka 报错 KafkaConsumer is not safe for multi-threaded access
  20. 没有50W彩礼 女友被强行拽走! Python分析全国彩礼情况,心凉了!

热门文章

  1. 推荐一个免费在线制作gif图片的网站。
  2. ERROR: Cannot install -r requirements.txt (line 2) and tensorflow>=1.14.0 because these package vers
  3. 网站文件上传到服务器怎么不显示,我已经上传文件,为什么还看不到网站首页?...
  4. 电池-外部DC双电源供电设备电源自动切换电路分享(上)
  5. Qui-Pure v2.48主题版本更新日志
  6. 国内源(镜像)安装Homebrew + adb
  7. 【阿朱标红】投资创业型人才 公司从平台化到社会化
  8. spring的depends-on
  9. Yeelink:将复杂的传感器以极简的方式组到同一个网络内
  10. 提升app粉丝活跃度趣谈:app嵌入h5游戏活跃粉丝的优势