`

oracle复杂查询练习题

 
阅读更多

1.删除重复记录(当表中无主键时)

Sql代码
  1. createtableTESTTB(
  2. bmvarchar(4),
  3. mcvarchar2(20)
  4. )
  5. insertintoTESTTBvalues(1,'aaaa');
  6. insertintoTESTTBvalues(1,'aaaa');
  7. insertintoTESTTBvalues(2,'bbbb');
  8. insertintoTESTTBvalues(2,'bbbb');
  9. /*方案一*/
  10. deletefromTESTTBwhererowidnotin
  11. (selectmax(rowid)fromTESTTBgroupbyTESTTB.BM,TESTTB.MC)
  12. /*方案二*/
  13. deletefromTESTTBawherea.rowid!=(
  14. selectmax(rowid)fromTESTTBbwherea.bm=b.bmanda.mc=b.mc
  15. )

2.bookEnrol是用来登记的,不管你是借还是还,都要添加一条记录。

请写一个SQL语句,获取到现在状态为已借出的所有图书的相关信息,

ID为3的java书,由于以归还,所以不要查出来。要求查询结果应为:(被借出的书和被借出的日期)

Sql代码
  1. createtablebook(
  2. idint,
  3. namevarchar2(30),
  4. PRIMARYKEY(id)
  5. )
  6. insertintobookvalues(1,'English');
  7. insertintobookvalues(2,'Math');
  8. insertintobookvalues(3,'JAVA');
  9. createtablebookEnrol(
  10. idint,
  11. bookIdint,
  12. dependDatedate,
  13. stateint,
  14. FOREIGNKEY(bookId)REFERENCESbook(id)ONDELETECASCADE
  15. )
  16. insertintobookEnrolvalues(1,1,to_date('2009-01-02','yyyy-mm-dd'),1);
  17. insertintobookEnrolvalues(2,1,to_date('2009-01-12','yyyy-mm-dd'),2);
  18. insertintobookEnrolvalues(3,2,to_date('2009-01-14','yyyy-mm-dd'),1);
  19. insertintobookEnrolvalues(4,1,to_date('2009-01-17','yyyy-mm-dd'),1);
  20. insertintobookEnrolvalues(5,2,to_date('2009-02-14','yyyy-mm-dd'),2);
  21. insertintobookEnrolvalues(6,2,to_date('2009-02-15','yyyy-mm-dd'),1);
  22. insertintobookEnrolvalues(7,3,to_date('2009-02-18','yyyy-mm-dd'),1);
  23. insertintobookEnrolvalues(8,3,to_date('2009-02-19','yyyy-mm-dd'),2);
  24. /*方案一*/
  25. selecta.id,a.name,b.dependdatefrombooka,bookenrolbwhere
  26. a.id=b.bookid
  27. and
  28. b.dependdatein(selectmax(dependdate)frombookenrolgroupbybookid)
  29. andb.state=1
  30. /*方案二*/
  31. selectk.id,k.name,a.dependdate
  32. frombookenrola,BOOKk
  33. wherea.idin(selectmax(b.id)frombookenrolbgroupbyb.bookid)
  34. anda.state=1
  35. anda.bookid=k.id;

3.查询每年销量最多的产品的相关信息

Sql代码
  1. createtablet2(
  2. year_varchar2(4),
  3. productvarchar2(4),
  4. salenumber
  5. )
  6. insertintot2values('2005','a',700);
  7. insertintot2values('2005','b',550);
  8. insertintot2values('2005','c',600);
  9. insertintot2values('2006','a',340);
  10. insertintot2values('2006','b',500);
  11. insertintot2values('2007','a',220);
  12. insertintot2values('2007','b',350);
  13. insertintot2values('2007','c',350);
  14. /**方案一*/
  15. selecta.year_,a.sale,a.productfromt2ainnerjoin(
  16. selectmax(sale)asslfromt2groupbyyear_)b
  17. ona.sale=b.slorderbya.year_
  18. /*方案二*/
  19. selectsa.year_,sa.product,sa.sale
  20. fromt2sa,
  21. (selectt.year_pye,max(t.sale)maxcout
  22. fromt2t
  23. groupbyt.year_)tmp
  24. wheresa.year_=tmp.pye
  25. andsa.sale=tmp.maxcout

4.排序问题,如果用总积分做降序排序..因为总积分是字符型,所以排出来是这样子(9,8,7,6,5...),要求按照总积分的数字大小排序。

Sql代码
  1. createtablet4(
  2. 姓名varchar2(20),
  3. 月积分varchar2(20),
  4. 总积分char(3)
  5. )
  6. insertintot4values('WhatIsJava','1','99');
  7. insertintot4values('水王','76','981');
  8. insertintot4values('新浪网','65','96');
  9. insertintot4values('牛人','22','9');
  10. insertintot4values('中国队','64','89');
  11. insertintot4values('信息','66','66');
  12. insertintot4values('太阳','53','66');
  13. insertintot4values('中成药','11','33');
  14. insertintot4values('西洋参','257','26');
  15. insertintot4values('大拿','33','23');
  16. /*方案一*/
  17. select*fromt4orderbycast(总积分asint)desc
  18. /*方案二*/
  19. select*fromt4orderbyto_number(总积分)desc;

5.得出所有人(不区分人员)每个月及上月和下月的总收入

Sql代码
  1. createtablet5(tmonthint,
  2. tnamevarchar2(10),
  3. incomenumber
  4. )
  5. insertintot5values('08','a',1000);
  6. insertintot5values('09','a',2000);
  7. insertintot5values('10','a',3000);
  8. /*方案一*/
  9. selecto.tmonth,sum(o.income)ascur,(selectsum(t.income)fromt5twheret.tmonth=(o.tmonth+1)groupbyt.tmonth)asnext,
  10. (selectsum(t.income)fromt5twheret.tmonth=(o.tmonth-1)groupbyt.tmonth)aslast
  11. fromt5owhereo.tmonth=2groupbyo.tmonth
  12. /*方案二*/
  13. selecttmonthas月份,tnameas姓名,sum(income)as当月工资,
  14. (selectsum(income)
  15. fromt5
  16. wheretmonth=to_number(substr(to_char(sysdate,'yyyy-mm-dd'),7,1))-1)AS上月工资,
  17. (selectsum(income)
  18. fromt5
  19. wheretmonth=to_number(substr(to_char(sysdate,'yyyy-mm-dd'),7,1))+1)AS下月工资
  20. fromt5wheretmonth=substr(to_char(sysdate,'yyyy-mm-dd'),7,1)
  21. groupbytmonth,tname

6.根据现有的学生表,课程表,选课关系表,查询一。没有修过李明老师的课的学生,查询二,既学过a课程,又学过b课程的学生姓名

Sql代码
  1. S表[SNO,SNAME]--学生表
  2. C表[CNO,CNAME,CTEATHER]--课程表
  3. SC表[SNO,CNO,SCGRADE]--选课关系表
  4. 查询一:没有修过李明老师的课的学生的姓名
  5. selectsnamefromswherenotexists
  6. (select*fromsc,cwheresc.cno=c.cnoandc.cteather='李明'andsc.sno=s.sno)
  7. 查询二:既学过a课程,又学过b课程的学生姓名
  8. SELECTS.SNO,S.SNAME
  9. FROMS,(
  10. SELECTSC.SNO
  11. FROMSC,C
  12. WHERESC.CNO=C.CNO
  13. ANDC.CNAMEIN('a','b')
  14. GROUPBYSNO
  15. )SCWHERES.SNO=SC.SNO
  16. 查询三:列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩
  17. SELECTS.SNO,S.SNAME,AVG(SC.SCGRADE)
  18. FROMS,SC,(
  19. SELECTSNO
  20. FROMSC
  21. WHERESCGRADE<60
  22. GROUPBYSNO
  23. HAVINGCOUNT(DISTINCTCNO)>=2
  24. )AWHERES.SNO=A.SNOANDSC.SNO=A.SNO
  25. GROUPBYS.SNO,S.SNAME
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics