楼主: newkid

SQL 小测验每周一题

[复制链接]
论坛徽章:
27
ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:36托尼托尼·乔巴
日期:2017-10-25 16:45:57秀才
日期:2017-04-05 13:18:06秀才
日期:2017-03-02 10:35:322016猴年福章
日期:2016-02-23 09:58:342016猴年福章
日期:2016-02-18 09:31:302015年新春福章
日期:2015-03-06 11:57:312014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31
31#
发表于 2011-11-4 15:07 | 只看该作者
PIVOT 完全不懂

使用道具 举报

回复
论坛徽章:
14
2012新春纪念徽章
日期:2012-01-04 11:58:182012新春纪念徽章
日期:2012-02-07 09:59:35ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59马上加薪
日期:2014-08-09 14:42:472014年世界杯参赛球队: 美国
日期:2014-06-04 09:05:20优秀写手
日期:2014-03-12 06:00:13马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:082013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:水球
日期:2012-10-11 16:40:16
32#
发表于 2011-11-4 21:41 | 只看该作者
本帖最后由 ziling2011 于 2011-11-4 21:43 编辑

 BD 
E列名有引号

使用道具 举报

回复
论坛徽章:
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
33#
 楼主| 发表于 2011-11-4 21:59 | 只看该作者
2011-7-9 答案BD.
A: 输出列名不对
C: 语法错误
E: 输出列名不对, 多了单引号
F: COUNT会计算所有非空列,0也会被计入。应该用NULL取代0.


==================================================================
2011-7-16 分析函数 FIRST 关键字
作者:mentzel.iudith
难度:中

在我们的HR(人力资源)应用中我们有如下的员工表:
CREATE TABLE plch_employees
(
   employee_id  INTEGER PRIMARY KEY
, last_name    VARCHAR2(100)
, salary       NUMBER
)
/

BEGIN
   INSERT INTO plch_employees
     VALUES (100, 'Jobs', 1000);

   INSERT INTO plch_employees
     VALUES (200, 'Ellison', 1000);

   INSERT INTO plch_employees
     VALUES (300, 'Gates', 1000);

   COMMIT;
END;
/

我们还有一张日志表,记录了每次员工的薪资调整:
CREATE TABLE plch_emp_log
(
   employee_id  INTEGER  REFERENCES plch_employees (employee_id)
, log_date     DATE
, old_salary   NUMBER
, new_salary   NUMBER
, CONSTRAINT plch_emp_log_pk PRIMARY KEY (employee_id, log_date)
)
/

BEGIN
   INSERT INTO plch_emp_log  VALUES (100, TO_DATE('15-JAN-10','DD-MON-RR'), 1000, 2000);
   INSERT INTO plch_emp_log  VALUES (100, TO_DATE('18-JAN-10','DD-MON-RR'), 2000, 1800);
   INSERT INTO plch_emp_log  VALUES (200, TO_DATE('20-JAN-10','DD-MON-RR'), 1000, 1600);
   INSERT INTO plch_emp_log  VALUES (200, TO_DATE('20-MAR-10','DD-MON-RR'), 1600, 2500);

   INSERT INTO plch_emp_log  VALUES (300, TO_DATE('01-APR-10','DD-MON-RR'), 1000, 2000);
   INSERT INTO plch_emp_log  VALUES (100, TO_DATE('05-APR-10','DD-MON-RR'), 1800, 1900);
   INSERT INTO plch_emp_log  VALUES (200, TO_DATE('10-MAY-10','DD-MON-RR'), 2500, 2300);
   INSERT INTO plch_emp_log  VALUES (300, TO_DATE('15-MAY-10','DD-MON-RR'), 2000, 3000);

   INSERT INTO plch_emp_log  VALUES (100, TO_DATE('15-SEP-10','DD-MON-RR'), 1900, 1500);
   INSERT INTO plch_emp_log  VALUES (200, TO_DATE('20-SEP-10','DD-MON-RR'), 2300, 3000);
   INSERT INTO plch_emp_log  VALUES (300, TO_DATE('10-OCT-10','DD-MON-RR'), 3000, 2700);

   INSERT INTO plch_emp_log  VALUES (100, TO_DATE('05-JAN-11','DD-MON-RR'), 1500, 2500);
   INSERT INTO plch_emp_log  VALUES (200, TO_DATE('10-FEB-11','DD-MON-RR'), 3000, 2000);
   INSERT INTO plch_emp_log  VALUES (300, TO_DATE('20-FEB-11','DD-MON-RR'), 2700, 2500);

   INSERT INTO plch_emp_log  VALUES (100, TO_DATE('15-APR-11','DD-MON-RR'), 2500, 2200);
   INSERT INTO plch_emp_log  VALUES (200, TO_DATE('20-JUL-11','DD-MON-RR'), 2000, 2800);
   INSERT INTO plch_emp_log  VALUES (300, TO_DATE('15-SEP-11','DD-MON-RR'), 2500, 2900);

   COMMIT;
END;
/

我们决定实现一个视图,从而使得对这个视图的简单查询(只有过滤条件,没有连接、聚合、子查询等)能够回答诸如此类的需求:

返回一个员工列表,他们的工资在一个指定日期区间发生变动,要求显示每个员工在此区间的第一个和最后一个工资,这个区间可能是一年,一季度,或一个月。

这里有些例子:

1. 某一年,比如 2010
PERIOD   EMPLOYEE_ID  FIRST_SALARY  LAST_SALARY
-------  -----------  ------------  -----------
2010             100          1000         1500
2010             200          1000         3000
2010             300          1000         2700

2. 某一季度,比如 2010 第一季度
PERIOD   EMPLOYEE_ID  FIRST_SALARY  LAST_SALARY
-------  -----------  ------------  -----------
2010-1           100          1000         1800
2010-1           200          1000         2500

3. 某个月,比如 2010-01
PERIOD   EMPLOYEE_ID  FIRST_SALARY  LAST_SALARY
-------  -----------  ------------  -----------
2010-01          100          1000         1800
2010-01          200          1000         1600

哪些选项可用来取代下列视图定义中的 /*FIRST_SALARY*/ 和 /*LAST_SALARY*/,使得这个视图可用来回答上述问题?

CREATE OR REPLACE VIEW plch_emp_salary_change
AS
SELECT
       TO_CHAR(log_date,'YYYY')  year,
       TO_CHAR(log_date,'Q')     quarter,
       TO_CHAR(log_date,'MM')    month,
       employee_id,
       /*FIRST_SALARY*/    first_salary,
       /*LAST_SALARY*/     last_salary,
       GROUPING_ID(TO_CHAR(log_date,'YYYY'),
                   TO_CHAR(log_date,'Q'),
                   TO_CHAR(log_date,'MM'))   gid
FROM
      plch_emp_log
GROUP BY
      ROLLUP(TO_CHAR(log_date,'YYYY'),
             TO_CHAR(log_date,'Q'),
             TO_CHAR(log_date,'MM')),
      employee_id
/

(A)
MIN(old_salary)
MAX(new_salary)

(B)
FIRST_VALUE(old_salary)
LAST_VALUE(new_salary)

(C)
MIN(old_salary) KEEP(DENSE_RANK FIRST ORDER BY log_date)
MIN(new_salary) KEEP(DENSE_RANK LAST  ORDER BY log_date)

(D)
FIRST_VALUE(old_salary)   OVER(PARTITION BY employee_id
                               ORDER BY log_date)     
LAST_VALUE(new_salary)    OVER(PARTITION BY employee_id
                               ORDER BY log_date)
                              
(E)
MIN(old_salary)    OVER(PARTITION BY employee_id
                        ORDER BY log_date)
MAX(new_salary)    OVER(PARTITION BY employee_id
                        ORDER BY log_date)
                        
(F)
TO_NUMBER(SUBSTR(MIN(TO_CHAR(log_date,'YYYYMMDDHH24MISS')||old_salary),15))
TO_NUMBER(SUBSTR(MAX(TO_CHAR(log_date,'YYYYMMDDHH24MISS')||new_salary),15))

使用道具 举报

回复
论坛徽章:
14
2012新春纪念徽章
日期:2012-01-04 11:58:182012新春纪念徽章
日期:2012-02-07 09:59:35ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59马上加薪
日期:2014-08-09 14:42:472014年世界杯参赛球队: 美国
日期:2014-06-04 09:05:20优秀写手
日期:2014-03-12 06:00:13马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:082013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:水球
日期:2012-10-11 16:40:16
34#
发表于 2011-11-4 22:26 | 只看该作者
D

使用道具 举报

回复
论坛徽章:
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
35#
发表于 2011-11-6 18:04 | 只看该作者
注意分组的语义概念以及要求的最开始的sal和最后的sal,这个过程中可能降薪
所以答案和明显了,2个

使用道具 举报

回复
论坛徽章:
0
36#
发表于 2011-11-6 19:45 | 只看该作者
本帖最后由 吴哲仁 于 2011-11-6 19:48 编辑

答案是:A,B,D,F
C最后差了一个括号

2011-06-18 ANSI JOIN 语法
作者:Patrick Barel
难度:中

我创建了这张表并填入数据:
CREATE TABLE plch_departments (
  department_id INTEGER PRIMARY KEY
,department_name VARCHAR2 (100))
/

BEGIN
   INSERT INTO plch_departments
        VALUES (100, 'Marketing');

   INSERT INTO plch_departments
        VALUES (200, 'Catering');

   COMMIT;
END;
/

CREATE TABLE plch_employees
(
   employee_id     INTEGER
, last_name       VARCHAR2 (100)
, salary          NUMBER
, department_id   INTEGER    REFERENCES plch_departments (department_id)
)

/

BEGIN
   INSERT INTO plch_employees
        VALUES (100
              , 'Jobs'
              , 1000000
              , 100);

   INSERT INTO plch_employees
        VALUES (200
              , 'Ellison'
              , 1000000
              , 200);

   INSERT INTO plch_employees
        VALUES (300
              , 'Gates'
              , 1000000
              , 200);

   COMMIT;
END;
/
哪些选项包含了一个查询,它返回的结果集和下面这个查询相同:
SELECT e.last_name, e.salary, d.department_name
  FROM plch_employees e, plch_departments d
WHERE e.department_id = d.department_id

(A)
SELECT e.last_name, e.salary, d.department_name
  FROM plch_employees e NATURAL JOIN plch_departments d
/

(B)
SELECT e.last_name, e.salary, d.department_name
  FROM plch_employees e JOIN plch_departments d USING (department_id)
/

(C)
SELECT e.last_name, e.salary, d.department_name
  FROM plch_employees e JOIN plch_departments d USING department_id
/

(D)
SELECT e.last_name, e.salary, d.department_name
  FROM    plch_employees e
       JOIN
          plch_departments d
       ON (e.department_id = d.department_id)
/

(E)
SELECT e.last_name, e.salary, d.department_name
  FROM plch_employees e CROSS JOIN plch_departments d
/

(F)
SELECT e.last_name, e.salary, d.department_name
  FROM plch_employees e CROSS JOIN plch_departments d
WHERE e.department_id = d.department_id
/







世界上只有两种编程方法:Oracle的方法和错误的方法。



使用道具 举报

回复
论坛徽章:
3
2012新春纪念徽章
日期:2012-01-04 11:58:18双黄蛋
日期:2012-01-05 14:01:192014年世界杯参赛球队: 厄瓜多尔
日期:2014-07-02 10:32:37
37#
发表于 2011-11-6 21:28 | 只看该作者
ACDF

使用道具 举报

回复
论坛徽章:
8
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22灰彻蛋
日期:2011-11-08 00:28:222012新春纪念徽章
日期:2012-01-04 11:55:052012新春纪念徽章
日期:2012-02-07 09:59:35ITPUB 11周年纪念徽章
日期:2012-10-09 18:13:332013年新春福章
日期:2013-02-25 14:51:24ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:422017金鸡报晓
日期:2017-01-10 15:33:11
38#
发表于 2011-11-6 22:25 | 只看该作者
很是实践出真知啊。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
46
ITPUB元老
日期:2011-08-06 00:48:09最佳人气徽章
日期:2012-03-13 17:39:18版主1段
日期:2013-03-07 02:21:02ITPUB季度 技术新星
日期:2011-11-18 16:54:31ITPUB伯乐
日期:2012-02-16 14:53:44ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:45会员2007贡献徽章
日期:2007-09-26 18:42:10玉石琵琶
日期:2012-02-21 15:04:38授权会员
日期:2007-01-26 09:19:03数据库板块每日发贴之星
日期:2011-08-04 01:01:01
39#
发表于 2011-11-7 09:53 | 只看该作者
本帖最后由 outdo 于 2011-11-7 09:59 编辑

CDF

使用道具 举报

回复
论坛徽章:
27
ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:36托尼托尼·乔巴
日期:2017-10-25 16:45:57秀才
日期:2017-04-05 13:18:06秀才
日期:2017-03-02 10:35:322016猴年福章
日期:2016-02-23 09:58:342016猴年福章
日期:2016-02-18 09:31:302015年新春福章
日期:2015-03-06 11:57:312014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31
40#
发表于 2011-11-7 13:26 | 只看该作者
ABDF

使用道具 举报

回复

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

本版积分规则 发表回复

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