电子科技大学数据库与软件工程三

适用于网工和物联网专业

目录

一、实验目的

二、实验内容

三、实验软件

四、实验步骤及数据记录

1.子查询

2. 伪列

3.数据库对象

4. 块、存储过程和触发器

五、实验结论及思考题

实验结论:

思考题:

六、总结及心得体会

七、对本实验过程及方法、手段的改进建议


一、实验目的

1、学习子查询和常用函数;

2、了解数据库视图的操作;

3、学习 PL/SQL 语言实现对数据库存储过程、触发器等操作。

二、实验内容

 在 SQL Developer 中使用学生用户连接 Oracle 数据库,使用实验二导入的 EMP 表(员工表)、DEPT 表(部门表)和 SALGRADE 表(工资等级表),实现数据库子查询、视图、存储过程、触发器等的操作过程。

三、实验软件

Oracle 数据库、SQL Developer

四、实验步骤及数据记录

1.子查询

1)查询出销售部(SALES)下面的员工姓名、工作、工资。

SELECT NAME,JOB,SAL FROM EMP

WHERE DEPTNO=(SELECT DEPTNO FROM WHERE DNAME='SALES');

结果如下:

图1

2)查询出 EMP 表中比任意一个销售员(SALESMAN)工资低(比销售员工资查询结果中的最大值小)的员工姓名、工作和工资。

SELECT ENAME,JOB,SAL FROM EMP

WHERE SAL<ANY(SELECT SAL FROM EMP WHERE JOB='SALESMAN');

结果如下:

图2

2. 伪列

1)查询出员工表中前 5 名员工的姓名、工作和工资。

SELECT ROWNUM,ENAME,JOB,SAL FROM EMP WHERE ROWNUM<=5;

结果如下:

图3

2)查询出工资最高的前 5 名员工的姓名、工资和工资

SELECT ROWNUM,T.* FROM

(SELECT ENAME,JOB,SAL

FROM EMP ORDER BY SAL DESC) T

WHERE ROWNUM<=5;

结果如下:

图4

3.数据库对象

1)基于 EMP 表和 DEPT 表创建一个只读视图,该视图中只包含员工编号、姓名、工作、入职日期和部门名称,隐藏了员工的工资、奖金、部门编号等信息。

CREATE OR REPLACE VIEW EMPDETAIL

AS

SELECT EMPNO,ENAME,JOB,HIREDATE,DNAME

FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO

WITH READ ONLY;

查询创建的 EMPDETAIL 视图:

结果如下:

图5

2)为 EMP 表的 ENAME 列创建唯一索引,为 EMP 表的工资列创建普通索引,把 JOB 列先变为小写再创建索引

CREATE UNIQUE INDEX UQ_ENAEM_IDX ON EMP(ENAME);

CREATE INDEX IDX_SAL ON EMP(SAL);

CREATE INDEX IDX_JOB_LOWER ON EMP(LOWER(JOB));

 使用下面的 SELECT 命令查看表 EMP 的索引:

SELECT INDEX_NAME,INDEX_TYPE,TABEL_OWNER,TABLE_NAME,UNIQUENESS

FROM USER_INDEXES WHERE TABLE_NAME='EMP';

结果如下:

图6

4. 块、存储过程和触发器

1)声明一个名为sname 的变量

DECLARE

SNAME VARCHAR2(20):='jerry';

BEGIN

SNAME:SNAME||'and tom';

DBMS_OUTPUT.PUT_LINE(sname);

END;

在SQL *Plus 中输出数据时,可能没有结果显示,可以使用命令:set serveroutput on设置输出到 SQL *Plus 控制台上。

​ 输出结果如图所示

图7

2)创建一个显示雇员总人数的存储过程。

CREATE OR REPLACE PROCEDURE EMP_COUNT

AS

V_TOTAL NUMBER(10);

BEGIN

SELECT COUNT(*) INTO V_TOTAL FROM EMP;

DBMS_OUTPUT.PUT_LINE('雇员总人数为:'||V_TOTAL);

END;

存储过程需要点击 SQL Developer 的“运行”按钮才能执行,如果存在错误,就会显示:“警告:创建的过程带有编译错误”。如果存在错误,对脚本进行修改,直到没有错误产生。如果编译结果正确,将显示:“过程已编译”。

调用存储过程,在工作表中输入以下语句并执行:

结果如下:

图8

 3)制作一个数据库触发器。记录所有对 EMP 表进行的 INSERT、UPDATE和DELETE 操作。

CREATE TABLE EMP_LOG(

who varchar2(30),

when date);

CREATE OR REPLACE TRIGGER EMP_OP

BEFORE INSERT OR UPDATE OR DELETE

ON EMP

BEGIN

INSERT INTO EMP_LOG (who,when)

VALUES(user,sysdate);

END EMP_OP;

执行 EMP 表更新操作,查看日志表,结果如下:

图9

五、实验结论及思考题

实验结论:

SQL语言变化要灵活运用,对查询和视图,存储触发器的代码使用和运用更要更加的灵活。

对于一些的查询自己要运用数据库中的笛卡尔相关运算进行解决。

思考题:

  1. 查询出比所有销售员的工资都高的员工姓名、工作和工资。请写出 SELECT命令,并给出查询结果截图

 SELECT ENAME,JOB,SAL FROM EMP

WHERE SAL>ALL (SELECT SAL FROM EMP WHERE JOB='SALESMAN');

查询结果如下:

图10

2、查询出 EMPDETAIL 视图中第 5 条到第 10 条之间的记录。请写出 SELECT命令,并给出查询结果截图。

SELECT *FROM (SELECT rownum no, EMPNO, ENAME, JOB, HIREDATE, DNAME FROM EMPDETAIL WHERE rownum<=10 ORDER BY rownum ASC) WHERE no>=5;

结果如下:

图11

3、创建一个存储过程,显示工资最低的雇员名字。请写出创建存储过程的代码,并给出存储过程的执行结果截图。

CREATE OR REPLACE PROCEDURE SAL_LOW

AS

V_LOW STRING(20);

BEGIN

SELECT ENAME INTO V_LOW FROM EMP WHERE ROWNUM=1 ORDER BY SAL ASC;

DBMS_OUTPUT.PUT_LINE('最低工资:'||V_LOW);

END;

结果如下:

图12

六、总结及心得体会

  1. 实验过程中会遇到一些命令执行失败,之后发现是自己的相关命令的用法出现错误。
  2. 在实验过程中要融汇变通,对课堂上讲述的命令进行变换和总结。
  3. 同时在实验过程中要认真仔细,对出问题的每一个过程进行分析总结,运用课堂知识进行解决。

七、对本实验过程及方法、手段的改进建议

1.另外,可以适当增加一些SQL语言的练习,以便对学习的知识进行掌握。

2.建议实验步骤相关部分可以不给出代码,让学生们自己撰写。

猜你喜欢

转载自blog.csdn.net/weixin_53284122/article/details/129219643