一、数据库对象
1.为表vendor_master(vid,vname, VENADD1, VENADD2, VENADD3)创建一个视图,该视图将VENADD1、VENADD2和VENADD3(地址的三部分,都为varchar2性) 3个列连接起来组成名为VENADDRES的列.
2.创建名为“my_seq”的序列,该序列的起始值为1000,并在每次查询时增加10,直到该序列达到1100,然后重新从1000开始.
3.在表order_detail(oid,orderno,venderid, itemcode,customerid,customaddr)表的orderno和itemcode列上创建一个唯一组合索引.
--1.为表vendor_master(vid,vname, VENADD1, VENADD2, VENADD3)创建一个视图,
--该视图将VENADD1、VENADD2和VENADD3(地址的三部分,都为varchar2性) 3个列连接起来组成名为VENADDRES的列.
CREATE TABLE VENDOR_MASTER(
Vid NUMBER(4) PRIMARY KEY,
Vname VARCHAR2(20) NOT NULL,
VENADD1 VARCHAR2(20) NOT NULL,
VENADD2 VARCHAR2(20) NOT NULL,
VENADD3 VARCHAR2(20) NOT NULL
);
--创建视图
CREATE VIEW VENADD5 AS
SELECT "CONCAT"("CONCAT"(VENADD1,VENADD2),VENADD3) AS VENADDRES
FROM VENDOR_MASTER;
SELECT * FROM VENADD5;
--2.创建名为“my_seq”的序列,该序列的起始值为1000,并在每次查询时增加10,直到该序列达到1100,然后重新从1000开始.
CREATE SEQUENCE my_seq
START WITH 1000
INCREMENT BY 10
MAXVALUE 1100
CYCLE;
--3.在表order_detail(oid,orderno,venderid, itemcode,customerid,customaddr)表的orderno和itemcode列上创建一个唯一组合索引.
CREATE TABLE ORDER_DETAIL(
oid NUMBER(4) NOT NULL,
orderno NUMBER(4) NOT NULL,
venderid NUMBER(4) NOT NULL,
itemcode NUMBER(4),
customerid NUMBER(4) NOT NULL,
customaddr VARCHAR2(20)
);
CREATE UNIQUE INDEX X
ON ORDER_DETAIL(orderno,itemcode);
二、使用如下表
emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号)
dept部门表(deptno部门编号/dname部门名称/loc地点)
尽量用视图完成以下查询
1、列出月薪比 "BLAKE" 少的所有雇员
2、列出至少有一个雇员的部门详细信息
3、列出所有雇员的姓名及其直接上级的姓名。
4、列出入职日期早于其直接上级的所有雇员
5、列出没有雇员的部门信息
6、列出所有“CLERK”(办事员)的姓名及其部门名称
7、列出最低薪金大于1500的工作类别信息
8、列出月薪高于公司平均水平的所有雇员
9、列出与“SCOTT”从事相同工作的所有雇员
10、列出某些雇员的姓名和薪金,条件是他们的月薪高于部门30中所有雇员的薪金
11、列出每个部门的信息以及该部门中雇员的数量--
12、列出所有雇员的雇员名称、部门名称和月薪
13、列出各个部门的MANAGER(经理)的最低薪金
14、列出所有雇员的年薪,并且按年薪排序
15、列出薪金水平处于第四位到第七位的雇员
-- 创建总的视图,将两个表合并在一个视图中
CREATE VIEW VEMP AS
SELECT EMP.*,DEPT.DNAME,DEPT.LOC
FROM DEPT,EMP
WHERE DEPT.DEPTNO=EMP.DEPTNO;
--1、列出月薪比 "BLAKE" 少的所有雇员
SELECT EMPNO,ENAME
FROM VEMP
WHERE SAL<(SELECT SAL FROM VEMP WHERE ENAME='BLAKE');
--2、列出至少有一个雇员的部门详细信息
SELECT DISTINCT DEPTNO,DNAME,LOC
FROM VEMP
WHERE DEPTNO IN
(SELECT DEPTNO
FROM VEMP
GROUP BY DEPTNO
HAVING "COUNT"(DEPTNO)>0);
--3、列出所有雇员的姓名及其直接上级的姓名。
SELECT V.ENAME,W.ENAME
FROM VEMP V LEFT JOIN VEMP W
ON W.EMPNO=V.MGR;
--4、列出入职日期早于其直接上级的所有雇员
SELECT V.ENAME,W.ENAME
FROM VEMP V LEFT JOIN VEMP W
ON W.EMPNO=V.MGR
WHERE V.HIREDATE0);
--6、列出所有“CLERK”(办事员)的姓名及其部门名称-
SELECT ENAME,DNAME
FROM VEMP
WHERE JOB='CLERK';
--7、列出最低薪金大于1500的工作类别信息
SELECT JOB,DNAME
FROM VEMP
WHERE SAL>1500;
--8、列出月薪高于公司平均水平的所有雇员
SELECT EMPNO,ENAME
FROM VEMP
WHERE SAL>(SELECT "AVG"(SAL) FROM VEMP);
--9、列出与“SCOTT”从事相同工作的所有雇员
SELECT EMPNO,ENAME
FROM VEMP
WHERE JOB=(SELECT JOB FROM VEMP WHERE ENAME='SCOTT') AND ENAME!='SCOTT';
--10、列出某些雇员的姓名和薪金,条件是他们的月薪高于部门30中所有雇员的薪金
SELECT ENAME ,SAL
FROM VEMP
WHERE SAL>(SELECT "MAX"(SAL) FROM VEMP WHERE DEPTNO=30);
--11、列出每个部门的信息以及该部门中雇员的数量
SELECT DEPT.*,(SELECT "COUNT"(*) FROM VEMP W WHERE DEPT.DEPTNO=W.DEPTNO)
FROM DEPT;
--12、列出所有雇员的雇员名称、部门名称和月薪
SELECT ENAME,DNAME,SAL+"NVL"(COMM,0) MONTHSAL
FROM VEMP;
--13、列出各个部门的MANAGER(经理)的最低薪金
SELECT DEPTNO,"MIN"(SAL)
FROM VEMP
WHERE "JOB"='MANAGER'
GROUP BY DEPTNO;
--14、列出所有雇员的年薪,并且按年薪排序
SELECT ENAME,(SAL+"NVL"(COMM,0))*12 YEARSAL
FROM VEMP
ORDER BY YEARSAL ASC;
--15、列出薪金水平处于第四位到第七位的雇员
SELECT *
FROM (SELECT V.*,ROW_NUMBER() OVER(ORDER BY SAL)RANK
FROM VEMP V ) YEARA
WHERE YEARA."RANK" BETWEEN 4 AND 7;