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

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


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

Выпуск 276 от 09 января 2010 г.

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

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

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

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

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


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

§ В сообщении об ошибке на проверочной базе по предложению Faust_zp теперь указывается код ошибки.
Остается только проявить добрую волю, чтобы заглянуть в документацию, а не обращаться в поддержку за текстом сообщения об ошибке. :-)

§ Поднял сложность задачи 161 (SELECT, рейтинговый этап) до 3 баллов, и понизил до 1 балла сложность задачи 16 (DML)

§ Новая задача от Ozzy выставлена на 3 этап под номером 163 (сложность 3 балла).

§ Скинул в архив сообщения из "Книги жалоб и предложений" за последние 2 года.
Архив доступен только для чтения.

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
Смена лидера!
1. Ozzy (163)
3. Arcan (162)
16. Angellore (145, 151)

§ Продвинулись в рейтинге:
63. lilyok (задач 137, время 79.927)
64. kostik (136, 107.279)
91. Балуткин (124, 400.50)

§ Новые лица в ТОР 100 и вернувшиеся туда:
90. silver (124, 44.151)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
111. _yizraor (120, 25.857)
116. Magnetic (119, 248.922)
117. risp (119, 16.708)
122. Shurgenz (116, 12.606)
134. Sergey79 (115, 690.822)
175. iv_2609 (110, 57.545)

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

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

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

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

На обучающем этапе - 9277

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 >Зотов П.Г. (Ozzy)1 160 163 22 393 669 196.037 209.310 75 08 Jan 2010 08 Jan 2010
2 Карасёва Н.В. (vlksm)1 162 162 22 395 1334 118.586 87.959 72 30 Dec 2009 08 Jan 2010
3 Креславский О.М. (Arcan)1 162 162 22 395 1068 112.314 91.360 72 02 Jan 2010 08 Jan 2010
4 Яцук А.А. (Faust_zp)2 162 162 22 395 1059 114.197 669.147 72 29 Dec 2009 08 Jan 2010
5 Дроздков А.Н. (anddros)5 159 160 22 388 582 7.995 8.541 67 30 Dec 2009 08 Jan 2010
6 Сальников С.А. ($erges)1 158 160 22 385 672 5.694 5.860 64 29 Dec 2009 07 Jan 2010
7 Умрихина Е.В. (Umrikhina)1 153 160 22 376 488 41.333 58.773 64 25 Aug 2009 29 Sep 2009
8 Сенкевич С.В. (GreyC)1 136 152 21 341 612 57.731 27.102 44 07 Oct 2009 01 Jan 2010
9 Селезнёв А.С. (Артём С.)1 133 152 21 333 444 47.227 37.524 44 25 Jan 2009 03 Mar 2009
10 Тарасов Д.Б. (Gavrila)10 147 156 22 357 1584 67.216 35.866 41 27 Dec 2009 30 Dec 2009
11 Никотин В.М. (@Nikotin)1 137 150 21 338 471 8.341 3.751 38 11 Dec 2009 08 Jan 2010
12 Печатнов В.В. (pvv)1 144 158 21 347 679 36.968 19.968 36 28 Aug 2009 08 Jan 2010
13 Мурашкин И.В. (lepton)1 129 156 21 319 1139 69.455 59.005 36 05 May 2009 14 Dec 2009
14 Муллаханов Р.Х. (rem)9 139 152 22 339 649 14.607 20.056 33 20 Jun 2009 03 Aug 2009
15 Орлов М.В. (Eagleoff)15 148 158 22 353 621 43.587 18.192 30 29 Dec 2009 08 Jan 2010
16 Бойко Д.М. (Angellore)16 149 151 22 352 883 726.667 237.796 29 06 Jan 2010 08 Jan 2010
17 Шиндин А.В. (AlShin)10 130 150 21 324 79 20.369 7.203 28 05 Jan 2009 27 Nov 2009
18 Анисимов Д. (danilko)13 142 160 22 337 32 12.701 9.542 28 12 Aug 2009 17 Aug 2009
19 Держальцев В.А. (MadVet)7 123 146 21 304 1715 60.703 28.482 26 26 Dec 2009 26 Dec 2009
20 Любченко В.А. (IAS56)6 132 146 21 320 1048 419.379 373.617 26 18 Jul 2009 28 Jul 2009

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Гукасян А. (Artur) 30 37 66 7 73 1127 08 Jan 2010
2 Krzys (Boniu) 28 29 59 6 65 2558 06 Jan 2010
3 Баранов Д. (badmal) 16 67 25 30 55 501 08 Jan 2010
4 Сиянко (SIIV) 14 30 23 17 40 1965 08 Jan 2010
5 >Дубинский А.В. (_yizraor) 14 120 37 0 37 111 08 Jan 2010
6 >Zavrotschi D. (dumitru) 12 17 22 0 22 3564 08 Jan 2010
7 Сидоров А.В. (OPM) 10 95 20 0 20 314 07 Jan 2010
8 DBdiv2 (DBdiv2) 9 71 20 0 20 441 07 Jan 2010
9 Старостин М.А. (misha2) 10 40 20 0 20 1586 08 Jan 2010
10 Стебунов В.В. (VetSt) 0 0 19 19 7652 08 Jan 2010
11 >Коваленко Ю.А. (Летчик) 14 49 18 0 18 849 08 Jan 2010
12 Ommi S.R. (SunithaRani) 0 0 17 17 7803 08 Jan 2010
13 >Бартошик С.А. (wer32) 5 5 8 7 15 8223 08 Jan 2010
14 Горбунов А.В. (risp) 5 119 12 0 12 117 08 Jan 2010
15 >Сухнев Д.А. (mz) 6 141 11 0 11 50 08 Jan 2010
16 >Срибняк А. (silver) 5 124 11 0 11 90 08 Jan 2010
17 >Усик В.Н. (Vladius) 6 106 11 0 11 202 08 Jan 2010
18 Бойчук М.В. (Большой Бизон) 1 51 1 10 11 876 08 Jan 2010
19 Слюсаренко А.А. (Al @xey) 0 43 0 11 11 1554 08 Jan 2010
20 >bitsadze M.M. (maka) 5 9 11 0 11 7499 08 Jan 2010

Изучаем SQL

Оператор UNPIVOT

Моисеенко С.И.

Как следует из названия оператора, UNPIVOT выполняет обратную по отношению к PIVOT операцию, т.е. представляет данные, записанные в строке таблицы, в одном столбце. В примере, рассмотренном ранее, мы с помощью оператора PIVOT разворачивали в строку таблицу, полученную с помощью следующего запроса:

SELECT screen, AVG(price) avg_
FROM Laptop
GROUP BY screen
 
screen  avg_ 
11 700.00
12 960.00
14 1175.00
15 1050.00

В результате было получено следующее представление:

avg_     11   12   14   15 
average price 700.00 960.00 1175.00 1050.00

Исходный результат мы можем получить, если применим к pivot-запросу unpivot-преобразование:

SELECT screen -- заголовок столбца, который будет содержать заголовки
-- строк исходной таблицы
,avg__ AS avg_-- заголовок столбца, который будет содержать значения
   -- из строки исходной таблицы
from(
-- pivot-запрос из предыдущего примера
SELECT [avg_],
 [11],[12],[14],[15]
 FROM (SELECT 'average price' AS 'avg_', screen, price FROM Laptop) x
 PIVOT
 (AVG(price)
 FOR screen
 IN([11],[12],[14],[15])
 ) pvt
-- конец pivot-запроса
 ) pvt
 UNPIVOT
 (avg__ -- заголовок столбца, который будет содержать значения
 -- из столбцов исходной таблицы, перечисленных ниже
 FOR screen in([11],[12],[14],[15])
 ) unpvt

Заметим, что имя avg_ нельзя использовать в операторе UNPIVOT, поскольку оно уже использовалось в операторе PIVOT, поэтому я использовал новое имя avg__, которому затем присвоил алиас, чтобы полностью воссоздать результат, полученный с помощью группировки.

Рассмотрим теперь более содержательный пример. Пусть требуется информацию о рейсе 1100 представить в следующем виде:

trip_no spec     info 
1100 id_comp  4
1100 plane  Boeing
1100 town_from Rostov
1100 town_to  Paris
1100 time_out 14:30:00
1100 time_in  17:50:00

Поскольку информация из строки таблицы трансформируется в столбец, то напрашивается использование оператора UNPIVOT. Здесь следует сделать одно замечание. Значения в этом столбце должны быть одного типа. Поскольку в этот столбец в нашем примере собираются значения из разных столбцов исходной таблицы, то нужно преобразовать их к единому типу. Более того, должны совпадать не только типы, но и размер.

Общим типом в нашем случае является строковый тип. Поскольку столбцы town_from и town_to уже имеют тип char(25), то приведем все к этому типу:

SELECT trip_no,CAST(id_comp AS CHAR(25)) id_comp, CAST(plane AS CHAR(25)) plane,town_from,town_to, CONVERT(CHAR(25),time_out, 108) time_out, CONVERT(CHAR(25),time_in,108) time_in
FROM Trip
WHERE trip_no =1100
 
trip_no id_comp plane   town_from   town_to time_out    time_in  
1100 4 Boeing Rostov Paris 14:30:00 17:50:00

Здесь мы заодно преобразовали время вылета/прилета, убрав из него составляющую даты:

CONVERT(CHAR(25),time_out, 108)

Остальное, я надеюсь, понятно из кода:

SELECT trip_no, spec, info FROM (
SELECT trip_no,CAST(id_comp AS CHAR(25)) id_comp,
CAST(plane AS CHAR(25)) plane,
town_from,town_to, CONVERT(CHAR(25),time_out, 108) time_out, CONVERT(CHAR(25),time_in,108) time_in
FROM Trip
WHERE trip_no =1100
) x
UNPIVOT(
info
FOR spec IN(id_comp, plane,town_from,town_to, time_out, time_in)
) unpvt

Столбец с именем spec используется для вывода названий параметров, а столбец info содержит сами параметры. Результат выполнения запроса уже был представлен в условии задачи.

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

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

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

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

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

Контакты

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

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

В избранное