oracle考试题目.docx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
根据提供的文档内容,我们可以归纳出一系列关于Oracle数据库的基础知识点及相关操作。下面将详细解析文档中的问题及答案: ### 一、理论部分 1. **为什么要给表指定主键?** - 主键确保了表中每一行记录的唯一性,方便进行数据的查找和更新。在关系型数据库中,主键作为表间连接的关键依据之一,有助于维护数据的一致性和完整性。 2. **为什么要给表指定外键?** - 外键用于建立不同表之间的关联,实现数据之间的参照完整性。通过定义外键,可以确保表间的链接正确无误,避免无效的数据引用。 3. **为什么要对某些字段的取值进行限制?** - 对字段进行限制(如非空约束、唯一性约束等),可以确保数据的有效性和一致性,防止无效数据的录入,从而提高数据的质量和可靠性。 4. **为什么要表中的某一列或几列建立索引?请给emp表的ename列创建索引,写出相应的SQL语句。** - 建立索引可以加速数据检索的速度。索引相当于书籍的目录,可以快速定位数据的位置。 - 创建索引的SQL语句示例:`CREATE INDEX idx_emp_ename ON emp (ename);` 5. **当对表的列进行了什么约束时,Oracle会为它自动创建索引?** - 当指定了一列或多列为表的主键或唯一性约束时,Oracle会自动为该约束创建索引。 6. **为什么要给某张表或者某几张表建立视图?创建一个视图,要求只显示工资小于1500的员工的信息;然后给最低工资少于1000的员工工资加300。** - 视图提供了一个简化和定制化的数据展示方式,可以隐藏不必要的细节,便于特定的用户群体访问数据。 - 创建视图的SQL语句示例:`CREATE VIEW v_low_salary AS SELECT * FROM emp WHERE sal < 1500;` - 更新工资的SQL语句示例:`UPDATE emp SET sal = sal + 300 WHERE sal < 1000;` 7. **视图的DML操作会同步到基表吗?是不是对所有的视图都可以进行DML操作?** - 是的,对视图执行的DML操作(如INSERT、UPDATE、DELETE)通常会同步到基表。但并不是所有视图都支持DML操作,例如基于多个表的复杂视图可能无法直接更新。 8. **为什么要创建序列?当向表中插入数据时,对于主键的值可以调用某个序列来自动生成,此时是调用序列的那个属性?** - 序列用于自动生成唯一的数值,常用于为主键字段自动填充值。 - 在插入数据时,可以通过调用序列的`NEXTVAL`属性来获取下一个序列值作为主键值。 9. **Oracle准确的说是一个什么?写出英文名称。** - Oracle是一种关系型数据库管理系统,英文全称是“Oracle Database”。 10. **目前市场上畅销的关系数据库有哪些,分别是哪个公司的?** - Oracle Database (Oracle Corporation) - SQL Server (Microsoft) - MySQL (Oracle Corporation) - PostgreSQL (PostgreSQL Global Development Group) 11. **在Oracle中,哪些是数据库对象?** - 表(Table)、视图(View)、存储过程(Stored Procedure)、触发器(Trigger)、索引(Index)、序列(Sequence)等。 12. **SQL语句是如何分类的?** - 数据定义语言(DDL):用于创建、修改或删除数据库对象,如CREATE TABLE、ALTER TABLE、DROP TABLE等。 - 数据操纵语言(DML):用于处理数据,包括插入(INSERT)、更新(UPDATE)、删除(DELETE)和查询(SELECT)操作。 - 数据控制语言(DCL):用于管理权限和授权,如GRANT和REVOKE命令。 - 事务控制语言(TCL):用于管理事务,如COMMIT和ROLLBACK命令。 13. **使用sys身份登录sqlplus的操作语句是怎样的?** - `sqlplus / as sysdba` 14. **使用scott身份登录的语句又是怎样的?** - `sqlplus scott/your_password` 15. **现在e盘下有一个test.sql文件(里面有很多对数据库的操作),请问怎样在控制台运行这个sql文件?** - 使用SQL*Plus工具,输入以下命令:`@E:\test.sql` 16. **Oracle中的权限有哪两种?** - 系统权限(System Privileges):允许用户执行特定类型的数据库操作。 - 对象权限(Object Privileges):允许用户访问特定的数据库对象。 17. **Oracle数据库的常用数据类型有哪些?(列出主要的四种)** - VARCHAR2:可变长度字符串 - NUMBER:数字类型 - DATE:日期时间类型 - CHAR:固定长度字符串 ### 二、操作题解析 1. **创建一个用户tom,密码是tom,并授予会话的权限。** - SQL语句:`CREATE USER tom IDENTIFIED BY tom; GRANT CONNECT TO tom;` 2. **列出薪金比"SMITH"多的所有雇员。** - SQL语句:`SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename = 'SMITH');` 3. **列出部门名称和这些部门的雇员,同时列出那些没有雇员的部门。** - 此处需要使用左外联接(left outer join),确保所有部门都被列出,即使没有对应的雇员。 - SQL语句:`SELECT d.dept_name, e.* FROM dept d LEFT OUTER JOIN emp e ON d.dept_id = e.dept_id;` 4. **列出所有雇员的姓名及其直接上级的姓名。** - SQL语句:`SELECT e1.ename, e2.ename AS manager_name FROM emp e1 LEFT JOIN emp e2 ON e1.mgr = e2.empno;` 5. **列出所有“CLERK”(办事员)的姓名及其部门名称。** - SQL语句:`SELECT e.ename, d.dept_name FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE e.job = 'CLERK';` 6. **列出各种工作类别的最低薪金,显示最低薪金大于1500的记录。** - SQL语句:`SELECT job, MIN(sal) AS min_salary FROM emp GROUP BY job HAVING MIN(sal) > 1500;` 7. **列出从事“SALES”(销售)工作的雇员的姓名,假定不知道销售部的部门编号。** - 需要先找出销售部门的编号,再查询该部门的雇员。 - SQL语句:`SELECT e.ename FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE d.dept_name = 'SALES';` 8. **列出薪金高于公司平均水平的所有雇员。** - SQL语句:`SELECT * FROM emp WHERE sal > (SELECT AVG(sal) FROM emp);` 9. **列出与“SCOTT”从事相同工作的所有雇员。** - SQL语句:`SELECT * FROM emp WHERE job = (SELECT job FROM emp WHERE ename = 'SCOTT');` 10. **列出某些雇员的姓名和薪金,条件是他们的薪金等于部门30中任何一个雇员的薪金。** - SQL语句:`SELECT ename, sal FROM emp WHERE sal IN (SELECT sal FROM emp WHERE deptno = 30);` 11. **列出按年薪排序的所有雇员的年薪。** - 考虑到年薪计算,可以假设一年工作时间为12个月。 - SQL语句:`SELECT ename, sal * 12 AS annual_salary FROM emp ORDER BY annual_salary DESC;` 12. **列出所有雇员的雇员名称、部门名称和薪金。** - SQL语句:`SELECT e.ename, d.dept_name, e.sal FROM emp e JOIN dept d ON e.deptno = d.deptno;` 13. **列出各种类别工作的最低工资。** - SQL语句:`SELECT job, MIN(sal) AS min_salary FROM emp GROUP BY job;` 14. **列出入职日期早于其直接上级的所有雇员。** - SQL语句:`SELECT e1.ename, e1.hiredate FROM emp e1 JOIN emp e2 ON e1.mgr = e2.empno WHERE e1.hiredate < e2.hiredate;` 15. **列出至少有一个雇员的所有部门。** - 使用内联接(inner join)即可。 - SQL语句:`SELECT DISTINCT d.dept_name FROM dept d JOIN emp e ON d.deptno = e.deptno;` 16. **列出各个部门的MANAGER(经理)的最低薪金。** - 先找出各部门的经理,然后计算最低薪金。 - SQL语句:`SELECT d.dept_name, MIN(e.sal) AS min_salary FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE e.job = 'MANAGER' GROUP BY d.dept_name;` 17. **显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计升序排列。** - SQL语句:`SELECT job, SUM(sal) AS total_salary FROM emp WHERE job != 'SALESMAN' GROUP BY job HAVING SUM(sal) > 5000 ORDER BY total_salary ASC;` 18. **列出最低薪金大于1500的各种工作及此从事此工作的全部雇员人数。** - SQL语句:`SELECT job, COUNT(*) AS num_employees FROM emp GROUP BY job HAVING MIN(sal) > 1500;` 19. **列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级。** - 假设工资等级已知并存储在表中。 - SQL语句:`SELECT e.ename, e.deptno, e.mgr, w.salary_level FROM emp e JOIN wages w ON e.sal BETWEEN w.min_sal AND w.max_sal WHERE e.sal > (SELECT AVG(sal) FROM emp);` 20. **列出所有部门的详细信息和部门人数。** - SQL语句:`SELECT d.*, COUNT(e.empno) AS num_employees FROM dept d LEFT OUTER JOIN emp e ON d.deptno = e.deptno GROUP BY d.deptno;` 21. **列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称。** - SQL语句:`SELECT e.ename, e.sal, d.dept_name FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE e.sal > ALL (SELECT sal FROM emp WHERE deptno = 30);` ### 项目实例表结构及操作 1. **写出这四张表建表的DDL语句;(要求有注释)** - 用户表(tb_user): ```sql CREATE TABLE tb_user ( user_id NUMBER(4) PRIMARY KEY, -- 用户ID name VARCHAR2(20), -- 姓名 delpt_id NUMBER(2), -- 部门ID emt NUMBER(3) -- 资产 ); ``` - 部门表(tb_dept): ```sql CREATE TABLE tb_dept ( dept_id NUMBER(2) PRIMARY KEY, -- 部门ID dept_desc VARCHAR2(20) -- 部门描述 ); ``` - 功夫表(tb_gongfu): ```sql CREATE TABLE tb_gongfu ( user_id NUMBER(4) NOT NULL, -- 用户ID gf_id NUMBER(2) NOT NULL, -- 功夫ID main_gf_flag NUMBER(1) CHECK (main_gf_flag IN (0, 1)), -- 是否为主要功夫 PRIMARY KEY (user_id, gf_id) ); ``` - 功夫明细表(tb_gf): ```sql CREATE TABLE tb_gf ( gf_id NUMBER(2) PRIMARY KEY, -- 功夫ID gf_desc VARCHAR2(20) -- 功夫描述 ); ``` 2. **向表中插入以上数据;** - 示例插入数据的SQL语句: ```sql INSERT INTO tb_user (user_id, name, delpt_id, emt) VALUES (1001, '令狐冲', 1, 100); INSERT INTO tb_dept (dept_id, dept_desc) VALUES (1, '华山派'); INSERT INTO tb_gongfu (user_id, gf_id, main_gf_flag) VALUES (1001, 1, 1); INSERT INTO tb_gf (gf_id, gf_desc) VALUES (1, '华山剑法'); ``` 3. **查询部门名称以及各部门的人员数量,按人员数量降序排列;** - SQL语句:`SELECT d.dept_desc, COUNT(u.user_id) AS num_employees FROM tb_dept d LEFT OUTER JOIN tb_user u ON d.dept_id = u.delpt_id GROUP BY d.dept_desc ORDER BY num_employees DESC;` 4. **查询资产排前3的用户的姓名,资产,以及部门名称,按资产升序排列;** - SQL语句:`SELECT u.name, u.emt, d.dept_desc FROM tb_user u JOIN tb_dept d ON u.delpt_id = d.dept_id ORDER BY u.emt ASC LIMIT 3;` 5. **查询每个部门的总资产;** - SQL语句:`SELECT d.dept_desc, SUM(u.emt) AS total_assets FROM tb_dept d JOIN tb_user u ON d.dept_id = u.delpt_id GROUP BY d.dept_desc;` 6. **查询会两种功夫或两种功夫以上的人员的名字,部门,以及会的主要功夫名称;** - SQL语句:`SELECT u.name, d.dept_desc, g.gf_desc FROM tb_user u JOIN tb_dept d ON u.delpt_id = d.dept_id JOIN tb_gongfu gfu ON u.user_id = gfu.user_id JOIN tb_gf g ON gfu.gf_id = g.gf_id WHERE gfu.main_gf_flag = 1 GROUP BY u.user_id HAVING COUNT(gfu.gf_id) >= 2;` 以上就是从给定文档中提取的知识点及操作题的解答。这些知识点涵盖了Oracle数据库的基础概念、表设计、SQL语句编写等多个方面,对于初学者理解Oracle数据库的使用具有很好的参考价值。
- 粉丝: 4
- 资源: 7万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于分布式驱动电动汽车的路面附着系数估计,分别采用无迹卡尔曼
- 基于Jupyter Notebook的互动媒体制作学习源码与实践心得记录
- 卷积神经网络 matlab实现
- 基于分布式驱动电动汽车的路面附着系数估计,分别采用无迹卡尔曼 滤波(UKF)和容积卡尔曼滤波(CKF)对电动汽车四个车轮的路面附
- 基于Java开发的电子商务管理系统后端设计源码
- 基于Java与HTML技术的skt-take-out项目设计源码
- comsol水力压裂应力-渗流-损伤模型 comsol仿真模型
- 卷积神经网络源码-深度
- 基于HTML的API与人工智能网络新媒体课程期末作业设计源码
- 双馈风力发电机 双馈风机 DFIG 低电压穿越 MATLAB仿真模型simulink LVRT 设置电压跌落 有撬棒保护(也