Java登陆第五天——SQL之DQL(三)

发布时间 2023-11-12 18:05:33作者: ocraft

子查询

子查询就是在 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);

image

子查询根据结果的行数分为:单行子查询多行子查询

单行子查询

顾名思义 子查询结果为一行的。

栗子:利用子查询,查询刘sir的所有学生。
SQL语句:

select * from person
	where teacher = (select id from person where name = '刘sir');

程序运行结果:
image

解析:
image

多行子查询

顾名思义 子查询结果为多行的。

栗子:利用子查询,查询任意sir的所有学生。
SQL语句:

select * from person 
	where teacher in (select id from person where name like '_sir');

程序运行结果:
image

解析:
image

子查询临时表

之前提及过,每次查询的结果都是一张临时的,虚拟的表(无论怎么查询都不会不改变原表结构)

因此,子查询的结果可以当作一张表使用

--可以配合多表查询进行使用。
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;

程序运行结果:
image

解析:
image