ITPub博客

首页 > 数据库 > Oracle > 每日一练(三)一个union all的例子,三个题

每日一练(三)一个union all的例子,三个题

原创 Oracle 作者:Angelina7 时间:2016-10-27 21:37:32 0 删除 编辑

一:
表结构是这样的
SNAME                     CNAME
------------------------- -------------------------
张三                      数学
张三                      物理
张三                      语文
张三                      化学
李四                      数学
李四                      语文
李四                      化学
王五                      数学
王五                      物理
王五                      语文
赵四                      数学
赵四                      物理
赵四                      语文
周七                      数学
周七                      物理
15 rows selected

求:
1 :只选数学,物理,语文的学生, 写出相应 SQL  语句
2 :同时选了数学,物理,语文的学生,  查询结果如下, 写出相应 SQL 
1:
select sname, cname
  from (select sname, cname, count(*) over(partition by sname) cnt
          from course
         where sname not in (select sname
                               from (select *
                                       from course
                                       left outer join (select '数学' cname1
                                                         from dual
                                                       union all
                                                       select '物理' cname1
                                                         from dual
                                                       union all
                                                       select '语文' cname1
                                                         from dual) c
                                         on (course.cname = c.cname1))
                              where cname1 is null))
 where cnt = 3;

SNAME                     CNAME
------------------------- -------------------------
王五                      数学
王五                      物理
王五                      语文
赵四                      数学
赵四                      语文
赵四                      物理
6 rows selected
2:
select sname, cname
  from course
 where sname in
       (select sname
          from (select sname, cname, count(*) over(partition by sname) cnt
                  from course
                 where cname in ('数学', '物理', '语文'))
         where cnt >= 3);

SNAME                     CNAME
------------------------- -------------------------
张三                      数学
张三                      物理
张三                      语文
张三                      化学
王五                      数学
王五                      物理
王五                      语文
赵四                      数学
赵四                      物理
赵四                      语文
10 rows selected


二、
drop table students;
create table students(name varchar2(25),class varchar2(25),grade int);
insert into students values ('张三','语文',20);
insert into students values ('张三','数学',90);
insert into students values ('张三','英语',50);
insert into students values ('李四','语文',81);
insert into students values ('李四','数学',60);
insert into students values ('李四','英语',90);
insert into students values ('王二','数学',81);
insert into students values ('王二','英语',90);
insert into students values ('李五','数学',83);
insert into students values ('李五','英语',90);
insert into students values ('李五','化学',90);
commit;
有表 students(name,class,grade), 请用标准 sql  语句完成
name  class grade
张三  数学  81
李四  语文  70
王五  数学  90
张三  语文  60
李四  数学  100
王五  语文  90
王五  英语  81
要求: 用 sql  语句输出各门功课都大于 80  分的同学姓名
(1)
select *
  from students
 where name in
       (select a.name
          from (select name, count(*) over(partition by name) cnt
                  from students
                 where grade > 80) a
         inner join (select name, count(*) over(partition by name) cnt1
                      from students) b
            on (a.name = b.name)
         where cnt = cnt1);


(2)超级简单的Group By


select name from students group by name having min(grade) >= 80;


NAME                      CLASS                              GRADE
------------------------- ------------------ ------------------------------
王二                      数学                                81
王二                      英语                                90
李五                      数学                                83
李五                      英语                                90
李五                      化学   

三、
drop table students;
create table students(name varchar2(25),class varchar2(25),grade int);
insert into students values ('张三','语文',20);
insert into students values ('张三','数学',90);
insert into students values ('张三','英语',50);
insert into students values ('李四','语文',81);
insert into students values ('李四','数学',60);
insert into students values ('李四','英语',90);
commit;                             

已知一个表的结构为:
姓名  科目  成绩
张三  语文  20
张三  数学  30
张三  英语  50
李四  语文  70
李四  数学  60
李四  英语  90
过 怎样通过 select  语句把他变成以下结构:
姓名  语文  数学  英语
张三  20 30 50
李四  70 60 90

select name,
       nvl(sum(case
                   when class = '语文' then
                    grade
                   else
                    null
               end),
           0) "语文",
       nvl(sum(case
                   when class = '数学' then
                    grade
                   else
                    null
               end),
           0) "数学",
       nvl(sum(case
                   when class = '英语' then
                    grade
                   else
                    0
               end),
           0) "英语"
  from students
 group by name;


NAME                              语文         数学         英语
------------------------- ---------- ---------- ----------
王二                               0         81         90
李四                              81         60         90
李五                               0         83         90
张三                              20         90         50

select name,
       nvl(max(decode(class, '语文', grade)),0) "语文",
       nvl(max(decode(class, '数学', grade)),0) "数学",
       nvl(max(decode(class, '英语', grade)),0) "英语"
  from students
 group by name;




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31402276/viewspace-2127249/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 导入导出数据块
请登录后发表评论 登录
全部评论

注册时间:2016-10-14

  • 博文量
    31
  • 访问量
    12512