我先上两张表这便是我们这次用到的表
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 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 结果: 在我们应用到查找的时候,看到所有我们应该想到all,看到任意应该想到any,看到范围想到in
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行。
where englishSQL> select sno,sname,english,math from studentscore
2 where english