Oracle 查詢 包括高級查詢案例

商品銷售數據庫

1--用SQL建立三個表,須指出該表的實體完整性和參照完整性,對性別和年齡指出用戶自定義的約束條件。(性別分成男女,年齡從10到100)。
--顧客表的數據用插入語句輸入數據,其它兩表可用任意方式輸入數據。
create table Article(
       goodsno  varchar2(4) constraint pk_goodsno primary key,
       goodsname  varchar2(16),--商品名
       price    number(8,2),--單價
       goodsnum  int --數量
)
drop table Article;
insert into Article  (goodsno,goodsname,price,goodsnum) values ('s001','計算機',5000,10);
insert into Article  (goodsno,goodsname,price,goodsnum) values ('s002','打印機',1000,12);
insert into Article  (goodsno,goodsname,price,goodsnum) values ('s003','洗衣機',800,10);
insert into Article  (goodsno,goodsname,price,goodsnum) values ('s004','電冰箱',1100,20);
select* from Article;


create table Customer(
       cno  varchar2(4) constraint pk_cno primary key,
       cname  varchar2(8) not null,
       csex   varchar2(2) check (csex in('男','女')),
       cage   int constraint c_cage check (cage between 10 and 100)
)
drop table Customer;
insert into Customer(cno,cname,csex,cage) values('G001','張三','男',29);
insert into Customer(cno,cname,csex,cage) values('G002','李四','女',25);
insert into Customer(cno,cname,csex,cage) values('G003','王五','女',31);
insert into Customer(cno,cname,csex,cage) values('G004','趙六','男',25);
insert into Customer(cno,cname,csex,cage) values('G005','小酒','女',20);
insert into Customer(cno,cname,csex,cage) values('G006','小豬','女',22);
select * from Customer;


create table OrderItem(
       cno  varchar2(4) constraint fk_manno references Customer(cno),
       goodsno  varchar2(4) constraint fk_goodno references Article (goodsno),
       goodsnum   int, --數量
       buyprice number(8,2),--購買價
       buytime   date --購買日期
)
select * from Orderitem;
drop table OrderItem;


insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G001','s001',1,5000,to_date('2016-05-25','yyyy-mm-dd'));
insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G001','s002',2,900,to_date('2016-05-25','yyyy-mm-dd'));
insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G001','s002',2,900,to_date('2016-05-26','yyyy-mm-dd'));
insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G001','s003',1,800,to_date('2016-05-25','yyyy-mm-dd'));
insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G001','s004',1,1100,to_date('2016-05-25','yyyy-mm-dd'));
insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G002','s001',1,4900,to_date('2016-05-25','yyyy-mm-dd'));
insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G002','s004',1,1100,to_date('2016-05-26','yyyy-mm-dd'));
insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G003','s001',1,4800,to_date('2016-05-25','yyyy-mm-dd'));
insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G004','s001',1,5000,to_date('2016-05-26','yyyy-mm-dd'));
insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G004','s002',3,950,to_date('2016-05-26','yyyy-mm-dd'));
insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G005','s002',1,1000,to_date('2016-05-26','yyyy-mm-dd'));
insert into OrderItem(cno,goodsno,goodsnum,buyprice,buytime) values('G006','',0,0,to_date('2016-05-26','yyyy-mm-dd'));
select * from OrderItem;


2.--檢索定購商品號爲‘S001’的顧客號和顧客名。         --用o.cno 也可以查到 (* —— *)
 select c.cno,cname from Customer c ,OrderItem o
  where goodsno='s001' and c.cno=o.cno ;


3.--檢索定購商品號爲‘S001’或‘S002’的顧客號和顧客名。
 select distinct o.cno,cname from Customer c ,OrderItem o
 where  c.cno=o.cno and (goodsno='s001' or goodsno='s002');
 
4.--檢索至少定購商品號爲‘S001’和‘S002’的顧客號。( 選購了商品s001於s002,選購商品大於等於2可以省略)
 select o.cno from Orderitem o;
 
  
 select * from Orderitem o where o.goodsno='s001';
 select * from Orderitem o where o.goodsno='s002';
                      
                       
 select o.cno, count(o.goodsno)
   from Orderitem o
  group by o.cno
 having count(o.goodsno) >= 2;
 
 
 
 --答案  第一種方法 
 select distinct o.cno
   from Orderitem o
  where o.cno in (select  o.cno from Orderitem o where o.goodsno = 's001')
    and o.cno in (select  o.cno from Orderitem o where o.goodsno = 's002')
    and o.cno in (select  o.cno  --count(o.goodsno)
   from Orderitem o
  group by  o.cno
 having count(o.goodsno) >=2);
 
 --第二種方法
select *
  from Orderitem o
 where o.goodsno = 's001'
   and exists (select *
          from orderitem o2
         where o2.goodsno = 's002'
           and o.cno = o2.cno);
           
5.--檢索至少定購商品號爲‘S001’和‘S002’的顧客號。(用自表連接方法) 
select *
  from Orderitem o
 where o.goodsno = 's001'
   and exists (select *
          from orderitem o2
         where o2.goodsno = 's002'
           and o.cno = o2.cno);


6.--檢索沒定購商品的顧客號和顧客名。
select c.cno,cname from Customer  c,Orderitem o
where c.cno=o.cno and o.goodsnum=0;




7.--檢索一次定購商品號‘S001’商品數量最多的顧客號和顧客名。
select max(o.goodsnum), c.cno, c.cname
  from Customer c
  join Orderitem o
    on o.cno = c.cno
 where o.goodsno = 's001'
 group by c.cno, c.cname;




8.--檢索男顧客的人數和平均年齡。
select count(*), avg(c.cage) from Customer c where c.csex = '男';




9.--檢索至少訂購了一種商品的顧客數。
select distinct o.cno from Orderitem o
where o.goodsno is not null ;




10.--檢索訂購了商品的人次數。
select count( o.cno) from OrderItem o where o.goodsnum is not null;




11.--檢索顧客張三訂購商品的總數量及每次購買最多數量商品和最少數量商品的數量之差。  
select sum(o.goodsnum), (max(o.goodsnum) - min(o.goodsnum))
  from Orderitem o, Customer c
 where o.cno = c.cno
   and c.cname = '張三';




12.--檢索至少訂購了3件商品的顧客號和顧客名及他們定購的商品次數和商品總數量,並--按商品總數量降序排序。
--(*_*)商品次數用goodsno 算作商品次數
      --select * from emp e order by e.sal asc; --[desc]
      
-- 第一步      記錄顧客號購買了 多少次商品 商品總數量 分組 以顧客號
select count(o.goodsno) ,sum(o.goodsnum), o.cno from Orderitem o group by o.cno;


--第二步       購買三件及以上商品的顧客號
select count(o.goodsno) ,sum(o.goodsnum),o.cno from Orderitem o group by o.cno
having count(o.goodsno)>=3;


--第三步      查詢顧客名 顧客號
select c.cno,c.cname from customer c;


--最終合併 答案爲
select c.cno, c.cname
  from customer c
 where c.cno in (select o.cno--count(o.goodsno), sum(o.goodsnum), 
                   from Orderitem o
                  group by o.cno
                 having count(o.goodsno) >= 3);




13.--檢索年齡在30至40歲的顧客所購買的商品名及商品單價。 
       select a.goodsno, a.price
         from Article a, Customer c, Orderitem o
        where a.goodsno = o.goodsno
          and c.cno = o.cno
          and c.cage between 30 and 40;





14.--檢索購買的商品的單價至少有一次高於或等於1000元的顧客號和顧客名。  
select distinct c.cno, c.cname ,o.goodsno from Orderitem o,Customer c,Article a
where a.goodsno = o.goodsno
   and c.cno = o.cno
and a.price>=1000;


15.--檢索購買的購買價都高於或等於1000元的顧客號和顧客名。 
select distinct c.cno, cname ,o.goodsno from Orderitem o,Customer c,Article a
where a.goodsno = o.goodsno
   and c.cno = o.cno
and o.buyprice>=1000;




16.--檢索女顧客購買的商品號,商品名和數量合計。 
select o.goodsno,a.goodsname ,sum(o.goodsnum) from Orderitem o,Customer c,Article a --count(o.數量)
where a.goodsno = o.goodsno
   and c.cno = o.cno
and c.csex='女' group by o.goodsno,a.goodsname;


17.--檢索所有的顧客號和顧客名以及它們所購買的商品號。(包括沒買商品的顧客)
select distinct c.cno, c.cname, o.goodsno
  from Customer c, Orderitem o
 where c.cno = o.cno;


--18.檢索這樣的顧客號,顧客名,他們定購了所有的商品 (* 。*)


 --第一步   查詢所有的商品種類
  select  count(1) from Article;


 --第二步   查看顧客所購買的商品的記錄
  select count(distinct o.goodsno), o.cno  from Orderitem o group by o.cno;


 --第三步    查出購買所有商品的顧客號
  select count(distinct o.goodsno), o.cno  from Orderitem o group by o.cno
        having count(distinct (o.goodsno))=(select  count(a.goodsno)from Article a);
       
 --最後   查出顧客名所在的信息     答案爲:  
 select *
   from Customer c
  where c.cno in
        (select  o.cno--count(distinct o.goodsno),
           from Orderitem o
          group by o.cno
         having count(distinct(o.goodsno)) = (select count(a.goodsno)
                                               from Article a));


20.--檢索這樣的顧客號,他們至少訂購了顧客號爲“G002”所訂購的所有商品  (*——*)  暫時不會    


21.--向Article表插入一條紀錄。刪除無人購買的商品。(檢驗一下剛插入的記錄是否已被--刪除)
insert into Article  (goodsno,goodsname,price,goodsnum) values ('s005','計算機2',10000,10);
delete from Article  a where a.goodsno= 's005';


22.--降低已售出的數量總合超過10件的商品單價爲原價的95%。
  update article set price=price*0.95 where goodsnum>10;
  select * from article;
23.--修改約束:顧客的年齡必須大於18歲。
alter table customer drop constraint c_cage;
alter table customer  add constraint c_cage check (cage >18);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章