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

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


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

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

http://www.sql-ex.ru

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

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

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

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


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

§ При недавнем добавлении данных я нарушил правила предметной области, а именно, ввел корабль, год спуска на воду которого был меньше, чем год спуска на воду головного корабля того же класса. В результате в течение нескольких дней были проблемы с решением, например, задачи 55. Проблема состояла в том, что решение явно определяющее год спуска на воду головного корабля класса и решение, считающее (по описанию предметной области), что минимальный год - это год спуска головного корабля класса, давали разные результаты на проверочной базе. Данные уже исправлены. Но что самое удивительное, так это то, что Sp999, у которого прошло неверное решение на 34 задаче, и который спровоцировал дабавление данных, попался теперь с правильным решением на задаче 55. Только не нужно говорить, что инициатива наказуема :-). Я благодарен Sp999 за то, что он заметил эти казусы в проверке и поспособствовал ее качественному улучшению.

§ По предложению автора задачи 120 (Fiolent) добавлены проверочные данные и внесено уточнение в формулировку. Некоторые опубликованные на форуме решения перестанут проходить. Проверь свое решение!

§ В задаче 102 проходили решения, которые не учитывали одновременной окраски квадрата разными баллончиками. По предложению hamlet внесены изменения в проверочные данные, блокирующие такие решения.

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

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

Лучшие результаты (ТОР 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 03 Dec 2004
3 Якутин Н.В. (ZrenBy) 136 6 274 428.80 3.993 24 Jun 2004 16 Nov 2004
4 Леденев С.А. (Shurgenz) 136 17 274 60.94 8.315 18 Oct 2004 03 Dec 2004
5 Михайлов В.Г. (mslava) 136 17 274 498.01 9.734 26 Oct 2004 26 Oct 2004
6 Spirin (spirin) 136 17 274 44.06 13.429 29 Sep 2004 29 Sep 2004
7 Валуев Д.И. (Fiolent) 136 17 274 293.15 19.314 23 Jun 2004 03 Dec 2004
8 Мельникова И.А. (Iris_m) 136 17 274 141.12 65.651 30 Sep 2004 03 Dec 2004
9 Карабанов А. (gipa) 133 0 268 138.58 5.022 10 Jul 2004 10 Jul 2004
10 Сныткин В.Л. (vlad_snt) 132 17 267 92.10 6.145 03 Dec 2004 04 Dec 2004
11 Новиков Д.А. (DimaN) 130 0 264 68.17 2.104 01 Mar 2004 01 Mar 2004
12 Драконов Ф.А. (f_d) 130 0 264 36.32 7.243 03 Jun 2004 11 Nov 2004
13 Пятница О.А. (Robin) 128 17 259 589.55 70.834 06 Oct 2004 06 Oct 2004
14 Губарь Д.К. (DEathkNIghtS) 124 17 251 22.67 1.048 03 Nov 2004 03 Nov 2004
15 Смирнов А. (Leshich) 124 17 251 147.15 84.180 03 Aug 2004 19 Nov 2004
16 Ганя А.Д. (Sandman25) 123 1 248 154.83 3.130 16 Jun 2004 16 Jun 2004
17 сафрошкин В.Ю. (safervas) 123 14 248 102.29 80.143 26 Nov 2004 29 Nov 2004
18 Шулакова Н. (nshu) 121 0 244 81.03 5.468 28 Feb 2004 28 Feb 2004
19 Gershovich (VIG) 121 17 244 628.96 6.905 30 Nov 2004 04 Dec 2004
20 Митронин А.А. (mitronin) 120 9 241 405.96 2.150 09 Aug 2004 09 Aug 2004

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Кузнецов Е.В. (john_ua1acc) 52 75 110 23 133 91 03 Dec 2004
2 >Черемных В.П. (Sp999) 28 69 69 17 86 107 04 Dec 2004
3 >Кувалкин К.С. (Cyrilus) 28 79 63 18 81 74 04 Dec 2004
4 Долгополов С. (chel_2000) 31 62 66 6 72 225 03 Dec 2004
5 Литвинов С.M. (ЛиС) 47 47 68 0 68 392 02 Dec 2004
6 >Пивоваров А.Г. (andreyp) 16 74 38 14 52 97 03 Dec 2004
7 Галич Н.Н. (Tantor) 25 25 40 6 46 639 03 Dec 2004
8 Галиаскаров Э.Г. (edart) 9 62 25 19 44 224 03 Dec 2004
9 >sirin (sirin) 22 52 42 2 44 298 04 Dec 2004
10 Dragunov (Andrewd1980) 25 25 40 1 41 634 30 Nov 2004
11 Симонов (comstels) 29 29 40 1 41 643 03 Dec 2004
12 Булаев В.В. (Kvix) 18 97 37 0 37 47 02 Dec 2004
13 Pererva (Lorik) 15 32 27 9 36 599 04 Dec 2004
14 Янютин Д.Е. (denyan) 23 23 35 0 35 723 03 Dec 2004
15 кочанов С. (rjxfyjd) 20 20 32 3 35 807 02 Dec 2004
16 Телицына И. (Irka_T) 23 23 34 0 34 752 02 Dec 2004
17 _Maxim_ _. (_Maxim_) 21 21 29 1 30 893 03 Dec 2004
18 Николаев А.Р. (AndrewN) 7 64 18 10 28 148 03 Dec 2004
19 Лесихин А.С. (tempus) 12 45 18 9 27 389 03 Dec 2004
20 Кравченко С.Н. (Sergiore) 15 24 27 0 27 697 03 Dec 2004
21 Забара М.С. (максим111) 12 97 25 0 25 51 03 Dec 2004
22 Мостайкина М.Ю. (Lady) 7 62 15 10 25 235 02 Dec 2004
23 Грига В.П. (grigavp) 10 34 22 0 22 474 30 Nov 2004
24 Телицын М.В. (Sam) 4 59 12 9 21 247 03 Dec 2004
25 DAHUUJI H. (goodliinad) 15 31 20 0 20 661 04 Dec 2004

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

SELECT

Задача 26
Найдите среднюю цену ПК и ПК-блокнотов, выпущенных производителем A (латинская буква). Вывести: одна общая средняя цена.

В FAQ #6 описан пример решения, который схематично можно записать так:

SELECT (SUM(price_PC) + SUM(price_Laptop))/COUNT(PC) + COUNT(Laptop))
WHERE maker='A'

Этот запрос будет работать неверно, если у производителя А в БД нет продукции одного из видов. Пусть, например, отсутствуют ПК, тогда COUNT(PC) вернет 0, и знаменатель будет посчитан правильно. Однако SUM(price_PC) даст NULL. Как известно, арифметические операции с NULL-значением также дают NULL. В результате мы получаем не SUM(price_Laptop)/COUNT(Laptop), а NULL.

Ниже приводится еще пара неверных решений, которые содержат другую ошибку.

(1)
SELECT AVG(price) FROM (
    SELECT price FROM pc WHERE model IN
        (SELECT model FROM product WHERE maker='A' AND type='PC')
         UNION
     SELECT price FROM laptop WHERE model IN
        (SELECT model FROM product WHERE maker='A' AND type='Laptop')
) as prod

(2)
    SELECT AVG(price) FROM (
         SELECT price, model FROM pc WHERE model IN
    (SELECT model FROM product WHERE maker='A' AND type='PC')
         UNION
     SELECT price, model FROM laptop WHERE model IN
        (SELECT model FROM product WHERE maker='A' AND type='Laptop')
) as prod

Первое решение дает результат 772.5, второе - 773.0 при правильном значении 734.5454545454545.

В запросе (1) выбираются цены на все модели производителя А из таблицы PC. Затем они объединяются с ценами на все модели производителя А из таблицы Laptop. Наконец, вычисляется среднее значение. Что же тут неправильного? Ошибка состоит в том, как объединяются цены. Оператор UNION исключает дубликаты, поэтому из нескольких одинаковых цен (если таковые имеются) будет оставаться одна. Как результат, среднее будет посчитано по неверному количеству.

В запросе (2) выбирается не только цена, но и номер модели. Т.е. объединение выполняется по паре атрибутов. Это решение было бы правильным, если бы в соответствующей таблице не было одинаковых моделей с одинаковыми ценами. Последнее было бы гарантировано, если бы пара {price, model} являлась первичным ключом. Однако согласно нашей схеме это не так. При этом такая ситуация не является нереальной. Представим себе, что одна модель комплектуется большим диском, чем другая модель с тем же номером, а памяти, наоборот, имеет меньше. Тогда цена у них вполне может быть одинакова.

В результате объединения будут исключены дубликаты пар {price, model} и, как следствие, получен неверный результат.

Надеюсь, теперь вполне очевидно, как следует решать эту задачу.

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

Контакты

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

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

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

В избранное