简介
昨天下午写Day04任务单的作业,共花费4.5h,对SQL查询语句有了些许心得体会。
感觉复杂的SQL查询语句:多表联查、子查询…其实就是简单的数学题,解题过程就像是解方程组:多重嵌套、重复代入。
例题:查询指定用户的历史购买记录,统计出该用户购买最多的商品类型
解题思路:
- 先拆解题目,分为以下步骤,再一步步解,类似解数学题时的因式分解
- 查询指定用户的历史购买记录
- 统计出该用户购买最多的商品类型
- 将每一步骤的结果看作虚拟表,以供后续步骤使用,类似解方程组时的用式(1)减去式(2)得…记为式(3),将式(3)代入…解得…
- 多次使用子查询、多表联查
-- where 子句子查询:将一个查询的结果作为另一个查询(更新)操作的条件
select 列名 from 表名 where 条件列 = | in | not in (子查询) [条件… 其他];
-- from 子句子查询:将一个查询的结果看做一张虚拟表提供给其他查询使用
select 列名 from (子查询) 临时表名 [条件… 其他];
-- 内联接查询
select 列名 from 表1, 表2 where 两表关联列条件表达式;
step1:查询身份证号为513-26-2416的用户的历史购买记录
注:本来是想以vspace.i_basic表中的name作为查询条件,操作时发现存在同名用户,于是换id_card作为查询条件
-- step1:查询身份证号为513-26-2416的用户的手机号
select phone from vspace.i_basic where id_card = '513-26-2416';
写到这里,突然想起来,其实只需要用主键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;
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
);
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