对SQL查询语句中子查询、多表联查在实际应用中的个人理解

本文通过一个实际例子,详细解析如何使用SQL子查询和多表联查来查询用户购买最多商品类型的步骤,强调了解决复杂查询问题时的拆解和虚拟表思路,以及在实际项目中根据需求灵活选择查询方法的重要性。
摘要由CSDN通过智能技术生成

简介

昨天下午写Day04任务单的作业,共花费4.5h,对SQL查询语句有了些许心得体会。
感觉复杂的SQL查询语句:多表联查、子查询…其实就是简单的数学题,解题过程就像是解方程组:多重嵌套、重复代入。

例题:查询指定用户的历史购买记录,统计出该用户购买最多的商品类型

解题思路:

  • 先拆解题目,分为以下步骤,再一步步解,类似解数学题时的因式分解
  1. 查询指定用户的历史购买记录
  2. 统计出该用户购买最多的商品类型
  • 将每一步骤的结果看作虚拟表,以供后续步骤使用,类似解方程组时的用式(1)减去式(2)得…记为式(3),将式(3)代入…解得…
  • 多次使用子查询、多表联查
-- where 子句子查询:将一个查询的结果作为另一个查询(更新)操作的条件
select 列名 from 表名 where 条件列 = | in | not in (子查询) [条件… 其他];
-- from 子句子查询:将一个查询的结果看做一张虚拟表提供给其他查询使用
select 列名 from (子查询) 临时表名 [条件… 其他];
-- 内联接查询
select 列名 from1,2 where 两表关联列条件表达式;

step1:查询身份证号为513-26-2416的用户的历史购买记录

注:本来是想以vspace.i_basic表中的name作为查询条件,操作时发现存在同名用户,于是换id_card作为查询条件
i_basic

-- step1:查询身份证号为513-26-2416的用户的手机号
select phone from vspace.i_basic where id_card = '513-26-2416';

虚拟表1

写到这里,突然想起来,其实只需要用主键phone作为查询条件就行

select * from vspace.i_order where phone = '10001114722';

step2:在订单表(vspace.i_order)中查询手机号为10001114722的用户的历史购买记录

-- step2:将step1的结果看做虚拟表与订单表进行联接查询(以订单时间升序显示)
select * from vspace.i_order where phone = (
	select phone from vspace.i_basic where id_card = '513-26-2416'
) order by order_date;

虚拟表2

step3:将上图视为虚拟表2,查询其中商品的最大购买量

-- step3:统计查询step2结果中的商品的最大购买量(以订单时间升序显示)
select max(ammount) total from (
	select * from vspace.i_order where phone = (
		select phone from vspace.i_basic where id_card = '513-26-2416'
	) order by order_date
);

虚拟表3

step4:在虚拟表2中查询购买量为3的商品的编号

-- step4:查询该用户的历史购买记录中商品购买量为step3结果的商品的编号(以商品编号升序显示)
select goods_id from (
	select * from vspace.i_order where phone = (
		select phone from vspace.i_basic where id_card = '513-26-2416'
	) order by order_date
) where ammount 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值