单选题
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
是一个有效的数据类型,用于存储逻辑值(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
类型
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语句(如 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日志
待续....