论坛首页 招聘求职论坛

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

浏览 24150 次
精华帖 (0) :: 良好帖 (2) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-08-16   最后修改:2010-08-16

自己对sql的理解。用一句俗话说:人有七窍,已经通了六窍,有没有童鞋指点一下

问:关系模式:User(userId, userName), Article(articleId, userId, title,   content),Vote(articleId, score),User为用户关系,Article为用户发表的文章关系,Vote为文章得票关系,title为文章标题、score为得票数。
(1)用SQL语言查询所有没发表过文章的用户名;
(2)用SQL语言查询得票数大于100的所有文章标题,按得票数倒序排列;
(3)用SQL语言查询出发表文章数大于5,文章平均得票数大于100的用户名,按平均得票数倒序排列;
(4)设计这些表的主键、外键和索引,并指出上面三个查询所使用的索引。
(5)当用户数超过1000万,文章数超过1亿时,如何考虑存储及性能的改进和优化?

 

答: 

 

1 select * from User where useid  not in(select userid from Article);
2 select title from article   inner  join vote  on article.articleid=vote.aritcleid and  vote.score>100 order by vote.score asc;
3有点不太会,下面胡乱乱写了一通

3 select * from user where userid in(select userid from Article inner join vote on article.articleid = vote.articleid group by userId  having avg(score)>100) group by userid having count(*) >5;

4主键外键应该很简单,索引第一个应该是userid,第二个是articleid 和score,第三个应该是articleid和 userid

5用户数按照id分割分布式存储,文章类似,还可以用读写分离等策略水平扩展数据库.

   发表时间:2010-08-17  

1.显然用exists效率高
3.select * from user where  exists (
select userid from Article inner join vote on article.articleid
= vote.articleid  where user.id=article.userId  group by userId  having avg(score)>100 and count(*) >=2
)
1 请登录后投票
   发表时间:2010-08-17  
谢谢,第3个题目看来只要自己好好再想想就出来了,
exists在写hql和jdbc的时候从来没有用过,据说少量结果集用exists,大量结果集用in,再研究研究
0 请登录后投票
   发表时间:2010-08-17  
-.-似乎是某B开头的公司的题。。不过是笔试时做的。。额
0 请登录后投票
   发表时间:2010-08-17  

建议count(*)少用,用count(userid)之类的、
0 请登录后投票
   发表时间:2010-08-17  
第一个,俺会用外连接,然后 is null
0 请登录后投票
   发表时间:2010-08-17  
楼主喜欢用子查询哦,利用外连接速度会更好!
0 请登录后投票
   发表时间:2010-08-17  
lkj107 写道
第一个,俺会用外连接,然后 is null

+1
0 请登录后投票
   发表时间:2010-08-17  
mark.sql方面的学习需要加强
0 请登录后投票
   发表时间:2010-08-17  
第三题:
select
user.userName
from user
inner join
(
    --平均得票数大于100的用户
select  art.userId
from  article art
inner join vote on art.articleId = vote.articleId
where art.userId in(
            --文章数大于5的用户
select  userId
from  article
group by userId
having count(articleId) > 5
)
group by art.userId
having avg(vote.score) > 100
) newuser on user.userId =newuser.userId
0 请登录后投票
论坛首页 招聘求职版

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