1. 程式人生 > >2018/12/21 oracle-sql練習

2018/12/21 oracle-sql練習

oracle-sql練習

建立以下表格用於練習

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)--職員郵箱 ); CREATE TABLE tb_Prod ( ID number PRIMARY KEY,--商品編號 TYPE VARCHAR2(20) NOT NULL,--商品型別 Mark VARCHAR2(20) NOT NULL,--商品品牌 Spec VARCHAR2(20)--商品規格 ); 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 --銷售時間 );

tb_emp員工表的資料插入

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

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

tb_Sales銷售表的資料插入

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

查詢所有職員的所有資訊

select * from tb_emp;

在這裡插入圖片描述

查詢所有職員的姓名,電話,地址

select name,tel,address
from tb_emp;

在這裡插入圖片描述

查詢所有女職員的詳細資訊

select * 
from tb_emp 
where sex='女'

在這裡插入圖片描述

查詢年齡在24到26歲之間的職員的姓名,性別

select name,sex 
from tb_emp 
where age between 24 and 26

在這裡插入圖片描述
查詢家住長沙的女職員的姓名,電話,地址

select name,tel,address
from tb_emp
where sex='女' and address like ('%長沙%')

在這裡插入圖片描述
查詢李雲,孫一成,林笑的電話,地址

select tel,address
from tb_emp
where name in ('李雲','孫一成','林笑')

在這裡插入圖片描述
查詢郴洲和株洲的職員的姓名,性別,年齡

select name,sex,age
from tb_emp
where address like ('%郴洲%') or address like ('%株洲%')

在這裡插入圖片描述
查詢家住長沙,年齡在25到28歲之間的男職員的姓名

select name
from tb_emp
where (age between 25 and 28)
and
(address like '%長沙%')
and
(sex='男')

在這裡插入圖片描述
查詢郵件地址為空的職員

select name
from tb_emp
where email is null

在這裡插入圖片描述
總共有多少個職員?

select count(*)
from tb_emp

在這裡插入圖片描述
年齡最小的女職員的年齡

select name
from tb_emp
where sex='女'
and
age in (select min(age)
from tb_emp
where sex='女'
group by sex)

在這裡插入圖片描述
這裡兩個人都是23歲,原本用的是age = (select。。。)來查詢,但是隻查詢出李雲一個人,因為這個子查詢返回兩行資料,改成in之後,結果正確。

按性別統計職員的最大年齡和最小年齡

select sex,max(age),min(age)
from tb_emp
group by sex

在這裡插入圖片描述
筆記本單筆銷售價值最高的單筆銷售價值

select max(pamount)
from tb_prod p,tb_sales s
where p.id=s.pid
group by type
having type='筆記本'

在這裡插入圖片描述
5. 熊貓電視機的平均銷售價格

select avg(pamount)
from tb_prod p,tb_sales s
where p.id=s.pid
group by mark
having mark='熊貓'

在這裡插入圖片描述
紫光筆記本4月份的銷售總額

select sum(pamount)
from tb_prod p,tb_sales s
where p.id=s.pid and to_char(sdate,'mm')=4
group by mark
having mark='紫光' 

在這裡插入圖片描述
這裡to_char函式獲得的月數是字元型別,和數字4比較的時候會隱式轉換成數字型別。

按型別,品牌統計商品的銷售總數量,銷售總數量,低於20的不統計

select type,mark,sum(pqty)
from tb_prod p,tb_sales s
where p.id=s.pid
group by type,mark
having sum(pqty)>=20

在這裡插入圖片描述
按品牌,規格統計筆記本的平均銷售價格,按銷售價格從高到低的順序顯示

select mark,spec,avg(pamount) a
from tb_prod p,tb_sales s
where p.id=s.pid
group by mark,spec
order by  a desc

在這裡插入圖片描述
按姓名統計男職員3月份的銷售總額,銷售總額低於80000的不統計

select e.name,sum(pamount) 銷售總額
from tb_prod p,tb_sales s,tb_emp e
where p.id=s.pid and e.id=s.eid 
and e.sex='男' 
and to_char(sdate,'mm')=3
group by e.name
having sum(pamount) >=80000

在這裡插入圖片描述
找出銷售總額最高的職員的姓名

select e.name,sum(pamount) sp
from tb_emp e,tb_sales s
where e.id=s.eid 
group by e.name
having sum(pamount)=(select max(a)
                    from (select sum(pamount) a
                          from tb_emp e,tb_sales s
                          where e.id=s.eid
                          group by e.id
                          order by a desc)  )

在這裡插入圖片描述
1.先求出每個員工的銷售總額倒序排序
2.再求出銷售總額最高的額度用max()函式來實現
3.再求出每個人的姓名與銷售額度,當銷售額度等於最高的銷售總額時,輸出這個人的姓名和銷售額度

按姓名統計每個職員一共完成了多少筆銷售業務

select e.name,count(s.eid) 業務數量
from tb_emp e,tb_sales s
where e.id=s.eid(+)
group by e.name

在這裡插入圖片描述
找出完成銷售業務筆數最少的職員的姓名和他完成的業務數

select e.name,count(s.eid) 業務數量
from tb_emp e,tb_sales s
where e.id=s.eid(+)
group by e.name
having count(s.eid) = (select min(ct)
                    from (select e.name,count(s.eid) ct
                    from tb_emp e,tb_sales s
                    where e.id=s.eid(+)
                    group by e.name))

在這裡插入圖片描述

所有職員,所有商品的銷售情況,
包括:職員姓名,商品類別,商品品牌,商品規格,銷售數量,銷售價值,銷售時間,按銷售時間從高到低排列

select e.name,type,mark,spec,pqty,pamount,sdate
from tb_emp e,tb_prod p,tb_sales s
where e.id=s.eid and p.id=s.pid
order by sdate desc;

在這裡插入圖片描述
筆記本4月份的銷售情況,
包括:商品編號,商品品牌,商品規格,銷售數量,銷售價值,按銷售數量從低到高排列

select p.id,p.mark,p.spec,s.pqty,s.pamount
from tb_prod p,tb_sales s
where  p.id=s.pid
and type='筆記本'
and to_char(sdate,'mm')=4
order by s.pqty asc;

在這裡插入圖片描述
李雲3月份的銷售情況,包括:商品編號,商品品牌,商品規格,銷售數量,銷售價值

select e.name,p.id,p.mark,p.spec,s.pqty,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(sdate,'mm')=3;

在這裡插入圖片描述
長虹29英寸純平藝術電視機的銷售情況,包括:銷售數量,銷售價值,銷售時間

select pamount 銷售價值,pqty 銷售數量,sdate 銷售時間
from tb_prod p,tb_sales s
where p.id=s.pid
and mark='長虹'
and spec='29英寸純平藝術';

在這裡插入圖片描述
長沙男職員4月份的銷售情況,包括:職員姓名,商品類別,商品品牌,商品規格,銷售數量,銷售價值

select e.name,p.type,p.mark,p.spec,s.pqty,s.pamount
from tb_emp e,tb_prod p,tb_sales s
where e.id=s.eid and p.id=s.pid
and sex='男'
and address like '%長沙%'
and to_char(sdate,'mm')=4;

在這裡插入圖片描述