近期打算离职,所以开始投简历重新找DBA的工作,然后**资本打电话过来电话面试,提了两个问题,全没答上来,其实是太久没用MySQL了啊,还有我工作就是不断去试出来的,反正整理一下啦。
第一个问题:
有两张表:
如上图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)
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表数据如下
id | score |
---|---|
1 | 0.1 |
2 | 0.2 |
3 | 0.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;
结果:
fir | sec | thr |
---|---|---|
0.1 | 0.2 | 0.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.