Oracle学习(八)——————————————子查询

我先上两张表这便是我们这次用到的表

student表

SQL> select * from student;

       SNO SNAME                                    SSEX           SAGE SDEPT
---------- ---------------------------------------- -------- ---------- ----------------------------------------
         6 李宇航                                   男               22 口腔医学
         7 苏小白                                   男               22 中医药
         1 张波                                     男               18 软件工程
         2 李增福                                   男               21 预防医学
         3 安霞                                     女               21 临床医学
         4 贺建                                     女               20 应用数学
         5 杨鹏飞                                   男               20 应用数学
        13 苏非                                     女               19 中医药
         8 李旭                                     男               19 临床医学
         9 张必过                                   男               19 预防医学
        10 安星宇                                   男               23 软件工程
        11 李四                                     男

已选择12行。

studentscore表

SQL> select * from studentscore;

       SNO SNAME                   ENGLISH    CHINESE       MATH
---------- -------------------- ---------- ---------- ----------
         1 张波                         53         99         75
         2 李增福                       62         88         90
         3 安霞                         80         46         86
         4 贺建                         99         86         96
         5 杨鹏飞                       72         76         63
         6 李宇航                       62         65         66
         7 苏小白                       32         68         60
         8 李旭                         64         86         98
         9 张必过                       26         35         36
        10 安星宇                       76         75         73
        12 王五
        14 黄尚                         86         82         80

已选择12行。

子查询

我们来了解一下子查询

什么是子查询?

子查询就是将在一个查询结果中查找需要的数据,也就是将两个查询语句合为一句

例:查询数学成绩排在第一名之后的所有人的的数学成绩,学号和姓名

这我们可以分为两步。

第一步我们查出所有人的数学成绩,学号,姓名

select sno,sname,math from studentscore;

第二步查出数学成绩最高的分数

select max(math) from studentscore;

我们将两个语句结合

select sno,sname,math from studentscore 

where math<(select max(math) from studentscore);

结果:

SQL> select sno,sname,math from studentscore
  2  where math<(select max(math) from studentscore);

       SNO SNAME                      MATH
---------- -------------------- ----------
         1 张波                         75
         2 李增福                       90
         3 安霞                         86
         4 贺建                         96
         5 杨鹏飞                       63
         6 李宇航                       66
         7 苏小白                       60
         9 张必过                       36
        10 安星宇                       73
        14 黄尚                         80

已选择10行。

多行子查询

in any all

a.IN 或者NOT IN

IN就是符合范围内

NOT IN就是不符合范围‘

例:查找学生表中非软件工程专业的学号和姓名

查找所有人的姓名和学号以及专业

select sno,sname,sdept from student.

查找非软件工程专业

select sno from student where sdept !='软件工程';

两者合并

select sno,sname,sdept from student

where sno in 

(select sno from student where sdept !='软件工程');

SQL> select sno,sname,sdept from student
  2  where sno in
  3  (select sno from student where sdept !='软件工程');

       SNO SNAME                                    SDEPT
---------- ---------------------------------------- ----------------------------------------
         6 李宇航                                   口腔医学
         7 苏小白                                   中医药
         2 李增福                                   预防医学
         3 安霞                                     临床医学
         4 贺建                                     应用数学
         5 杨鹏飞                                   应用数学
        13 苏非                                     中医药
         8 李旭                                     临床医学
         9 张必过                                   预防医学

已选择9行。

not in 便是不在查找的范围中,不过不在范围内需要考虑null,如果这样null也会输出

用 not in完成上面问题

SQL> select sno,sname,sdept from student
  2  where sno not in
  3  (select sno from student where sdept ='软件工程')
  4  order by sno asc;

       SNO SNAME                                    SDEPT
---------- ---------------------------------------- ----------------------------------------
         2 李增福                                   预防医学
         3 安霞                                     临床医学
         4 贺建                                     应用数学
         5 杨鹏飞                                   应用数学
         6 李宇航                                   口腔医学
         7 苏小白                                   中医药
         8 李旭                                     临床医学
         9 张必过                                   预防医学
        11 李四
        13 苏非                                     中医药

已选择10行。

我们发现学号为11的人也进行了输出

b.any

>any 表示比子查找中最小的结果大的输出

=any和in 类似

<>any表示返回表中全部记录

来个例子;

查询所有英语成绩大于任意一个人的数学成绩的人

查询所有人的英语成绩

select sno,sname,english,math from studentscore;

查询所有人的数学成绩

select math from studentscore;

结合:

 select sno,sname,english,math from studentscore
  where english>any
  (select math from studentscore)
   order by english asc;//按英语成绩排序

SQL> select sno,sname,english,math from studentscore
  2  where english>any
  3  (select math from studentscore)
  4  order by english asc;

       SNO SNAME                   ENGLISH       MATH
---------- -------------------- ---------- ----------
         1 张波                         53         75
         6 李宇航                       62         66
         2 李增福                       62         90
         8 李旭                         64         98
         5 杨鹏飞                       72         63
        10 安星宇                       76         73
         3 安霞                         80         86
        14 黄尚                         86         80
         4 贺建                         99         96

已选择9行。

 

c.all

>all比子查询中最大值还大

=all等价于not in

注意:在用all要判断子查询是否有null,如果有null则没有结果,因为要和all中任何一个数据比较所以不能出现null

例子:

查找英语成绩比任意一个数学成绩还低的学号,姓名,英语成绩,数学成绩

查找所有人的学号,姓名,英语成绩,数学成绩

select sno,sname,math,english from studentscore;

查询所有人的数学成绩

select math from studentscore

结合:

 select sno,sname,english,math from studentscore
 where english (select nvl(math,100) from studentscore)

结果:

SQL>  select sno,sname,english,math from studentscore
  2   where english

在我们应用到查找的时候,看到所有我们应该想到all,看到任意应该想到any,看到范围想到in

你可能感兴趣的:(数据库,oracle)