论坛首页 招聘求职论坛

某个大公司的sql面试题,自己不太会做有没有童鞋指点一下

浏览 24123 次
精华帖 (0) :: 良好帖 (2) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-08-17  
第三题:
select b.userid usId, a.usernmae, avg(v.score) aScore, count(1) aCount
   from user_t a, article b, vote v
  where a.userid = b.userid
    and v.articleid = b.articleid having avg(v.score) > 100
    and count(b.articleid) > 5
  group by b.userid, a.usernmae
  order by aScore;

第五题等待高手回答。
0 请登录后投票
   发表时间:2010-08-17   最后修改:2010-08-17
gezi1003 写道
第三题:
select b.userid usId, a.usernmae, avg(v.score) aScore, count(1) aCount
   from user_t a, article b, vote v
  where a.userid = b.userid
    and v.articleid = b.articleid having avg(v.score) > 100
    and count(b.articleid) > 5
  group by b.userid, a.usernmae
  order by aScore;

第五题等待高手回答。


mercyblitz 写道

1000W 用户,使用100w作为一个表,users_1,...users_10。

类似文章表类似。


粒度可以有App控制,一般Shard是用逻辑App来做的。
0 请登录后投票
   发表时间:2010-08-17   最后修改:2010-08-18
呵呵。。。发下我的想法,不一定正确哦~
1.
select username from user usr
left join article art on art.userid = user.userid
where art.userid is null;

2.
select art.title, vt.score from article art
left join vote vt on vt.articleid = art.articleid
where vt.score > 100 order by vt.score desc;

3.
--貌似把问题给复杂化了,呵呵。。。
select usr.* from user usr
inner join
(select art.userid userid, avg(vt.score) aavg from article art
inner join vote vt on vt.articleid = art.articleid
where aavg > 100 group by art.userid) tmp1 on tmp1.userid = usr.userid
inner join
(select userid userid, count(articleid) cart
from article where cart > 5 group by userid) tmp2 on tmp2.userid = usr.userid
where tmp1.userid = tmp2.userid order by tmp1.aavg desc;
0 请登录后投票
   发表时间:2010-08-17  
kakaluyi 写道
谢谢,第3个题目看来只要自己好好再想想就出来了,
exists在写hql和jdbc的时候从来没有用过,据说少量结果集用exists,大量结果集用in,再研究研究


如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in;反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists
0 请登录后投票
   发表时间:2010-08-17  
查询:
(1)
SELECT U.USERNAME FROM USER U WHERE NOT EXISTS
(SELECT 1 FROM ARTICLE A
 WHERE U.USERID = A.USERID) 
 
(2)
SELECT TITLE FROM ARTICLE A LEFT JOIN VOTE V 
 ON A.ARTICLEID = V.ARTICLEID
 WHERE V.SCORE > 100 
 ORDER BY V.SCORE DESC

(3)
SELECT USERID,COUNT(1) AS TOTAL, AVG(SCORE) AS AVG_SCORE 
 FROM ARTICLE A LEFT JOIN VOTE V
      ON A.ARTICLEID = V.ARTICLEID
 GROUP BY USERID
 HAVING AVG(SCORE) > 100  AND COUNT(1) > 5
 ORDER BY AVG_SCORE DESC
0 请登录后投票
   发表时间:2010-08-18  
finux 写道
呵呵。。。发下我的想法,不一定正名哦~
1.
select username from user usr
left join article art on art.userid = user.userid
where art.userid is null;



可以把On 与 where 在一起用哦?? 求解

我只见过... left join ... on ...没有见过 后面还有一个where,
本人菜鸟,给解...
0 请登录后投票
   发表时间:2010-08-18  
lerous 写道
kakaluyi 写道
谢谢,第3个题目看来只要自己好好再想想就出来了,
exists在写hql和jdbc的时候从来没有用过,据说少量结果集用exists,大量结果集用in,再研究研究


如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in;反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists


请问: 你说的这个: 主查询中表较大又有索引时应该用In;反之外层主查询记录较少,子查询表大又有索引时用exists是有实践证明 ,还是某本书某个老师说的
0 请登录后投票
   发表时间:2010-08-18   最后修改:2010-08-18
facade 写道
查询:
(1)
SELECT U.USERNAME FROM USER U WHERE NOT EXISTS
(SELECT 1 FROM ARTICLE A
 WHERE U.USERID = A.USERID) 
 


帅多,你的这个 1是什么意思呀?没见过,请给分析一下...
0 请登录后投票
   发表时间:2010-08-18  
shaobaitou 写道

建议count(*)少用,用count(userid)之类的、


这种说法似乎是误传...
0 请登录后投票
   发表时间:2010-08-18  
Mrpublic 写道
lerous 写道
kakaluyi 写道
谢谢,第3个题目看来只要自己好好再想想就出来了,
exists在写hql和jdbc的时候从来没有用过,据说少量结果集用exists,大量结果集用in,再研究研究


如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in;反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists


请问: 你说的这个: 主查询中表较大又有索引时应该用In;反之外层主查询记录较少,子查询表大又有索引时用exists是有实践证明 ,还是某本书某个老师说的

这种东西基本都是误传。
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics