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

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


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

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

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

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

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

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

§ Устранена неоднозначность формулировки задачи 102 (SELECT), связанная с возможностью одновременной окраски квадрата несколькими баллончиками, а также одновременной окраски нескольких квадратов одним и тем же баллончиком.

§ Как было замечено (Shurgenz), проходило неправильное решение задачи 107 (SELECT). Проверочная база дополнена данными, устраняющими эту дыру в проверке.

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

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

Лучшие результаты (ТОР 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 14 Sep 2004
3 Spirin (spirin) 136 274 44.06 13.429 29 Sep 2004 30 Sep 2004
4 Валуев Д.И. (Fiolent) 136 274 293.15 19.314 23 Jun 2004 01 Oct 2004
5 Мельникова И.А. (Iris_m) 136 274 141.12 65.651 30 Sep 2004 01 Oct 2004
6 Карабанов А. (gipa) 133 268 138.58 5.022 10 Jul 2004 11 Jul 2004
7 Новиков Д.А. (DimaN) 130 264 68.17 2.104 01 Mar 2004 07 Apr 2004
8 Драконов Ф.А. (f_d) 130 264 36.32 7.243 03 Jun 2004 28 Jun 2004
9 Леденев С.А. (Shurgenz) 128 259 43.94 7.215 01 Oct 2004 01 Oct 2004
10 >Пятница О.А. (Robin) 126 256 586.24 68.062 03 Oct 2004 03 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 02 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 pilona (pilona) 62 62 110 5 115 166 29 Sep 2004
2 vaxman (vaxman) 45 45 72 9 81 309 02 Oct 2004
3 Miliauskas G. (gintautasm) 34 34 59 9 68 392 30 Sep 2004
4 Snowman S. (Snowman) 34 34 59 0 59 388 01 Oct 2004
5 Балуев Д.И. (labuika) 34 34 59 0 59 389 01 Oct 2004
6 Муллагалиева С. (_sveta_) 34 34 59 0 59 390 03 Oct 2004
7 Давыдов В.Я. (Vsevolod) 34 34 59 0 59 391 01 Oct 2004
8 Hakobyan H.H. (hamlet) 34 34 58 0 58 397 02 Oct 2004
9 Авдеев Г.Н. (henry_avdeev) 22 84 52 0 52 50 01 Oct 2004
10 Stashatov A. (ascom2) 27 39 52 0 52 344 29 Sep 2004
11 Domashov (zyx) 20 82 49 0 49 52 01 Oct 2004
12 salam (salam) 28 28 49 0 49 451 01 Oct 2004
13 Ter (York) 28 33 45 0 45 439 30 Sep 2004
14 >Сидоров А.Л. (kerim) 25 25 40 0 40 523 03 Oct 2004
15 Танаков С.А. (Shaman) 14 88 29 9 38 46 01 Oct 2004
16 Прокопенко И. (Prokop) 23 23 34 0 34 610 01 Oct 2004
17 Каретников А.В. (Sudya) 22 22 32 0 32 654 01 Oct 2004
18 foobar (slacker) 22 22 31 0 31 677 02 Oct 2004
19 jnybbs (jnybbs) 21 21 29 0 29 730 01 Oct 2004
20 Lambert A. (Alan) 21 21 29 0 29 735 30 Sep 2004
21 Теслюк А.А. (teslyuk) 20 20 27 0 27 754 01 Oct 2004
22 Забара М.С. (максим111) 9 74 23 0 23 85 29 Sep 2004
23 Елдыщенко (grey_rat) 5 64 14 8 22 145 30 Sep 2004
24 Антипенко Д.Г. (AntipenkoDm) 8 58 19 0 19 206 03 Oct 2004
25 Rabotnikov (fm) 7 27 19 0 19 484 27 Sep 2004
26 Grib D.E. (zark) 16 16 19 0 19 895 29 Sep 2004
27 Гулайцева Ю. (Yulia) 13 41 18 0 18 324 01 Oct 2004
28 крысевич (kulikoaa) 10 44 18 0 18 371 01 Oct 2004
29 Blumental K.S. (Nagual) 13 35 18 0 18 440 29 Sep 2004
30 Мельникова И.А. (Iris_m) 8 136 15 2 17 5 01 Oct 2004

Изучаем SQL

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

Коррелирующие подзапросы

Коррелирующие подзапросы позволяют иногда очень кратко написать запросы, которые могут выглядеть весьма громоздко при использовании других средств. Напомним, что коррелирующий подзапрос содержит ссылку на содержащий его запрос (назовем его основным), в результате чего подзапрос выполняется для каждой строки основного запроса.

Рассмотрим следующий пример. Пусть требуется определить дату и рейсы каждого пассажира, совершенные им в свой последний полетный день. Иными словами, нужно определить максимальную дату полета каждого пассажира и найти все его рейсы за эту дату. С определением максимальной даты нет никаких проблем:

SELECT id_psg, MAX(date) FROM pass_in_trip GROUP BY id_psg

Однако тут нет рейса. Если мы попытаемся включить рейс в список вывода:

SELECT id_psg, trip_no, MAX(date) FROM pass_in_trip GROUP BY id_psg

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

SELECT id_psg, trip_no, MAX(date) FROM pass_in_trip GROUP BY id_psg, trip_no

то получим последний полет пассажира каждым рейсом, которым он летал. Это совсем не та задача, которую мы пытаемся решить. Использование коррелирующего подзапроса

SELECT id_psg, trip_no, [date] FROM pass_in_trip pt_1
  WHERE [date]=(
      SELECT MAX([date]) FROM pass_in_trip pt_2
         WHERE pt_1.id_psg=pt_2.id_psg)

дает то, что нужно:

id_psg trip_no date
10 1187 2003-04-14 00:00:00.000
9 1182 2003-04-13 00:00:00.000
8 1187 2003-04-14 00:00:00.000
6 1123 2003-04-08 00:00:00.000
5 1145 2003-04-25 00:00:00.000
3 1145 2003-04-05 00:00:00.000
3 1123 2003-04-05 00:00:00.000
2 1124 2003-04-02 00:00:00.000
1 1100 2003-04-29 00:00:00.000

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

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

SELECT pt_1.id_psg, trip_no, [date]
   FROM pass_in_trip pt_1
      JOIN (
      SELECT id_psg, MAX([date]) md
         FROM pass_in_trip GROUP BY id_psg) pt_2
      ON pt_1.id_psg=pt_2.id_psg AND [date]=md

Однако, как это ни покажется удивительным, оптимизатор SQL Server 2000 выберет для обоих запросов идентичный план выполнения при наличии естественного индекса (кластерного) по первичному ключу. Соответственно, и время выполнения запросов не должно отличаться.

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

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

Статистику посещений сайта можно посмотреть на Рамблере (TOP 100).

Здесь статистика по странам за неделю.

Контакты

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

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

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

В избранное