楼主: newkid

SQL 小测验每周一题

[复制链接]
论坛徽章:
13
2010广州亚运会纪念徽章:轮滑
日期:2010-09-03 12:44:53马上有房
日期:2014-04-04 13:51:34马上加薪
日期:2014-04-04 13:35:40优秀写手
日期:2014-03-14 06:00:13夏利
日期:2013-08-05 18:32:18复活蛋
日期:2013-06-25 17:22:592013年新春福章
日期:2013-02-25 14:51:24蛋疼蛋
日期:2013-01-08 18:08:502011新春纪念徽章
日期:2011-02-18 11:43:33生肖徽章2007版:兔
日期:2011-01-20 12:58:49
21#
发表于 2011-11-2 21:22 | 只看该作者
就知道题目中的写法和选项中join on两种方式,using cross第一次看见。。。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
22#
 楼主| 发表于 2011-11-2 22:14 | 只看该作者
6-25 答案BDE.
A: 按照别名的 ORDER BY导致总合计不在最后一行。
B: 虽然正确,但依赖于一个前提,即UNION ALL不修改结果集的顺序。更好的写法:
SELECT s2.total
     , s2.product
     , s2.country
     , s2.sales
FROM (
   SELECT 1 subselect
        , GROUPING(s.product) subtotal
        , 'Product' total
        , CASE GROUPING(s.product)
            WHEN 1 THEN 'TOTAL'
            ELSE s.product
          END product
        , 'TOTAL' country
        , SUM(s.sales) sales
   FROM plch_sales s
   GROUP BY s.product
   UNION ALL
   SELECT 2 subselect
        , GROUPING(s.country) subtotal
        , 'Country' total
        , 'TOTAL' product
        , CASE GROUPING(s.country)
            WHEN 1 THEN 'TOTAL'
            ELSE s.country
          END country
        , SUM(s.sales) sales
   FROM plch_sales s
   GROUP BY s.country
   UNION ALL
   SELECT 3 subselect
        , 1 subtotal
        , 'Grand' total
        , 'TOTAL' product
        , 'TOTAL' country
        , SUM(s.sales) sales
   FROM plch_sales s
) s2
ORDER BY s2.subselect
       , s2.subtotal
       , s2.product
       , s2.country;

C:错误:ROLLUP(s.product, s.country)会按照(product,country)和(product)汇总,不会产生(country)汇总。
D:正确:GROUPING SET允许你自己定义GROUP BY组合。
E:正确:CUBE产生了所有四种可能的 GROUP BY 组合, HAVING GROUPING_ID 去除了 (product,country) 组合。
F:错误:按照别名的 ORDER BY 导致了排序错误。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
23#
 楼主| 发表于 2011-11-2 22:18 | 只看该作者
2011-7-2 ALL比较条件
作者:Steven Feuerstein
难度:低

我创建了这张表并填入数据:
CREATE TABLE plch_employees
(
   employee_id   INTEGER
, last_name     VARCHAR2 (100)
, salary        NUMBER
)
/

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

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

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

   INSERT INTO plch_employees
        VALUES (400, 'Buffet', 4000);

   INSERT INTO plch_employees
        VALUES (500, 'Slim', 5000);

   INSERT INTO plch_employees
        VALUES (600, 'Arnault', 6000);

   COMMIT;
END;
/

下列哪些查询执行之后会显示这三行文本?
Arnault
Buffet
Slim

(A)
SELECT last_name
    FROM plch_employees
   WHERE salary > ALL (2000, 3000)
ORDER BY last_name
/

(B)
SELECT last_name
    FROM plch_employees
   WHERE salary > ANY (2000, 3000)
ORDER BY last_name
/

(C)
SELECT last_name
    FROM plch_employees
   WHERE salary > 2000 AND salary > 3000
ORDER BY last_name
/

(D)
SELECT last_name
    FROM plch_employees
   WHERE salary >  (SELECT salary
                         FROM plch_employees
                        WHERE last_name IN ('Ellison', 'Gates'))
ORDER BY last_name
/

(E)
SELECT last_name
    FROM plch_employees
   WHERE salary > ALL (SELECT salary
                         FROM plch_employees
                        WHERE last_name IN ('Ellison', 'Gates'))
ORDER BY last_name
/


使用道具 举报

回复
论坛徽章:
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
24#
发表于 2011-11-2 23:51 | 只看该作者
这个题目还不错,比较冷门,其实all,some,any操作符还挺复杂的,特别是>,>=,<,<=,还有用于关联子查询的时候
all就是全部都满足的意思,any some是任何一条满足
>all就是大于全部都满足的,那只要找最大的
>any就是大于任何一条,那就大于最小的,和all是相反的,<都是相反的
any子查询无结果,则无结果,all子查询无结果,则全部返回

使用道具 举报

回复
论坛徽章:
4
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51灰彻蛋
日期:2011-11-07 07:32:08蛋疼蛋
日期:2011-12-26 14:19:11蛋疼蛋
日期:2012-04-07 01:24:00
25#
发表于 2011-11-3 08:29 | 只看该作者
都是非常好的题目,学习了^_^

使用道具 举报

回复
论坛徽章:
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
26#
发表于 2011-11-3 08:48 | 只看该作者
看完兔子的解释后选了ACE

all,some,any又是第一次看到。。。
这题越做越给力

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
27#
 楼主| 发表于 2011-11-3 22:11 | 只看该作者
2011-7-2 答案ACE, 兔子的解说很给力,大家现在都知道了回字有四种写法。

==================================================================
2011-7-9 行列转换
作者:Kim Berg Hansen
难度:中

我创建了这张表并填入数据:
CREATE TABLE plch_employees
(
   employee_id   INTEGER
, department_id INTEGER
, last_name     VARCHAR2 (20)
, salary        NUMBER
)
/

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

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

   INSERT INTO plch_employees
        VALUES (300, 100, 'Gates', 199500);

   INSERT INTO plch_employees
        VALUES (400, 200, 'Feuerstein', 199400);

   INSERT INTO plch_employees
        VALUES (500, 200, 'Hansen', 200600);

   COMMIT;
END;
/

我老板想知道每个部门有多少个员工赚钱少于250000,多少人大于等于250000。
哪些选项能够产生符合条件的输出:
DEPARTMENT_ID       LESS       MORE
------------- ---------- ----------
          100          2          0
          200          2          1

(A)
SELECT *
FROM (
   SELECT department_id
        , CASE
             WHEN salary < 250000 THEN 'LESS'
             ELSE 'MORE'
          END salary_category
   FROM plch_employees
) PIVOT (
   COUNT(salary_category)
   FOR department_id IN (
      100,200
   )
);

(B)
SELECT *
FROM (
   SELECT department_id
        , CASE
             WHEN salary < 250000 THEN 'LESS'
             ELSE 'MORE'
          END salary_category
   FROM plch_employees
) PIVOT (
   COUNT(*)
   FOR salary_category IN (
      'LESS' AS less,
      'MORE' AS more
   )
)
ORDER BY department_id;


(C)
SELECT department_id
     , COUNT(salary < 250000) less
     , COUNT(salary >= 250000) more
FROM plch_employees
GROUP BY department_id
ORDER BY department_id;

(D)
SELECT department_id
     , COUNT(
          CASE
             WHEN salary < 250000 THEN 1
          END
       ) less
     , COUNT(
          CASE
             WHEN salary >= 250000 THEN 1
          END
       ) more
FROM plch_employees
GROUP BY department_id
ORDER BY department_id;

(E)
SELECT *
FROM (
   SELECT department_id
        , CASE
             WHEN salary < 250000 THEN 'LESS'
             ELSE 'MORE'
          END salary_category
   FROM plch_employees
) PIVOT (
   COUNT(*)
   FOR salary_category IN (
      'LESS',
      'MORE'
   )
)
ORDER BY department_id;

(F)
SELECT department_id
     , COUNT(
          CASE
             WHEN salary < 250000 THEN 1
             ELSE 0
          END
       ) less
     , COUNT(
          CASE
             WHEN salary >= 250000 THEN 1
             ELSE 0
          END
       ) more
FROM plch_employees
GROUP BY department_id
ORDER BY department_id;

使用道具 举报

回复
论坛徽章:
10000
绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2015-12-16 18:42:35绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-09-10 13:05:08
28#
发表于 2011-11-4 08:49 | 只看该作者
(A)就算值对,输出的标题也不对,标题是100,200
(C)COUNT()里面的语法不对,不仔细看还以为是对的
(F)COUNT应该改成SUM
所以答案应该是BDE

使用道具 举报

回复
论坛徽章:
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
29#
发表于 2011-11-4 09:48 | 只看该作者
jboracle1981 发表于 2011-11-4 08:49
(A)就算值对,输出的标题也不对,标题是100,200
(C)COUNT()里面的语法不对,不仔细看还以为是对的
...

这家伙考的东西很多陷阱的,他说的是一模一样

使用道具 举报

回复
论坛徽章:
4
蜘蛛蛋
日期:2011-06-08 16:02:522012新春纪念徽章
日期:2012-01-04 11:58:18秀才
日期:2016-08-05 10:38:01秀才
日期:2016-08-05 10:38:11
30#
发表于 2011-11-4 10:52 | 只看该作者
abdf

使用道具 举报

回复

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

本版积分规则 发表回复

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