pl/sql练习2

--创建职员表
CREATE TABLE tb_emp
(
   ID        number     PRIMARY KEY,--职员编号
   NAME    VARCHAR2(20)    NOT NULL,--职员姓名
   Sex        VARCHAR2(2)    NOT NULL    CHECK(sex IN ('男','女')),--职员性别                            
   Age        number    NOT NULL CHECK(age>=18),--职员年龄
   Address    VARCHAR2(50)    NOT NULL, --职员地址
   Tel        VARCHAR2(30)    NOT NULL,--职员电话
   Email    VARCHAR2(30)--职员邮箱
);
--插入数据
INSERT INTO tb_emp
(ID,NAME,sex,age,address,tel)
VALUES
(1,'赵龙','男',25,'湖南省长沙市伍家岭江南苑9栋203号','0731-4230123');
INSERT INTO tb_emp
(ID,NAME,sex,age,address,tel)
VALUES
(2,'李云','女',23,'湖南省长沙市东风路东风新村21栋502号','0731-4145268');
INSERT INTO tb_emp
(ID,NAME,sex,age,address,tel)
VALUES
(3,'孙一成','男',24,'湖南省株洲市601厂宿舍15栋308号','0732-8342567');
INSERT INTO tb_emp
(ID,NAME,sex,age,address,tel)
VALUES
(4,'林笑','男',27,'湖南省郴洲市人民医院20栋301号','0735-2245214');
INSERT INTO tb_emp
(ID,NAME,sex,age,address,tel)
VALUES
(5,'卫晴','女',23,'湖南省长沙市望月湖12栋403号','0731-8325124');
--创建商品表
CREATE TABLE tb_Prod
(
   ID        number     PRIMARY KEY,--商品编号
   TYPE    VARCHAR2(20)    NOT NULL,--商品类型
   Mark    VARCHAR2(20)    NOT NULL,--商品品牌
   Spec    VARCHAR2(20)--商品规格
);
--插入数据
SELECT * FROM tb_prod;

INSERT INTO tb_prod VALUES(1,'电视机','长虹','29英寸纯平');

INSERT INTO tb_prod VALUES(2,'电视机','长虹','29英寸纯平艺术');

INSERT INTO tb_prod VALUES(3,'电视机','长虹','32英寸背投');

INSERT INTO tb_prod VALUES(4,'电视机','熊猫','29英寸纯平');

INSERT INTO tb_prod VALUES(5,'电视机','熊猫','29英寸纯平艺术');

INSERT INTO tb_prod VALUES(6,'电视机','熊猫','32英寸背投');

INSERT INTO tb_prod VALUES(7,'笔记本','联想','P4-1.8G');

INSERT INTO tb_prod VALUES(8,'笔记本','联想','P4-2.4G');

INSERT INTO tb_prod VALUES(9,'笔记本','紫光','P4-1.8G');

INSERT INTO tb_prod VALUES(10,'笔记本','紫光','P4-2.4G');
--创建销售表
CREATE TABLE tb_Sales
(
   srNO        number     PRIMARY KEY,--记录编号
   eID        number    NOT NULL REFERENCES tb_emp(id),--职员编号
   pID        number    NOT NULL REFERENCES tb_prod(id),--商品编号
   pQty        number    NOT NULL CHECK(pqty>0),--销售数量
   pAmount    number        NOT NULL CHECK(pamount>0),--销售价值
   sDate    date    default sysdate --销售时间
);
--插入数据
INSERT INTO tb_sales VALUES(1,1,1,10,21000,to_date('2004-3-12','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(2,1,2,5,20000,to_date('2004-3-12','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(3,1,1,4,23500,to_date('2004-3-14','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(4,1,5,4,16500,to_date('2004-3-14','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(5,2,3,3,31000,to_date('2004-3-11','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(6,2,6,4,40000,to_date('2004-3-13','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(7,3,7,5,40000,to_date('2004-3-13','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(8,3,8,3,36000,to_date('2004-3-14','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(9,4,9,6,41500,to_date('2004-3-12','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(10,4,10,5,50000,to_date('2004-3-14','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(11,1,1,10,21000,to_date('2004-4-12','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(12,1,2,5,20000,to_date('2004-4-12','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(13,1,4,12,23500,to_date('2004-4-14','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(14,1,5,4,16500,to_date('2004-4-14','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(15,2,3,3,31000,to_date('2004-4-11','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(16,2,6,4,40000,to_date('2004-4-13','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(17,3,7,5,40000,to_date('2004-4-13','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(18,3,8,3,36000,to_date('2004-4-14','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(19,4,9,6,41500,to_date('2004-4-12','yyyy-mm-dd'));

INSERT INTO tb_sales VALUES(20,4,10,5,50000,to_date('2004-4-14','yyyy-mm-dd'));
--练习
--1. 查询所有职员的所有信息
SELECT * FROM tb_emp;
--2. 查询所有职员的姓名,电话,地址
select name,tel,address from tb_emp;
--3. 查询所有女职员的详细信息
select * from tb_emp where sex='女';
--4. 查询年龄在24到26岁之间的职员的姓名,性别
select name,sex from tb_emp where age between 24 and 26;
--5. 查询家住长沙的女职员的姓名,电话,地址
select name,tel,address from tb_emp 
where sex='女' and instr(address,'长沙')>0;
--6. 查询李云,孙一成,林笑的电话,地址
select tel,address from tb_emp 
where name='李云' or name='孙一成' or name='林笑';
--7. 查询郴洲和株洲的职员的姓名,性别,年龄
select name,sex,age 
from tb_emp 
where instr(address,'郴洲')>0 or instr(address,'株洲')>0;
--8. 查询家住长沙,年龄在25到28岁之间的男职员的姓名
select name from tb_emp 
where instr(address,'长沙')>0 and age between 25 and 28
and sex='男';
--9. 查询邮件地址为空的职员
select * from tb_emp where email is null;
--合计
SELECT * FROM tb_emp;
SELECT * FROM tb_sales;
SELECT * FROM tb_prod;
--1. 总共有多少个职员?
select count(*) from tb_emp;
--3. 年龄最小的女职员的年龄
select min(age) from tb_emp where sex='女'; 
--7. 按性别统计职员的最大年龄和最小年龄
select sex,max(age),min(age) from tb_emp group by sex;
--4. 笔记本单笔销售价值最高的单笔销售价值
select max(s.pamount) amount 
from tb_sales s,tb_prod p 
where s.pid=p.id and p.type='笔记本';
--5. 熊猫电视机的平均销售价格
select p.mark,sum(s.pamount)/sum(s.pqty) 
from tb_sales s,tb_prod p 
where s.pid=p.id and p.mark='熊猫'
group by p.mark;
--6. 紫光笔记本4月份的销售总额
select sum(s.pamount) 
from tb_sales s,tb_prod p 
where s.pid=p.id and p.mark='紫光' and to_char(sdate,'mm')=4
group by p.mark;
--分组与合计
SELECT * FROM tb_emp;
SELECT * FROM tb_sales;
SELECT * FROM tb_prod;
--1. 按类型,品牌统计商品的销售总数量,销售总数量,低于20的不统计
select p.type,p.mark,sum(s.pqty)
from tb_sales s,tb_prod p
where s.pid=p.id
group by p.type,p.mark
having sum(s.pqty)>20;
--2. 按品牌,规格统计笔记本的平均销售价格,按销售价格从高到低的顺序显示
select p.mark,p.spec,round(sum(s.pamount)/sum(s.pqty))
from tb_sales s,tb_prod p
where s.pid=p.id
group by p.mark,p.spec
order by round(sum(s.pamount)/sum(s.pqty)) desc;
--3. 按姓名统计男职员3月份的销售总额,销售总额低于80000的不统计
select e.name,sum(s.pamount) 
from tb_emp e,tb_sales s
where s.eid=e.id and e.sex='男' and to_char(s.sdate,'mm')=3
group by e.name
having sum(s.pamount)>80000;
--4. 找出销售总额最高的职员的姓名
select * from (
select e.name,sum(s.pamount)
from tb_emp e,tb_sales s
where s.eid=e.id
group by e.name
order by sum(s.pamount) desc
) 
where rownum=1;

--5. 按姓名统计每个职员一共完成了多少笔销售业务
select e.name,count(s.eid)
from tb_emp e,tb_sales s
where s.eid(+)=e.id
group by e.name;
--6. 找出完成销售业务笔数最少的职员的姓名和他完成的业务数
select e.name,count(s.eid)
from tb_emp e,tb_sales s
where s.eid(+)=e.id
group by e.name
having count(s.eid)<=all(
select count(s.eid)
from tb_emp e,tb_sales s
where s.eid(+)=e.id
group by e.name
);
--多表查询
SELECT * FROM tb_emp;
SELECT * FROM tb_sales;
SELECT * FROM tb_prod;
--1. 所有职员,所有商品的销售情况,
--包括:职员姓名,商品类别,商品品牌,商品规格,销售数量,销售价值,
--销售时间,按销售时间从高到低排列
select e.name,p.type,p.mark,p.spec,s.pqty,s.pamount,s.sdate 
from tb_emp e,tb_sales s,tb_prod p
where e.id=s.eid and s.pid=p.id
order by s.sdate desc;
--2. 笔记本4月份的销售情况,
--包括:商品编号,商品品牌,商品规格,销售数量,销售价值,按销售数量从低到高排列
select s.pid,p.mark,p.spec,s.pqty,s.pamount,s.sdate 
from tb_sales s,tb_prod p
where s.pid=p.id and to_char(sdate,'mm')=4 and p.type='笔记本'
order by s.pqty asc;
--3. 李云3月份的销售情况,包括:商品编号,商品品牌,商品规格,销售数量,销售价值
--1.李云在tb_emp表,商品编号,商品品牌,商品规格在tb_prod表,
--销售数量,销售价值在tb_sales表
--三张表连接,
--2.找关联条件
--3.找筛选条件
SELECT e.name,p.id,p.type AS 商品规格,p.mark AS 商品品牌,s.pqty AS 销售数量,
s.pamount 销售价格
FROM tb_emp e,tb_prod p,tb_sales s
WHERE e.id = s.eid AND p.id = s.pid
AND e.name='李云'
AND to_char(s.sdate,'mm')='03';
--4. 长虹29英寸纯平艺术电视机的销售情况,包括:销售数量,销售价值,销售时间
select s.pqty,s.pamount,s.sdate
from tb_prod p,tb_sales s
where p.id=s.pid
and p.type='电视机'
and p.mark='长虹'
and p.spec='29英寸纯平艺术';
--5. 长沙男职员4月份的销售情况,包括:职员姓名,商品类别,商品品牌,
--商品规格,销售数量,销售价值
select e.name,p.type,p.mark,s.pqty,s.pamount
from tb_prod p,tb_sales s,tb_emp e
where p.id=s.pid and s.eid=e.id
and e.sex='男' 
and e.address like'%长沙%'
and to_char(sdate,'mm')='04';

猜你喜欢

转载自blog.csdn.net/TKHKHT/article/details/85164543