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

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


Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 120 (30 декабря 2006 г.)

SQL Exercises

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

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

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

Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов.

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


С наступающим Новым Годом дорогие подписчики и посетители сайта!
Желаем вам здоровья и правильных решений не только в задачах на сайте!

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

§ Поменял в доступном для скачивания скрипте БД "Корабли" формат даты на независимый от настроек на сервере, т.к. были жалобы на ошибки в скрипте.

§ Давно вызывала нарекания проверка задачи 78. Последней каплей стало сообщение от avk. Сделал отдельную проверочную базу под эту задачу. Так что проверьте свои решения.

§ 139 задачу решил pаparome и с лучшим промежуточным результатом занимает шестую позицию в рейтинге.
Botch решил 137 задачу; ждем его на третьем этапе.

§ Новое лицо в сотне:
ДимонХХХ (задач 109, время 13.706)

§ Продвинулись в рейтинге:
Tunin (130, 36.185)
Fencer (120, 167.115)
marishkin (118, 10.461)
Damirishe (117, 6.093)
Fomichev (113, 9.836)
Kamin (110, 35.505)

§ На этой неделе сертифицированы:
Botch (B06013867) [AR] (г.Москва, Россия)

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

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

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

Сертифицировано на сайте - 121

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Агапов В. (KERBEROS) 141 141 20 333 89 6.183 1.262 11 20 Nov 2006 29 Dec 2006
2 Кувалкин К.С. (Cyrilus) 141 141 20 333 746 12.417 2.519 11 10 Dec 2006 29 Dec 2006
3 Карасёва Н.В. (vlksm) 141 141 20 333 196 27.850 2.710 11 18 Nov 2006 29 Dec 2006
4 Мурашкин И.В. (lepton) 141 141 20 333 240 14.865 4.724 11 18 Nov 2006 28 Dec 2006
5 Зверев Д.Л. (dimzv) 141 141 20 333 1141 9.324 4.938 11 19 Dec 2006 22 Dec 2006
6 Голубин Р.С. (Roman S. Golubin) 141 141 20 333 457 54.984 33.803 11 18 Nov 2006 29 Dec 2006
7 Войнов П.Е. (pаparome) 140 139 20 329 489 2.738 .049 7 26 Dec 2006 28 Dec 2006
8 Тарасов Д.Б. (Gavrila) 140 140 20 329 466 20.242 .513 7 05 Dec 2006 29 Dec 2006
9 Васьков Е.В. (Johan) 140 140 20 329 124 12.713 11.402 7 20 Nov 2006 29 Dec 2006
10 Валуев Д.И. (Fiolent) 139 140 20 326 1188 117.017 62.302 4 05 Dec 2006 29 Dec 2006
11 Юлдашев М.Р. (Snowbear) 138 139 20 324 441 4.106 .000 3 02 Oct 2006 28 Dec 2006
12 Держальцев В.А. (MadVet) 138 139 20 324 540 34.249 3.085 3 08 Oct 2006 19 Oct 2006
13 Палий С.А. (PS_Sergey) 139 139 20 325 212 15.756 4.188 3 01 Dec 2006 03 Dec 2006
14 Мальцев А.В. (Палкин) 138 138 20 322 101 20.184 .000 0 26 Nov 2006 28 Dec 2006
15 Утёнков М.Н. (=Maxim=) 138 138 20 322 200 24.998 .000 0 19 Nov 2006 28 Dec 2006
16 Slobodcicov A.N. (Testo) 136 138 20 319 337 7.171 .000 0 25 Aug 2006 10 Nov 2006
17 Иванов А.Н. (Goapsy) 136 138 20 319 270 18.911 .000 0 07 Aug 2006 18 Dec 2006
18 Абашин П.И. (Dizil) 137 137 20 318 453 3.966 .000 0 20 Nov 2006 25 Dec 2006
19 Крижевич С.А. (yaff) 137 137 20 318 523 15.010 .000 0 05 Dec 2006 05 Dec 2006
20 Виноградов С.М. (Botch) 137 137 20 318 74 19.782 .000 0 26 Dec 2006 29 Dec 2006

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Шептунов П.П. (PavelPS) 67 67 125 26 151 371 29 Dec 2006
2 Сабо Я.Ш. (SHON) 55 55 103 0 103 1006 23 Dec 2006
3 Мухачева Т.А. (myxa4y1) 55 55 103 0 103 1007 23 Dec 2006
4 Бурылов А.А. (FaerMan) 53 53 97 0 97 1158 27 Dec 2006
5 Соловьева Е.И. (zhenda) 52 52 94 0 94 1208 22 Dec 2006
6 >Кныш И.Ю. (Игорь_1808) 30 53 63 23 86 732 29 Dec 2006
7 Копылов М.А. (CasperGhost) 39 39 65 19 84 1401 29 Dec 2006
8 Кабышева Ж.-. (Жан-Ка) 29 29 58 25 83 1289 23 Dec 2006
9 >medam S.M. (soori) 45 45 80 0 80 1489 29 Dec 2006
10 >Кушнерик В.А. (ValentinOS) 37 55 79 0 79 1009 29 Dec 2006
11 >Dimenko R.P. (DRP1986) 31 53 67 8 75 710 29 Dec 2006
12 >Шестопалов А.В. (freespoken) 40 40 70 2 72 1749 29 Dec 2006
13 Марковник Ю. (lodarX) 40 40 67 1 68 1870 29 Dec 2006
14 Новикоф Ж.Ж. (human) 33 33 66 0 66 1918 29 Dec 2006
15 >Ждановских А.В. (RainScald) 39 39 65 0 65 1953 29 Dec 2006
16 Hurynovich P. (Pahan) 33 46 64 0 64 1549 27 Dec 2006
17 Задорожная Е.В. (Zador.Ka) 14 53 33 25 58 626 26 Dec 2006
18 Булаев Г.Ю. (Энтри) 24 55 58 0 58 962 28 Dec 2006
19 Yaroslavsky A. (ummagummarocknroll) 28 49 58 0 58 1309 28 Dec 2006
20 >Нилов И.А. (nilich1) 28 33 53 0 53 2257 29 Dec 2006
21 >Соколов С.А. (delirium) 25 54 52 0 52 1027 29 Dec 2006
22 Литягин К.М. (Monstrosity) 28 28 49 0 49 2704 28 Dec 2006
23 makaka (makaka) 32 32 44 0 44 2953 29 Dec 2006
24 Пасечников П.А. (paul03) 21 45 43 0 43 1496 28 Dec 2006
25 Голубинцев А.А. (lexaNRJ) 31 31 42 0 42 3070 28 Dec 2006
26 >Жирнов Д.А. (ДимонХХХ) 17 109 41 0 41 97 29 Dec 2006
27 >Шредер Е.Ю. (zoomer74) 28 28 41 0 41 3107 29 Dec 2006
28 >natriashvili A.Z. (akaki natriashvili) 19 41 40 0 40 1759 29 Dec 2006
29 Пеленицын А.М. (Ulysses) 24 24 37 0 37 3329 26 Dec 2006

Изучаем SQL

Рекурсивные запросы в SQL:1999 и SQL Server 2005 (продолжение, начало в вып. #117)

Frederic BROUARD (оригинал: Recursive Queries in SQL:1999 and SQL Server 2005)
Перевод Моисеенко С.И.

Вы видите здесь стеки? Такое представление деревьев хорошо известно в литературе по базам данных, особенно в трудах Джо Селко. Вы найдете все, что пожелаете, в его знаменитой книге "Деревья и иерархии", вышедшей под редакцией Morgan Kaufman в серии "SQL для умников". Если вы читаете по-французски, могу порекомендовать еще один ресурс, где можно найти хранимые процедуры, написанные для MS SQL Server и выполняющие всю работу, связанную с этой моделью: http://sqlpro.developpez.com/cours/arborescence/

Наконец, можем мы воспроизвести иерархические отступы как в последнем запросе? Да, конечно. Это будет намного легче сделать, если ввести еще один столбец 'LEVEL' для хранения уровня узла. Его можно очень просто вычислить, поскольку при вставке в дерево первый узел - это корень и, следовательно, его уровень - 0. При вставке других элементов в дерево уровень вычисляется по родительским данным: если вставляется дочерний узел, то его уровень есть уровень родителя + 1. Чтобы вставить сестринский элемент, заимствуется уровень сестры. Ниже приведены операторы ALTER и UPDATE, которые расставляют уровни в таблице:

ALTER TABLE T_VEHICULE
ADD LEVEL INTEGER

UPDATE T_VEHICULE SET LEVEL = 0 WHERE VHC_ID = 1
UPDATE T_VEHICULE SET LEVEL = 1 WHERE VHC_ID = 2
UPDATE T_VEHICULE SET LEVEL = 1 WHERE VHC_ID = 3
UPDATE T_VEHICULE SET LEVEL = 1 WHERE VHC_ID = 4
UPDATE T_VEHICULE SET LEVEL = 2 WHERE VHC_ID = 5
UPDATE T_VEHICULE SET LEVEL = 2 WHERE VHC_ID = 6
UPDATE T_VEHICULE SET LEVEL = 2 WHERE VHC_ID = 7
UPDATE T_VEHICULE SET LEVEL = 2 WHERE VHC_ID = 8
UPDATE T_VEHICULE SET LEVEL = 2 WHERE VHC_ID = 9
UPDATE T_VEHICULE SET LEVEL = 2 WHERE VHC_ID = 10
UPDATE T_VEHICULE SET LEVEL = 2 WHERE VHC_ID = 11
UPDATE T_VEHICULE SET LEVEL = 3 WHERE VHC_ID = 12
UPDATE T_VEHICULE SET LEVEL = 3 WHERE VHC_ID = 13

Теперь запрос, делающий отступы, примет вид:

SELECT SPACE(LEVEL) + VHC_NAME as data
FROM T_VEHICULE
ORDER BY LEFT_BOUND

Намного проще, не так ли?

ПЕРВЫЕ ВПЕЧАТЛЕНИЯ...

Единственное, что можно сказать об этих двух способах навигации по иерархическим данным, - это то, что интервальная модель значительно более эффективна и работает лучше, чем модель, использующая технику рекурсивных запросов SQL:1999. Фактически, РЕКУРСИВНЫЕ запросы не так здесь интересны... А где-то еще?... Да!

7 - Второй пример: сложная сеть

Возможно Вы никогда не были во Франции. Поэтому может вам будет интересно узнать, что в Париже красивые девушки, в Тулузе знаменитое блюдо называют мясным ассорти, и маленький конструктор самолета называется Аэробус. Итак, проблема состоит в том, чтобы проехать на машине от Парижа до Тулузы, используя сеть автострад. Я несколько упрощаю схему для Вас (если Вы потерялись и не знаете, как произнести название города, чтобы спросить дорогу до Тулузы, просто скажите "to loose" (распустить) ...):

PARIS
|
| | |
385 420 470
| | |
NANTES CLERMONT FERRAND LYON
|    | |
|    | 335 350 |    320
|    ----- ------------------
|        |     |            |
375 | MONTPELLIER MARSEILLE
| | |
------------- ------------------------------- 205
| 240 |
TOULOUSE NICE

-- если существует необходимая нам для примера таблица, удалить ее
IF EXISTS (SELECT *
     FROM INFORMATION_SCHEMA.TABLES
     WHERE TABLE_SCHEMA = USER
         AND TABLE_NAME = 'T_JOURNEY')
     DROP TABLE T_JOURNEY
-- создать таблицу:
CREATE TABLE T_JOURNEY
(JNY_FROM_TOWN VARCHAR(32),
JNY_TO_TOWN VARCHAR(32),
JNY_MILES INTEGER)
-- занести данные :
INSERT INTO T_JOURNEY VALUES ('PARIS', 'NANTES', 385)
INSERT INTO T_JOURNEY VALUES ('PARIS', 'CLERMONT-FERRAND', 420)
INSERT INTO T_JOURNEY VALUES ('PARIS', 'LYON', 470)
INSERT INTO T_JOURNEY VALUES ('CLERMONT-FERRAND', 'MONTPELLIER', 335)
INSERT INTO T_JOURNEY VALUES ('CLERMONT-FERRAND', 'TOULOUSE', 375)
INSERT INTO T_JOURNEY VALUES ('LYON', 'MONTPELLIER', 305)
INSERT INTO T_JOURNEY VALUES ('LYON', 'MARSEILLE', 320)
INSERT INTO T_JOURNEY VALUES ('MONTPELLIER', 'TOULOUSE', 240)
INSERT INTO T_JOURNEY VALUES ('MARSEILLE', 'NICE', 205)

Теперь попробуем очень простой вопрос, дающий все поездки между городами:

WITH journey (TO_TOWN)
AS
     (SELECT DISTINCT JNY_FROM_TOWN
     FROM T_JOURNEY
     UNION ALL
     SELECT JNY_TO_TOWN
     FROM T_JOURNEY AS arrival
         INNER JOIN journey AS departure
             ON departure.TO_TOWN = arrival.JNY_FROM_TOWN)
SELECT *
FROM journey

TO_TOWN
-----------------
CLERMONT-FERRAND
LYON
MARSEILLE
MONTPELLIER
PARIS
NANTES
CLERMONT-FERRAND
LYON
MONTPELLIER
MARSEILLE
NICE
TOULOUSE
MONTPELLIER
TOULOUSE
TOULOUSE
TOULOUSE
NICE
MONTPELLIER
MARSEILLE
NICE
TOULOUSE
MONTPELLIER
TOULOUSE
TOULOUSE

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

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

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

§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL.

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

Контакты

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

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

В избранное