1. 程式人生 > >pl/sql練習2

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';