子查询
子查询就是在 where中再嵌套一个查询SQL,可以理解为Java中方法的返回值。
--甚至可以套中套 无限套
--被查询出来的表根据结果分为:单行子查询和多行子查询
select 列名 from 表名 where (
另一个select语句
);
准备数据
-- 创建Person
create table Person(
id int,
name varchar(20),
sex char,
age int,
teacher int
);
-- 插入数据
insert into Person values
('1001','张三','M','11','2001'),
('1002','五六','M','12','2002'),
('1003','王正','W','11','2001'),
('1004','温馨','W','12','2001'),
('1005','真心','M','12','2002'),
('1006','向东','M','11','2001'),
('1007','藕带','M','12','2002'),
('1008','二郎','M','12','2001'),
('1009','皮球','M','12','2002'),
('1010','子弟','W','11','2001'),
('2001','刘sir','M','33',null),
('2002','吴sir','W','36',null);
子查询根据结果的行数分为:单行子查询和多行子查询。
单行子查询
顾名思义 子查询结果为一行的。
栗子:利用子查询,查询刘sir的所有学生。
SQL语句:
select * from person
where teacher = (select id from person where name = '刘sir');
程序运行结果:
解析:
多行子查询
顾名思义 子查询结果为多行的。
栗子:利用子查询,查询任意sir的所有学生。
SQL语句:
select * from person
where teacher in (select id from person where name like '_sir');
程序运行结果:
解析:
子查询临时表
之前提及过,每次查询的结果都是一张临时的,虚拟的表(无论怎么查询都不会不改变原表结构)
因此,子查询的结果可以当作一张表使用
--可以配合多表查询进行使用。
select 列名 from 子查询;
栗子:利用子查询,显示学生信息和其老师的姓名。
SQL语句:
select person.id,person.name,person.age,tea.name
from (select id,name from person where name LIKE '_sir') as tea,person
where person.teacher = tea.id;
程序运行结果:
解析: