Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru) 213


Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)"

Выпуск 213 (25 октября 2008 г.)

Новым посетителям сайта

SQL Exercises Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.

Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 51-й задачи первого этапа. При подсчете рейтинга каждого участника отбрасывается один самый худший показатель среди всех решенных им упражнений.

Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов, которые пригодятся на третьем рейтинговом этапе, который начинается после 138 задачи.

Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.


Новости сайта

§ На 10 дней раньше закончился второй этап народного голосования в рамках Премии Рунета. Увы, но в финал мы не попали. Для этого нужно было набрать около 2200 голосов. Мы же набрали 1046 за 20 дней. Это явный прогресс, т.к. в прошлом году за 2 месяца (с учетом финала) мы набрали 1292 голоса.
Спасибо всем, кто голосовал за нас!
Но есть и хорошая новость - теперь можно успокоиться и заняться делом. :-)

§ По просьбе Ozzy на персональной странице выводится список всех решенных задач с краткими формулировками. Там же есть пара ссылок - на соответствующий топик форума и на страницу с данным упражнением.
Надеюсь, что это понравится не только заказчику. :-)

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
6. @Nikotin (146, 147)

§ К третьему этапу подошли:
41. mar_vi (задач 138, время 8.892)
42. orange (138, 15.673)
Одна задача до третьего этапа осталась:
44. TimonSP (137, 2.685)
46. Oxana (137, 63.180)

§ Новые лица в ТОР 100 и вернувшиеся туда:
41. mar_vi (138, 8.892)
96. lexaNRJ (126, 89.199)

§ Продвинулись в рейтинге:
61. MeVit (133, 29.515)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
107. Ashton (124, 18.678)
134. Gleb (117, 160.082)

§ На этой неделе сертифицированы:
MeVit (B08034505) [AR] - г.Томск, Россия
breezemaster1 (A08039147) [BK] - г.Москва, Россия

§ Число подписчиков - 3835

Число участников рейтинга - 18835

Число участников второго этапа - 1579

Число участников третьего этапа - 40

Сертифицировано на сайте - 335

Лучшие результаты (ТОР 20)

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Печатнов В.В. (pvv) 149 149 21 360 357 30.865 17.490 36 10 Oct 2008 24 Oct 2008
2 Селезнёв А.С. (Артём С.) 148 149 21 357 322 38.520 29.235 36 25 Sep 2008 21 Oct 2008
3 Креславский О.М. (Arcan) 149 149 21 360 617 48.147 36.296 36 08 Oct 2008 24 Oct 2008
4 Карасёва Н.В. (vlksm) 149 149 21 360 866 77.240 49.173 36 18 Sep 2008 24 Oct 2008
5 Сальников С.А. ($erges) 148 149 21 358 196 2.854 3.359 34 09 Sep 2008 24 Oct 2008
6 Никотин В.М. (@Nikotin) 147 147 21 355 53 6.724 1.839 31 19 Oct 2008 24 Oct 2008
7 Держальцев В.А. (MadVet) 140 146 21 341 1257 60.815 28.482 28 24 Sep 2008 06 Oct 2008
8 Любченко В.А. (IAS56) 139 146 21 340 615 403.439 373.617 28 11 May 2008 16 Aug 2008
9 Голубин Р.С. (Roman S. Golubin) 143 145 21 343 1122 93.054 58.822 25 13 Sep 2008 23 Oct 2008
10 Nikolaenko A.V. (Shadow77) 145 126 21 347 436 77.520 14.010 23 22 Oct 2008 24 Oct 2008
11 Мурашкин И.В. (lepton) 142 148 21 342 921 43.485 33.011 23 29 Sep 2008 02 Oct 2008
12 Солдатенков Ю.С. (SolYUtor) 141 146 21 339 819 22.703 6.102 20 14 Aug 2008 23 Oct 2008
13 Белогурова К. (Katy_Ekb) 135 143 21 328 361 10.714 4.673 18 20 May 2008 16 Oct 2008
14 Егоров А.Б. (ABEgorov) 140 144 21 337 180 12.917 8.815 18 03 Aug 2008 12 Aug 2008
15 Войнов П.Е. (pаparome) 142 146 21 338 1125 3.132 .213 17 22 Sep 2008 07 Oct 2008
16 Дроздков А.Н. (anddros) 143 145 21 341 140 4.236 .921 17 14 Oct 2008 24 Oct 2008
17 iglbeat (iglbeat) 140 145 21 336 360 34.601 15.225 17 08 Aug 2008 25 Aug 2008
18 Северюхин Ю.А. (Venser) 131 142 21 319 335 4.925 .655 14 01 Feb 2008 04 Feb 2008
19 Борисенков Д.В. (xuser) 140 142 21 332 261 3.346 .926 14 18 Oct 2008 24 Oct 2008
20 Мишин С.А. (CepbIu) 137 142 21 328 69 9.772 2.148 14 26 Jun 2008 10 Sep 2008

Лучшие результаты за неделю

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >PVS V.S. (Night Wind) 52 52 98 19 117 1162 24 Oct 2008
2 >Шиндин А.В. (AlShin) 41 41 79 23 102 1543 24 Oct 2008
3 >Тазиева С.И. (fart) 41 41 80 19 99 1617 24 Oct 2008
4 >Васильева Н.А. (Рыжая Нина) 43 43 81 0 81 2249 24 Oct 2008
5 >Демидов А.Б. (AlexandrB) 43 43 81 0 81 2250 24 Oct 2008
6 >Фадеев (Cerebral) 30 30 57 0 57 3827 24 Oct 2008
7 >Дмитрий (Litium) 17 27 39 17 56 3147 24 Oct 2008
8 Dvoinos Y. (Y.Dvoinos) 22 37 54 0 54 2709 23 Oct 2008
9 Ozik (dont.worry) 23 23 36 17 53 4191 24 Oct 2008
10 Войнов Е.В. (xvevx) 17 43 34 17 51 1657 21 Oct 2008
11 >Мерлян (Irmo) 13 46 25 23 48 1296 24 Oct 2008
12 Долгов (Dolgov) 24 24 44 3 47 4849 24 Oct 2008
13 Попов (hype) 24 24 44 1 45 5091 23 Oct 2008
14 >Vildanov M. (mar_vi) 18 138 44 0 44 41 24 Oct 2008
15 Ябжанов В. (yabsql) 21 74 43 0 43 446 24 Oct 2008
16 Волпянский (MShue) 14 21 38 0 38 5150 24 Oct 2008
17 Hakobyan M. (Smiley) 22 22 37 0 37 5990 22 Oct 2008
18 Пинский О.А. (SQLTestEx) 19 19 36 0 36 6084 22 Oct 2008
19 >Тульцев А.Ю. (NFF) 21 21 36 0 36 6091 24 Oct 2008
20 Даниленко Е. (EkaterinaD) 14 25 35 0 35 4893 23 Oct 2008
21 Иванов (N022) 21 21 34 0 34 6316 23 Oct 2008
22 Тхор А. (salaga) 20 59 33 0 33 1385 23 Oct 2008
23 Karaszewski K. (Karasinho8) 8 29 16 16 32 2972 24 Oct 2008
24 >pati S. (sandhyapati) 12 25 24 8 32 4824 24 Oct 2008
25 Suvorov (UnoClon) 12 24 32 0 32 4852 20 Oct 2008
26 Клименко А.Н. (zprotos) 18 18 29 1 30 7020 23 Oct 2008
27 >Абкина Н.Б. (Krasa) 19 19 30 0 30 7035 24 Oct 2008

Изучаем SQL

Требования к SQL Server по усилению поддержки: предложение OVER() и упорядоченные вычисления (продолжение, начало в вып.195-199, 202-212)

Itzik Ben-Gan и Sujata Mehta (оригинал: SQL Server Feature Enhancement Request - OVER Clause and Ordered Calculations )
Перевод: Карасева Н.В.

iv. Векторные выражения и их взаимодействия с предложением OVER

Векторные выражения (или конструкторы строк) могут быть весьма полезны как для упрощения кода, так и для его оптимизации. Классическим примером полезности векторных выражений (безотностительно к предложению OVER) является обновление нескольких атрибутов. Вместо кода:

UPDATE dbo.T1
SET col1 = (SELECT col1
            FROM dbo.T2
            WHERE T2.keycol = T1.keycol),
    col2 = (SELECT col2
            FROM dbo.T2
            WHERE T2.keycol = T1.keycol),
    col3 = (SELECT col3
            FROM dbo.T2
            WHERE T2.keycol = T1.keycol);

используя векторное выражение, вы написали бы:

UPDATE dbo.T1
SET (col1, col2, col3) =
    (SELECT (col1, col2, col3)
     FROM dbo.T2
     WHERE T2.keycol = T1.keycol);

Что касается использования OVER, то оно может существенно уменьшить длину кода, поскольку стало бы возможным для нескольких выражений использование одного и того же предложения OVER. Рассматрим пару примеров.

Следующий запрос содержит вычисление 4 выражений с одинаковыми OVER предложениями (конструкция ROWS рассматривается в статье далее):

SELECT empid, ordermonth AS tomonth, qty AS qtythismonth,
  SUM(qty) OVER(PARTITION BY empid
             ORDER BY ordermonth
             ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS totalqty,
  AVG(qty) OVER(PARTITION BY empid
             ORDER BY ordermonth
             ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS avgqty,
  MIN(qty) OVER(PARTITION BY empid
             ORDER BY ordermonth
             ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS minqty,
  MAX(qty) OVER(PARTITION BY empid
             ORDER BY ordermonth
             ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS maxqty
FROM dbo.EmpOrders
ORDER BY empid, ordermonth;

Использование векторного выражения упрощает запрос следующим образом:

SELECT empid, ordermonth AS tomonth, qty AS qtythismonth,
  (SUM(qty), AVG(qty), MIN(qty), MAX(qty))
     OVER(PARTITION BY empid
          ORDER BY ordermonth
          ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
     AS (totalqty, avgqty, minqty, maxqty)
FROM dbo.EmpOrders
ORDER BY empid, ordermonth;

Следующий запрос содержит вычисление 3 выражений с одинаковыми предложениями OVER:

SELECT EmployeeID,
  OrderID AS CurOrderID,
  LAG(OrderID, 1, NULL)
    OVER(PARTITION BY EmployeeID
         ORDER BY OrderDate, OrderID) AS PrvOrderID,
  OrderDate AS CurOrderDate,
  LAG(OrderDate, 1, NULL)
    OVER(PARTITION BY EmployeeID
         ORDER BY OrderDate, OrderID) AS PrvOrderDate,
  RequiredDate AS CurReqDate,
  LAG(RequiredDate, 1, NULL)
    OVER(PARTITION BY EmployeeID
         ORDER BY OrderDate, OrderID) AS PrvReqDate
FROM Orders;

С векторным выражением оно упрощается следующим образом:

SELECT EmployeeID,
  OrderID      AS CurOrderID,
  OrderDate    AS CurOrderDate,
  RequiredDate AS CurReqDate,
  ( LAG(OrderID,      1, NULL),
    LAG(OrderDate,    1, NULL),
    LAG(RequiredDate, 1, NULL) )
    OVER(PARTITION BY EmployeeID
         ORDER BY OrderDate, OrderID)
    AS (PrvOrderID, PrvOrderDate, PrvReqDate)
FROM Orders;

Мы уверены, что добавление поддержки векторных выражений было бы очень важным для использования множественных вычислений, основанных на одном и том же предложении OVER.

Dieter Noeth, который рецензировал эту работу, указал, что ANSI SQL исходит из необходимости сокращения многочисленных ссылок на одно и то же самое определение окна. Это достигается использованием определения SQL:2003 WINDOW, которое является даже более гибким, чем предложенные векторные выражения, поскольку определения окон могут быть вложеными:

SELECT empid, ordermonth AS tomonth, qty AS qtythismonth,
   SUM(qty) OVER w AS totalqty,
   AVG(qty) OVER w AS avgqty,
   MIN(qty) OVER w AS minqty,
   MAX(qty)  OVER w AS maxqty
FROM dbo.EmpOrders
ORDER BY empid, ordermonth
WINDOW w AS (PARTITION BY empid
             ORDER BY ordermonth
             ROWS BETWEEN 2 PRECEDING AND CURRENT ROW);

Поскольку ANSI SQL релизует эту потребность в очень изящной манере, он предпочителен для использования синтаксиса векторных выражений, предложенного ранее.

(Продолжение следует...)

Полезная информация

§ Приглашаем вас посетить новый проект - Интерактивный учебник по SQL.
   Ресурс позиционируется как "справочное обеспечение" для сайта SQL-EX.RU, но может использоваться и независимо от него.

§ Онлайновый выпуск рассылки можно почитать на сайте.

§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL.

§ Хотите поддержать проект? Вот инструкция по применению. :-)

Контакты

По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77[@]yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.

Подписка Subscribe.Ru
Новости сайта "Упражнения по SQL"

В избранное