数据开发岗位: 面试测试题(2025年)
单选题
1.以下哪种方式只能用于等价连接 (A)
A HASH JOIN
B NESTED LOOPS
C SORT MERGE JOIN
解析:
A 哈希连接
通常只能用于等价连接
它通过在一张表上构建哈希表,然后扫描另一张表并利用哈希值进行匹配,一般是等值条件
B 嵌套循环连接
等价连接和非等价连接均可以. 它通过内外两层循环来匹配两张表的数据, 外层循环读取一张表的每一行,内层循环遍历另一张表进行匹配,连接条件可以是各种比较条件, 包括 等号(此时是等价连接)
C 排列合并连接
2. 下面哪个语句会报错 (A)
A . ALTER SEQUENCE seq1 START WITH 1;
B. ALTER SEQUENCE seq1 NOMINVALUE;
C. ALTER SEQUENCE seq1 NOCACHE;
D. ALTER SEQUENCE seq1 MAXVALUE 90;
解释:
A 在大多数数据库中, 序列(SEQUNECE) 一旦创建, 其起始值不能通过ALTER SEQUENCE修改
B 是设置序列无最小值
C 设置序列不缓存值
D 设置序列的最大值为90
3.表T中,C1列的差异值有100万,C2列的差异值有100. 当查询下面的sql时, 关于索引的说法正确的是 SELECT COUNT(*) FROM T WHERE C1=1 AND C2=2; (B)
A . 索引(C2,C1) 比索引(C1,C2) 效率高
B. 索引(C1,C2) 比索引(C2,C1) 效率高
C. 索引(C1,C2) 和索引(C2,C1) 效率一样高
解析:
4. 下面哪个类型不是oracle支持的内部数据类型
A. FLOAT
B. INTEGER
C. CHAR
D. DATETIME
解析:
A. FLOAT oracle支持的浮点数据类型,用于存储带小数的数值
B. INTEGER oracle 支持的整数数据类型
C. CHAR oracle支持的固定长度字符数据类型
D. DATETIME 在MySQL 和 SQL Server 中是标准数据类型,存储日期和时间,
在MYSQL中的格式为YYYY-MM-DD HH:MM:SS;
ORACLE中存储日期和时间常用的是DATE和TIMESTAMP类型
5.如果只需要存储日期(比如交易日), 以下哪个类型占用的存储空间最小(B)
A. VARCHAR2
B. DATE
C. NUMBER
D. TIMESTAMP
解析:
A. VARCHAR2
-
特点:VARCHAR2 是一种可变长度的字符类型,用于存储字符串。
-
存储空间:VARCHAR2 的存储空间取决于实际存储的字符串长度。如果存储日期(如“2025-03-05”),至少需要占用 10 个字符的空间(每个字符通常占用 1 字节),加上长度信息,实际占用空间可能更大。
B. DATE
-
特点:DATE 是专门用于存储日期和时间的类型,包含年、月、日、时、分、秒。
-
存储空间:在大多数数据库系统中,DATE 类型通常占用 7 字节 的固定空间(具体实现可能因数据库而异,但通常为固定大小)。
C. NUMBER
-
特点:NUMBER 是一种数值类型,用于存储数字。
-
存储空间:NUMBER 的存储空间取决于其精度和范围。如果用 NUMBER 来存储日期(如通过序列化日期为数字),可能需要占用较大的空间(例如,存储年月日为一个数字,如 20250305,可能需要占用 4 字节或更多)。
-
适用性:NUMBER 不适合直接存储日期,因为它无法直接表示日期的结构(如年、月、日)。
D. TIMESTAMP
-
特点:TIMESTAMP 是一种更精确的日期时间类型,包含年、月、日、时、分、秒,以及小数秒(纳秒)。
-
存储空间:TIMESTAMP 通常占用 11 字节 或更多(具体取决于数据库实现),因为它需要存储更精确的时间信息。
-
适用性:虽然可以存储日期,但占用空间比 DATE 类型大,且对于只需要存储日期(如交易日)的场景,精度过高是不必要的。
6. 某会话对T表进行了一个INSERT操作, 但是还没有提交,下面说法正确的是 (D)
A. 其他会话对T表的INSERT操作将会被阻塞,直到该会话提交或回滚
B. 其他会话对T表的SELECT 操作将会被阻塞, 直到该会话提交或回滚
C. 该会话可以查询T表, 但只有提交后才能查到这些新插入的记录
D. 即使未提交, 该会话也可以查询到这些新插入的记录
解释:
A:不正确。其他会话对T表的INSERT操作不会被阻塞,除非数据库系统使用了某种形式的锁机制来管理并发写入,但这与事务是否提交无关。
B:不正确。其他会话对T表的SELECT操作通常不会被阻塞,除非存在锁竞争。在大多数情况下,SELECT操作可以并发执行,除非事务隔离级别设置为可重复读或串行化。
C:不正确。该会话在事务中可以查询到新插入的记录,即使事务尚未提交。这是因为事务内部的操作是可见的。
D :事务的局部性:在一个数据库事务中,一个会话(或事务)对数据的更改对其他会话是不可见的,直到该事务提交。但是,事务内部的操作是可见的,这意味着事务中的操作可以“看到”该事务中之前所做的所有更改。
未提交读(Uncommitted Read):虽然在大多数数据库系统中,未提交的更改对其他事务是不可见的,但在同一事务内部,即使更改尚未提交,事务也可以“看到”这些更改。这是事务隔离级别的一个特性,确保事务内部操作的一致性。
自动提交(Autocommit):在某些数据库系统中,每个单独的SQL语句都被视为一个事务,并且默认情况下是自动提交的。在这种情况下,即使没有显式的提交语句,每个操作也会立即对当前会话可见。
7.Oracle中, 用于PL/SQL程序输出调试信息的内置程序包是(A)
A. DBMS_OUTPUT
B. DBMS_STANDARD
C. DBMS_LOB
D. DBMS_ALERT
解释:
A. DBMS_OUTPUT 通过PUT_LIINE等过程可以把变量值,提示信息等输出到控制台, 方便调试程序
B. DBMS_STANDARD Oracle的系统标准包,定义了一些基本的数据类型,异常信息和子程序等
C. DBMS_LOB 主要用于处理大对象数据类型(如CLOB,BLOB等), 提供了一系列操作大对象数据的函数和过程
D. DBMS_ALERT 用于数据库会话之间进行异步通信和事件通知
8.某个事务由两条语句组成, 第一条语句被成功执行,但是第二条由于违反约束而失败,此时会出现什么情况?(C)
C. 整个事务都会回滚
解释:
事务具有原子性,即事务中的操作要么全部成功提交,要么全部失败回滚. 当一条事务由多条语句组成,只要其中任何一条语句因为违反约束或者是其他原因执行失败, 整个事务就会回滚, 之前成功执行的语句结果也会被撤销, 以保证数据的一致性和完整性
8. 下面哪个赋值语句效率更高(B)
A. SELECT 1 INTO V FROM DUAL;
B. V :=1;
解析:
A. SELECT 1 INTO V FROM DUAL; 是通过SQL查询的方式从dual 表(oracle中的伪表,用于单行单列查询) 中选取值1并赋值给变量V, 这需要进行SQL解析,执行查询等一系列操作
B. V :=1; 是PL/SQL中的直接赋值语句,直接将值1赋值给变量V
9.在Oracle中, 当控制一个显示游标时,下面哪个命令包含INTO子句(C)
A. OPEN
B. CURSOR
C. FETCH
D. CLOSE
解释:
A. OPEN 语句用于打开游标, 语法: OPEN 游标名
B. CURSOR 用于声明游标的关键字
语法: CURSOR 游标名 IS select语句
C. FETCH 语句用于从游标中提取数据, 并把数据存储到变量中,
语法: FETCH 游标名 INTO 变量列表
D. CLOSE 语句用于关闭游标; 语法: CLOSE 游标名
10. Oracle中, 不属于游标属性的是(D)
A. %NOTFOUND
B. %FOUND
C. %ISOPEN
D. %ROWTYPE
解释:
游标的4个属性如下
游标名%ROWCOUNT:返回游标中已处理的行数
游标名%FOUND:是否存在,为true时,表示游标有数据, false表示没有数据
游标名%NOTFOUND:和 FOUND 相反,为 true 表示游标中没有数据,比如用 fetch into 取数据,取完最后一条后,会变为true
游标名%ISOPEN:判断游标是否打开,为true 时,表示游标打开, false表示关闭
%ROWTYPE
用于声明一个记录变量,该变量的字段与表或游标中的列具有相同的名称和数据类型。
用法:
表 %ROWTYPE:用于声明一个变量,其结构与表中的一行完全一致。
DECLARErecord_variable table_name%ROWTYPE;
游标 %ROWTYPE:用于声明一个变量,其结构与游标查询返回的行一致
DECLARECURSOR cursor_name IS SELECT column_list FROM table_name;record_variable cursor_name%ROWTYPE;
11. 按照NAME字段降序排列,写法正确的是(A)
A. ORDER BY NAME DESC
解析:
desc是降序; asc是升序(默认)
多选题
1.下列哪些声明是不合法的 (A)
A. DECLARE v_name, v_dept varchar2(10);
B. DECLARE v_date boolean;
C. DECLARE v_amount number(10, 2) :=5000;
D. DECLARE v_test number(10);
解析:
A. 正确的声明为
DECLARE v_name varchar2(10);
DECLARE v_dept varchar2(10);
B. Oracle数据库中没有 boolean的数据类型; 可以通过 NUMBER(1)
或 CHAR(1)
来模拟布尔值; 但在PL/SQL(Oracle的程序设计语言)中,BOOLEAN
是一个有效的数据类型,用于存储逻辑值(TRUE
或FALSE
)
示例: 在表定义中模拟布尔值
使用NUMBER(1)
CREATE TABLE example (id NUMBER PRIMARY KEY,is_active NUMBER(1) CHECK (is_active IN (0, 1)) -- 0 表示 FALSE,1 表示 TRUE
);
使用CHAR(1)
CREATE TABLE example (id NUMBER PRIMARY KEY,is_active CHAR(1) CHECK (is_active IN ('Y', 'N')) -- 'Y' 表示 TRUE,'N' 表示 FALSE
);
示例 : PL/SQL中使用BOOLEAN
类型
DECLAREis_active BOOLEAN := TRUE;
BEGINIF is_active THENDBMS_OUTPUT.PUT_LINE('Active');ELSEDBMS_OUTPUT.PUT_LINE('Inactive');END IF;
MySQL 提供了 BIT
类型,但也可以使用 TINYINT
来存储布尔值
CREATE TABLE example (id INT PRIMARY KEY,is_active TINYINT(1) DEFAULT 0 -- 0 表示 FALSE,1 表示 TRUE
);
2.以下关于NULL的说法正确的有(A, B, C, D)
A. 索引中不存储索引列全为NULL的记录
B. 所有对NULL进行的算术运算,结果都是NULL
C. count(column) 不包括对NULL的统计,但count(*) 包括对NULL的统计
D. 对字段进行降序排序时,如果不指定NULL的排序规则, 则NULL排在最后
解释:
A. 这是为了节省空间和提高索引效率
D. 在Oracle中,NULL
值被认为是未知的,它既不是大于也不是小于任何其他值,所以在升序排序时,它被认为“小于”任何其他值,而在降序排序时,它被认为“大于”任何其他值
-
**降序排序(
ORDER BY ... DESC
)**时,NULL
值会排在最后。 -
**升序排序(
ORDER BY ... ASC
)**时,NULL
值会排在最前。
3. 以下哪些不是DML (C, D)
A. DELETE
B. INSERT
C. TRUNCATE
D. CREATE
解析:
AB : 删除(delete)和插入行(insert)是DML数据操纵语言
CD: 是DDL数据定义语言; TRUNCATE清空表中所有数据; CREATE创建数据库对象
4.下面哪些语句会隐式提交事务?(A, B)
A. CREATE
B. TRUNCATE
C. UPDATE
D. SELECTE
解析;
某些语句会隐式地提交事务,这意味着它们不仅执行了指定的操作,而且还自动结束了当前的事务,并开始了一个新的事务。
A. CREATE
创建新的数据库对象,如表、索引、视图、触发器等。在大多数数据库系统中,CREATE 语句会隐式提交事务。这是因为创建数据库对象是一个不可逆的操作,一旦创建成功,对象就存在于数据库中,因此需要立即将这个更改提交,以确保数据库的一致性和完整性。
B. TRUNCATE
用于快速删除表中的所有行。与 DELETE 语句不同,TRUNCATE 不会逐行删除数据,而是直接释放表的数据页,这使得操作非常快。由于 TRUNCATE 也是一个不可逆的操作,它通常也会隐式提交事务,以确保数据库的一致性。
C. UPDATE
用于修改表中的数据。通常不会隐式提交事务。这是因为 UPDATE 操作是可逆的,可以通过 ROLLBACK 命令撤销。因此,UPDATE 操作通常发生在一个事务中,直到显式地执行 COMMIT 或 ROLLBACK 命令
D. SELECT
数据查询语言(DQL), 用于查询数据, 不涉及事务提交操作,更不会隐式地提交事务
隐式提交
>>部分DDL语句
>>在存储过程/函数中使用的DML语句
>>一次性执行多个DML语句或者多个查询语句(批处理)
常见的DDL语句会有隐式提交的有(不是全部DDL语句都有)
-
CREATE
,ALTER
,DROP
,TRUNCATE
,RENAME
执行DCL语句(如 GRANT
、REVOKE
等)时,也会触发隐式提交,这是因为权限的授予或撤销是立即生效的,需要被立即确认
DML(数据操作语言)语句如INSERT
、UPDATE
和DELETE
通常需要显式执行COMMIT
来提交事务。
隐式提交
-
当在一个存储过程或函数中执行DML语句时,事务可能会自动在语句执行结束时提交事务。这是最常见的隐式提交情况。
-
在批处理语句中,如果用户一次性执行多个DML语句或者多个查询语句,Oracle会自动将这些操作合并为一个批处理语句,并在执行完毕后进行隐式提交操作
5. 以下关于绑定变量的说法正确的有(B, C, D)
A. 同一个SQL的所有绑定变量可以具有相同的命名
B. 存在数据倾斜的情况下, 使用绑定变量可能生成较差的执行计划
C. 绑定变量可以降低SQL注入攻击的风险, 提高安全性
D. 绑定变量可以降低硬解析
解析:
A. 在SQL中使用绑定变量时,通常建议每个绑定变量都有唯一的名称,以避免混淆和潜在的错误
B. 存在数据倾斜的情况下, 由于绑定变量在SQL解析阶段无法获得具体值, 优化器可能生成不符合实际数据分布的执行计划
C.绑定变量将数据和SQL分离,恶意用户难以通过输入改变SQL结构, 从而降低SQL注入攻击的风险
D. 绑定变量使相似的SQL语句可以复用执行计划,减少SQL语句硬解析次数, 提高数据库性能
6. 以下哪些是Oracle支持的正则表达式函数(A, B, C,D)
A. REGEXP_REPLACE
B. REGEXP_LIKE
C. REGEXP_INSTR
D. REGEXP_SUBSTR
解析:
A. REGEXP_REPLACE 使用正则表达式匹配字符串,并将指定的部分替换为指定的部分
B. REGEXP_LIKE 使用正则表达式判断一个字符串是否匹配的正则表达式,返回true或false
C. REGEXP_INSTR 使用正则表达式在字符串中搜索指定字符串,返回匹配项的起始位置
D. REGEXP_SUBSTR 使用正则表达式从字符串中提取匹配的子字符串
7.以下哪些函数可以用作分析函数
A. LAG
B. COUNT
C. RANK
D. ROW_NUMBER
解析:
A. LAG
LAG
是一个分析函数,它从当前行向前(即向结果集的开始方向)查看,并返回指定列中给定偏移量的值。如果没有指定偏移量,默认为1。
B. COUNT
COUNT
通常用作聚合函数,用于计算分组中的行数。然而,COUNT
也可以作为分析函数使用,当它与OVER
子句一起使用时,可以计算直到当前行的所有行的数量。
C. RANK
RANK
是一个分析函数,它为结果集中的每个行分配一个唯一的排名,如果两个值相同,则分配相同的排名,并在后续的排名中留下空位。
D. ROW_NUMBER
ROW_NUMBER
是一个分析函数,它为结果集中的每个行分配一个唯一的连续整数,通常用于数据的排序。
因此,所有这些函数(A、B、C、D)都可以用作分析函数,只要它们与OVER
子句一起使用
SELECT column1, COUNT(column1) OVER() AS total_count, RANK() OVER(ORDER BY column2) AS rank, ROW_NUMBER() OVER(ORDER BY column3) AS row_num, LAG(column4, 1) OVER(ORDER BY column5) AS prev_value
FROM table_name;
8. 以下关于truncate 和delete 的说法正确的有(A, B, C)
A. delete不能降低高水位线, 但被释放的空间可以被再次使用
B. truncate 产生的redo(重做)日志比delete少得多
C. 整表删除时,通常truncate比delete快
D. truncate删除的数据可以被闪回
解释:
B. truncate是DDL操作, 会快速删除表中所有的数据, 产生的redo日志很少
delete是DML操作,会为每一条删除记录产生redo日志
9. 下列子句中,哪些可以包含子查询(C, D)
A. GROUP BY
B. ORDER BY
C. WHERE
D. SELECT
解析:
GROUP BY 用于对查询结果进行分组,后面跟随的是分组的列名
ORDER BY 用于对查询结果进行排序, 后面跟排序的列名或表达式
WHERE 用于筛选行, 子查询可以嵌套在WHERE子句中, 用来生成筛选条件
SELECT 用于选择列, 子查询可以嵌套在SELECT中, 用来生成计算列或作为表达式的一部分
示例: 作为计算列的一部分
示例: 作为表达式的一部分
假设我们想要找出销售总额超过所有产品平均销售总额的产品ID和销售总额
SELECT ProductID,SUM(Amount) AS TotalSales
FROM Sales
GROUP BY ProductID
HAVING SUM(Amount) > (SELECT AVG(TotalSales) FROM (SELECT SUM(Amount) AS TotalSales FROM Sales GROUP BY ProductID) AS SubTotals);
在这个示例中,子查询(SELECT AVG(TotalSales) FROM (SELECT SUM(Amount) AS TotalSales FROM Sales GROUP BY ProductID) AS SubTotals)
首先计算所有产品的销售总额的平均值,然后外层查询使用这个平均值来过滤那些销售总额超过平均值的产品。
判断题
1. INT类型占用4字节存储空间(√ )
2.同一用户下的表和索引不能具有相同的名称(√)
解析:
在数据库中, 同一用户下对象名称需具有唯一性, 表和索引属于对象
3. MYSQL中, 对于字符串型数据, 空字符串就是NULL,对于数值型数据0就是NULL(×)
解析:
MYSQL中(或大多数数据库系统中), 空字符串是一个确定的字符串值,表示没有字符串内容;NULL代表的是缺失值,未知值,二者含义不同. 数值型数据0是一个具体的数值,也和表示未知的NULL不同
4. 在MYSQL中,UPDATE语句可以有WHERE子句和LIMIT子句(√ )
解析:
WHERE子句用来指定更新的条件,只对满足条件的行进行更新;
LIMIT子句可以限制更新的行数,即只更新指定数量的行
5. 下面的SQL一定不会走索引吗?(×)
select * from client where client_name is null.
解析:
当 client_name 列存在索引,并且WHERE
子句中使用IS NULL
或IS NOT NULL
来检查NULL值时,通常不会使用索引。这是因为NULL值在数据库中表示缺失或未知的数据,索引通常不包含NULL值(或者对NULL值有特殊的处理方式),因此索引对于优化这类查询的帮助有限。
但是并不意味着空值判断一定不会走索引
空值判断使用索引的可能性
部分索引(Partial Index):
在某些数据库系统中(如PostgreSQL),可以创建部分索引,只针对满足特定条件的行进行索引。例如,可以创建一个只索引client_name为NULL的行的索引。 如果有这样的部分索引存在,那么查询WHERE client_name IS NULL可能会使用这个索引。
CREATE INDEX idx_client_name_null ON client (client_name) WHERE client_name IS NULL;
函数索引(Functional Index): 在Oracle和PostgreSQL等数据库中,可以创建函数索引,即对列的表达式进行索引。虽然直接对NULL进行索引可能不常见,但如果有相关的函数索引,可能会间接利用索引。
oracle
CREATE INDEX idx_client_name_null ON client (client_name) WHERE client_name IS NULL;
虽然表面上看起来没有直接使用函数,但实际上,这里的WHERE client_name IS NULL
子句可以被视为一种特殊的函数应用。这是因为它在索引创建时对client_name
列进行了条件筛选,只有当client_name
为NULL
时,相应的行才会被包含在索引中。这种条件筛选可以看作是对列值的一种“函数”处理,因为它改变了索引中包含的数据。
示例:
使用函数索引优化字符串长度查询
假设我们有一个表employees
,其中包含员工的姓名(name
)字段。我们经常需要查询姓名长度超过某个特定值的员工。
CREATE INDEX idx_name_length ON employees (LENGTH(name));
数据库优化
某些数据库系统可能会对NULL值进行特殊处理,使得在某些情况下可以使用索引。
例如,
对于非唯一索引而言,MySQL 8.0 之前的版本在内部实现中将NULL视为相等,并且在索引中仅存储一次。不过,从MySQL 8.0开始,这个行为有了变化,NULL在非唯一索引中可以被存储多次。这意味着在某些情况下,包含NULL值的索引可以帮助优化查询性能,特别是在使用IS NULL
或IS NOT NULL
条件时。例如,查询WHERE age IS NULL
可以直接利用索引,而不需要回表查询。
然而,当在索引列上进行NULL
值判断时,索引可能会失效,导致数据库引擎放弃使用索引而进行全表扫描。例如,查询WHERE name IS NULL
可能无法有效利用索引。为了缓解索引失效的问题,可以使用组合索引,使得即使其中一个字段包含NULL值,整体索引仍能被利用
6. CREATE TABLE 语句中有定义主键的选项(√ )
解析:
通过PRYMARY KEY关键词来定义主键, 可在定义列时直接声明, 也可以在列定义之后统一声明