Mysql子查询

本文深入探讨了SQL子查询的使用场景与优化策略,包括子查询在select、from及where子句中的应用,以及in与exists关键字的区别与适用场景。通过实例对比,帮助读者理解如何选择合适的查询方式以提升数据库操作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子查询

当一个查询是另一个查询的条件时,称之为子查询。

嵌套在select语句中的SQL语句只能是单行或单列。
现有:
t_account:ID(bigint pk),账户名称(varchar(20) not null),登录名称(varchar(20) unique not null),密码(varchar(32)),性别(int),出生日期(date),数据创建时间(datetime)
t_goods:ID(bigint pk), 商品名称(varchar(20) not null),商品类型(int not null),商品描述(varchar(200)),商品价格(decimal(8,2)),数据创建时间(datetime)
客户购买商品,就存在下订单
t_order:ID(bigint pk),订单编号(varchar(20) unique not null),账户信息(外键 not null),商品信息(外键 not null),数据创建时间(datetime)
创建t_account,t_goods,t_order表,并添加数据。
数据如下:
t_account
在这里插入图片描述
t_goods
在这里插入图片描述

t_order
在这里插入图片描述

子查询的应用位置:

1.在select 中嵌套子查询
如:查询用户编号为20181002的名称和订单号

select id,(select accout_name from t_account where id=20181002) as '名称' from t_order where account_id=20181002;

执行结果如下:
在这里插入图片描述

2.在from子句中嵌套子查询
即在from后只有子查询作为数据源

3.在where子句中嵌套子查询
如:查询订单表中订单号为20181021103的用户的所有信息


SELECT * from t_account a where a.id=(select account_id from t_order where id=20181021103);

执行结果如下:
在这里插入图片描述

SQL in 和exists

确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

购买了物品的用户信息,具体sql语句如下:
使用in:
select * from t_account where id in (select account_id from t_order);
执行结果如下:
在这里插入图片描述

使用exists

select * from t_account a where EXISTS  (select account_id from t_orderlist o where a.id=o.account_id);

在这里插入图片描述

通过上述操作,我们发现结果都是一致的,那么它们的区别在哪里呢?

in 适合于外查询比内查询对应的表,数据量更大的情况下。
exists 适合于外查询比内查询对应的表,数据量更小的情况下。
当两表数据一致差不多时,查询效率几乎一致。

**

嵌套子查询在其他子句的要求

**
group by 嵌套
要求子查询只能返回单行单列值
having 中嵌套
只能用到聚合参数
order中嵌套
要求子查询只能返回单行值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值