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

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


Информационный Канал Subscribe.Ru

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

http://www.sql-ex.ru

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

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

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

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


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

§ Замеченную Arsu дыру в проверке задачи 46 залатали.

§ С помощью Fiolent заблокировали прохождение неверных решений в задачах 59 и 60, что было обнаружено hamlet'ом.

§ Добавлены проверочные данные под 82 и 85 задачи. Спасибо Leshich, hamlet и Sp999, что обратили внимание. Лучше поздно, чем никогда :-).

§ Подготовлена новая версия страницы с упражнениями на SELECT. Помимо прочего, улучшена диагностика ошибок по аналогии с упражнениями по DML. Пока доступны будут обе страницы - старая и новая. Ссылки на новую страницу нет, т.к. она после отладки заменит старую. Новую страницу можно будет получить по адресу http://www.sql-ex.ru/exercises2.php . Просьба протестировать ее, т.е. решать задачи с ее помощью. Буду благодарен, если вы сообщите о замеченных багах.

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

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

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

No Surname Number of
Sel_ex
Number of
DML_ex
Scores Days Days_2 Last_Solved Last_Visit
1 Зверев Д.Л. (dimzv) 136 17 274 252.92 2.219 14 Jul 2004 14 Jul 2004
2 Иткин И.Л. (joseph_itkin) 136 17 274 245.84 2.792 29 Oct 2004 27 Dec 2004
3 Якутин Н.В. (ZrenBy) 136 6 274 428.80 3.993 24 Jun 2004 28 Dec 2004
4 Сныткин В.Л. (vlad_snt) 136 19 274 96.10 6.470 07 Dec 2004 09 Jan 2005
5 Леденев С.А. (Shurgenz) 136 17 274 60.94 8.315 18 Oct 2004 30 Dec 2004
6 Михайлов В.Г. (mslava) 136 17 274 498.01 9.734 26 Oct 2004 26 Oct 2004
7 Spirin (spirin) 136 17 274 44.06 13.429 29 Sep 2004 06 Dec 2004
8 Валуев Д.И. (Fiolent) 136 19 274 293.15 19.314 23 Jun 2004 09 Jan 2005
9 Hakobyan H.H. (hamlet) 136 17 274 86.90 31.941 25 Dec 2004 05 Jan 2005
10 Мельникова И.А. (Iris_m) 136 17 274 141.12 65.651 30 Sep 2004 08 Jan 2005
11 Карабанов А. (gipa) 133 0 268 138.58 5.022 10 Jul 2004 10 Jul 2004
12 Новиков Д.А. (DimaN) 130 0 264 68.17 2.104 01 Mar 2004 01 Mar 2004
13 Драконов Ф.А. (f_d) 130 0 264 36.32 7.243 03 Jun 2004 11 Nov 2004
14 Пятница О.А. (Robin) 128 17 259 589.55 70.834 06 Oct 2004 12 Dec 2004
15 Шипунов И. (IAS) 125 18 254 203.95 68.024 03 Jan 2005 06 Jan 2005
16 Губарь Д.К. (DEathkNIghtS) 124 17 251 22.67 1.048 03 Nov 2004 03 Nov 2004
17 Смирнов А. (Leshich) 124 17 251 147.15 84.180 03 Aug 2004 19 Nov 2004
18 Ганя А.Д. (Sandman25) 123 1 248 154.83 3.130 16 Jun 2004 16 Jun 2004
19 сафрошкин В.Ю. (safervas) 123 14 248 102.29 80.143 26 Nov 2004 12 Dec 2004
20 Шулакова Н. (nshu) 121 0 244 81.03 5.468 28 Feb 2004 28 Feb 2004

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Degtiarev A.K. (hell) 68 68 126 30 156 120 09 Jan 2005
2 Мубаракзянова (mrv) 55 55 95 0 95 281 06 Jan 2005
3 Bezborodov D. (brdless) 51 51 81 0 81 356 06 Jan 2005
4 Прыгун В. (victorpr) 32 96 71 6 77 58 08 Jan 2005
5 Будник С.В. (BSV1969) 15 63 30 30 60 202 06 Jan 2005
6 Дудкин А.В. (Arsu) 28 60 51 0 51 261 05 Jan 2005
7 Бойцова Е.В. (Lena) 15 76 39 11 50 99 08 Jan 2005
8 >Кувалкин К.С. (Cyrilus) 19 119 44 2 46 26 09 Jan 2005
9 Фомушкин А.В. (Silicat) 20 61 36 9 45 252 06 Jan 2005
10 Горбаченко Г. (glebg) 11 62 26 17 43 251 09 Jan 2005
11 >Vasilchak E. (BLESSED) 26 26 43 0 43 666 09 Jan 2005
12 Рахманов И.Е. (bloom) 14 64 36 1 37 162 07 Jan 2005
13 Крокодил Г. (crocodil) 32 32 35 0 35 783 06 Jan 2005
14 >Веденин Ю.А. (MAD) 22 22 31 3 34 907 09 Jan 2005
15 >Arzant (First_Step) 20 25 30 0 30 789 09 Jan 2005
16 >q (anton_t) 20 20 27 0 27 1001 09 Jan 2005
17 server# M.J. (Apache) 19 19 25 0 25 1051 08 Jan 2005
18 Смородина О.Н. (SONiko) 7 56 19 0 19 276 08 Jan 2005
19 satyricon E.T. (Zheka) 6 28 18 0 18 612 06 Jan 2005
20 hidden (diwdotnet) 15 15 17 0 17 1240 08 Jan 2005
21 Kalygulova A.S. (babacvf) 7 22 15 0 15 879 04 Jan 2005

Характерные ошибки при решении упражнений

SELECT

Задача 46
Укажите сражения, в которых участвовало, по меньшей мере, три корабля одной и той же страны.

До недавнего обновления данных в основной базе на сайте проходил заведомо неправильное решение:

SELECT battle FROM Classes c
   LEFT JOIN Ships s ON c.class = s.class
    INNER JOIN Outcomes o ON o.ship = s.name OR c.class = o.ship
GROUP BY battle, country HAVING COUNT(ship) > 3

Обратите внимание на HAVING COUNT(ship) > 3. Использование правильного предиката с условием >=3 делало запрос неверным, каким он и является. Подгонка решения позволила обнаружить дыру в проверке, которая и была устранена.

Итак, запрос соединяет классы с кораблями из таблицы Ships, чтобы определить страну корабля. Левое соединение (LEFT JOIN) используется для того, чтобы не потерять класс, если кораблей этого класса нет в таблице Ships. Такой (и не только) класс понадобится для того, чтобы учесть головные корабли из таблицы Outcomes, что и делается в следующем (внутреннем) соединении. Предикат этого соединения

(1)
ON o.ship = s.name OR c.class = o.ship

сформирует строку, в столбце ship которой будет находиться имя корабля, принимавшего участие в сражениях, если его имя совпадает с именем корабля известного класса в таблице Ships ИЛИ если его имя совпадает с именем класса (головной корабль). Если корабль не принимал участия в сражении, то в столбце ship будет NULL. Затем выполняется группировка по паре атрибутов {battle, country} с предложением HAVING COUNT(ship) >= 3, что позволяет отобрать только те страны, которые участвовали в битве более чем двумя кораблями. Заметим, что функция COUNT корректно обработает NULL-значения в столбце ship.

§ О разнице в использовании COUNT(*) и COUNT(<имя столбца>) можно почитать в справке на сайте.

В этом "ИЛИ" предиката (1) и заключается основная ошибка этого запроса. Если один и тот же головной корабль имеется в таблице Outcomes и в таблице Ships, то он будет учтен дважды для одной и той же битвы. Это можно увидеть из запроса, который любезно предложил автор неправильного решения (BSV1969):

SELECT battle, country, ship, COUNT(*) qty FROM Classes c
    LEFT JOIN Ships s ON c.class = s.class
    INNER JOIN Outcomes o ON o.ship = s.name OR c.class = o.ship
GROUP BY battle, country, ship

Я привожу здесь только одну неправильную строку результата:

Battle country ship qty
Surigao Strait USA Tennessee 2

Явная ошибка, т.к. один и тот же корабль не может дважды упоминаться для одной и той же битвы (Surigao Strait), что запрещено первичным ключом на таблице Outcomes.

Отметим, что рассматриваемый запрос содержит еще одну ошибку, описанную в FAQ. Поскольку группировка выполняется по паре атрибутов {battle, country}, то битва будет выводиться неоднократно, если в ней принимало участие по 3 и более корабля от каждой страны.

Остается один вопрос. Почему же при трех отмеченных ошибках (>3 вместо >=3, ошибочное соединение и возможное появление дубликатов) запрос был принят системой?

Попробуем разобраться. В основной базе не было ни одной битвы, для которой бы выполнялось условие задачи. В правильном решении выводился пустой набор записей. Поэтому ошибочное увеличение числа кораблей не работало с правильным критерием (>=3), т.к. запрос выдавал битву Surigao Strait, хотя в ней реально принимало участие 2 корабля из USA. А вот условие >3 опять давало пустой набор.

В проверочной базе для блокировки решения с неисключенными дубликатами для одной битвы было два набора по 3 корабля разных стран. При этом в одном наборе головной корабль присутствовал в обеих таблицах (Outcomes и Ships). Для этого набора рассматриваемым запросом ошибочно считалось 4 корабля, а для второго правильно - 3. Поэтому условие в предикате HAVING - > 3 и давало только одну битву, разрешая самым неожиданным образом проблему с дубликатами.

Мир SQL полон неожиданностей; чем больше вы делаете ошибок, тем больше вероятность совпадения результатов :-).

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

§ Приведенные здесь примеры можно выполнить непосредственно на сайте, установив флажок "Без проверки" на странице с упражнениями на SELECT.

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

§ В ближайшее время (следите за сообщениями в рассылке) будут выставлены 2 новые задачи. Количество задач при этом не изменится. Предполагается менять задачи. Предположительно будут заменены задачи 111 и 62. Как следствие, второй этап будет начинаться теперь не с 63 задачи, а с 62 (новой). Тем самым, будут изменены сертификационные требования. Теперь для получения сертификата BR потребуется решить одну новую задачу, а для сертификата AR - две (конечно, если вы их ранее решили).

Контакты

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

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

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.db.sqlex
Отписаться

В избранное