一、多表查询综合练习

1、  列出高于在30部门工作的所有人员的薪金的员工的姓名、部门名称、部门编号、部门人数

分析:

需要的员工信息:

|-emp表:姓名、部门编号

|-dept表:部门名称、部门编号

|-emp表:统计部门人数

确认关联关系:

  emp.deptno=dept.deptno

1)    查询出在30部门工作的所有人员的薪金

select sal from emp where deptno=30 ;

2)    找出工资大于30部门的员工的姓名、部门编号(返回多行单列数据,在where子句子查询)

select e.ename, e.deptno, e.sal
from emp e
where e.sal >all (select sal from emp where deptno=30) ;

3)    统计显示部门的名称

select e.deptno, e.sal, d.dname
from emp e, dept d
where sal >all (select sal from emp where deptno=30) and (d.deptno = e.deptno) ;

4)   在emp表中统计出部门的各个人数,子查询中查询部门人数,返回多行多列表

select deptno dno, count(empno)  count
from emp
group by deptno ;

5)    多行多列表在from子句中查询结果

select e.ename,d.dname, e.deptno, temp.count
from emp e, dept d,(select deptno dno, count(empno) count
from emp
group by deptno) temp
where sal >all (select sal from emp where deptno=30)
and (d.deptno = e.deptno)
and temp.dno=d.deptno ;

2、 列出与scott从事相同工作的所有员工信息以及部门名称,部门人数,领导姓名

分析:

需要的员工信息:

|-emp表:员工名称,工资

|-dept表:部门名称

|-emp表:统计部门人数

|-emp表:统计领导信息

确认关联关系:

|-部门联系 emp.deptno=dept.deptno

|-领导联系 emp.mgr=memp.empno

1)   查询出scott从事的工作

select job from emp where ename='SCOTT';

2)   与scott从事相同工作的所有员工信息,子查询返回“单行单列“

select e.empno, e.ename, e.sal
from emp e
where e.job=(select job from emp where ename='SCOTT');

3)   加入显示部门名称,加入dept表

select e.empno, e.ename, e.sal, d.dname
from emp e, dept d
where e.job=(select job from emp where ename='SCOTT')
and (d.deptno = e.deptno);

4)   加入显示部门人数,子查询返回多行多列

select  e.empno, e.ename, e.sal, d.dname , temp.cou
from emp e, dept d, (select deptno dno, count(empno) cou
from emp
group by deptno) temp
where job=(select job from emp where ename='SCOTT')
and (d.deptno = e.deptno)
and temp.dno=d.deptno;

5)   加入显示领导姓名,使用emp表的自身关联,并消除“SCOTT”

select e.empno, e.ename, e.job, e.mgr, e.hiredate, e.sal, e.comm, d.dname, temp.cou, m.ename
from emp e, dept d, (select deptno dno, count(empno) cou
from emp
group by deptno) temp, emp m
where e.job=(select job
from emp
where ename='SCOTT')
and d.deptno = e.deptno
and temp.dno=d.deptno
and e.mgr=m.empno
and e.ename<>'SCOTT';

3、查询出比 'SMITH'或'ALLEN'薪资高的员工的编号、姓名、工资、部门名称、领导名称、部门人数、平均工资和最高及最低工资

select e.empno, e.ename, e.sal, d.dname, m.ename, temp.count, temp.avg, temp.max, temp.min
from emp e,dept d,emp m,(select deptno dno, count(empno) count, avg(sal) avg , max(sal) max, min(sal) min
from emp
group by deptno) temp
where e.sal >any (select sal from emp where ename in ('SMITH','ALLEN'))
--and e.ename<>'SMITH'
--and e.ename<>'ALLEN'
and e.ename not in ('SMITH','ALLEN')
and e.deptno=d.deptno(+)
and e.mgr=m.empno(+)
and d.deptno=temp.dno(+);

4、查询出有比直接领导就职时间早的雇员的编号,姓名,部门名称,部门位置和部门人数

select e.empno, e.ename, d.dname, d.loc, temp.count
from emp e, emp m, dept d, (select deptno dno, count(empno) count
from emp
group by deptno) temp
where e.mgr=m.empno(+)
and e.hiredate < m.hiredate
and d.deptno=e.deptno(+)
and d.deptno=temp.dno(+);

5、列出所有“CLERK”(办事员 )的姓名,部门名称,部门人数和工资等级

select e.ename, d.dname, temp.count, s.grade
from emp e,
dept d,
(select deptno dno, count(empno) count from emp group by deptno) temp,
salgrade s
where e.job = 'CLERK'
and d.deptno = e.deptno
and d.deptno = temp.dno
and e.sal between s.losal and s.hisal;

二、创建一个超市商品记录数据库,并进行增加,修改,删除,查询等操作,设置约束条件,包括主外键,非空约束等

1、   数据表的建立

--数据删除
DROP TABLE purchase PURGE;
DROP TABLE product PURGE;
DROP TABLE customer PURGE; --数据表的建立
--1、创建顾客表:
create table customer (
customerid varchar2(3),
c_name varchar2(20) not null,
loction varchar2(30),
CONSTRAINT pk_customerid PRIMARY KEY(customerid) --主键设置
); --2、创建商品表:
create table product(
productid varchar2(3),
productname varchar2(20) not null,
unitprice number,
p_category varchar2(20),
provider varchar2(20),
CONSTRAINT ck_unitprice CHECK (unitprice>0), --检查设置
CONSTRAINT pk_productid PRIMARY KEY(productid) --主键设置
); --3、创建购买表:
create table purchase(
customerid varchar2(3),
productid varchar2(20),
quantity number,
CONSTRAINT ck_quantity CHECK (quantity BETWEEN 0 AND 20), --检查设置
CONSTRAINT fk_customerid FOREIGN KEY(customerid) REFERENCES customer(customerid) ON DELETE CASCADE, --外键的设置
CONSTRAINT fk_productid FOREIGN KEY(productid) REFERENCES product(productid) ON DELETE CASCADE --外键的设置
); 

--提交事务
commit;

2、   数据的添加

--测试数据
INSERT INTO product(productid, productname, unitprice, p_category, provider)
VALUES('M01', '佳洁士', 8.00, '牙膏','宝洁');
INSERT INTO product(productid, productname, unitprice, p_category, provider)
VALUES('M02', '高露洁', 6.50 , '牙膏','高露洁');
INSERT INTO product(productid, productname, unitprice, p_category, provider)
VALUES('M03', '洁诺', 5.00, '牙膏','联合利华');
INSERT INTO product(productid, productname, unitprice, p_category, provider)
VALUES('M04', '舒肤佳', 3.00, '香皂','宝洁');
INSERT INTO product(productid, productname, unitprice, p_category, provider)
VALUES('M05', '夏士莲', 5.00, '香皂','联合利华');
INSERT INTO product(productid, productname, unitprice, p_category, provider)
VALUES('M06', '雕牌', 2.50, '洗衣粉','纳爱斯');
INSERT INTO product(productid, productname, unitprice, p_category, provider)
VALUES('M07', '中华', 3.50, '牙膏','联合利华');
INSERT INTO product(productid, productname, unitprice, p_category, provider)
VALUES('M08', '汰渍', 3.00, '洗衣粉','宝洁');
INSERT INTO product(productid, productname, unitprice, p_category, provider)
VALUES('M09', '碧浪', 4.00, '洗衣粉','宝洁'); INSERT INTO customer(customerid, c_name, loction)
VALUES('C01', 'Dennis', '海淀');
INSERT INTO customer(customerid, c_name, loction)
VALUES('C02', 'John', '朝阳');
INSERT INTO customer(customerid, c_name, loction)
VALUES('C03', 'Tom', '东城');
INSERT INTO customer(customerid, c_name, loction)
VALUES('C04', 'Jenny', '东城');
INSERT INTO customer(customerid, c_name, loction)
VALUES('C05', 'Rick', '西城'); INSERT INTO purchase(customerid, productid, quantity)
VALUES('C01', 'M01', 3);
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C01', 'M05', 2);
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C01', 'M08', 2);
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C02', 'M02', 5);
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C02', 'M06', 4);
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C03', 'M01', 1);
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C03', 'M05', 1);
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C03', 'M06', 3);
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C03', 'M08',1 );
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C04', 'M03', 7);
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C04', 'M04', 3);
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C05', 'M06', 2);
INSERT INTO purchase(customerid, productid, quantity)
VALUES('C05', 'M07', 8); --提交事务
commit;

3、对数据库进行操作

第一问:查询出购买过宝洁产品的用户详细信息

select  DISTINCT *
from customer
where customerid in (
select customerid
from purchase
where productid in (
select productid
from product
where provider='宝洁'
));

第二问:查询出购买了顾客"Dennis"购买过的所有商品的顾客信息

1)   查询出顾客"Dennis"所购买的商品

select productid
from purchase
where customerid in (
select customerid
from customer
where c_name = 'Dennis');

2)   使用exists()判断行,MINUS集合运算比较出其他顾客与“Dennis”所购买商品的集合,集合为空表示购买过“Dennis”所购买所有商品,集合不为空则没有购买过“Dennis”所购买所有商品。

select *
from customer cu2
where not exists ((
select p1.productid
from purchase p1
where p1.customerid in (
select customerid
from customer
where c_name = 'Dennis'))
MINUS
(select p2.productid
from purchase p2
where p2.customerid in (
select cu1.customerid
from customer cu1
                     where cu1.c_name=cu2.c_name)))
and c_name<>'Dennis';

补充:

a、eixsts()的相关用法:http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html

b、集合运算union、union all、intersect和minus

①union:连接两个子查询的和,消除重复行

②union all: 连接两个子查询的和,不消除重复行

③intersect:获取两个子查询的结果,值返回同时存在两个子查询的数据行

④minus:返回从第一个子查询的结果,但没有在第二个子查询返回的结果

第三问:查询出牙膏销量最高的供应商

1)   查询出供应牙膏的供应商和商品id

select  provider,productid
from product
where p_category='牙膏' ;

2)   查询出牙膏销量最高的供应商

select temp.provider, sum(p.quantity) sum
from purchase p, (select provider,productid
from product
where p_category='牙膏') temp
where p.productid=temp.productid
group by temp.provider
HAVING sum(p.quantity)=(
select max(sum(p.quantity))
from purchase p, (select provider,productid
from product
where p_category='牙膏') temp
where p.productid=temp.productid
group by temp.provider);

第四问:所有的牙膏商品单价增加10%

UPDATE product SET unitprice=unitprice*1.1 where p_category='牙膏' ;

第五问:删除从未被购买的商品

DELETE FROM product WHERE productid not in (select productid from purchase);

Oracle 数据库基础学习 (七) SQL语句综合练习的更多相关文章

  1. Oracle 数据库 基础学习 (一) SQL基本知识

    Oracle 从零开始,不知所措.要掌握一种技能,最好的方式是先学会怎么使用它,然后再深入学习,先有样子,再有技术.   一,什么是数据库? 为什么需要数据库? 数据库实质上是一个信息的列表,或者是一 ...

  2. Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)

    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项) A.cat B.concat C.join D.+ 解答:B

  3. Oracle数据库查看表空间sql语句

    转: Oracle数据库查看表空间sql语句 2018-09-03 15:49:51 兰海泽 阅读数 6212   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...

  4. Oracle 数据库基础学习 (三) Oracle 四个表结构

    Oracle 四个表的 emp dept  salgrade  bunus 的结构,记住有利于后期SQL语句的学习 雇员表(emp) No. 字段 类型 描述 1 empno NUMBER(4) 表示 ...

  5. Oracle数据库更新时间的SQL语句

    ---Oracle数据库更新时间字段数据时的sql语句---格式化时间插入update t_user u set u.name='pipi',u.modifytime=to_date('2015-10 ...

  6. 抓取oracle数据库耗费资源的sql语句

    oracle数据库连接业务系统,而有些sql语句的执行严重影响了oracle的性能,就如同mysql的慢查询一样,mysql可以开启慢查询日志定位这些造成数据库性能下降的语句,而oracle同样可以做 ...

  7. cmd连接Oracle数据库成功后输入sql语句返回 2

    解决办法 : sql语句后一定要跟分号  .

  8. Oracle 数据库基础学习 (八) PL/SQL综合练习

    1.定义游标:列出每个员工的姓名.部门名称并编程显示第10个到第20个记录. declare cursor zemp_cursor is (select temp.ename, temp.dname ...

  9. Oracle 数据库基础学习 (二) 学习小例子:创建一个表,记录商品买卖的情况

      运行环境:Oracle database 11g + PL/SQL Developer ex: --创建一个表 create table plspl_test_product( --加入not n ...

随机推荐

  1. 一个Java程序员的实习总结(2)

    在今天的总结里,主要讲述第二.三周这半个月的培训情况,并且穿插讲讲我对实习和见习的看法,有需要有兴趣的童鞋可以看看. 半个月的见习 其实我更愿意把实习和见习分开讲,实习指的是还没签三方或者直接就是大三 ...

  2. [nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

    蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体 ...

  3. 一次Mysql 死锁事故

    故障描述: 简单描述一下需求:我们写的一个计步器的客户端软件,用户通过手机客户端将用户的运动计步信息传到服务器. 服务器侧记录每个用户每次上传明细,同时每个用户有一个汇总值,参与全省排名. 1.加入明 ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (15) -----第三章 查询之与列表值比较和过滤关联实体

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-8与列表值比较 问题 你想查询一个实体,条件是给定的列表中包含指定属性的值. 解 ...

  5. 《SQL必知必会》—— 读后总结

  6. 重温 w3cshool css3

    border-radius: 2em 1em 4em / 0.5em 3em;  兼容性IE9+.Firefox 4+.Chrome.Safari 5+ 以及 Opera 支持 border-radi ...

  7. 每天多一点(2016.12.04)》Javascript隐式转换

    乱想 javascript为什么需要隐式转换?如果没有会出现什么情况? 找了一圈没有看到关于这个的讨论,只好自己研究了,可能不一定正确,自行辨知. 郁闷就是郁闷在好好的,为什么要搞个隐式转换,一般来讲 ...

  8. 【.NET深呼吸】存储基于本地线程的值

    在特定情况,我们希望这样一个场景: N个线程同时调用同一个类实例的同一个操作方法,并且同一个变量可以面向每一个线程存储独立的值.比如,某变量X,它对于线程A的值与对于线程B的值是相互独立的.线程A设置 ...

  9. 火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题

    一.先遇到document.body.scrollTop值为0的问题 做页面的时候可能会用到位置固定的层,读取document.body.scrollTop来设置层的位置,像这样, window.on ...

  10. Android Fragment---执行Fragment事务

    转载博客:http://blog.csdn.net/think_soft/article/details/7272853 在Activity中使用有关Fragment的添加.删除.替换以及用它们执行其 ...