这章主要是讲子查询在SQL查询中的作用。
吐槽 markdown难道不会自动保存??? 一不小心编辑了另外一个,原本编辑的就—-完全没了
(表的基本结构:
Student(Sid,Sname,Sage,Ssex) 学生表
Course(Cid,Cname,Tid) 课程表
SC(Sid,Cid,score) 成绩表
Teacher(Tid,Tname) 教师表
)
1.按查询结果分
-
表子查询 :
一个子查询返回的结果理论上是“多行多列”的时候。此时可以当做一个“表”来使用,通常是放在from后面。
形式举例:select X1, X2, ... from (表子查询) as tab1 where id > 10;
select * from (select sname,sid from student) as a;
select * from (select sname,sid from student) as a where sage > 60;
//1.我们要为子查询的结果准备一个相应的名称,一般可用as,也可以直接在后面接上名称
//2.此处子查询得到的就是一个表,这个表是我们查询出来的表而不是数据库中存在的表
//3.我们能操作的只有子查询中得到的字段,子查询中没有的字段是使用不了的
-
行子查询 :
一个子查询返回的结果理论上是“一行多列”的时候。此时可以当做一个“行”来使用,通常放在“行比较语法”中。
形式举例:select X1, X2, ... from 表1 where (1010, 42) = (行子查询);
select sid,sage from student where (1010, 42) = (select sid,sage from student where sid =1010);
select sage from student where (42) = (select sid,sage from student where sid =1010);
select sid,sage from student where (1010, 42) in (select sid,sage from student where sid >1006);
//注意!这里比较时,前后的字段数量一定要一致,通俗点讲,前面几个值,后面查询出来的就有几个列
-
列子查询 :
一个子查询返回的结果理论上是“多行一列”的时候。此时可以当做“多个值”使用,类似这种:(5, 17, 8, 22)。
形式举例:select X1, X2, ... from 表1 where edu in (列子查询);
select sid,sname from student where 1010 in (select sid from student where sid >1000);
//与行子查询的区别在于是一行多列还是一列多行
//子查询的作用很灵活,可以配合各种查询方式进行比对
-
标量子查询:
一个子查询返回的结果理论上是“一行一列”的时候。此时可以当做“一个值”使用,类似这种:select 5 as c1; 或select ...where a = 17,或select ... where b > 8;
形式举例:select X1, X2, ... from 表1 where age = (标量子查询);
//标量子查询的特点就是只有一个值
//这里就不多说了 小结:
select 字段或表达式或(子查询)
from 表名 或 (子查询) as 别名
where 字段 运算符 数据或(子查询)
group by xxx
having 字段 运算符 数据或(子查询)
在比较运算符中使用子查询
-
where
形式:
where 字段 比较运算符 (标量子查询);
其中,比较运算符有:> >= < <= = <>
select sid,sname from student where sid > (select sid from student where sid =1010);
//这个比较的返回值是布尔值
//只不过是进行了多次比对,把是true的统一返回
-
使用any的子查询
形式:
where 字段 比较运算符 any (列子查询);
其中,比较运算符有:> >= < <= = <>
说明:
1,其含义是:如果该列子查询所得的数据中,有任何一个满足该比较运算符的条件,就算符合了条件,结果为真(true);
select sid,sname from student where sid > any(select sid from student where sid >1010);
//any查询时有个小特点:有任何一个满足该比较运算符的条件,就算符合了条件,结果为真(true);
//这句话的意思是当有一个满足时,全部返回真
我们来比较这两句
select sid from student where sid >1010;
select sid,sname from student where 1012 > any(select sid from student where sid >1010);
//第一句我们查询出了四个值
//第二次我们那1012与这四个值比较发现,1012>1011,满足了这个条件,则返回true
//因为返回的是布尔值true,所以会查询出所有
-
使用all的子查询
形式:
where 字段 比较运算符 all (列子查询);
其中,比较运算符有:> >= < <= = <>
说明:
1,其含义是:如果该列子查询所得的数据中,全都满足该比较运算符的条件,才算符合了条件,结果才是真(true);
select sid,sname from student where 1012 > all(select sid from student where sid >1010);
select sid,sname from student where 1015 > all(select sid from student where sid >1010);
//很好理解,全部满足即可
-
使用exists的子查询
形式:
where exists(子查询)
说明:
1,exists表示的含义是:该子查询的结果如果“有”数据,此时exists就代表“真”;
该子查询的结果如果“没有”数据,此时exists就代表“假”;
//用东西就是true
案例:
select sid,sname from student where exists(select sid from student where sid >1010);
select sid,sname from student where exists(select sid from student where sid >1015);
总结
子查询在整个SQL语句中使用时是很重要的,很灵活。