当前位置: 首页 > 面试题库 >

Oracle SQL示例数据库

易招
2023-03-14
问题内容

我正在尝试通过它提供的html" target="_blank">数据库学习Oracle SQL。我在某处发现了要完成的任务。数据库结构由Oracle提供:

CREATE TABLE EMP
(EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR NUMERIC(4),
HIREDATE DATETIME,
SAL NUMERIC(7, 2),
COMM NUMERIC(7, 2),
DEPTNO NUMERIC(2))

INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, '17-DEC-1980', 800, NULL, 20)
INSERT INTO EMP VALUES
(7499, 'ALLEN', 'SALESMAN', 7698, '20-FEB-1981', 1600, 300, 30)
INSERT INTO EMP VALUES
(7521, 'WARD', 'SALESMAN', 7698, '22-FEB-1981', 1250, 500, 30)
INSERT INTO EMP VALUES
(7566, 'JONES', 'MANAGER', 7839, '2-APR-1981', 2975, NULL, 20)
INSERT INTO EMP VALUES
(7654, 'MARTIN', 'SALESMAN', 7698, '28-SEP-1981', 1250, 1400, 30)
INSERT INTO EMP VALUES
(7698, 'BLAKE', 'MANAGER', 7839, '1-MAY-1981', 2850, NULL, 30)
INSERT INTO EMP VALUES
(7782, 'CLARK', 'MANAGER', 7839, '9-JUN-1981', 2450, NULL, 10)
INSERT INTO EMP VALUES
(7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, NULL, 20)
INSERT INTO EMP VALUES
(7839, 'KING', 'PRESIDENT', NULL, '17-NOV-1981', 5000, NULL, 10)
INSERT INTO EMP VALUES
(7844, 'TURNER', 'SALESMAN', 7698, '8-SEP-1981', 1500, 0, 30)
INSERT INTO EMP VALUES
(7876, 'ADAMS', 'CLERK', 7788, '12-JAN-1983', 1100, NULL, 20)
INSERT INTO EMP VALUES
(7900, 'JAMES', 'CLERK', 7698, '3-DEC-1981', 950, NULL, 30)
INSERT INTO EMP VALUES
(7902, 'FORD', 'ANALYST', 7566, '3-DEC-1981', 3000, NULL, 20)
INSERT INTO EMP VALUES
(7934, 'MILLER', 'CLERK', 7782, '23-JAN-1982', 1300, NULL, 10)

CREATE TABLE DEPT
(DEPTNO NUMERIC(2),
DNAME VARCHAR(14),
LOC VARCHAR(13) )

INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK')
INSERT INTO DEPT VALUES (20, 'RESEARCH', 'DALLAS')
INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO')
INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON')

CREATE TABLE BONUS
(ENAME VARCHAR(10),
JOB VARCHAR(9),
SAL NUMERIC,
COMM NUMERIC)

CREATE TABLE SALGRADE
(GRADE NUMERIC,
LOSAL NUMERIC,
HISAL NUMERIC)

INSERT INTO SALGRADE VALUES (1, 700, 1200)
INSERT INTO SALGRADE VALUES (2, 1201, 1400)
INSERT INTO SALGRADE VALUES (3, 1401, 2000)
INSERT INTO SALGRADE VALUES (4, 2001, 3000)
INSERT INTO SALGRADE VALUES (5, 3001, 9999)

现在,我想选择在本部门和薪水最高的员工。

我写了这样的东西:

select ename, salgrade.grade, dept.dname from emp, salgrade, dept
WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal
AND emp.deptno = dept.deptno group by salgrade.grade,  dept.dname, emp.ename

但是它不能正常工作。输出为:

ENAME    GRADE   DNAME
SMITH    1   RESEARCH
BLAKE    4   SALES
FORD     4   RESEARCH
KING     5   ACCOUNTING
SCOTT    4   RESEARCH
MILLER   2   ACCOUNTING
TURNER   3   SALES
WARD     2   SALES
MARTIN   2   SALES
ADAMS    1   RESEARCH
JONES    4   RESEARCH
JAMES    1   SALES
CLARK    4   ACCOUNTING
ALLEN    3   SALES

注意行:

WARD 2 SALES
MARTIN 2 SALES

同一部门有2名员工。

你能指出我的错误吗?


问题答案:

您没有过滤查询,这就是为什么要显示所有员工的原因。

这将过滤收入低于其部门/职等最高薪资的员工:

SELECT ename, salgrade.grade, dept.dname
  FROM emp, salgrade, dept
 WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal
   AND emp.deptno = dept.deptno
   AND emp.sal = (SELECT MAX(sal)
                    FROM emp emp_in, salgrade grade_in
                   WHERE emp_in.sal BETWEEN grade_in.losal AND grande_in.hisal
                     AND emp_in.deptno = emp.deptno
                     AND grade_in.losal = salgrade.losal)

您仍然会发现重复的内容,例如,有两个销售人员获得了2级的最高薪水(Martin和Ward均获得了1250)。这是可以接受的,还是您需要一些其他条件来仅选择其中一个。

您可以使用row_numberanalytic函数来确保按年级/部门只返回一行(请注意,如果有重复项,则Oracle将选择任意一行):

SELECT * FROM (
  SELECT ename, salgrade.grade, dept.dname,
         row_number() OVER (PARTITION BY dept.deptno, salgrade.grade 
                            ORDER BY emp.sal DESC) rnk
    FROM emp, salgrade, dept
   WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal
     AND emp.deptno = dept.deptno
) WHERE rnk = 1;

ENAME       GRADE DNAME          RNK
---------- ------ -------------- ---
MILLER          2 ACCOUNTING       1 
CLARK           4 ACCOUNTING       1 
KING            5 ACCOUNTING       1 
ADAMS           1 RESEARCH         1 
FORD            4 RESEARCH         1 
JAMES           1 SALES            1 
MARTIN          2 SALES            1 
ALLEN           3 SALES            1 
BLAKE           4 SALES            1


 类似资料:
  • 主要内容:Oracle示例数据库简介,Oracle示例数据库图,下载Oracle示例数据库本教程向您介绍Oracle示例数据库,并提供链接供下载。 Oracle示例数据库简介 我们为您提供一个名为 OT 的Oracle示例数据库,它基于全球虚拟公司,销售计算机硬件,包括存储,主板,RAM,视频卡和CPU。 公司保存产品信息,如:名称,描述标准成本,标价,产品线。它还跟踪所有产品的库存信息,包括产品可用的仓库。由于该公司在全球运营,因此在世界各地拥有仓库。 公司记录所有客户信息,包括姓名

  • 在本教程中,将学习如何在SQL Server中创建新数据库并执行脚本以加载示例数据库。 首先,如果您还没有示例数据库,则需要下载以下文件: 下载SQL Server示例数据库 第二步,解压缩下载的zip文件,会看到三个SQL脚本文件: - 此文件用于创建包括模式和表的数据库对象。 - 此文件用于将数据插入表中。 - 此文件用于从示例数据库中删除表及其模式。 当想要刷新示例数据库时,它非常有用。 第

  • 主要内容:数据库表在本教程中,我们将介绍一个SQL Server示例数据库:bk_stores。 以下是数据库ER图: 从图中可以看出,示例数据库有两个模式销售()和生产(),这些模式有张表。 数据库表 1. sales.stores表 表包含商店的信息。每个商店都有商店名称,联系信息,如:电话和电子邮件,以及包括街道,城市,州和邮政编码的地址。 2. sales.staffs表 表存储员工的基本信息,包括名字,姓

  • 加载示例数据 本节内容依赖以下数据: 威廉·莎士比亚全集,解析成合适的字段。点击这里下载这个数据集: shakespeare.json. 一组虚构的账户与随机生成的数据。点击这里下载这个数据集: accounts.zip. 一组随机生成的日志文件。点击这里下载这个数据集: logs.jsonl.gz. 其中有两个数据集是压缩文件,可使用以下命令解压缩文件: unzip accounts.zip g

  • 主要内容:创建新用户并授予权限,创建数据库表,将数据加载到表中在本教程中,您将学习如何在Oracle数据库服务器中创建OT 样本数据库。 请注意,本教程中的命令您可能并不熟悉,但也会影响操作。首先,只需按照说明一步一步创建示例数据库即可。可以在下一个教程中学习每个命令。 为了方便,这里分别演示在Oracle 11g和Oracle 12c下如何创建用户和导入示例数据库。 创建新用户并授予权限 首先,启动SQL plus 程序的命令行: 如下所示 - 或者从开始

  • 本文向大家介绍JavaScript操作Oracle数据库示例,包括了JavaScript操作Oracle数据库示例的使用技巧和注意事项,需要的朋友参考一下 我还是IT界的一只小菜鸟,参加工作时间不长,不过凭着自己的一颗好学的心还有自己永不停止的学习脚步,自己在编程方面也是收获颇丰~~ 一直以为JavaScript想和数据库交互必须通过AJAX来调用服务器端代码(C#或JAVA)才行,但最近才发现J