查看: 11985|回复: 76

[SQL] 【讨论】大公司面试题,测测你的SQL水平

[复制链接]
认证徽章
论坛徽章:
3
优秀写手
日期:2014-11-11 06:00:15沸羊羊
日期:2015-03-04 14:55:412015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-12-18 17:49 | 显示全部楼层 |阅读模式
   大公司面试题,大家看下看看有没有更好的办法做出来,测测你的sql水平!!!
   
   A.有下面三个表
  1. T_Score(分数表)
  2. Stu_id        Lession_id        Score
  3. 001        L001        90
  4. 001        L002        86
  5. 002        L001        84
  6. 002        L004        75
  7. 003        L003        85
  8. 004        L005        98
  9. …..        

  10. T_Stu_Profile(学生表)
  11. Stu_id        Stu_Name        Sex        Age        Class_id
  12. 001        郭东        F        16        0611
  13. 002        李西        M        18        0612
  14. 003        张北        F        16        0613
  15. 004        钱南        M        17        0611
  16. 005        王五        F        17        0614
  17. 006        赵七        F        16        0615
  18. ……        

  19. T_Lession(课程表)
  20. Lession_id        Lession_Name
  21. L001        语文
  22. L002        数据
  23. L003        英语
  24. L004        物理
  25. L005        化学
复制代码
          1).写出学生没有参加考试的课程,以下形式显示
                 学生姓名        班级        课程



认证徽章
论坛徽章:
3
优秀写手
日期:2014-11-11 06:00:15沸羊羊
日期:2015-03-04 14:55:412015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-12-18 17:51 | 显示全部楼层

  1. select p1.stu_name,p1.class_id,tl.lession_name from t_lession tl,t_stu_profile p1 where tl.lession_id not in(select l.lession_id from t_score s,t_lession l,t_stu_profile p where s.lession_id=l.lession_id and s.stu_id=p.stu_id and p.stu_id=p1.stu_id) order by p1.stu_name desc;
复制代码
             这是我做的,大家可以一起来做做练习,看看你的SQL水平哟

使用道具 举报

回复
认证徽章
论坛徽章:
3
优秀写手
日期:2014-11-11 06:00:15沸羊羊
日期:2015-03-04 14:55:412015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-12-18 17:52 | 显示全部楼层
建表语句:
  1. CREATE TABLE t_stu_profile(stu_id VARCHAR2(10) primary key NOT NULL,
  2.                            stu_name VARCHAR2(30) NOT NULL, sex CHAR(1),
  3.                            age NUMBER(3), class_id VARCHAR2(10));

  4. CREATE TABLE t_lession;
  5. (lession_id VARCHAR2(10) primary key NOT NULL,
  6. lession_name VARCHAR2(20) NOT NULL);

  7. CREATE TABLE t_score(stu_id VARCHAR2(10) primary key,
  8.                      lession_id VARCHAR2(10) NOT NULL, score NUMBER(3, 1));
复制代码

使用道具 举报

回复
认证徽章
论坛徽章:
3
优秀写手
日期:2014-11-11 06:00:15沸羊羊
日期:2015-03-04 14:55:412015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-12-18 17:55 | 显示全部楼层
这是插数据的语句
  1. insert into t_stu_profile (STU_ID, STU_NAME, SEX, AGE, CLASS_ID)
  2. values ('001', '郭东', 'F', 16, '0611');

  3. insert into t_stu_profile (STU_ID, STU_NAME, SEX, AGE, CLASS_ID)
  4. values ('002', '李西', 'M', 18, '0612');

  5. insert into t_stu_profile (STU_ID, STU_NAME, SEX, AGE, CLASS_ID)
  6. values ('003', '张北', 'F', 16, '0613');

  7. insert into t_stu_profile (STU_ID, STU_NAME, SEX, AGE, CLASS_ID)
  8. values ('004', '钱南', 'M', 17, '0611');

  9. insert into t_stu_profile (STU_ID, STU_NAME, SEX, AGE, CLASS_ID)
  10. values ('005', '王五', 'F', 17, '0614');

  11. insert into t_stu_profile (STU_ID, STU_NAME, SEX, AGE, CLASS_ID)
  12. values ('006', '赵七', 'F', 16, '0615');


  13. insert into t_score (STU_ID, LESSION_ID, SCORE)
  14. values ('001', 'L001', 90.0);

  15. insert into t_score (STU_ID, LESSION_ID, SCORE)
  16. values ('001', 'L002', 86.0);

  17. insert into t_score (STU_ID, LESSION_ID, SCORE)
  18. values ('002', 'L001', 84.0);

  19. insert into t_score (STU_ID, LESSION_ID, SCORE)
  20. values ('002', 'L004', 75.0);

  21. insert into t_score (STU_ID, LESSION_ID, SCORE)
  22. values ('003', 'L003', 85.0);

  23. insert into t_score (STU_ID, LESSION_ID, SCORE)
  24. values ('004', 'L005', 98.0);

  25. insert into t_lession (LESSION_ID, LESSION_NAME)
  26. values ('L001', '语文');

  27. insert into t_lession (LESSION_ID, LESSION_NAME)
  28. values ('L002', '数据');

  29. insert into t_lession (LESSION_ID, LESSION_NAME)
  30. values ('L003', '英语');

  31. insert into t_lession (LESSION_ID, LESSION_NAME)
  32. values ('L004', '物理');

  33. insert into t_lession (LESSION_ID, LESSION_NAME)
  34. values ('L005', '化学');
复制代码

使用道具 举报

回复
认证徽章
论坛徽章:
3
优秀写手
日期:2014-11-11 06:00:15沸羊羊
日期:2015-03-04 14:55:412015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-12-18 17:57 | 显示全部楼层
本帖最后由 jinaqu 于 2014-12-25 02:02 编辑

补充一题:
     6)。在对数据仓库进行数据分析的时候,经常需要用到临时表,但由于需求不同不能统一定义事务和会话级临时表,有代码如下,请提出你的优化方案(假设每个查询都将查询出数千万条数据):
         create or replace procedure demo1
         as
         begin         

         create table t1 as select * from a;
         ....
         drop table t1;

         create table t2 as select * from b;
         ....
         drop table t2;

         create table t3 as select * from c;
         ....
         drop table t3;

         end;

         请问如果你是后面负责优化这段pl/sql代码,你会怎么做?

                    (请从SQL,PL/SQL开发以及DBA的角度出发,尽可能的优化执行效率和执行性能)

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2014-12-18 18:23 | 显示全部楼层
select a.stu_name,a.class_id,b.lession_name
from t_stu_profile a,t_lession b
where not exists
(select 1 from t_score c
where a.stu_id=c.stu_id
and b.lession_id=c.lession_id)
order by stu_name,class_id;

你子查询写的太复杂了

使用道具 举报

回复
认证徽章
论坛徽章:
3
优秀写手
日期:2014-11-11 06:00:15沸羊羊
日期:2015-03-04 14:55:412015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-12-18 18:24 | 显示全部楼层
dingjun123 发表于 2014-12-18 18:23
select a.stu_name,a.class_id,b.lession_name
from t_stu_profile a,t_lession b
where not exists

哦哦,原来如此哦

使用道具 举报

回复
认证徽章
论坛徽章:
3
优秀写手
日期:2014-11-11 06:00:15沸羊羊
日期:2015-03-04 14:55:412015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-12-18 18:26 | 显示全部楼层
B.2.        找出课程的前三名,以下列形式显示
课程        第一名(姓名+分数)        第二名(姓名+分数)        第三名(姓名+分数)
语文       
数学       
英语       
物理       
化学       
以最简单SQL语句显示,最好不要使用游标与变量





这个没写出来弄成下面这样,还在想办法。。。。
  1. select  r.lession_name "课程",(case r.srank when 1 then r.stu_name||'+'||r.score end) "第一名(姓名+分数)",(case r.srank when 2 then r.stu_name||'+'||r.score end) "第二名(姓名+分数)",(case r.srank when 3 then r.stu_name||'+'||r.score end) "第三名(姓名+分数)" from (select p.stu_name,s.score ,l.lession_name,rank() over(partition by l.lession_id order by s.score desc) srank from t_lession l,t_stu_profile p,t_score s
  2. where s.lession_id=l.lession_id and s.stu_id=p.stu_id) r where r.srank<4;
复制代码
CCC.png

使用道具 举报

回复
论坛徽章:
5
优秀写手
日期:2013-12-18 09:29:09目光如炬
日期:2015-07-26 22:00:00目光如炬
日期:2015-07-26 22:00:00目光如炬
日期:2015-07-26 22:00:00目光如炬
日期:2015-07-26 22:00:00
发表于 2014-12-18 18:35 | 显示全部楼层
所谓的行列互转

使用道具 举报

回复
认证徽章
论坛徽章:
3
优秀写手
日期:2014-11-11 06:00:15沸羊羊
日期:2015-03-04 14:55:412015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-12-18 18:37 | 显示全部楼层
tianshansoft 发表于 2014-12-18 18:35
所谓的行列互转

帮忙搞搞看,我没搞出来

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表