子查询的结果是一个值的时候
子查询结果只要是单个值
,肯定在WHERE
后面作为条件
SELECT 查询字段 FROM 表 WHERE 字段[= > < <>](子查询);
子查询结果是单列多行的时候
子查询结果只要是单列
,肯定在WHERE
后面作为条件
子查询结果是单列多行,结果集类似于一个数组,父查询使用IN
运算符
SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
子查询的结果是多行多列
子查询结果只要是多行多列
,肯定在FROM
后面作为表
SELECT ... FROM (子查询) 表别名 WHERE 条件;
子查询作为表需要取别名,否则这张表没用名称无法访问表中的字段
– 用户表(user)
create table `user` (
`id` int auto_increment primary key,
`username` varchar(50) -- 用户姓名
);
– 订单表(orders)
create table `orders` (
`id` int auto_increment primary key,
`price` double,
`user_id` int
);
– 给订单表添加外键约束
– 向user表中添加数据
insert into user values(3,'张三');
insert into user values(4,'李四');
insert into user values(5,'王五');
insert into user values(6,'赵六');
– 向orders 表中插入数据
insert into orders values(1,1314,3);
insert into orders values(2,1314,3);
insert into orders values(3,15,4);
insert into orders values(4,315,5);
insert into orders values(5,1014,null);
select * from user;
select * from orders;
– 练习:
– 查询用户的订单,没有订单的用户不显示
select * from user u,orders o where u.id = o.user_id;
– 查询所有用户的订单详情
select * from user u left join orders o on u.id = o.user_id;
– 查询所有订单的用户详情
select * from user u right join orders o on u.id = o.user_id;
– 练习:
– 查看用户为张三的订单详情
select id from user where username = '张三';
select * from orders o join (select id from user where username = '张三') u on o.user_id = u.id;
– 查询出订单的价格大于300的所有用户信息。
select user_id from orders where price > 300;
select * from user where id in (select user_id from orders where price > 300);
– 查询订单价格大于300的订单信息及相关用户的信息。
select * from user u join (select * from orders where price > 300) o on u.id = o.user_id;
- 子查询的结果是单行单列(一个值情况), 一般放在where后面作为条件**, 通过=,>,<,<>**
select ... from ... where 列 [=><<>...] (子查询)
- 子查询的结果是单列多行, 一般放在where后面作为条件**, 通过in**
select ... from ... where 列 in (子查询)
- 子查询的结果是多行多列, 一般放在from后面作为虚拟表, 需要给虚拟表取别名
select ... from (子查询) as 别名 where 条件
参考:黑马彭智林