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

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


Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 114 (18 ноября 2006 г.)

http://www.sql-ex.ru

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

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

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

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

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


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

§ По просьбе участников разместил ссылочку на странице с упражнениями (SELECT), которая ведет на страницу рейтинга по производительности. Ссылка появляется, если задача решена (сертификационный этап).

§ Постарался учесть пожелания Perfect Stranger и Ocean по уточнению формулировки задачи 81.

§ Произошла замена задачи и обещанное изменение сертификационных требований:
- удалена 50-я задача. Под этим номером теперь находится бывшая 58-я;
- сертификационный этап теперь начинается с новой 58 задачи (сложность 1);
- для получения сертификата BK требуется теперь решить 67 задач, а для получения сертификата AR - 125 задач;
- просроченные заказы сертификатов удалены.

§ Очевидное, на мой взгляд, понимание условия задачи 32 далеко не всем было очевидно :-). Последней каплей стало сообщение иностранца на форуме (at least). Теперь формулировка в русском варианте звучит так (изменение выделено):
Определить названия всех кораблей из таблицы Ships, которые удовлетворяют, по крайней мере, комбинации любых четырёх критериев из следующего списка: numGuns = 8
bore = 15
displacement = 32000
type = bb l
aunched = 1915
class=Kongo
country=USA

§ Незначительно обновил текст на главной странице, в частности, уточняется, что в настоящее время мы используем SQL Server 2005.

§ Список решивших все задачи пополнил lepton - третья позиция в рейтинге.
Еще два человека перешли на третий этап - dimzv (задач 137, время 4.380) и PS_Sergey (137, 11.552). Каждым решено 138 задач, однако на результате сказалась только что добавленная 58 задача, которую они не успели решить.

§ Продолжили свое восхождение к вершине:
Goga_3040 (135, 61.903)
Дайнин (119, 86.687)
Родион1976 (113, 1.146)
Tunin (111, 23.326)
ds (110, 89.756)

Замечу, что Родион1976 по-прежнему сохраняет лидерство на промежуточном этапе.

 

§ Вошли в сотню:
sn-prokop (108, 29.068)
Dmitry Faleleev (104, 2.019)

§ На этой неделе сертифицированы:
BIeZ (A06013635) [BK] (г.Москва, Россия)

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Агапов В. (KERBEROS) 140 141 20 332 79 6.173 1.262 11 10 Nov 2006 17 Nov 2006
2 Карасёва Н.В. (vlksm) 140 141 20 332 176 27.838 2.710 11 29 Oct 2006 17 Nov 2006
3 Мурашкин И.В. (lepton) 140 141 20 332 234 14.856 4.724 11 12 Nov 2006 17 Nov 2006
4 Голубин Р.С. (Roman S. Golubin) 140 141 20 332 447 54.977 33.803 11 08 Nov 2006 17 Nov 2006
5 Васьков Е.В. (Johan) 139 140 20 328 85 12.705 11.402 7 12 Oct 2006 17 Nov 2006
6 Войнов П.Е. (pаparome) 138 140 20 325 407 2.687 .000 4 05 Oct 2006 17 Nov 2006
7 Юлдашев М.Р. (Snowbear) 138 139 20 324 441 4.106 .000 3 02 Oct 2006 14 Nov 2006
8 Кувалкин К.С. (Cyrilus) 138 139 20 324 712 11.063 1.171 3 06 Nov 2006 17 Nov 2006
9 Держальцев В.А. (MadVet) 138 139 20 324 540 34.249 3.085 3 08 Oct 2006 19 Oct 2006
10 Зверев Д.Л. (dimzv) 137 138 20 321 1107 4.380 .000 0 15 Nov 2006 16 Nov 2006
11 Палий С.А. (PS_Sergey) 137 138 20 321 193 11.552 .000 0 12 Nov 2006 13 Nov 2006
12 Тарасов Д.Б. (Gavrila) 137 138 20 321 432 19.721 .000 0 01 Nov 2006 17 Nov 2006
13 Утёнков М.Н. (=Maxim=) 137 138 20 321 190 24.992 .000 0 09 Nov 2006 17 Nov 2006
14 Валуев Д.И. (Fiolent) 137 138 20 321 1125 54.696 .000 0 03 Oct 2006 17 Nov 2006
15 Slobodcicov A.N. (Testo) 136 138 20 319 337 7.171 .000 0 25 Aug 2006 10 Nov 2006
16 Иванов А.Н. (Goapsy) 136 138 20 319 270 18.911 .000 0 07 Aug 2006 09 Oct 2006
17 Абашин П.И. (Dizil) 136 137 20 317 420 3.961 .000 0 18 Oct 2006 18 Oct 2006
18 Крижевич С.А. (yaff) 136 137 20 317 481 14.998 .000 0 24 Oct 2006 25 Oct 2006
19 Мальцев А.В. (Палкин) 136 137 20 317 56 15.229 .000 0 12 Oct 2006 17 Nov 2006
20 Вязовецков А.С. (alex_v) 136 137 20 317 141 22.788 .000 0 20 Oct 2006 20 Oct 2006

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Souc J. (sulo) 52 52 94 0 94 1101 16 Nov 2006
2 Le S.N. (GMTGMT) 35 35 60 23 83 1309 17 Nov 2006
3 >Чуйкова А. (Ann_G) 46 46 80 0 80 1367 17 Nov 2006
4 >Назаров В.С. (Quest) 43 43 76 0 76 1484 17 Nov 2006
5 krishna S. (sharanya) 38 38 61 9 70 1681 16 Nov 2006
6 >Волов (dimaster) 38 38 67 0 67 1753 17 Nov 2006
7 Toan N.C. (lumdong$it1) 29 41 44 22 66 1209 17 Nov 2006
8 Золотарев Г.В. (Utyf1982) 35 41 65 0 65 1670 15 Nov 2006
9 Клименко В.П. (батюня) 38 38 62 0 62 1920 15 Nov 2006
10 >Иванов А.М. (Умник) 31 31 56 5 61 1966 17 Nov 2006
11 cis (Cis) 27 37 49 9 58 1732 15 Nov 2006
12 >Карпенко М. (Онуфрий Голохвастов) 30 59 57 0 57 810 17 Nov 2006
13 Рыжиков С.А. (DeadLock5) 27 58 52 4 56 756 17 Nov 2006
14 Рябых Д.С. (spillerok) 31 31 55 1 56 2192 15 Nov 2006
15 >Тагиров А.Р. (T!GER) 33 33 56 0 56 2198 17 Nov 2006
16 >Бородкина М.И. (marishkin) 32 32 46 9 55 2232 17 Nov 2006
17 Балакина Н.А. (nadush) 13 55 30 23 53 611 15 Nov 2006
18 >Меркулов С.Н. (Sergei(RUS)) 26 57 53 0 53 831 17 Nov 2006
19 Conversation (cvst) 27 27 46 7 53 2309 14 Nov 2006
20 nos E.C. (gmtdeu) 27 27 46 5 51 2414 13 Nov 2006
21 >Koshel S. (UnicSQL) 28 28 49 0 49 2485 17 Nov 2006
22 >Викторов М. (MikhailV) 28 28 49 0 49 2490 17 Nov 2006
23 zaimz hen Z.H. (henzaimz) 28 28 47 1 48 2587 14 Nov 2006
24 Huan V.N. (Vu Huan) 27 27 46 0 46 2658 14 Nov 2006
25 >H. Y. (SoftS) 21 46 44 0 44 1290 17 Nov 2006
26 Nguyen T. (tuxWarrior) 24 24 37 7 44 2738 14 Nov 2006
27 >Трефилов А. (Aladdin) 11 55 24 19 43 662 17 Nov 2006
28 Le Son (locke) 22 22 36 7 43 2778 12 Nov 2006
29 >Alex T. (Teya) 31 31 42 0 42 2850 17 Nov 2006
30 >Хамето С.Н. (Rabbit) 15 70 32 9 41 278 17 Nov 2006
31 Ток И. (Инка) 28 28 41 0 41 2891 15 Nov 2006
32 M K. (L) 22 43 40 0 40 1675 16 Nov 2006
33 Micheal K. (gorilla) 24 24 37 3 40 2927 14 Nov 2006
34 Стукало Д.В. (Dimonster) 25 25 40 0 40 2944 15 Nov 2006
35 Муртазина М.Ш. (Musy) 25 25 40 0 40 2959 16 Nov 2006

Изучаем SQL

Простые рекурсивные CTE

Rob Farley (оригинал: Simple recursive CTE)
Перевод Моисеенко С.И.

Я люблю CTE (общие табличные выражения). Главным образом, потому, что они дают мне возможность получить производную таблицу, к которой я могу неоднократно обращаться. Я нечасто использую их рекурсивные возможности. Однако когда я это делаю, то постоянно восхищаюсь мощью таких решений.

Сегодня мне довелось получить чудный способ преобразования целых чисел в их двоичное представление.

Итак, я применяю CTE:

with ctebins as
(select num as num_orig, num as working_level, cast('' as varchar(max)) as binval
from nums_bin
union all
select c.num_orig, c.working_level / 2, cast(c.working_level % 2 as varchar(max)) + c.binval
from ctebins c
where c.working_level > 0
)
select num_orig, binval
from ctebins
where working_level = 0
;

Здесь верхний уровень CTE заполняется пачкой чисел из nums_bin, наряду с пустой строкой. Знаю, что я не должен использовать varchar(max) - нам не нужно так много, в конце концов...

Затем CTE заполняется строками, используя рекурсию. Я сохраняю оригинальное число (чтобы его использовать позже), и продолжаю сокращать его вдвое, чтобы вывести двоичное число. После чего я запрашиваю полный CTE для последнего уровня рекурсии, когда число, с которым я работаю, уменьшилось до нуля.

Это работает прекрасно и очень быстро на большом наборе чисел.

Комментарий от Omnibuzz

Ниже мое решение, использующее СТЕ. Оно определенно не такое заумное, как данное Митчем (опущего - прим. переводчика), но работает прекрасно :-).

Предполагая, что nums_bin - таблица, содержащая 50000 записей, выполним запрос:

declare @maxval int
select @maxval = max(num) from nums_bin;
with cte as
(
select 1 as bin,1 as counter
union all
select bin*2,counter + 1 from cte
where bin*2 < @maxval
)
select num,
(select (num&bin)/bin from cte b order by counter desc for xml path('')) as bin
from nums_bin

20/10/2006

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

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

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

Контакты

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

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

В избранное