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

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


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

Выпуск 291 от 24 апреля 2010 г.

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

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

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

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

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


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

§ Новая задача от qwrqwr выставлена на обучающий этап под номером 52 (сложность 1 балл).

§ Последнее предупреждение. :-)
На неделе выставлю первую партию новых рейтинговых задач. Продолжение следует...

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
2. Arcan (158)
31. Ivanoff Alex (141)

§ Одна задача до третьего этапа осталась:
69. qwrqwr (задач 137, время 47.309)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
104. Serg71 (121, 300.903)
123. uon (118, 367.341)
147. Вишня (113, 34.603)

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

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

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

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

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

Сертифицировано на сайте - 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 158 22 411 1437 130.067 94.584 78 12 Apr 2010 23 Apr 2010
2 Креславский О.М. (Arcan)1 167 158 22 411 1175 125.656 101.174 78 19 Apr 2010 23 Apr 2010
3 Зотов П.Г. (Ozzy)1 165 158 22 406 760 199.850 211.374 76 09 Apr 2010 23 Apr 2010
4 Сальников С.А. ($erges)1 165 252 22 406 773 7.593 7.315 73 09 Apr 2010 23 Apr 2010
5 Яцук А.А. (Faust_zp)1 164 252 22 405 1093 121.912 92.200 72 01 Feb 2010 20 Mar 2010
6 Дроздков А.Н. (anddros)5 163 252 22 400 667 8.311 8.292 67 25 Mar 2010 23 Apr 2010
7 Умрихина Е.В. (Umrikhina)1 150 252 22 372 488 41.244 47.336 59 25 Aug 2009 14 Apr 2010
8 Дубинский А.В. (_yizraor)8 159 252 22 389 671 67.232 28.098 56 31 Mar 2010 13 Apr 2010
9 Бойко Д.М. (Angellore)9 156 163 22 375 977 874.544 166.328 42 10 Apr 2010 23 Apr 2010
10 Тарасов Д.Б. (Gavrila)9 154 251 22 373 1669 70.897 36.480 42 22 Mar 2010 23 Apr 2010
11 Сенкевич С.В. (GreyC)1 133 251 21 337 612 57.718 26.238 41 07 Oct 2009 01 Jan 2010
12 Селезнёв А.С. (Артём С.)1 130 251 21 329 444 47.221 34.492 41 25 Jan 2009 03 Mar 2009
13 Никотин В.М. (@Nikotin)1 134 251 21 334 471 8.335 3.704 35 11 Dec 2009 09 Apr 2010
14 Мурашкин И.В. (lepton)1 126 251 21 314 1139 69.439 58.709 32 05 May 2009 18 Apr 2010
15 Печатнов В.В. (pvv)1 142 252 21 345 845 36.963 17.410 31 10 Feb 2010 19 Apr 2010
16 Шиндин А.В. (AlShin)10 142 251 21 343 498 26.251 418.630 30 28 Feb 2010 09 Mar 2010
17 Муллаханов Р.Х. (rem)9 136 251 22 334 649 14.598 20.041 29 20 Jun 2009 02 Feb 2010
18 Орлов М.В. (Eagleoff)15 150 252 22 361 687 47.274 12.519 28 05 Mar 2010 23 Apr 2010
19 Анисимов Д. (danilko)13 139 252 22 332 32 12.700 9.283 26 12 Aug 2009 17 Aug 2009
20 Любченко В.А. (IAS56)6 136 251 22 328 1285 655.251 138.580 23 12 Mar 2010 14 Mar 2010

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Добрынин С. (inGray) 51 51 95 0 95 1420 23 Apr 2010
2 >bochkanov (bono) 21 21 43 0 43 4279 23 Apr 2010
3 >Санько А.В. (count) 18 90 41 0 41 285 23 Apr 2010
4 Kac (AlexKac) 22 47 38 0 38 886 23 Apr 2010
5 Bolotovskaya G. (Galinka) 14 39 36 0 36 1980 22 Apr 2010
6 Kuzmik (Dmitro_K) 12 41 24 0 24 1787 21 Apr 2010
7 Громов А.П. (grap) 5 72 10 12 22 425 18 Apr 2010
8 Коншин А. (Alex11111111111) 0 0 17 17 7684 22 Apr 2010
9 >Сухарев В.В. (YodaS) 8 95 16 0 16 266 23 Apr 2010
10 Sadovin (A_S) 0 46 0 16 16 945 23 Apr 2010
11 >Дмитриев А.А. (v.s.o.p.) 8 22 16 0 16 4308 23 Apr 2010
12 >Бойко Д.С. (ДенисБ) 11 12 15 0 15 7568 22 Apr 2010
13 Рыбкина Т.В. (Rybka) 5 75 13 0 13 387 22 Apr 2010
14 knyaginichev S. (knyagich) 5 67 13 0 13 489 22 Apr 2010
15 Дегтярь С.Б. (degt) 6 96 11 1 12 260 23 Apr 2010
16 Петров А.И. (gji) 7 28 12 0 12 2776 22 Apr 2010
17 Р. А.Р. (Gasfield) 4 12 12 0 12 6654 20 Apr 2010
18 >Козликова Д.А. (kozlik) 3 44 4 6 10 974 23 Apr 2010
19 >Богданенко Т.А. (bog_tat) 6 6 10 0 10 8271 23 Apr 2010
20 Zalyaev D.N. (3dpoison_) 4 97 9 0 9 333 21 Apr 2010
21 Monya (Monya) 3 12 9 0 9 6259 23 Apr 2010
22 Rusak V. (jnb) 4 5 9 0 9 8172 18 Apr 2010
23 Гришин (_1_1_) 0 0 9 9 8418 23 Apr 2010

Изучаем SQL

Рекурсивные СТЕ

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

У CTE есть еще одно важное назначение. С его помощью можно написать рекурсивный запрос, т.е. запрос, который, написанный один раз, будет повторяться многократно пока истинно некоторое условие.

Рекурсивный CTE имеет следующий вид:

WITH <имя>[(<список столбцов>)]
AS(
<SELECT...> -- анкорная часть
UNION ALL -- рекурсивная часть
<SELECT...FROM <имя>…>
WHERE <условие продолжения итераций>
)
 ...

От обычного CTE-запроса рекурсивный отличается только рекурсивной частью, которая вводится предложением UNION ALL. Обратите внимание, что в рекурсивной части присутствует ссылка на имя CTE, т.е. внутри CTE ссылается само на себя. Это, собственно, и есть рекурсия. Естественно, анкорная и рекурсивная части должны иметь одинаковый набор столбцов.

Перейдем к примеру. Рассмотрим задачу получения алфавита, т.е. таблицы алфавитных символов - прописных латинских букв.

Чтобы было с чем сравнивать, решим сначала эту задачу с помощью генерации числовой последовательности, которая рассматривалась в параграфе 8.1 Интерактивного учебника по SQL.

SELECT CHAR(ASCII('A')+5*(a-1) + b-1) AS num
FROM (SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3
 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
 ) x CROSS JOIN
 (SELECT 1 b UNION ALL SELECT 2 UNION ALL SELECT 3
 UNION ALL SELECT 4 UNION ALL SELECT 5
 ) y
WHERE 5*(a-1) + b <= 26
ORDER BY 1

А вот решение с помощью рекурсивного CTE

;WITH Letters AS(
SELECT ASCII('A') code, CHAR(ASCII('A')) letter
UNION ALL
SELECT code+1, CHAR(code+1) FROM Letters
WHERE code+1 <= ASCII('Z')
)
SELECT letter FROM Letters

В запросе анкорной части определяем ASCII-код первой буквы алфавита и соответствующий ему символ. В запросе рекурсивной части мы просто увеличиваем ASCII-код на единицу, обращаясь к CTE в предложении FROM. В результате к строке с первым символом будут последовательно добавляться (UNION ALL) строки со следующими буквами в порядке их ASCII-кодов. Итерации будут продолжаться до тех пор, пока условие code +1 <= ascii('Z') будет истинным, т.е. пока не будет добавлена буква Z.

Оператор

SELECT letter FROM Letters

собственно и служит для обращения к CTE, запуска рекурсии и вывода результата. Все остальное можно считать определением.

Следует заметить, что по умолчанию допускается 100 итераций. Это значит, что если условие прекращения итераций не выполнено ранее, то рекурсия будет остановлена после выполнения 100 итераций. Максимальное число итераций можно изменить с помощью "хинта"

OPTION(MAXRECURSION N)

где N - максимальное число итераций. Значение 0 не ограничивает число итераций. Нужно с осторожностью использовать это значение, т.к. оно чревато зацикливанием.

Если запрос не был завершен в пределах указанного числа итераций, возникает ошибка (полученные к этому моменту строки возвращаются):

The statement terminated. The maximum recursion N has been exhausted before statement completion.

(Выполнение оператора прервано. Достигнут предел максимального числа итераций N до завершения выполнения оператора).

Давайте решим еще одну задачу в качестве ответа на вопрос, который мне неоднократно встречался на просторах Интернет.

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

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

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

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

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

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

Контакты

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

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

В избранное