2024软件测试面试题-mysql

730 篇文章 5 订阅
234 篇文章 0 订阅

1.mysql中的group by和order by区别?

order by作用就是排序,desc降序,osc升序,默认升序,order by 后面必须列出排序的字段名,跟多个字段名时,排序按就近原则依次而来。
group by作用就是聚合分组,值相等即为一组

2.mysql中的where和having有什么区别?

功能上where和having都是做查询过滤
区别:
(1)执行顺序不同:where是在分组前对数据进行过滤,而having通常是对分组以后的数据进行筛选,所以一般都是在使用order by 或者聚合函数后使用
(2)where后的条件表达式里不允许使用聚合函数,而having可以

3.如何使用group by和having子句来对查询结果进行分组和过滤?

例:查询每个部门的平均工资大于5000的部门
Select deparment,AVG(salary) from table1 group by deparment having AVG(salary)>5000;

4.数据库中的左连接、右连接和内连接有什么区别?

(1)语法不同:
内连接关键字为inner join,左连接关键字为left join,右连接关键字为right join
(2)基础表不同:
左连接是以左边表中的数据为基准
右连接是以右边表中的数据为基准
(3)结果集不同:
内连接是把两个表中匹配的关联数据显示出来,不匹配不返回显示;
左连接是以左表中的数据为基准,右表如果有和左表条件相符的数据就查找出来,如果条件不相符就用Null显示;
右连接是以右表中的数据为基准,左表如果有和右表条件相符的数据就查找出来,如果条件不相符就用Null显示;
简而言之,左连接以左表为主,右连接以右表为主。左连接显示左表中的所有记录,右连接显示右表中的所有记录,如果连接条件不满足,则以null值填充。

5.如何使用join操作连接多个表?

例:使用inner join查询两个表的交集
Select * from table1 inner join table2 on table1.column=table2.column;

6.Sql两张表关联取价格前10的数据?

首先从table2中选择价格最高的前10条记录,然后将这些记录与table1进行关联,以获取更多的详细信息。
Select t1.*, t2.price from table1 t1 join(select id,price from table2 order by price DESC limit 10) t2 on t1.id=t2.id;

7.如何使用union操作合并多个查询结果?

使用union操作可以合并多个查询结果,结果集中不包括重复的记录。
例:Selectfrom table1 union selectfrom table2;

8.Union 和 Union all有什么区别?

(1)返回的结果集不同:
Union:union 在进行表连接后会筛选掉重复的记录,所以在表连接后对所产生的结果集进行筛选运算,删除重复的记录再返回结果集
Union all:union 只是简单的将两个结果合并就返回。如果返回的结果集中有重复的数据,那么返回的结果集中就包含重复的数据。
(2)性能不同:
union all 要比 union 快很多,因为他没有排序去重的耗时
ps:使用 union 和 union all 时一定要保证查询的列一致,即select 后的参数名一致

9.JOIN和UNION的区别是什么?

JOIN是一个用于连接两个或多个表的SQL子句。它允许使用来自所有连接表的数据。换句话说,来自所有表的列被显示在彼此的旁边,这意味着数据是水平堆叠的。
UNION是一个集合运算符,用于合并两个或多个SELECT语句的结果。数据是垂直堆叠的。使用UNION的要求之一是在所有联合的SELECT语句中必须有相同数量的列。另外,所有选择的列必须是相同的数据类型。

10.你说下数据库查询中,count(*) 和 count(1) 和 count(列名)的区别?

数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT;
COUNT(1) 和 COUNT()表示的是直接查询符合条件的数据库表的行。而COUNT(列名)表示的是查询符合条件的列的值不为NULL的行数,因此它的统计结果可能会小于表中的总行数。
对于COUNT(1)和COUNT(
),MySQL的查询效率是完全一样的,建议用哪个呢?建议使用COUNT()!因为COUNT()是SQL92定义的标准统计行数的语法。
在实际应用中,可以根据具体的需求来选择使用哪种方式:
如果只需要统计行数,建议使用count(*);如果需要统计某一列非NULL值的数量,可以使用count(列名);而如果需要统计某一列中某个特定值的数量,可以使用count(列名)或者使用其他更加复杂的查询语句。

11.写一个查询,找出按艺术家分类的歌曲数量(使用 LEFT JOIN 和 COUNT())

Select a.id,artname,count(song) as songnumber from a left jion b on a.id=b.artid group by a.id,artname order by a.id;

12.SQL的书写顺序是什么?执行顺序是什么?

书写顺序:
​ select->distinct->from->join->on->where->group by->having->order by->limit
执行顺序
from->on->join->where->group by(开始使用select中的别名,后面的语句中都可以使用别名)->sum、count、max、avg->having->select->distinct->order by->limit

13.DISTINCT的作用是什么?

DISTINCT的目的是去除重复的值,即在你的查询输出中显示唯一的值。
例:Select DISTINCT name from table1 order by name;
如果在聚合函数中使用DISTINCT,你的查询将消除重复的聚合结果。

14.下面这条sql语句如何优化DISTINCT?

比如优化Select DISTINCT t1.a from t1,t2 where t1.a=t2.b ??

在数据量比较大的时候,使用DISTINCT函数加索引列,会使索引失效,并扫描全表;
这个时候,应该将DISTINCT在所有列,都转换为group by,例:
Select t1.a from t1,t2 where t1.a=t2.b group by t1.a;

15.数据库索引知道么简单说一下?

索引是一种使记录有序化的技术,它可以指定按某列/某几列预先排序,从而大大提高查询速度。
索引的主要作用是加快数据查找速度,提高数据库的性能。没有索引的话就只能全局扫描。通俗理解,数据库索引就是现实生活中字典的索引。
索引的缺点:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。
索引的建立原则:在最频繁使用的、用以缩小查询范围的字段上建立索引;
在频繁使用的、需要排序的字段上建立索引。

16.平常测试中使用数据库的场景有哪些?

(1)查看存入数据库的数据是否符合预期
(2)修改数据库中的测试数据,来验证一些测试用例
(3)构造测试数据

17.常见的聚合函数有哪些?

常用5种聚合函数,分别是求和函数SUM()、求平均函数AVG()、最大 值函数MAX()、最小值函数MIN()和计数函数COUNT。
COUNT()函数:统计数据表中包含的记录行的总数,或者根据查询结果返回列中包含的数据行数。
COUNT(*)计算表中总的行数,不管某列是否有数值或者为空值。
COUNT(字段名)计算指定列下总的行数,计算时将忽略空值的行。
AVG()函数:通过计算返回的行数和每一行数据的和,求得指定列数据的平均值。SUM()函数:是一个求总和的函数,返回指定列值的总和。
MAX()函数:返回指定列中的最大值,不仅适用于查找数值类型,也可应用于字符类型。
MIN()函数:返回查询列中的最小值,不仅适用于查找数值类型,也可应用于字符类型。

18.drop、delete、truncate三者的区别?

在数据库的使用中,常见的删除方式有三种:delete、drop、truncate。
定义:
Delete语句用于删除表中的一条或多条记录。格式:DELETE FROM table_name WHERE condition。
Drop用于删除整张表;格式:DROP TABLE table_name。
Truncate命令用于删除表中的所有数据,格式:TRUNCATE TABLE table_name。
区别:
(1)数据库语言不同
drop和truncate是DDL(数据库定义语言)语句,Delete是DML(数据库操作语言)语句。
(2)使用场景不同
Delete一般用于删除表中的特定数据;Drop用于删除整张表;而Truncate用于清空表中的数据。
总的来说,delete、truncate仅仅删除表里面的数据;drop会把表的结构也删除掉。
(3)执行速度不同
Delete需要手动提交(commit)操作才生效,可以进行回滚;
Truncate会隐式提交,不需要commit提交,不会记录日志,所以执行速度很快,不能回滚,不会触发触发器;
Drop不需要commit提交,所以执行速度很快,不能回滚,不会触发触发器;
总的来说,执行速度drop > truncate > delete
(4)空间回收情况不同
Truncate会将数据所占用的空间返还(即恢复到初始大小);Delete不会返回数据所占用的空间;Drop将数据所占用的空间全部释放掉;
(5)应用范围不同
Truncate只能对table;Delete可以是table和view;Drop可以删除表、视图、索引、过程、函数等;

19.主键、外键和索引的区别?

(1)定义:
主键——唯一标识一条记录,不能有重复的,不允许为空
外键——表的外键是另一表的主键, 外键可以有重复的, 可以是空值
索引——该字段没有重复值,但可以有一个空值
(2)作用:
主键——用来保证数据完整性
外键——用来和其他表建立联系用的
索引——是提高查询排序的速度
(3)个数:
主键—— 主键只能有一个
外键—— 一个表可以有多个外键
索引—— 一个表可以有多个唯一索引

20.SQL语言包括哪几部分?每部分都有哪些操作关键字?

SQL 语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL) 四个部分。
数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index 等
数据操纵:Select ,insert,update,delete,
数据控制:grant,revoke
数据查询:select

21.SQL注入漏洞产生的原因?如何防止?

SQL 注入产生的原因:程序开发过程中不注意规范书写 sql 语句和对特殊字符进行过滤,导致客户端可以通过全局变量 POST 和 GET 提交一些 sql 语句正常执行。
防止 SQL 注入的方式:
开启配置文件中的 magic_quotes_gpc 和 magic_quotes_runtime 设置
执行 sql 语句时使用 addslashes 进行 sql 语句转换
Sql 语句书写尽量不要省略双引号和单引号。
过滤掉 sql 语句中的一些关键词:update、insert、delete、select、 * 。
提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。

22.说说对SQL语句优化有哪些方法?(选择几条即可)

(1)Where 子句中:where 表之间的连接必须写在其他 Where 条件之前,那些可以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING 最后。
(2)用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN。
(3) 避免在索引列上使用计算
(4)避免在索引列上使用 IS NULL 和 IS NOT NULL
(5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
(6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
(7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

23.MySQL事务是什么?它是如何使用的?

事务是数据库中一个最小的不可再分的工作单元,里面的内容要么全部执行成功,要么全部失败回滚,不可能存在部分执行成功而部分执行不成功的情况。
事务主要是为了保证复杂数据库操作数据的可靠性、一致性,尤其是在并发访问数据时。主要用于处理操作量大,复杂度高的数据。例如银行转账时,从一方账户减少100元同时另一方账户应该增加100元,如果一环出现问题则整个事务就需要回滚,让这些操作恢复成之前的样子,以保证数据的一致性。

24.MySQL存储过程是什么?有什么优缺点?

存储过程是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。其实思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
优点:使用存储过程的三个主要好处:简单、安全、高性能
(1)存储过程通过把处理封装在一个易用的单元中,可以简化复杂的操作;
(2)存储过程由于不需要反复建立一系列处理步骤,所有开发和应用程序都使用同意存储过程,因而保证了数据的一致性,防止错误。
(3)存储过程限制对基础数据的访问,减少数据讹误机会(无意识的货别的原因所导致的),具有安全性。
(4)存储过程通常以编译过的形式存储,所以DBMS处理命令所需的工作量少,提高了性能。
缺点:
(1)存储过程往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
(2)存储过程的编写比基本SQL语句编写复杂,需要更高的技能和经验,为了安全会限制人员对存储过程的创建。

25.什么是trgger触发器?有什么作用?

触发器是一种在数据库中执行自动化操作的工具,是一种特殊类型的存储过程,通过数据库事件来自动触发运行的(如INSERT、UPDATE、DELETE操作),主要是没有人工干预的情况下来完成复杂度高一些的约束条件,从而保证数据库的完整性和一致性。
作用:
数据约束:触发器可以强制执行数据库表的基本约束。如必填字段或唯一值约束等,如果违反他们,触发器会阻止插入、更新或删除操作。
数据校验:触发器可以校验数据是否符合业务规则或限制。例如,当尝试插入一条将来日期时,触发器会触发并阻止该操作。
数据日志:触发器可以字段记录每一条插入、更新或删除操作。这些信息可以用于最近的数据更改历史记录、审计、分析或报告。
数据转换:触发器可以将数据转换成不同的格式或结构。例如,将日期格式从欧洲风格转换成美国风格,或者将数据从一张表插入到另一张表中。
数据集成:触发器可以将不同的数据库或应用程序集成到一起。例如,从一个外部数据源中提取数据并将其插入到数据库表中。
总之,触发器是数据库中非常有用的工具,可以自带化执行各种操作,从而实现数据约束、校验、日志、转换和集成等功能,可以大大提高数据库的可靠性、稳定性和安全性。

26.存储过程和触发器有什么区别?

(1)存储过程必须由用户或应用程序主动发起调用请求才能执行,而触发器是自动执行的;
(2)存储过程可以接受输入参数,而触发器不可以;
(3)存储过程可以返回单个值或多个值,而触发器无法返回值;
(4)存储过程中可以使用事务,而触发器不允许。
综上所述,存储过程和触发器在运行方式、功能、参数使用以及性能方面都有所不同。存储过程需要显式调用并执行,适用于需要执行复杂操作和跨应用程序共享的场景;而触发器则是基于数据库事件自动激活的,适用于自动化数据管理和维护的场景。

27.什么是脏读?怎么解决?

脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的,值得注意的是,脏读一般是针对于update操作的。
解决办法:redo 、 undo日志、锁机制、MVCC等。

28.MySQL与Redis区别是什么?

mysql与redis的区别有:
(1)类型不同:mysql是关系型数据库,而redis是缓存数据库;
(2)作用不同:mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢,而redis用于存储使用较为频繁的数据到缓存中,这样减少访问数据库的次数,提高运行效率。

29.Varchar 和 char 的区别?

(1)char 的长度是不可变的,而varchar的长度是可变的。
如:定义一个 char[10] 和 varchar[10],如果存进去的是“yang”,那么 char 所占的长度依然是10,除了字符“yang”外,后面跟6个空格,varchar 就立马把长度变为4了,取数据的时候,char 类型的要用trim() 去掉多余的空格,而 varchar 是不需要的。
(2)char 的存取速度要比 varchar 快的多,因为其长度固定,方便的程序的存储与查找。
char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,varchar 是以空间效率为首位。
char的存储方式是:对英文字符(ASCII)占用1个字节,对一个汉字占用2个字节。varchar的存储方式是:对每个英文字符占用2个字节,汉字也占用2个字节
ps:不同的编码形式对应的存储方式不一样,例:UTF-8编码:一个英文字符对应一个字节,一个中午(含繁体)占用3个字节
(3)两者的存储数据都非unicode的字符数据。

30.避免死锁的方法有哪些?

在有些情况下死锁是可以避免的,方法有:
(1)加锁顺序
当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。
如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生。
(2)加锁时限
另外一个可以避免死锁的方法是在尝试获取锁的时候加一个超时时间,这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。
若一个线程没有在给定的时限内成功获得所有需要的锁,则会进行回滚并释放所有已经获得的锁,然后等待一段随机的时间再重试。
(3)死锁检测
可以使用一些工具来检测和解决死锁问题,如java探针、Eclipse自带的死锁检测等。

 总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值