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

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


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

Новости сайта "Упражнения по SQL" Выпуск 7 (31 октября 2004 г.)

http://www.sql-ex.ru

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

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

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


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

§ Устранена неоднозначность формулировки задачи #82, на которую указал DEathkNIghtS. Теперь "расшифровывается", что соседние места находятся в одном ряду.

§ Автором (Fiolent) исправлена формулировка задачи 134. Добавлены проверочные данные, которые блокируют проходившие ранее не вполне верные решения этой задачи.


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

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

Лучшие результаты (ТОР 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 22 Oct 2004
2 Иткин И.Л. (joseph_itkin) 136 17 274 245.84 2.792 29 Oct 2004 29 Oct 2004
3 Якутин Н.В. (ZrenBy) 136 6 274 428.80 3.993 24 Jun 2004 27 Oct 2004
4 Леденев С.А. (Shurgenz) 136 17 274 60.94 8.315 18 Oct 2004 29 Oct 2004
5 Михайлов В.Г. (mslava) 136 17 274 498.01 9.734 26 Oct 2004 30 Oct 2004
6 Spirin (spirin) 136 17 274 44.06 13.429 29 Sep 2004 18 Oct 2004
7 Валуев Д.И. (Fiolent) 136 17 274 293.15 19.314 23 Jun 2004 27 Oct 2004
8 Мельникова И.А. (Iris_m) 136 17 274 141.12 65.651 30 Sep 2004 27 Oct 2004
9 Карабанов А. (gipa) 133 0 268 138.58 5.022 10 Jul 2004 08 Oct 2004
10 Новиков Д.А. (DimaN) 130 0 264 68.17 2.104 01 Mar 2004 07 Apr 2004
11 Драконов Ф.А. (f_d) 130 0 264 36.32 7.243 03 Jun 2004 28 Jun 2004
12 Пятница О.А. (Robin) 128 17 259 589.55 70.834 06 Oct 2004 28 Oct 2004
13 Смирнов А. (Leshich) 124 17 251 147.15 84.180 03 Aug 2004 28 Oct 2004
14 Ганя А.Д. (Sandman25) 123 1 248 154.83 3.130 16 Jun 2004 21 Sep 2004
15 Шулакова Н. (nshu) 121 0 244 81.03 5.468 28 Feb 2004 02 Mar 2004
16 Митронин А.А. (mitronin) 120 9 241 405.96 2.150 09 Aug 2004 08 Sep 2004
17 Муравейко О.Ю. (Aaz) 120 4 241 134.65 5.720 07 Mar 2004 25 Oct 2004
18 Gershovich (VIG) 119 1 238 486.32 4.006 10 Jul 2004 30 Oct 2004
19 Безруков Н.Н. (eviluser) 119 0 238 11.15 6.891 12 Jan 2004 12 Jan 2004
20 Губарь Д.К. (DEathkNIghtS) 118 17 236 19.54 .744 30 Oct 2004 30 Oct 2004

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Губарь Д.К. (DEathkNIghtS) 36 118 77 0 77 20 30 Oct 2004
2 Matsevich V. (vadimm) 37 62 70 5 75 192 29 Oct 2004
3 Трегубов А. (art) 30 50 57 16 73 288 30 Oct 2004
4 Дегтярь (degtyar) 34 68 68 0 68 103 29 Oct 2004
5 >ky (azure) 44 44 67 0 67 363 30 Oct 2004
6 Копысова С.В. (kosv) 36 36 64 0 64 381 29 Oct 2004
7 Брунец Р.Б. (romashka) 34 34 59 4 63 430 28 Oct 2004
8 Yun G.A. (JayS) 20 77 49 5 54 76 30 Oct 2004
9 Тортумашев (johnnytort) 21 93 43 10 53 49 29 Oct 2004
10 Давыдов В.Я. (Vsevolod) 28 62 51 0 51 207 27 Oct 2004
11 Михайлов В.Г. (mslava) 12 136 23 25 48 5 30 Oct 2004
12 Лукьянов А.Н. (Spider) 25 25 35 9 44 658 29 Oct 2004
13 Незговоров А.Г. (Шурик) 25 25 42 0 42 567 30 Oct 2004
14 Sazheniuk G. (Gia) 24 24 37 4 41 608 29 Oct 2004
15 Шаповалов М.П. (shap) 15 49 31 9 40 315 30 Oct 2004
16 Грицюта И.В. (Atez) 24 47 35 3 38 351 25 Oct 2004
17 Z P. (Condemned) 24 24 37 0 37 626 29 Oct 2004
18 Воробьев П.А. (crow1) 21 24 34 3 37 636 29 Oct 2004
19 Leon (Traveller) 23 44 36 0 36 360 30 Oct 2004
20 Bolschakoff (Bolschakoff) 20 56 34 0 34 226 29 Oct 2004
21 Сергеев Е.В. (John Doe) 13 27 32 2 34 518 29 Oct 2004
22 Истомина Н.А. (ina) 24 30 34 0 34 595 29 Oct 2004
23 Grunichev A.V. (lexxxa) 21 49 31 2 33 303 27 Oct 2004
24 Puzyrevskaya (pnv) 21 43 33 0 33 373 29 Oct 2004
25 Елдыщенко (grey_rat) 13 77 32 0 32 78 29 Oct 2004
26 Прозорова Т.И. (prozorovat) 17 59 31 0 31 218 29 Oct 2004
27 Старенкова Е. (seaqua) 10 31 23 7 30 462 27 Oct 2004


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

SELECT


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

Устав отвечать на вопросы относительно этой задачи, я решил объяснить сразу всем подписчикам допускаемую при ее решении одну и ту же ошибку. Однако чтобы не лишать вас удовольствия самостоятельно решить эту задачу, упрощу формулировку.
Итак,
Определить год, когда на воду было спущено максимальное количество кораблей. Вывод: количество кораблей, год.

Определить распределение количества кораблей по годам можно так

SELECT launched [year], COUNT(*) cnt FROM Ships GROUP BY launched

Теперь нам нужно оставить из всех строк, возвращаемых этим запросом, только те, у которых количество (cnt) максимально, т.е.

>= ALL(SELECT COUNT(*) cnt FROM Ships GROUP BY launched)

Окончательно получим

SELECT * FROM
(
SELECT launched [year], COUNT(*) cnt FROM Ships GROUP BY launched
) x
WHERE cnt >= ALL(SELECT COUNT(*) cnt FROM Ships GROUP BY launched)

Тем не менее, здесь кроется ошибка. Эта ошибка не связана с формальным построением решения. Оно не вызывает сомнения. Как это обычно происходит при решении задач на сайте, ошибка заключается в неточном учете особенностей модели предметной области, а именно, ее ограничений. В данном случае - это допустимость того, что в базе данных могут быть корабли с неизвестным годом спуска на воду. Хочу здесь отметить, что если в описании предметной области не оговорено противное, неключевые поля допускают NULL-значения. Собственно, по умолчанию это и имеется в виду, когда мы создаем таблицу с помощью оператора CREATE TABLE.

Строить корабли - это не кроликов разводить :-). Корабли строятся годами. Поэтому, если для ряда кораблей год спуска на воду неизвестен (NULL), то велика вероятность того, что число таких кораблей будет больше, чем количество кораблей, спущенных на воду в любом реальном году. Особенность группировки заключается в том (и это оговорено в Стандарте), что NULL-значения трактуются как РАВНЫЕ. Следовательно, все корабли с неизвестным годом спуска на воду, будут просуммированы с годом NULL. Я полагаю, что результат не должен включать такую строку по той причине, что неизвестный год - не значит один и тот же. С этим можно, конечно, поспорить. Однако все споры сведутся к допустимости использования специфического значения NULL в реляционной модели. Дискуссии по этому поводу ведутся со времен создания этой модели Коддом Е.Ф., которому и принадлежит идея NULL-значения. Однако, насколько мне известно, достойной альтернативы предложено не было.

Возвращаясь к нашей задаче, я, в знак безграничного уважения к Кодду, внесу в решение следующее изменение:

SELECT * FROM
(
SELECT launched [year], COUNT(*) cnt FROM Ships
WHERE launched IS NOT NULL
GROUP BY launched
) x
WHERE cnt >= ALL(SELECT COUNT(*) cnt FROM Ships
WHERE launched IS NOT NULL
GROUP BY launched)

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

Здесь следует использовать NULL-значение, если год спуска на воду кораблей данного класса неизвестен, т.к. в задаче сказано: "для каждого класса". Однако не в этом состоит характерная ошибка, допускаемая при решении задачи.
Дело в том, что в базе данных может быть класс, но не быть кораблей этого класса. Это вполне соответствует ограничениям схемы "Корабли", а именно, связи "один-ко многим" между таблицами Classes и Ships. Естественно, в этом случае нужно также писать NULL в качестве года спуска на воду, т.к. мы его не знаем.


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


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

§ Предложено (Robin) сделать на сайте страницу для работодателей. Мы готовы пойти навстречу и разместить информацию о сертифицированных на сайте специалистах, ищущих работу.
Нужна ли такая страница? Пишите.


Контакты

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

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

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

В избранное