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

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


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

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

http://www.sql-ex.ru

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

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

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

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


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

§ Обновилась персональная страница. Теперь на вкладке "Рейтинг и решенные задачи" номера задач сделаны ссылками, ведущими на соответствующие топики форума. Отдельно выделены номера задач, в обсуждении которых принимал участие хозяин персональной страницы, и топики, где появились новые сообщения.

§ Сделаны более однозначными формулировки задач 38 и 67.

§ Готовлю замену еще нескольких задач. Это будет 41 задача первого этапа (подробности в следующем выпуске рассылки). Еще две задачи заменят, вероятно, 106-ю (автор Shurgenz) и 112-ю. Некоторые перепевы, однако время покажет, насколько правомерна замена.

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 LastSolved LastVisit
1 Кувалкин К.С. (Cyrilus) 137 67 20 310 167 5.029 10 May 2005 14 May 2005
2 Гонтовой В.А. (noname) 137 67 20 310 52 9.695 07 May 2005 07 May 2005
3 Леденев С.А. (Shurgenz) 137 67 20 310 264 9.839 09 May 2005 14 May 2005
4 Валуев Д.И. (Fiolent) 137 67 20 310 617 26.475 13 May 2005 14 May 2005
5 Галиаскаров Э.Г. (Galogen) 137 67 20 310 172 61.254 13 May 2005 13 May 2005
6 Колосов А.С. (KAS) 136 137 20 308 25 3.404 11 Mar 2005 11 May 2005
7 Мельникова И.А. (Iris_m) 136 137 20 308 324 89.875 01 Apr 2005 04 May 2005
8 Сныткин В.Л. (Ded I) 136 67 20 306 252 7.463 12 May 2005 14 May 2005
9 Рахманов И.Е. (bloom) 136 67 20 306 148 14.186 11 May 2005 13 May 2005
10 Hakobyan H.H. (hamlet) 136 67 20 306 220 37.875 07 May 2005 11 May 2005
11 Шипунов И. (IAS) 136 67 20 306 334 82.086 13 May 2005 13 May 2005
12 Зверев Д.Л. (dimzv) 135 136 20 304 513 2.426 31 Mar 2005 31 Mar 2005
13 Иткин И.Л. (joseph_itkin) 134 136 20 301 375 2.851 07 Mar 2005 13 Apr 2005
14 Spirin (spirin) 133 136 19 298 158 13.466 21 Jan 2005 24 Jan 2005
15 Михайлов В.Г. (mslava) 134 136 17 295 648 10.509 25 Mar 2005 25 Mar 2005
16 Пятница О.А. (Robin) 127 128 20 289 754 74.637 19 Mar 2005 06 May 2005
17 Gershovich (VIG) 121 122 20 277 764 10.553 14 Apr 2005 13 May 2005
18 Митронин А.А. (mitronin) 121 67 20 276 681 8.692 11 May 2005 14 May 2005
19 Булаев В.В. (Kvix) 120 121 20 274 247 24.655 29 Apr 2005 29 Apr 2005
20 Якутин Н.В. (ZrenBy) 131 136 6 272 511 3.989 14 Sep 2004 18 Jan 2005

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Курочкин А.А. (KurochkinA) 46 46 77 0 77 520 14 May 2005
2 >Попеску В.Н. (Молдавский сибиряк) 39 52 76 0 76 395 14 May 2005
3 >Goppen (DenG) 36 49 69 6 75 477 14 May 2005
4 >Держальцев В.А. (MadVet) 28 109 62 0 62 41 12 May 2005
5 Martynyuk I. (Druger) 24 24 37 23 60 1042 12 May 2005
6 Ескендиров М. (Murat_2005) 35 35 44 9 53 934 13 May 2005
7 >Ленков (Sericeous) 27 55 46 3 49 385 14 May 2005
8 >Кирьяков И.В. (iv_kir) 24 29 47 0 47 808 14 May 2005
9 Астахов А. (Glukogenerator) 18 82 43 0 43 92 13 May 2005
10 Прошин (OLEG2005) 19 54 33 10 43 393 14 May 2005
11 Tokareva (Svetlana) 14 50 31 9 40 497 14 May 2005
12 Субботин А.М. (c[InIMat]ic) 21 49 31 8 39 498 13 May 2005
13 Окунев Е.Е. (Yamaneko) 17 59 32 0 32 332 13 May 2005
14 Konyshev (Phohack) 12 57 29 1 30 346 13 May 2005
15 Оскорбин В. (Vitos) 21 21 29 0 29 1304 13 May 2005
16 Коголев А.В. (Kogolev) 11 59 28 0 28 289 11 May 2005
17 >Яковлев (ton) 16 45 26 0 26 516 14 May 2005
18 Prishvin M. (Mikheil) 12 42 25 0 25 543 10 May 2005
19 Paleyev A. (AlexP) 11 24 25 0 25 1029 11 May 2005
20 >Ильинец Д.В. (idv) 12 93 23 0 23 78 13 May 2005
21 Ластовка Н.А. (Last_Nata) 8 43 14 9 23 691 13 May 2005
22 Gokadze B.J. (beso_g) 15 35 21 0 21 866 14 May 2005
23 >Евдокимов С.Е. (Ayzel) 15 15 17 3 20 1627 14 May 2005

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

SELECT

Задача 38
Найдите страны, владевшие когда-либо как обычными кораблями, так и крейсерами.

Т.е. нужно найти страны, которые имели корабли типа 'bc' и 'bb'. Слова "владевшие когда-либо" должно, по мнению автора, задействовать следующую логическую цепочку рассуждений:

- в текущем состоянии БД может не быть корабля какого-либо класса, хотя страна могла их иметь;
- тогда откуда мы можем узнать, что такие корабли были? Только по имеющимся в БД классам, поскольку только в таблице Classes имеется информация о типе и стране;
- если есть класс, скажем, типа 'bc' (крейсер), то были и корабли этого класса, поскольку классу дает имя первый корабль, выпущенный по данному проекту, даже если их нет в таблице Ships или Outcomes.

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

SELECT DISTINCT c1.country
FROM Classes c1 INNER JOIN Classes c2
    ON c1.country = c2.country
     INNER JOIN Ships s1
     ON c1.class = s1.class
     INNER JOIN Ships s2
     ON c2.class = s2.class
WHERE c1.type = 'bb'
     AND c2.type = 'bc'
UNION
SELECT DISTINCT c1.country
     FROM Classes c1 INNER JOIN Classes c2
     ON c1.country = c2.country
     INNER JOIN Ships s1
     ON c1.class = s1.class
     INNER JOIN Outcomes s2
     ON c2.class = s2.ship
WHERE c1.type = 'bb' AND c2.type = 'bc'
     OR c2.type = 'bb' AND c1.type = 'bc'

Какой формулировке соответствует это решение? Найти страны, у которых в БД имеются корабли обоих типов? Если ответ "да", то это решение все равно не является правильным.

В первом запросе объединения определяются страны, которые в таблице Ships имеют корабли обоих типов. Во втором запросе определяются страны, которые имеют в таблице Ships корабль одного типа, а в таблице Outcomes - другого.

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

INSERT INTO Classes VALUES('c_bb', 'bb' , 'AAA' ,10 ,15 , 35000)
INSERT INTO Classes VALUES('c_bc', 'bc', 'AAA', 6, 15, 45000)
INSERT INTO Outcomes VALUES('c_bb', 'Guadalcanal', 'ok')
INSERT INTO Outcomes VALUES('c_bc', 'Guadalcanal', 'ok')

Страна ААА имеет корабли обоих типов. Однако вышеприведенный запрос не выведет эту страну, как это и следовало ожидать.

Замечу также, что DISTINCT в обоих запросах совершенно излишен, т.к. UNION устранит возможные дубликаты. С точки зрения логики это замечание не является существенным. Однако с точки зрения оптимизации это достаточно важный момент. Сервер тратит значительные ресурсы на удаление дубликатов, поэтому не стоит это делать несколько раз. Сравните планы выполнения запросов с DISTINCT и без.

А вот пример половинчатого решения, принимаемого системой:

SELECT DISTINCT country
FROM Classes RIGHT JOIN
    (
     SELECT DISTINCT COALESCE(ship, name) AS name, class
     FROM outcomes FULL OUTER JOIN ships
     ON ship = name
    )AS Z
ON Z.name = Classes.class OR Z.class = Classes.class
WHERE type = 'bb' AND
     country IN (SELECT country FROM classes
         WHERE type = 'bc')

Здесь берутся все корабли из обеих таблиц - Ships и Outcomes. Далее соединением с таблицей Classes определяется их класс, и отбираются только те из них, которые имеют тип 'bb' (боевые корабли). Наконец, проверяется, что страна найденных ранее кораблей имеет также классы 'bc'. Решение оказалось правильным только потому, что страны, имеющие классы обоих типов, имеют в текущем состоянии БД корабли типа 'bb'.

Заблокировать подобные решения очень просто: достаточно добавить в таблицу Classes два класса (типа 'bc' и 'bb') для страны, которая вообще не имеет кораблей в БД. Однако, видимо, лучше уточнить формулировку, скажем, так:

Найдите страны, имеющие классы как обычных боевых кораблей ('bb'), так и крейсеров ('bc').

Скорее всего, к выходу этого номера рассылки изменение формулировки уже будет сделано. Тем не менее, надеюсь, что проведенный анализ решений окажется полезным для вас.

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

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

Конкурс

§ Мы выставили наш сайт на конкурс Интернить 2005. Победитель определяется числом поданых голосов. Просьба проголосовать. (рекомендуемая оценка 3 :-)).

Контакты

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

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

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

В избранное