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

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


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

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

http://www.sql-ex.ru

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

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

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

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


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

§ Исправлена формулировка задачи 19 (DML).

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

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

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

Лучшие результаты (ТОР 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 14 Jan 2005
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 15 Jan 2005
5 Леденев С.А. (Shurgenz) 136 19 274 60.94 8.315 18 Oct 2004 11 Jan 2005
6 Михайлов В.Г. (mslava) 136 17 274 498.01 9.734 26 Oct 2004 26 Oct 2004
7 Spirin (spirin) 136 19 274 44.06 13.429 29 Sep 2004 13 Jan 2005
8 Валуев Д.И. (Fiolent) 136 19 274 293.15 19.314 23 Jun 2004 15 Jan 2005
9 Hakobyan H.H. (hamlet) 136 19 274 86.90 31.941 25 Dec 2004 13 Jan 2005
10 Мельникова И.А. (Iris_m) 136 19 274 141.12 65.651 30 Sep 2004 14 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 15 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 13 Jan 2005
19 сафрошкин В.Ю. (safervas) 123 14 248 102.29 80.143 26 Nov 2004 12 Dec 2004
20 Кувалкин К.С. (Cyrilus) 121 18 244 48.80 3.245 12 Jan 2005 15 Jan 2005

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >moskalev V.V. (dee) 55 70 115 3 118 113 15 Jan 2005
2 AL-BOUREE D.S. (yemen) 57 57 101 0 101 270 14 Jan 2005
3 Елинов О.В. (ДеД МоРоЗ) 56 56 98 0 98 279 14 Jan 2005
4 Крук А.Л. (Electronic) 56 56 98 0 98 280 14 Jan 2005
5 Пшеницын И.В. (ipshon) 56 56 98 0 98 281 15 Jan 2005
6 Kiseloff D.I. (KID) 56 56 98 0 98 282 15 Jan 2005
7 Aksakov A.A. (AX3) 53 53 89 0 89 327 14 Jan 2005
8 Подгорных П.А. (Pav666) 52 52 88 0 88 335 14 Jan 2005
9 Afanasieva O.A. (Ola-la) 52 52 87 0 87 341 13 Jan 2005
10 Хабибрахманов Р. (Casey) 40 56 79 0 79 291 13 Jan 2005
11 zubkov (gurazh) 42 42 65 3 68 468 14 Jan 2005
12 R100 (R100) 42 42 67 0 67 453 13 Jan 2005
13 Веденин Ю.А. (MAD) 34 43 59 1 60 437 14 Jan 2005
14 Degtiarev A.K. (hell) 16 78 39 11 50 91 12 Jan 2005
15 Ильина О.Л. (Slonik) 28 56 49 0 49 288 12 Jan 2005
16 Лагунова О. (goodoi) 28 56 49 0 49 290 14 Jan 2005
17 Сухорук С.В. (Serega) 27 27 47 0 47 643 14 Jan 2005
18 Рудников С.П. (Ehidna) 27 27 47 0 47 645 12 Jan 2005
19 Краснов Е. (Johny) 23 56 44 0 44 289 15 Jan 2005
20 >Arzant (First_Step) 23 42 44 0 44 439 15 Jan 2005
21 Фомичев А.В. (Fomich) 31 31 42 0 42 693 13 Jan 2005
22 >A A.A. (fastsolver) 19 86 41 0 41 73 15 Jan 2005
23 Lonski S.O. (sllon) 16 56 41 0 41 292 13 Jan 2005
24 q (anton_t) 25 25 40 0 40 719 10 Jan 2005
25 >Reznick S.Y. (kinzer) 24 24 37 0 37 762 14 Jan 2005
26 Stolyarov S. (Cancel) 23 23 34 0 34 829 12 Jan 2005
27 Bratchikov (Brig) 10 58 24 9 33 276 13 Jan 2005
28 Паздникова О.И. (OlgaP) 19 40 32 0 32 565 14 Jan 2005
29 >Сенгилеев А. (hroft1) 12 57 30 1 31 272 15 Jan 2005
30 agayeva (murad) 18 24 31 0 31 784 14 Jan 2005
31 Хромченков Д.А. (olap) 22 22 31 0 31 928 14 Jan 2005
32 Мальцев С.С. (Serge) 14 56 30 0 30 284 11 Jan 2005
33 Shelehov (DINO) 17 24 30 0 30 795 14 Jan 2005
34 >Breido O.A. (Lusha) 21 21 29 1 30 996 15 Jan 2005

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

SELECT

Задача 57
Для каждого класса, имеющего не менее трех кораблей в базе данных, определите число кораблей этого класса, потопленных в сражениях, если такие были. Вывести: класс и число потопленных кораблей.

Рассмотрим следующее решение, не принимаемое системой проверки:

SELECT c.class, SUM(outc) FROM Classes c
   LEFT JOIN Ships s ON c.class=s.class
    LEFT JOIN (SELECT ship, 1 outc FROM Outcomes WHERE result='sunk') o
        ON s.name=o.ship OR c.class=o.ship GROUP BY c.class
HAVING COUNT(*) > 2 AND SUM(outc) IS NOT NULL

Первое левое соединение дает все классы, повторяющиеся столько раз, сколько имеется кораблей в таблице Ships. Если некий класс не имеет кораблей в этой таблице, то он будет упомянут один раз, и это дает нам возможность учесть головные корабли класса в таблице Outcomes, если таковые имеются.

Далее выполняется еще одно левое соединение с набором потопленных кораблей по предикату

ON s.name=o.ship OR c.class=o.ship

В вычисляемый столбец заносится 1, если имя потопленного корабля совпадает либо с именем корабля, либо с именем класса из полученного ранее набора. Таким образом, мы здесь и пытаемся учесть головные корабли.

Наконец, выполняется группировка по классам с отбором по числу кораблей (строк) класса и подсчитывается сумма потопленных кораблей (единиц в столбце outs). Насколько я понял, автор предлагает рациональный способ вычислить в одной группировке и общее число кораблей, и количество потопленных кораблей в классе. Предикат

SUM(outc) IS NOT NULL

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

Те, кто читал предыдущий номер рассылки с анализом задачи 46, уже догадались, в чем дело. Правильно, проблема в предикате второго соединения. Однако не только в этом.

Рассмотрим следующий вариант данных. Пусть для некоторого класса class_N в таблице Ships имеется два корабля: ship_1 и ship_2. Кроме того, в таблице Outcomes есть потопленный корабль ship_1 и оставшийся целым головной - class_N.

Первое соединение даст:
class ship
Class_N ship_1
Class_N ship_2

Выполняем второе соединение:

class ship outs
Class_N ship_1 1
Class_N ship_2 NULL

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

Давайте теперь немного изменим данные в примере. Пусть и головной корабль class_N тоже потоплен. Тогда результатом соединения будет:

Class ship Outs
class_N ship_1 1
class_N ship_2 NULL
class_N ship_1 1
class_N ship_2 1

Последние две строки будут получены в результате соединения со строкой потопленного головного корабля, т.к. предикат c.class=o.ship дает "истину". Таким образом, мы вместо одной строки для головного корабля получаем по строке на каждый корабль класса из таблицы Ships. Итого, вместо

class outs
class_N 2

имеем

class outs
class_N 3

Вы можете попытаться исправить это решение. Или использовать другой подход на базе внутреннего соединения и объединения.

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

Контакты

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

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

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

В избранное