📜  DBMS 面试常见问题 | 2套

📅  最后修改于: 2021-09-10 02:11:13             🧑  作者: Mango

本文是 DBMS 面试常见问题的延伸 |设置 1。

问:有一个表格,其中只有一行完全重复。编写查询以查找重复行

Name Section
abc CS1
bcd CS2
abc CS1

在上表中,我们可以使用以下查询找到重复的行。

SELECT name, section FROM tbl
GROUP BY name, section
HAVING COUNT(*) > 1

Q. 查询以找到员工的第二高工资?

SELECT max(salary) FROM EMPLOYEES WHERE salary IN
(SELECT salary FROM EMPLOYEEs MINUS SELECT max(salary)
FROM EMPLOYEES);

或者

SELECT max(salary) FROM EMPLOYEES WHERE 
salary <> (SELECT max(salary) FROM EMPLOYEES);

问:考虑以下员工表。以下查询的结果中有多少行?

ID 工资部门名称
1 10000 欧
2 40000 欧文
3 30000 CS
4 40000 ME
5 50000 米
6 60000 米
7 70000 CS

以下查询的结果中有多少行?

SELECT E.ID
FROM  Employee E
WHERE  EXISTS  (SELECT E2.salary
FROM Employee E2
WHERE E2.DeptName = 'CS'
AND   E.salary > E2.salary)

以下 5 行将是查询结果,因为 3000 是 CS 员工的最低工资,并且所有这些行都大于 30000。

2
4
5
6
7

Q. 编写一个触发器来更新 Emp 表,这样,如果在 Dep 表中进行了更新,那么该部门所有员工的工资应该增加一些(更新)

假设表名是 Dept 和 Emp,触发器可以写成——

CREATE OR REPLACE TRIGGER update_trig
AFTER UPDATE ON Dept
FOR EACH ROW
DECLARE
CURSOR emp_cur IS SELECT * FROM Emp;
BEGIN
FOR i IN emp_cur LOOP
IF i.dept_no = :NEW.dept_no THEN
DBMS_OUTPUT.PUT_LINE(i.emp_no);  --  for printing those
UPDATE Emp                      -- emp number which are
SET sal = i.sal + 100           -- updated
WHERE emp_no = i.emp_no;
END IF;
END LOOP;
END;

Q. 有一个包含Student 和Marks 两列的表格,您需要找到所有分数高于平均分的学生,即高于平均分的学生列表。

SELECT student, marks 
FROM table
WHERE marks > SELECT AVG(marks) from table;

问:命名使用子查询获得第三高分的学生。

SELECT Emp1.Name
FROM Employee Emp1
WHERE 2 = (SELECT COUNT(DISTINCT(Emp2.Salary))
           FROM Employee Emp2
           WHERE Emp2.Salary > Emp1.Salary
          )

*LOGIC- 薪水高于此人的人数为 2。

问:为什么我们不能将 WHERE 子句与 HAVING 等聚合函数一起使用?

SQL 中的 having 和 where 子句之间的区别在于 where 子句不能与聚合一起使用,但 having 子句可以。请注意:这不是预定义的规则,但总的来说,您会看到在大量 SQL 查询中,我们在 GROUP BY 之前使用 WHERE,在 GROUP BY 之后使用 HAVING。

Where 子句充当前置过滤器,而 Have 作为后置过滤器。

where 子句适用于行的数据,而不适用于聚合数据。

让我们考虑下表“标记”。

学生课程成绩

一个 c1 40
一个 c2 50
b c3 60
d c1 70
e c2 80

考虑查询

SELECT Student, sum(Score) AS total 
FROM Marks

这将逐行选择数据。 have 子句适用于聚合数据。

例如,以下查询的输出

SELECT Student, sum(score) AS total FROM Marks

学生总数
一个 90
60
d 70
80

当我们在上面的查询中应用具有时,我们得到

SELECT Student, sum(score) AS total
FROM Marks having total > 70

学生总数
一个 90
80

Q. 主键和唯一键的区别,如果只允许一个 null ,为什么要使用唯一键?

首要的关键:

  • 只有一行(元组)。
  • 从不允许空值(仅关键字段)。
  • 唯一键标识符并且不能为空且必须是唯一的。

唯一键:

  • 一行中可以有多个唯一键。
  • 唯一键可以有空值(只允许单个空值)。
  • 它可以是候选键。
  • 唯一键可以为空,也可以不唯一。

问:物化视图和动态视图有什么区别?

物化视图

  • 基于磁盘并根据查询定义定期更新。
  • 物化表很少创建或更新,它必须与其关联的基表同步。

动态视图

  • 仅虚拟并在每次访问时运行查询定义。
  • 每次用户请求特定视图时,都可以创建动态视图。

问:什么是嵌入式和动态 SQL?

静态或嵌入式 SQL

  • 应用程序中的 SQL 语句在运行时不会更改,因此可以硬编码到应用程序中。

动态 SQL

  • 在运行时构造的 SQL 语句;例如,应用程序可能允许用户输入他们自己的查询。
  • 动态 SQL 是一种编程技术,使您能够在运行时动态构建 SQL 语句。您可以使用动态 SQL 创建更通用、更灵活的应用程序,因为 SQL 语句的全文在编译时可能是未知的。
S.No. Static (embedded) SQL Dynamic (interactive) SQL
1. In static SQL how database will be accessed is predetermined in the embedded SQL statement. In dynamic SQL, how database will be accessed is determined at run time.
2. It is more swift and efficient. It is less swift and efficient.
3. SQL statements are compiled at compile time. SQL statements are compiled at run time.
4. Parsing, validation, optimization, and generation of application plan are done at compile time. Parsing, validation, optimization, and generation of application plan are done at run time.
5. It is generally used for situations where data is distributed uniformly. It is generally used for situations where data is distributed non-uniformly.
6. EXECUTE IMMEDIATE, EXECUTE and PREPARE statements are not used. EXECUTE IMMEDIATE, EXECUTE and PREPARE statements are used.
7. It is less flexible. It is more flexible.

http://docs.oracle.com/cd/A87860_01/doc/appdev.817/a76939/adg09dyn.htm

问:CHAR 和 VARCHAR 有什么区别?

  • CHAR 和 VARCHAR 在存储和检索方面有所不同。
  • CHAR 列长度是固定的,而 VARCHAR 长度是可变的。
  • 最大数量字符CHAR 数据类型可以容纳 255 个字符,而 VARCHAR 最多可以容纳 4000 个字符。
  • CHAR 比 VARCHAR 快 50%。
  • CHAR 使用静态内存分配,而 VARCHAR 使用动态内存分配。

你也许也喜欢:

  • 关于 DBMS 的练习测验
  • 最后一分钟笔记 – DBMS
  • 数据库管理系统文章