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

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


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

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

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

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

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

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

§ Исправлена формулировка задачи 17 (DML). Согласно старой формулировке было не вполне понятно, следует ли округлять среднее значение в обоих случаях или только в первом (обратил внимание Leshich). Следовало понимать "в обоих", что уточнено в новой формулировке.

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

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

Число участников второго этапа - 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 07 Oct 2004
3 Spirin (spirin) 136 274 44.06 13.429 29 Sep 2004 04 Oct 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 07 Oct 2004
6 Карабанов А. (gipa) 133 268 138.58 5.022 10 Jul 2004 08 Oct 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 08 Oct 2004
10 Пятница О.А. (Robin) 128 259 589.55 70.834 06 Oct 2004 08 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 08 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 Калинин (olegKa) 33 33 56 1 57 410 04 Oct 2004
2 Levin A. (AllexL) 21 62 40 9 49 194 08 Oct 2004
3 Hakobyan H.H. (hamlet) 22 56 39 0 39 212 09 Oct 2004
4 Bobulev A. (AKitten) 24 24 37 0 37 561 09 Oct 2004
5 Воронин И.В. (ursus) 24 24 37 0 37 564 07 Oct 2004
6 >Domashov (zyx) 15 97 29 0 29 35 09 Oct 2004
7 Bolschakoff (Bolschakoff) 21 21 29 0 29 749 08 Oct 2004
8 salam (salam) 17 45 28 0 28 291 08 Oct 2004
9 jnybbs (jnybbs) 11 32 28 0 28 405 07 Oct 2004
10 Муллагалиева С. (_sveta_) 16 50 27 0 27 257 08 Oct 2004
11 kumar (mk_garg20) 19 19 25 0 25 795 08 Oct 2004
12 Snowman S. (Snowman) 14 48 24 0 24 271 08 Oct 2004
13 >Victosha (Victosha) 18 18 23 0 23 837 10 Oct 2004
14 Сидоров А.Л. (kerim) 16 41 20 1 21 391 08 Oct 2004
15 Marshev (M__M__S) 17 17 21 0 21 866 08 Oct 2004
16 Зорин М.А. (Makc3) 16 36 18 2 20 499 08 Oct 2004
17 Semenoff S.V. (semenych) 6 39 10 9 19 429 05 Oct 2004
18 Hill J. (JHill) 16 16 19 0 19 914 08 Oct 2004
19 Капустина М. (mashak) 14 37 18 0 18 469 07 Oct 2004
20 Khanin A.S. (Khanin_Alex) 11 26 18 0 18 605 05 Oct 2004
21 tais (tais) 15 15 17 1 18 959 08 Oct 2004

Изучаем SQL

Генерация числовой последовательности

(тема предложена Shurgenz)

Иногда возникает необходимость получить в запросе числовую последовательность. Это может быть самоцелью или же промежуточным результатом для получения, скажем, последовательности дат. Пусть, например, требуется получить последовательность целых чисел от 1 до 100 с шагом 1. Можно, конечно, строить такую последовательность в "лоб", т.е.

SELECT 1
  UNION ALL SELECT 2
   ...
    UNION ALL SELECT 100

А если потребуется 1000 чисел? А ведь может еще существовать ограничение на размер запроса.

Помочь может декартово произведение (CROSS JOIN), которое редко когда используется, разве что в качестве промежуточного результата. Существенной особенностью декартова произведения является то, что мощность результата (количество строк) равно произведению мощностей участвующих в декартовом произведении таблиц. Т.е. если нам нужно получить последовательность 100 чисел мы можем использовать декартово произведение таблиц, каждая из которых содержит по 10 записей. Итак,

SELECT * FROM
   (SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
      UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
      UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10) x
CROSS JOIN
   (SELECT 1 b UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
      UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
      UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10) y

Результатом здесь является двухстолбцовая таблица, содержащая 100 строк. При этом каждое значение из первого подзапроса (числа от 1 до 10) сочетается с каждым значением из второго (аналогичного) подзапроса:

a b
1 1
1 2
...
1 10
2 1
2 2
...
2 10
...

Теперь осталось только вычислить сами значения. Будем считать, скажем, что число в первом столбце представляет собой десятки -1, а второй - единицы. Тогда вместо SELECT * FROM … в нашем запросе напишем

SELECT 10*(a-1)+b FROM …

что и даст нам требуемый результат.

А почему бы ни взять 3 таблицы (подзапроса)? Чем больше размер генерируемой последовательности, тем больше таблиц следует взять, чтобы получить более короткий запрос. Аналогично рассуждая и, исходя из того, что 5*5*5 = 125, получим:

SELECT 5*5*(a-1)+5*(b-1) + c AS num FROM
   (SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
   CROSS JOIN
   (SELECT 1 b UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) y
   CROSS JOIN
   (SELECT 1 c UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) z
      WHERE 5*5*(a-1)+5*(b-1) + c <=100
      ORDER BY 1

Условие WHERE 5*5*(a-1)+5*(b-1) + c <=100 использовано для того, чтобы ограничить последовательность значением 100, а не 125.

Рассмотрим "практический" пример. Пусть требуется получить 100 последующих незанятых номеров моделей на основе таблицы Product. Идея такова: находим максимальный номер модели и далее, используя генерацию последовательности, 100 последующих значений с шагом 1.

SELECT (SELECT MAX(model) FROM Product) + 5*5*(a-1)+5*(b-1) + c AS num FROM
   (SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
   CROSS JOIN
   (SELECT 1 b UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) y
   CROSS JOIN
   (SELECT 1 c UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) z
      WHERE 5*5*(a-1)+5*(b-1) + c <=100
      ORDER BY 1

Результат выполнения этого запроса я не буду приводить здесь из экономии килобайт. Проверьте сами.

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

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

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

SQL Server 2000
884593 SQL Server 2000 may overcommit physical memory on computers that are running Windows XP
870654 FIX: You may receive a 547 error message when you try to update an instance and application databases of SQL Server 2000 Notification Services by using the NSControl Update command
306756 PRB: Unable to Display Visual Totals Using the PivotTable Component

Контакты

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

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

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

В избранное