楼主: newkid

SQL 小测验每周一题

[复制链接]
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
151#
 楼主| 发表于 2012-1-10 03:12 | 只看该作者
2011-12-31 答案B, 因为1/3除不尽所以会占用NUMBER的所有位,因此扩大了列的存储空间,会产生行迁移。

下面用DUMP查看空间占用的情况:

select dump (1/2), to_char(1/2,'TM9') from dual
/

DUMP(1/2)           TO_CHAR(1/2,'TM9')
------------------- ----------------------------------------------------------------
Typ=2 Len=2: 192,51 .5



select dump (1/3), to_char(1/3,'TM9') from dual
/

DUMP(1/3)                                                                     TO_CHAR(1/3,'TM9')
----------------------------------------------------------------------------- -----------------------------------------------------------
Typ=2 Len=21: 192,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34 .3333333333333333333333333333333333333333



select dump (1/5), to_char(1/5,'TM9') from dual
/

DUMP(1/5)           TO_CHAR(1/5,'TM9')
------------------- ----------------------------------------------------------------
Typ=2 Len=2: 192,21 .2



select dump (1/10), to_char(1/10,'TM9') from dual
/

DUMP(1/10)          TO_CHAR(1/10,'TM9')
------------------- ----------------------------------------------------------------
Typ=2 Len=2: 192,11 .1

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
152#
 楼主| 发表于 2012-1-10 03:12 | 只看该作者
2012-1-7 层次查询
作者:Kim Berg Hansen
难度:中

我创建了如下的表并填入数据:
create table plch_emp (
   empno       number(4)   primary key,
   ename       varchar2(10),
   mgr         number(4)   references plch_emp(empno)
);

insert into plch_emp values (7839, 'KING'  , null);
insert into plch_emp values (7698, 'BLAKE' , 7839);
insert into plch_emp values (7499, 'ALLEN' , 7698);
insert into plch_emp values (7900, 'JAMES' , 7698);
insert into plch_emp values (7654, 'MARTIN', 7698);
insert into plch_emp values (7844, 'TURNER', 7698);
insert into plch_emp values (7521, 'WARD'  , 7698);
insert into plch_emp values (7782, 'CLARK' , 7839);
insert into plch_emp values (7934, 'MILLER', 7782);
insert into plch_emp values (7566, 'JONES' , 7839);
insert into plch_emp values (7902, 'FORD'  , 7566);
insert into plch_emp values (7369, 'SMITH' , 7902);
insert into plch_emp values (7788, 'SCOTT' , 7566);
insert into plch_emp values (7876, 'ADAMS' , 7788);

commit;

我老板要我写一个查询来显示所有那些“不是其他员工的经理”的员工,并且显示他或她的直接上级(在层次中往上一层的员工)的姓名,如果有上级的话。

哪些选项提供了满足要求的查询?换句话说,就上述数据而言,查询必须产生这样的输出:
PROGRAMMER      BOSS           
--------------- ---------------
ADAMS           SCOTT         
ALLEN           BLAKE         
JAMES           BLAKE         
MARTIN          BLAKE         
MILLER          CLARK         
SMITH           FORD           
TURNER          BLAKE         
WARD            BLAKE         

注:列标题"PROGRAMMER(程序员)"是因为在我们公司,所有不是经理的人都是程序员。有点奇怪是吗?但我们程序员喜欢这样,挺好!

(A)
select
   subordinate.ename as programmer,
   manager.ename as boss
from plch_emp subordinate
join plch_emp manager
   on manager.empno = subordinate.mgr
where manager.mgr is not null
order by
   subordinate.ename;

(B)
select
   ename as programmer,
   (
      select ename
      from plch_emp boss
      where boss.empno = plch_emp.mgr
   ) as boss
from plch_emp
where empno not in (
   select mgr
   from plch_emp
)
order by
   ename;

(C)
select
   ename as programmer,
   (
      select ename
      from plch_emp boss
      where boss.empno = plch_emp.mgr
   ) as boss
from plch_emp
where not exists (
   select null
   from plch_emp subordinate
   where subordinate.mgr = plch_emp.empno
)
order by
   ename;

(D)
select
   ename as programmer,
   prior ename as boss
from plch_emp
where prior mgr is null
start with mgr is null
connect by mgr = prior empno
order by
   ename;

(E)
select
   ename as programmer,
   prior ename as boss
from plch_emp
where connect_by_isleaf = 1
start with mgr is null
connect by mgr = prior empno
order by
   ename;

使用道具 举报

回复
论坛徽章:
142
秀才
日期:2016-01-06 14:01:09秀才
日期:2016-02-18 10:06:46秀才
日期:2016-02-18 10:08:02秀才
日期:2016-02-18 10:08:14秀才
日期:2016-03-01 09:57:08天蝎座
日期:2016-03-18 14:23:56秀才
日期:2016-03-24 09:10:24秀才
日期:2016-03-24 09:20:52秀才
日期:2016-04-21 14:08:53秀才
日期:2016-04-21 14:11:59
153#
发表于 2012-1-10 09:49 | 只看该作者
本帖最后由 visual2006 于 2012-1-16 09:55 编辑

C,E 2012-1-7 层次查询

使用道具 举报

回复
论坛徽章:
16
2011新春纪念徽章
日期:2011-01-04 10:36:17优秀写手
日期:2014-03-12 06:00:13马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:08茶鸡蛋
日期:2013-02-28 16:07:01复活蛋
日期:2013-02-27 18:28:01迷宫蛋
日期:2013-01-28 09:52:03奥运会纪念徽章:举重
日期:2012-06-28 11:26:23鲜花蛋
日期:2012-06-05 09:53:53双黄蛋
日期:2012-01-06 09:22:33
154#
发表于 2012-1-11 10:14 | 只看该作者
newkid 发表于 2011-11-22 01:01
2011-10-1 比较条件中的ALL, ANY 和 SOME
作者:Tim Hall
难度:中

这个考点应当是  > all 等同于 大于最大值
                > any  等同于大于最小值  

使用道具 举报

回复
论坛徽章:
0
155#
发表于 2012-1-11 16:02 | 只看该作者
newkid 发表于 2011-11-1 05:15
2011-06-18 ANSI JOIN 语法
作者:Patrick Barel
难度:中

BDF是对的

使用道具 举报

回复
论坛徽章:
13
2010新春纪念徽章
日期:2010-03-01 11:04:59技术图书徽章
日期:2018-03-01 10:21:49秀才
日期:2018-03-01 10:21:252015年新春福章
日期:2015-03-06 11:58:18喜羊羊
日期:2015-03-04 14:52:46优秀写手
日期:2014-04-22 06:00:18马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:082013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-01-04 11:56:01
156#
发表于 2012-1-13 09:30 | 只看该作者
本帖最后由 KEN6503 于 2012-1-14 07:09 编辑

答案是 C (2012-1-7 层次查询)

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
157#
发表于 2012-1-14 01:05 | 只看该作者
各位在回答问题的时候,标注一下回答的是哪一期的问题

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
158#
 楼主| 发表于 2012-1-18 02:59 | 只看该作者
本帖最后由 newkid 于 2012-4-28 03:17 编辑

2012-1-7 答案CE

A: where manager.mgr is not null这个条件错了,题目并没有要求经理的上级不为空。
B: where empno not in (
    select mgr
    from plch_emp
   ) 这个条件错了,因为子查询可能返回NULL, 导致NOT IN的结果返回空集合。
如果在子查询中加上WHERE mgr IS NOT NULL就对了。
D: 这个查询把有下级的员工也显示出来了。

=======================================================
2012-1-14 CEIL函数
作者:Kim Berg Hansen
难度:低

我创建下列的表并填入数据:
create table plch_employees
(
   employee_id   integer
, last_name     varchar2 (20)
, salary        number
)
/

insert into plch_employees
   values (100, 'Feuerstein', 11000);

insert into plch_employees
   values (200, 'Hansen',      9500);

insert into plch_employees
   values (300, 'Barel',      12250);

insert into plch_employees
   values (300, 'Kemp',       10750);
---- 注:最后一个员工ID重复,原文如此,但不影响结果

commit;

我老板想知道她在发薪日需要多少现金才够发所有人的工资。

我们国家用的货币是Moneto(一种虚构货币)。最小的面额是1000 Monetos的钞票。我们发的钱永远不能比工资低,所以如果工资不能被1000整除,我们必须向上找最接近的千位数。比如,我们老板需要给Barel发13,000的Monetos。

下列哪些选项的查询执行之后会显示:

TOTAL_PAY
----------
     45000

(A)
select sum(salary) total_pay
  from plch_employees

(B)
select ceil(sum(salary)/1000)*1000 total_pay
  from plch_employees

(C)
select sum(ceil(salary/1000)*1000) total_pay
  from plch_employees

(D)
select sum(round(salary,-3)) total_pay
  from plch_employees
  
(E)
select sum(round(salary,1000)) total_pay
  from plch_employees

(F)
select sum(trunc(salary,-3)) total_pay
  from plch_employees

(G)
select sum(floor(salary/1000)*1000+1000) total_pay
  from plch_employees
  
(H)
select sum(salary-mod(salary,1000)+1000) total_pay
  from plch_employees

(I)
select sum(
          salary
        - mod(salary,1000)
        + case mod(salary,1000) when 0 then 0 else 1000 end
       ) total_pay
  from plch_employees     

使用道具 举报

回复
论坛徽章:
9
生肖徽章2007版:鼠
日期:2008-01-02 17:35:532010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB元老
日期:2010-11-25 21:23:432011新春纪念徽章
日期:2011-02-18 11:43:34蛋疼蛋
日期:2011-05-18 12:56:16蛋疼蛋
日期:2011-07-05 23:24:04蛋疼蛋
日期:2011-09-01 13:05:43ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152013年新春福章
日期:2013-02-25 14:51:24
159#
发表于 2012-1-18 08:51 | 只看该作者
A肯定不行,结果为43500 ,
B只能取到44000,
C可以,
D不可以,如果salary的千位都大于等于5是可以取到;
E也不行
F不可以, 只能取到42000
G不可以,floor与ceil刚好相反。
H可以取到46000;
I可以,算法略显复杂。

newkid 2点多都还没睡,难道不在北京时区内?

使用道具 举报

回复
论坛徽章:
142
秀才
日期:2016-01-06 14:01:09秀才
日期:2016-02-18 10:06:46秀才
日期:2016-02-18 10:08:02秀才
日期:2016-02-18 10:08:14秀才
日期:2016-03-01 09:57:08天蝎座
日期:2016-03-18 14:23:56秀才
日期:2016-03-24 09:10:24秀才
日期:2016-03-24 09:20:52秀才
日期:2016-04-21 14:08:53秀才
日期:2016-04-21 14:11:59
160#
发表于 2012-1-18 09:24 | 只看该作者
以1000为单位向上取整,CEIL(天花板)
newkid是飞人,不落地滴,所以不在CN时区

使用道具 举报

回复

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

本版积分规则 发表回复

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