12.08sq刷题知识总结一

1.请你写一个SQL查找积分增加最高的用户的名字,以及他的总积分是多少(此题数据保证积分最高的用户有且只有1个),以上例子查询结果如下:
在这里插入图片描述

解释:
user_id为1的总计加了4分,其他的都是3分,user_id为1的name为tm
输出tm|4

select user.name,t.grade_sum FROM
(select user_id,sum(grade_num) as grade_sum from grade_info group by user_id order by grade_sum desc limit 1)t
inner join user
on user.id=t.user_id

做子查询,造了一张新表,只查出积分最高用户的id和num,然后联表查用户名。

2.有一张商品表(goods),字段依次为:商品id、商品名、商品质量
还有一张交易表(trans),字段依次为:交易id、商品id、这个商品购买个数
查找购买个数超过20,质量小于50的商品,按照商品id升序排序

select goods.*,t.count_new as total from goods inner join 
(select goods_id,sum(count) as count_new from trans group by goods_id 
having count_new>=20) t 
on goods.id=t.goods_id where goods.weight<50
order by id

子查询查出购买量超过20的商品id,并造出一张新表,这里用到了group by 和having的搭配使用,此处不可用where。而后联表查出商品详细参数,并筛选其中质量小于50的商品。

3请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成

select e.emp_no,s.salary,e.last_name,e.first_name
from employees e inner join salaries s
on e.emp_no=s.emp_no
and s.salary =
(
select max(salary) from salaries where to_date='9999-01-01' 
    and salary<(select max(salary) from salaries where to_date='9999-01-01')
)
and s.to_date='9999-01-01'

这道题非常有意思,不允许使用order by又要查出排名第二多的员工,那么就先查出排名第一的薪水情况,这样剩下的薪水中排第一的自然就是排名第二的员工薪水(允许多个)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值