MySQL的两个小问题

近期打算离职,所以开始投简历重新找DBA的工作,然后**资本打电话过来电话面试,提了两个问题,全没答上来,其实是太久没用MySQL了啊,还有我工作就是不断去试出来的,反正整理一下啦。

第一个问题:

有两张表:
a表这里写图片描述
如上图a表和b表这样子,一共有15个同学,想得到学号为1-15的学生的平均分,如果该项没有成绩就为0,怎么操作?

电话面试卡壳了,因为我工作中遇到这个问题我会去试试的嘛,但是一下子问就容易卡壳。来。试一试咯。用outer join是不行的,搜了一下笔记,MySQL是不支持FULL OUTER JOIN的语法的,可以使用left join 与right join 的union去重的方式来实现。

(SELECT a.`student_no`,a.`数`,b.`student_no`,b.`语`
FROM a
LEFT JOIN b
ON a.student_no=b.student_no)
UNION 
(SELECT a.`student_no`,a.`数`,b.`student_no`,b.`语`
FROM a
RIGHT JOIN b
ON a.student_no=b.student_no)

full join的转化实现

select t2.stuno, (IFNULL(t2.`数`,0)+IFNULL(t2.`语`,0))/2
from 
(
(select IFNULL(a.`student_no`,b.`student_no`) as stuno ,a.`数`,b.`student_no`,b.`语`
from a
left join b
on a.student_no=b.student_no)
union 
(SELECT IFNULL(b.`student_no`,a.`student_no`) AS stuno,a.`数`,b.`student_no`,b.`语`
FROM a
right JOIN b
ON a.student_no=b.student_no)
) t2
order by t2.stuno

不要光知道到case when 语句,ifnull要记得用啊。

第二问题:

有三行0.1,0.2,0.3,如何求1.1*1.2*1.3的值,那时候被误导了,光去想函数了,问了老师,老师说应该是涉及到行转列,好久不用,忘记了,来试一试。

c表数据如下

idscore
10.1
20.2
30.3

要行转列:

select  
case when id=1 THEn score END as fir,
CASE WHEN id=2 THEN score END AS sec,
CASE WHEN id=3 THEN score END AS thr
from c

行转列第一步

要想去掉null,那就group by 吧,额,验证是用到分组函数就可以,不一定group by,全体的分组。

SELECT  
MAX(CASE WHEN id=1 THEN score END) AS fir,
MAX(CASE WHEN id=2 THEN score END) AS sec,
MAX(CASE WHEN id=3 THEN score END) AS thr
FROM c;

结果:

firsecthr
0.10.20.3

然后相乘:

SELECT  fir*sec*thr
FROM (
SELECT
MAX(CASE WHEN id=1 THEN score END) AS fir,
MAX(CASE WHEN id=2 THEN score END) AS sec,
MAX(CASE WHEN id=3 THEN score END) AS thr
FROM c
) tm

得到结果0.006000.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值