### Oracle SQL 面试题解析 #### 一、基本表结构与字段定义 根据题目描述,我们有两个主要的表:`EMPLOYEE` 和 `DEPT`。 - **EMPLOYEE 表** 包含了雇员的基本信息,如编号、姓名、部门编号、电话号码、入职日期、工作职位等。其中 `EMPNO` 是主键。 - **EMPNO**: 雇员编号,长度为6个字符。 - **FIRSTNAME**: 雇员的第一个名字,长度不超过12个字符。 - **MIDINIT**: 雇员中间名字的首字母,长度为1个字符。 - **LASTNAME**: 雇员的姓氏,长度不超过15个字符。 - **WORKDEPT**: 部门编号,作为外键引用自 `DEPT` 表中的 `DEPTNO` 字段。 - **PHONENO**: 电话号码,长度为4个字符。 - **HIREDATE**: 入职日期。 - **JOB**: 工作岗位。 - **EDLEVELS**: 学历等级(1:中学及以下;2:大学;3:硕士及以上)。 - **SEX**: 性别(1:男;2:女)。 - **BIRTHDATE**: 出生日期。 - **SALARY**: 薪水。 - **BONUS**: 奖金。 - **DEPT 表** 包含了部门的基本信息,如编号、名称以及部门经理的编号。 - **DEPTNO**: 部门编号,作为主键。 - **DEPTNAME**: 部门名称。 - **MANAGER**: 部门经理编号,每个经理也是 `EMPLOYEE` 表中的一个雇员。 #### 二、SQL 查询题解答 接下来,我们将针对题目中的具体问题进行详细的解答。 1. **找出收入(SALARY和BONUS之和)最低的10个EMPNO,按照收入从低到高排序** ```sql SELECT EMPNO, NVL(BONUS, 0) + NVL(SALARY, 0) AS INCOME FROM EMPLOYEE ORDER BY INCOME LIMIT 10; ``` 这里使用了 `NVL` 函数来处理 `SALARY` 或 `BONUS` 可能为 `NULL` 的情况,并将它们转换为0,再相加得到总收入。然后按总收入从小到大排序,并限制结果只返回前10条记录。 2. **从雇员表中删除雇用日期在1940年1月1日以前的雇员** ```sql DELETE FROM EMPLOYEE WHERE HIREDATE < TO_DATE('1940-01-01', 'YYYY-MM-DD'); ``` 使用 `TO_DATE` 函数将字符串转换为日期格式,并进行比较删除。 3. **算出所有雇员的平均收入(SALARY和BONUS之和)、最低收入、最高收入,取整数位,小数点后面四舍五入** ```sql SELECT ROUND(SUM(NVL(SALARY, 0) + NVL(BONUS, 0)), 0) AS AVG_INCOME, ROUND(MIN(NVL(SALARY, 0) + NVL(BONUS, 0)), 0) AS MIN_INCOME, ROUND(MAX(NVL(SALARY, 0) + NVL(BONUS, 0)), 0) AS MAX_INCOME FROM EMPLOYEE; ``` 这里同样使用了 `NVL` 函数,并结合 `ROUND` 函数对结果进行四舍五入处理。 4. **列出所有雇员的全名,全部转换成大写字母,名字每一部分中间用空格隔开** ```sql SELECT UPPER(FIRSTNAME || ' ' || MIDINIT || ' ' || LASTNAME) AS FULL_NAME FROM EMPLOYEE; ``` 这里使用 `UPPER` 函数将字符串转换为大写,并通过 `||` 操作符拼接各个部分。 5. **找出雇员数大于50的部门的编号** ```sql SELECT DEPTNO, DEPTNAME FROM DEPT WHERE DEPTNO IN ( SELECT WORKDEPT FROM EMPLOYEE GROUP BY WORKDEPT HAVING COUNT(*) > 50 ); ``` 这里使用子查询先找出雇员数大于50的部门编号,然后再从 `DEPT` 表中筛选出这些部门的信息。 6. **在雇员表JOB字段上新建一个索引,取名idx_emp_job** ```sql CREATE INDEX idx_emp_job ON EMPLOYEE (JOB); ``` 这是创建索引的标准语法。 7. **找到FIRSTNME=’John’的员工所在部门的名称和部门经理编号** ```sql SELECT DEPTNAME, MANAGER FROM DEPT WHERE DEPTNO IN ( SELECT WORKDEPT FROM EMPLOYEE WHERE FIRSTNAME = 'John' ); ``` 使用子查询先找出名字为“John”的员工所在的部门编号,再从 `DEPT` 表中获取部门信息。 8. **更新雇员表的薪水,如果为空置为0,如果不为空,不变更字段值** ```sql UPDATE EMPLOYEE SET BONUS = 0 WHERE BONUS IS NULL; ``` 这里仅更新 `BONUS` 为 `NULL` 的记录,将其设为0。 9. **往部门表新增一个部门,DEPTNO=123,DEPTNAME=’Market’,MANAGER=20** ```sql INSERT INTO DEPT (DEPTNO, DEPTNAME, MANAGER) VALUES (123, 'Market', 20); ``` 这是插入新记录的标准语法。 10. **列出每个员工的字母缩写,忽略中间的名字** ```sql SELECT SUBSTR(UPPER(FIRSTNAME), 1, 1) || SUBSTR(UPPER(LASTNAME), 1, 1) AS ABBREVIATION FROM EMPLOYEE; ``` 使用 `SUBSTR` 函数截取名字的第一个字母,并使用 `UPPER` 函数转换为大写形式。 通过以上解析,我们可以看到这些问题涵盖了Oracle SQL中的一些基本操作,包括数据查询、数据更新、数据插入等,同时也涉及到了一些常用的函数和技巧,对于准备Oracle SQL面试的人来说非常有帮助。
- 粉丝: 13
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助