软件测试面试数据库真题-part 1

1、什么是数据库?

  • 参考回答:数据库是“按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

2、什么是关系型数据库?

  • 官方定义:关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的[数据组织。

  • 参考回答:我了解到数据库其实是分关系型和非关系型数据库的,非关系型数据有MongoDB,Google的BigTable等,然后关系型数据是我们工作中更多遇到的数据库,例如Mysql、Oracle、Sql Server那些,它们是以行、列的形式,更人性化的,更易于理解的方式存储数据,这些行和列组成表,然后表组成库,人们可以使用结构化查询语言SQL对它们进行查询、增删改等操作。

3、主键,外键,索引分别是什么?

  • 主键:若某一个属性组(注意是组)能唯一标识一条记录,该属性组就是一个主键。主键不能重复且只能有一个,也不允许为空。定义主键主要是为了维护关系数据库的完整性。

  • 外键:外键用于与另一张表的关联,是能确定另一张表记录的字段。外键是另一个表的主键,可以重复,可以有多个,也可以是空值。定义外键主要是为了保持数据的一致性。

  • 索引:索引是对表中一个或多个列的值进行排序的结构,优点是加快对数据的检索,缺点是减慢数据录入的速度和增加数据库的空间大小

    • 哪些列适合创建索引

      • 经常需要搜索的列,创建索引可以加快搜索的速度

      • 作为主键的列,创建索引以强制唯一性

      • 经常用来作连接查询的列,比如说外键,创建索引可以加快连接的速度

      • 经常需要根据范围进行搜索的列,和经常需要排序的列,加上索引,它是已经排序的,则这些列被排序了,指定范围搜索的列,也是按顺序显示的,查询速度也会加快

      • 经常使用在where子句中的列,创建索引可以加快条件的判断速度

    • 哪些列不适合创建索引

      • 查询中很少被用上的列,最好不要加索引,否则不但不能起到加快查询速度的作用,返面降低系统维护速度,增大空间需求

      • 列的值数据很少,比如说性别,就只有男女两种,没必要加索引

      • 修改性能要大于检索性能时,不要创建索引,它们是互相矛盾的,增加索引会提高检索性能,降低修改性能

4、Oracle、MySQL、SQL Server各自有什么特点?

首先它们都是关系型数据库

  • Oracle:甲骨文公司开发、跨平台,安全稳定,结构复杂,对管理员要求高,常用于金融、电信领域。对sql语句更稳重传统,提交数据需要手动commit,并且保存数据更持久 。

  • MySql:瑞典MYSQLAB推出,开源免费,体积小,速度快,适用于WEB网站、日志管理、数据仓库和嵌入式系统等小型系统,对sql语句更灵活,提交数据是默认自动提交的,但是数据库重启更新就会丢失数据。

  • SQL Server:微软Microsoft推出,可视化、安全性与稳定性较好,适用于企业级海量数据存储查询。提交数据默认为自动提交,可以设置为手动,从2014之后,也拥有了完全持久和延迟持久特性。

5、什么是SQL?SQL语句有哪些分类?

  • 官方定义:结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和[程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

  • 参考回答:按我的理解,SQL是结构化查询语言的简称,虽然称为查询语句,但其实它还包含对基本表和视图的数据插入、删除和修改的操纵功能,然后具有很强的数据查询功能。它具有数据定义、数据操作和数据控制三种功能,包含六个部份:数据查询语言、数据操作语言、事务控制语言、数据控制语言、数据定义语言和指针控制语言。

  • SQL语句分类和举例:

    • 数据查询语言:select、where、order by、group by、having等。

    • 数据操作语言:insert、update、delete等

    • 事务控制语言:commit、savepoint(保存点)、rollback(回滚)等

    • 数据控制语言:grant(授权)、revoke(回收权利)等控制权限命令

    • 数据库定义语言:create、drop、alter等

    • 指针控制语言:declare cursor、fetch into、update where current等用于对一个或多个表单独行的操作

6、MySQL有哪些常用的数据类型?

实际上,软件测试人员不经常去定义数据类型,这是开发的工作,但是最好要看懂。

8、请写出查询表的基本语法

  • 官方定义:MySQL包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。

  • 具体的大小和范围:

    7、什么是数据库中的约束?

  • 参考回答: 数据库约束是对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。

    约束通常与一个表相关联,并使用CREATE CONSTRAINT或CREATE ASSERTIONSQL语句创建。

    所有的关系数据库都支持对数据表使用约束,通过约束可以更好地保证数据表里数据的完整性。 约束是表上强制执行的校验规则,除此之外,当表中数据存在相互依赖性时,可以保护相关数据不被删除。

    约束通常无法修改。

  • 数据库中的五大约束:

    • 主关键字约束

      • 指定表的一列或几列的组合的值在表中具有惟一性,即能惟一地指定一行记录。

      • 每个表中只能有一列被指定为主关键字,且IMAGE 和TEXT 类型的列不能被指定为主关键字,也不允许指定主关键字列有NULL 属性。

    • 外关键字约束

      • 定义了表之间的关系。当一个表中的一个列或多个列的组合和其它表中的主关键字定义相同时,就可以将这些列或列的组合定义为外关键字,并设定它是和哪个表中哪些列相关联。

    • 唯一性约束

      • 惟一性约束指定一个或多个列的组合的值具有唯一性,以防止在列中输入重复的值。唯一性约束指定的列可以有NULL 属性。由于主关键字值是具有唯一性的,因此主关键字列不能再设定唯一性约束。唯一性约束最多由16 个列组成。

    • 检查约束

      • 检查约束对输入列或整个表中的值设置检查条件,以限制输入值,保证数据库的数据完整性。可以对每个列设置复合检查。

    • 缺省约束

      • 缺省约束通过定义列的缺省值或使用数据库的缺省值对象绑定表的列,来指定列的缺省值。SQL Server 推荐使用缺省约束,而不使用定义缺省值的方式来指定列的缺省值。

  • 最基本查询语句:

    select <列名1>,<列名2>... from <表名>;

  • 带条件的查询语句:

    select <列名1>,<列名2>... from <表名> where 条件;

  • 举例:以成绩表为例

1)查询成绩表scores里的姓名和成绩

select stuName as 姓名,stuScore as 成绩 from scores;  --as是起别名,为了可读性强,如果不需要,则只需要select stuName,stuScore from scores;
 
 

2)查询scores表全部列

select  *  from scores;

 

  • 3)查询(scores表)时删除重复的数据,比如按分数据查询,删除重复数据,将会将两个88去重

select distinct stuScore from scores;

 

4)条件查询(scores表),例如:查出分数大于90,或者名字包含“广”字的学生成绩

select * from scores where stuScore >= 90 or stuName like '%广%';

这里的条件,需要用上比较运算符、逻辑运算符和字符串模糊查询

综上所述,参考回答:查询语句最基本的语法就是select * from 表名,如果列名不多,也没有特殊要求时,我一般都是直接 用号查出所有的。如果列名特别多,然后我只需要查其中几列数据时,则会将 * 号替换成对应的列表,如果列表单词意义不太明显时,我还会用上as关键字来做别名,查出来的数据一目了然。然后如果需求是查更具体的符合某个条件的数据,我会在后面加上where关键字,再带上需要的条件,比如说查一个学生成绩表,需要查及格以上的学生成绩,就是select * from 成绩表 where 分数>=60,根据不同的需求,可能会用上算术运算符、比较运算符、逻辑运行符、字符串模糊查询等。

9、什么是子查询?子查询有哪些分类?

  • 参考回答:子查询就是将一个查询(子查询)的结果作为另一个查询(主查询)的数据来源或判断条件的查询。常见的子查询有WHERE子查询,HAVING子查询,FROM子查询,SELECT子查询,EXISTS子查询,子查询要使用小括号();

  • where 子查询

    • 在where子句里再包含一层查询,例如:查询分数比平均分低的学生信息(scores表)

select * from scores where stuScore < (select avg(stuScore) from scores);

 

having子查询

HAVING子句是对分组统计函数进行过滤的子句,也可以在HAVING子句中使用子查询,例如:查询平均分最高的学生及其平均分数(scores2表)

select stuName,score_avg from socres2 group by stuName having score_avg = (select max(score_avg) from socres2);

 

from子查询

FROM子查询就是将一个查询结构(一般多行多列)作为主查询的数据源,例如:查询平均分数高于90的学生以及该学生的平均成绩

select stuName,score_avg from (select stuName,score_avg from socres2 group by stuName) stu_score where stu_score.score_avg>90; 

select子查询

  • SELECT子查询在SELECT子句中使用查询的结果(一般会和dual空表一起使用),例如:平均分及格以上的学生占总学生的比例

select (select count(*) from socres2 where score_avg>=60)/(select count(*) from socres2) as 比例 from dual;

 

exisit子查询

将主查询的数据带到子查询中验证,如果成功则返回true,否则返false。主查询接收true就会显示符合条件的全部数据,false就什么都不显示。比如:以“如果存在不及格的学生”为条件查询信息

select * from socres2 where exists (select * from socres2 where score_avg < 60)

 

猜你喜欢

转载自blog.csdn.net/shuirongwu/article/details/130235285