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

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


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

Выпуск 293 от 08 мая 2010 г.

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

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

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

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

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


С наступающим Днем Победы!

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

§ На третий этап под номером 166 временно выставил новую задачу от qwrqwr (сложность 1 балл).
Выполнены следующие перестановки рейтинговых задач:
35 --> обучающий этап, номер 46
64 --> 35
67 --> 64
63 --> 67
65 --> 63
57 --> 65
66 --> 57
51 --> 66
166 --> 51
73 --> 123
123 --> 73
Второй этап начинается с задачи 35.

§ Сертификационный порог [BK] понижен. Теперь требуется решить 64 рейтинговые задачи на SELECT.

§ Ozzy внес уточнение в условие рейтинговой задачи 67.
Подлатал проверку задачи 12 (SELECT, обучающий этап) в ответ на сообщение от romb.
Для задачи 62 (SELECT, рейтинговый этап) добавил проверочный вариант данных, предложенный Славик'ом.
Написал подсказку к задаче 63 (SELECT, обучающий этап).
Уточнил формулировку задачи 129 более представительным примером.

§ По просьбе Wiedzmen ограничение на максимальное число начатых задач (3) теперь не распространяется на раздел "Головоломки".

§ Устранил некоторое расхождение в рейтингах, на которое обратил внимание anddros.
Добавил в статистику за день сумму баллов и число задач, решенных на обучающем этапе.

§ Выложил согласованную базу "Корабли" с реальными данными, подготовленную anddros.
Таблицы этой базы имеют префикс "_":
_outcomes
_ships
_battles
_classes

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
Смена лидера!
1. vlksm (164)
9. Angellore (146, 164)
14. Eagleoff (1434)

§ Новые лица в ТОР 100 и вернувшиеся туда:
98. Serg71 (задач 116, время 317.100)

§ Продвинулись в рейтинге:
74. silver (126, 51.770)
85. _ORA_ (118, 211.034)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
105. uon (115, 376.783)
106. Vladius (114, 23.680)
113. Cергей L (111, 205.967)
117. Magnetic (111, 343.283)
143. degt (109, 57.418)

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

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Карасёва Н.В. (vlksm)1 167 252 22 405 1456 131.805 94.864 79 01 May 2010 07 May 2010
2 Креславский О.М. (Arcan)1 166 252 22 403 1187 127.000 102.137 79 01 May 2010 07 May 2010
3 Зотов П.Г. (Ozzy)1 158 252 22 389 778 199.850 211.373 75 27 Apr 2010 07 May 2010
4 Сальников С.А. ($erges)1 163 252 22 397 794 7.818 7.297 72 30 Apr 2010 07 May 2010
5 Яцук А.А. (Faust_zp)1 156 252 22 385 1093 121.912 92.200 72 01 Feb 2010 04 May 2010
6 Дроздков А.Н. (anddros)5 159 252 22 387 709 8.353 8.273 68 06 May 2010 07 May 2010
7 Умрихина Е.В. (Umrikhina)1 142 252 22 352 488 41.244 47.336 59 25 Aug 2009 14 Apr 2010
8 Дубинский А.В. (_yizraor)8 151 252 22 369 671 67.232 28.051 55 31 Mar 2010 29 Apr 2010
9 Бойко Д.М. (Angellore)9 157 252 22 372 999 882.312 170.801 46 02 May 2010 07 May 2010
10 Тарасов Д.Б. (Gavrila)9 150 251 22 360 1707 71.055 36.268 41 29 Apr 2010 07 May 2010
11 Сенкевич С.В. (GreyC)1 125 251 21 317 612 57.718 26.238 41 07 Oct 2009 01 Jan 2010
12 Селезнёв А.С. (Артём С.)1 122 251 21 309 444 47.221 34.492 41 25 Jan 2009 03 Mar 2009
13 Никотин В.М. (@Nikotin)1 126 251 21 314 471 8.335 3.704 35 11 Dec 2009 27 Apr 2010
14 >Орлов М.В. (Eagleoff)14 143 143 22 346 750 55.305 23.563 33 07 May 2010 07 May 2010
15 Мурашкин И.В. (lepton)1 118 251 21 294 1139 69.439 58.709 32 05 May 2009 18 Apr 2010
16 Печатнов В.В. (pvv)1 134 252 21 325 845 36.963 17.410 31 10 Feb 2010 19 Apr 2010
17 Шиндин А.В. (AlShin)10 134 251 21 323 498 26.251 418.630 30 28 Feb 2010 09 Mar 2010
18 Муллаханов Р.Х. (rem)9 128 251 22 314 649 14.598 20.041 29 20 Jun 2009 02 Feb 2010
19 Анисимов Д. (danilko)13 131 252 22 312 32 12.700 9.283 26 12 Aug 2009 17 Aug 2009
20 Держальцев В.А. (MadVet)7 137 251 21 319 1842 62.140 28.209 23 02 May 2010 07 May 2010

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 alex (szaszalex83) 14 14 29 34 63 1790 01 May 2010
2 >петров А.С. (justtoxa) 19 26 43 0 43 2157 07 May 2010
3 Бежаев А.Ю. (Baser) 19 19 37 0 37 3322 06 May 2010
4 >Зора Б.П. (Аналітик++) 10 10 15 22 37 3332 07 May 2010
5 >Мазурин А. (Commander) 14 14 35 0 35 3560 07 May 2010
6 >Чобиток В. (vasia armor) 15 42 23 10 33 1175 07 May 2010
7 >ggg (GeBy) 16 22 32 0 32 2886 07 May 2010
8 >Рыбкина Т.В. (Rybka) 16 87 31 0 31 276 07 May 2010
9 >Smolin A.V. (alex_smol) 10 10 27 3 30 4255 07 May 2010
10 Fedorov A. (fan_1989) 11 28 19 9 28 1677 06 May 2010
11 >Дегтярь С.Б. (degt) 10 109 24 0 24 143 07 May 2010
12 kobakhidze B.F. (besi) 0 0 22 22 05 May 2010
13 Добрынин С. (inGray) 7 68 16 6 22 413 03 May 2010
14 Kulakov V. (vnkulakov81) 0 0 22 22 8840 07 May 2010
15 Смолина О.С. (burka) 1 33 1 19 20 1301 07 May 2010
16 Korentabak A. (koren) 0 3 0 19 19 5519 07 May 2010
17 Курмашов С.В. (zergey2) 12 31 18 0 18 1369 07 May 2010
18 Rajus H. (Harini) 6 6 15 0 15 7084 04 May 2010
19 >Shipko M. (Shipko Maxim) 9 9 15 0 15 7097 07 May 2010
20 Исмаилов А.Р. (aklerk) 10 44 14 0 14 1391 05 May 2010
21 Илмаюров Е. (jeniamin) 10 14 14 0 14 6134 05 May 2010

Изучаем SQL

Рекурсивные СТЕ (окончание, начало в вып.291)

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

Сначала напишем два простых CTE, которые формируют наш тестовый пример и определяют ASCII-код первой буквы алфавита (A) - не писать же константу. :-)

Далее последует анкорная часть, которая выполняет ранее описанную операцию приведения всего текста к нижнему регистру с заглавной первой буквой. Здесь же выполним замену символа с кодом code и предшествующим ему пробелом на... него же. Пусть вас не смущает такая, казалось бы, бесполезная замена. Дело в том, что для регистронезависимых баз данных символы 'a' и 'A' не различаются. Давайте пока на этом остановимся и посмотрим результат.

;WITH NM(name) AS
(SELECT 'ALfa and omegA' AS name
UNION ALL SELECT 'alfa beta gamma    zeta'
UNION ALL SELECT 'KSI PSI'
UNION ALL SELECT 'delta'
),
Ascii_code AS(
SELECT  ASCII('A') AS code
),
Repl(name, code, rep) AS
(SELECT name, code, REPLACE(UPPER(LEFT(name, 1)) + LOWER(SUBSTRING(name, 2, LEN(name) - 1)),' '+CHAR(code),' '+CHAR(code)) rep
FROM Ascii_code, NM
)
SELECT name, rep FROM Repl
 
name    rep
ALfa and omegA Alfa And omega
alfa beta gamma    zeta Alfa beta gamma    zeta
KSI PSI Ksi psi
delta Delta

Добавим, наконец, рекурсивную часть, в которой мы выполним замену буквы с кодом code+1. Рекурсия будет продолжаться до тех пор, пока не будет нарушено условие code < ASCII('Z'), т.е. пока мы не переберем все буквы.

Что же мы получим на выходе? К строкам, которые были получены в результате выполнения анкорной части, на каждой итерации будут добавлены (UNION ALL) те же строки с заменой очередной буквы. Отметим большой объем результата при использовании данного метода; в нашем случае это 4х26 = 104 строки. Из этого множества строк нас интересуют только те, которые получены в результате последней итерации, т.е. когда были выполнены все замены. Этой последней итерации соответствует условие code = ASCII('Z'), которое и используется в финальном запросе:

;WITH NM(name) AS
(SELECT 'ALfa and omegA' AS name
UNION ALL SELECT 'alfa beta gamma    zeta'
UNION ALL SELECT 'KSI PSI'
UNION ALL SELECT 'delta'
),
Ascii_code AS(
SELECT  ASCII('A') AS code
),
Repl(name, code, rep) AS
(SELECT name, code, REPLACE(UPPER(LEFT(name, 1)) + LOWER(SUBSTRING(name, 2, LEN(name) - 1)),' '+CHAR(code),' '+CHAR(code)) rep
FROM Ascii_code, NM
UNION ALL
SELECT name, code+1 code, REPLACE(rep,' ' + CHAR(code+1), ' ' + char(code + 1)) rep FROM Repl
WHERE code < ASCII('Z')
)
SELECT name, rep FROM Repl WHERE code=ASCII('Z')

Я хотел бы предостеречь вас от чрезмерного увлечения рекурсивными CTE, поскольку они зачастую проигрывают в производительности "традиционным" методам. Я не буду далеко ходить за примерами и сравню два представленных здесь метода. Увеличив количество обрабатываемых строк до 10000, я получил такое время использования CPU:
- метод на основе REPLACE: 842 ms
- рекурсивный метод: 6615 ms

Безусловно, есть задачи, которые нельзя решить непроцедурно в рамках стандарта SQL-92. В этих случаях использование рекурсивных CTE вполне обоснованно. В остальных случаях я бы рекомендовал выполнять тесты производительности для альтернативных решений.

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

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

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

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

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

Контакты

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

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

В избранное