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

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


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

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

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

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

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

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

§ Устав разъяснять формулировку задачи #23 (несмотря на то, что есть FAQ для этой задачи), по предложению Wowwi решил внести однозначность за счет избыточности. Теперь формулировка звучит так:

Найдите производителей, которые производили бы как ПК со скоростью не менее 750 МГц, так и ПК-блокноты со скоростью не менее 750 МГц. Вывести: Maker

§ С подачи solominva добавил проверочных данных под задачу #34. Сама задача совсем простая, однако большое число условий (3) потребовало большого числа различных вариантов проверочных данных.

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

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

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

No Surname Number of
exercises
Scores Days Days_2 Last_Solved Last_Visit
1 Зверев Д.Л. (dimzv) 136 274 252.92 2.219 14 Jul 2004 16 Sep 2004
2 Якутин Н.В. (ZrenBy) 136 274 428.80 3.993 24 Jun 2004 07 Oct 2004
3 Spirin (spirin) 136 274 44.06 13.429 29 Sep 2004 12 Oct 2004
4 Валуев Д.И. (Fiolent) 136 274 293.15 19.314 23 Jun 2004 15 Oct 2004
5 Мельникова И.А. (Iris_m) 136 274 141.12 65.651 30 Sep 2004 07 Oct 2004
6 Леденев С.А. (Shurgenz) 135 271 58.37 7.952 15 Oct 2004 16 Oct 2004
7 Карабанов А. (gipa) 133 268 138.58 5.022 10 Jul 2004 08 Oct 2004
8 Новиков Д.А. (DimaN) 130 264 68.17 2.104 01 Mar 2004 07 Apr 2004
9 Драконов Ф.А. (f_d) 130 264 36.32 7.243 03 Jun 2004 28 Jun 2004
10 Пятница О.А. (Robin) 128 259 589.55 70.834 06 Oct 2004 16 Oct 2004
11 Иткин И.Л. (joseph_itkin) 124 251 130.99 2.068 06 Jul 2004 06 Aug 2004
12 Смирнов А. (Leshich) 124 251 147.15 84.180 03 Aug 2004 30 Sep 2004
13 Ганя А.Д. (Sandman25) 123 248 154.83 3.130 16 Jun 2004 21 Sep 2004
14 Шулакова Н. (nshu) 121 244 81.03 5.468 28 Feb 2004 02 Mar 2004
15 Митронин А.А. (mitronin) 120 241 405.96 2.150 09 Aug 2004 08 Sep 2004
16 Муравейко О.Ю. (Aaz) 120 241 134.65 5.720 07 Mar 2004 21 Sep 2004
17 Gershovich (VIG) 119 238 486.32 4.006 10 Jul 2004 16 Oct 2004
18 Михайлов В.Г. (mslava) 119 238 203.11 5.816 05 Jan 2004 29 Jun 2004
19 Безруков Н.Н. (eviluser) 119 238 11.15 6.891 12 Jan 2004 12 Jan 2004
20 Krbashyan R. (raf_krb) 117 234 144.28 41.050 09 Mar 2004 20 Sep 2004

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Larichev S.V. (dorin_larsen) 70 70 132 26 158 90 15 Oct 2004
2 Луценко А.Ю. (lucika) 62 62 110 1 111 178 13 Oct 2004
3 Тортумашев (johnnytort) 62 62 110 0 110 181 15 Oct 2004
4 Губарь Д.К. (DEathkNIghtS) 61 61 108 0 108 201 16 Oct 2004
5 Victosha (Victosha) 46 64 92 3 95 124 16 Oct 2004
6 Сенчук В. (forens2) 51 51 86 0 86 263 15 Oct 2004
7 Mayboroda A.I. (Hohol) 46 53 83 0 83 245 15 Oct 2004
8 Дементьев В.Г. (Demiurge) 49 49 77 0 77 298 16 Oct 2004
9 Соловьянов С. (serge_sg) 46 46 69 0 69 333 15 Oct 2004
10 T (Ellen) 40 40 69 0 69 334 16 Oct 2004
11 Демиденко О.Б. (dob) 36 36 64 0 64 357 15 Oct 2004
12 Яковлев Е.А. (cis_jen) 34 34 59 0 59 408 15 Oct 2004
13 Sharifov E. (elshan) 36 36 47 9 56 492 13 Oct 2004
14 Милючихин Р. (Romchick) 32 32 53 0 53 440 12 Oct 2004
15 Сныткин В.Л. (vlad_snt) 17 78 41 9 50 65 15 Oct 2004
16 Прозорова Т.И. (prozorovat) 27 27 47 0 47 493 15 Oct 2004
17 Трасеров Т.Т. (Tracer) 20 90 44 0 44 49 15 Oct 2004
18 Харьковец (DedAlex) 26 26 43 0 43 524 11 Oct 2004
19 Sidorov (SiDi) 24 24 37 0 37 571 12 Oct 2004
20 Panikovsky (lakshin) 24 24 37 0 37 585 12 Oct 2004
21 Юдин А.А. (loginal) 26 26 35 0 35 620 15 Oct 2004
22 Шумилин А. (Shumilin) 23 23 34 0 34 632 12 Oct 2004
23 Ishchenko V.E. (Wowwi) 23 23 34 0 34 661 15 Oct 2004
24 Савченкова А.Е. (annas) 17 17 33 0 33 681 16 Oct 2004
25 Pulsar (Pulsar) 22 22 31 0 31 705 14 Oct 2004
26 Фурсаев В.Н. (fvn) 22 22 31 0 31 707 14 Oct 2004
27 Сенчук В. (forens) 22 22 31 0 31 711 12 Oct 2004
28 Гилев Е.М. (Eugene_G) 22 22 31 0 31 729 15 Oct 2004
29 Лазарь А. (Gluck) 22 22 31 0 31 733 15 Oct 2004
30 Латкин Н.Н. (l0ng) 12 97 25 4 29 33 17 Oct 2004
31 Самохин П. (Spv) 21 21 29 0 29 780 15 Oct 2004

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

SELECT

Задача 8
Найдите производителя, продающего ПК, но не ПК-блокноты.

Вот одно из неправильных решений, которое пока проходит:

SELECT DISTINCT p.maker
  FROM Product p INNER JOIN pc
   ON p.model = pc.model
   WHERE p.maker NOT IN
      (SELECT ip.maker FROM Laptop il INNER JOIN Product ip ON il.model = ip.model)

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

Представленное решение находит производителя, модели которого есть в таблице PC, и нет - в таблице Laptop. На самом деле для решения этой задачи достаточно одной лишь таблицы Product, в которой имеется поле type, описывающее тип продукции (PC, Laptop, Printer).

Таблица Product связана отношением один-ко-многим с другими таблицами по типам продукции.

Последнее означает, что в таблице Product могут быть модели, отсутствующие в таблице соответствующего типа продукции. Таким образом, если некий производитель имеет модели ПК-блокнотов, но их нет (в текущий момент) в таблице Laptop, то представленный запрос будет выводить этого производителя (если в таблице PC есть его модели). Хотя, на мой взгляд, не должен.

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

В заключение дам следующую трактовку данной предметной области. Таблица Product содержит информацию о поставщиках моделей, а остальные таблицы - модели, которые имеются в наличии, например, на складе некой фирмы.

Изучаем SQL

Нумерация

Обычно необходимость нумерации записей возникает при формировании отчетов. В этом случае нумерацию строк, возвращаемых запросом, обычно реализуют на клиенте. Например, не составляет особого труда перенумеровать строки отчета, подготовленного в MS Access. Однако иногда это необходимо сделать в самом запросе. Этот случай мы сейчас и рассмотрим.

Нумерация строк в соответствии с порядком значений первичного ключа

Естественно, нумероваться строки должны в соответствии с некоторым порядком. Пусть этот порядок задается полем первичного ключа, т.е. в порядке возрастания (или убывания) значений в этом поле. Для определенности предположим, что нам нужно перенумеровать модели в таблице Product, где номер модели является первичным ключом. Существенным здесь является то, значения первичного ключа не содержат дубликатов и NULL-значений, в результате чего имеется принципиальная возможность установить однозначное соответствие между номером модели и номером строки в порядке сортировки моделей.

Рассмотрим сначала следующий запрос:

SELECT P1.model, P2.model FROM Product P1 JOIN Product P2 ON P1.model <= P2.model

Здесь выполняется соединение двух одинаковых таблиц по неравенству P1.model <= P2.model, в результате чего каждая модель из второй таблицы (P2.model ) будет соединяться только с теми моделями из первой таблицы (P1.model), номера которых меньше или равны номеру этой модели. В результате получим, что модель с минимальным номером (1121) будет присутствовать во втором столбце результирующего набора только один раз, т.к. она меньше или равна только самой себе. На другом конце будет находиться модель с максимальным номером, т.к. любая модель будет меньше или равна ей. Следовательно, модель с максимальным номером будет сочетаться с каждой моделью, и число таких сочетаний будет равно общему числу моделей в таблице Product.

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

Таким образом, чтобы решить нашу задачу нумерации достаточно пересчитать модели в правом столбце, что нетрудно сделать при помощи группировки и использования агрегатной функции COUNT:

(1)   SELECT COUNT(*) no,P2.model FROM Product P1 JOIN Product P2
      ON P1.model <= P2.model GROUP BY P2.model

Не поленюсь и представлю результат выполнения этого запроса:

No model
1 1121
2 1232
3 1233
4 1260
5 1276
6 1288
7 1298
8 1321
9 1401
10 1408
11 1433
12 1434
13 1750
14 1752
15 2111
16 2112

Для нумерации в обратном порядке достаточно поменять знак неравенства на противоположный.

Продолжение следует...

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

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

Технические статьи и заплатки от Майкрософт.

SQL Server 2000
307945 INF: How to Carry Balances Forward for Display in a Balance Sheet.

Контакты

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

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

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

В избранное