数据开发岗位: 面试测试题(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:用于声明一个变量,其结构与表中的一行完全一致。

DECLARE
  record_variable table_name%ROWTYPE;

游标 %ROWTYPE:用于声明一个变量,其结构与游标查询返回的行一致

DECLARE
  CURSOR 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是一个有效的数据类型,用于存储逻辑值(TRUEFALSE

示例: 在表定义中模拟布尔值

使用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类型

DECLARE
    is_active BOOLEAN := TRUE;
BEGIN
    IF is_active THEN
        DBMS_OUTPUT.PUT_LINE('Active');
    ELSE
        DBMS_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语句(如 GRANTREVOKE 等)时,也会触发隐式提交,这是因为权限的授予或撤销是立即生效的,需要被立即确认

DML(数据操作语言)语句如INSERTUPDATEDELETE通常需要显式执行COMMIT来提交事务。

隐式提交

  1. 当在一个存储过程或函数中执行DML语句时,事务可能会自动在语句执行结束时提交事务。这是最常见的隐式提交情况。

  2. 在批处理语句中,如果用户一次性执行多个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日志

待续....

相关推荐
邴越13 分钟前
回文子序列问题解题模板
算法·leetcode·职场和发展
Anlici17 分钟前
面试官:想把你问趴下 => 面题整理[3] 😮‍💨初心未变🚀
javascript·面试·前端框架
独行soc2 小时前
2025年渗透测试面试题总结-长某亭科技-安全服务工程师(一面)(题目+回答)
科技·安全·面试·职场和发展·红蓝攻防·护网·2025
少年姜太公5 小时前
让你快速拿捏大厂面试中关于eventloop执行顺序问题
前端·javascript·面试
BingLin-Liu12 小时前
蓝桥杯备考:动态规划dp之最大子段和
职场和发展·蓝桥杯·动态规划
六个点12 小时前
面试中的网络协议
前端·网络协议·面试
周八营业的代码人15 小时前
Go常见面试题整理
面试·golang
蛇皮划水怪16 小时前
代码随想录-图论
后端·算法·面试
勤劳打代码16 小时前
烽火连营——爆杀 Jank 闪烁卡顿
flutter·面试·性能优化
低飞的蜜蜂16 小时前
场景题: 使用 redis 实现某抽奖活动人维度抽样逻辑
算法·面试