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

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


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

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

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

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

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

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


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

§ Добавил данные для проверки задачи 17 SELECT (сообщения на форуме от tamb и Тритонище).
С помощью alive. подлатал проверку задачи 62.
Fiolent подготовил большое обновление проверочных данных под задачу 98. В обсуждении проблем с проверкой приняли участие: vezyr, Mishar, DeadLock5.
Проверьте свои решения, т.к. из опубликованных на форуме проходят далеко не все :-).

§ Несмотря на весьма подробную формулировку задачи 14, целыми днями отвечал на вопросы по ней. Ошибка одна и та же. Пришлось написать FAQ на пару строк.

§ В составлении задач для сайта приняло участие уже достаточно большое число людей. Я посчитал, что будет интересно взглянуть на рейтинг авторов задач второго этапа. Пока рейтинг формируется на основании общего времени, которое в среднем потратили лидеры (ТОР 20, как и в рейтинге задач) на решение всех задач каждого автора. На мой взгляд этим оценивается как сложность, так и продуктивность. Впрочем, если будут другие варианты ранжирования, я готов их рассмотреть. Безусловным лидером является Cyrilus, что вполне закономерно :-).
Фактически авторов больше, но, к сожалению, время решения задач первого этапа не подсчитывается. Так уж исторически сложилось. В свое оправдание могу лишь только привести аналогию с MS DOS :-).

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

 

§ Новые лица в сотне и вернувшиеся в нее:
ikhomeriki (задач 135, время 2.492)
Онуфрий Голохвастов (117, 61.971)

§ Продвинулись в рейтинге:
Katy_Ekb (137, 3.844)
Inuyasha (136, 2.075)
7_x_F1WC (136, 45.041)
Ocean (136, 46.529)
Alex Wolker (136, 52.131)
wasp (136, 77.816)
modicus (135, 7.948)
yuriy.rozhok (135, 17.728)
Guy (133, 2.173)
elka (131, 68.318)
Shurgenz (130, 12.325)

§ На этой неделе сертифицированы:
cher (A07017699) [BK] (г.Ступино, Россия)

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Северюхин Ю.А. (Venser) 142 142 21 342 154 4.912 .655 14 04 Aug 2007 04 Aug 2007
2 Солдатенков Ю.С. (SolYUtor) 141 142 21 340 320 17.807 2.695 14 03 Apr 2007 10 Aug 2007
3 Шептунов П.П. (PavelPS) 142 142 21 342 222 8.145 3.499 14 06 Aug 2007 10 Aug 2007
4 Мурашкин И.В. (lepton) 142 142 21 342 499 15.737 5.539 14 04 Aug 2007 10 Aug 2007
5 Карасёва Н.В. (vlksm) 142 142 21 342 455 31.344 5.912 14 04 Aug 2007 06 Aug 2007
6 Мальцев А.В. (Палкин) 141 142 21 340 310 27.974 7.690 14 23 Jun 2007 26 Jul 2007
7 Голубин Р.С. (Roman S. Golubin) 142 142 21 342 719 55.391 34.203 14 07 Aug 2007 06 Aug 2007
8 Агапов В. (KERBEROS) 137 141 20 329 89 6.163 1.262 11 20 Nov 2006 27 Jul 2007
9 Кувалкин К.С. (Cyrilus) 140 141 20 335 901 12.541 2.519 11 14 May 2007 10 Aug 2007
10 Зверев Д.Л. (dimzv) 137 141 20 329 1141 9.294 4.938 11 19 Dec 2006 22 Dec 2006
11 Войнов П.Е. (pаparome) 141 142 21 338 712 2.765 .049 10 06 Aug 2007 09 Aug 2007
12 Любченко В.А. (IAS56) 141 142 21 338 334 176.801 20.130 10 04 Aug 2007 04 Aug 2007
13 Тарасов Д.Б. (Gavrila) 139 140 21 333 691 20.381 .513 7 18 Jul 2007 03 Aug 2007
14 Васьков Е.В. (Johan) 139 140 21 333 253 12.786 11.402 7 29 Mar 2007 26 Jul 2007
15 Валуев Д.И. (Fiolent) 139 140 20 330 1433 117.088 62.302 4 07 Aug 2007 10 Aug 2007
16 Юлдашев М.Р. (Snowbear) 139 139 21 331 749 4.132 .000 3 06 Aug 2007 10 Aug 2007
17 Утёнков М.Н. (=Maxim=) 139 139 21 331 459 25.187 .036 3 05 Aug 2007 07 Aug 2007
18 Креславский О.М. (Arcan) 139 14 21 331 191 9.932 .315 3 09 Aug 2007 10 Aug 2007
19 Держальцев В.А. (MadVet) 134 139 20 320 540 34.190 3.085 3 08 Oct 2006 19 Oct 2006
20 Палий С.А. (PS_Sergey) 135 139 20 321 212 15.704 4.188 3 01 Dec 2006 03 Dec 2006

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Смирнов А.С. (smiralex2007) 54 54 104 34 138 641 10 Aug 2007
2 >Радар Ю.В. (etrus) 57 57 110 19 129 770 10 Aug 2007
3 >Пучнин С.Г. (neron82) 56 56 108 11 119 954 10 Aug 2007
4 >LEJEUNE A. (Antoine) 40 52 85 29 114 812 10 Aug 2007
5 >Степанов (Barsyk) 58 58 111 3 114 1012 10 Aug 2007
6 >Полонский Н.В. (Mechanik) 57 57 110 2 112 1035 10 Aug 2007
7 Пелипенко О.А. (Олег) 57 57 110 0 110 1068 10 Aug 2007
8 >Туприков А.А. (Артём) 45 45 86 23 109 1087 10 Aug 2007
9 Horodecki J.M. (kuba.h_pl) 47 47 89 9 98 1373 07 Aug 2007
10 wildwind (wildwind) 46 46 87 0 87 1668 09 Aug 2007
11 Полищук А. (LLIypuk) 41 41 77 3 80 1831 10 Aug 2007
12 Асташов А.В. (Anton_A) 25 51 51 28 79 881 09 Aug 2007
13 >Добрынин С. (Никольский™) 41 41 77 0 77 1922 10 Aug 2007
14 >khomeriki I. (ikhomeriki) 33 135 76 0 76 36 10 Aug 2007
15 >Плотников Д.Ю. (superDen) 38 38 66 9 75 1984 10 Aug 2007
16 >Виноградов В.Г. (vin_val) 18 67 37 29 66 437 10 Aug 2007
17 >Дроздова (Vitulek) 36 36 63 3 66 2386 10 Aug 2007
18 >Подгорный И. (vanchos) 33 33 62 0 62 2556 10 Aug 2007
19 Туманина О. (OlgaFL) 31 31 56 3 59 2729 08 Aug 2007
20 >Chyzh V.O. (satanko) 22 48 52 1 53 1613 10 Aug 2007
21 Ревякин (Old_Pioner) 29 29 53 0 53 3194 10 Aug 2007
22 Фатуев А.В. (Andrew Fatuev) 28 28 50 0 50 3389 09 Aug 2007
23 Giorgi G. (mcnamaragio) 21 32 40 9 49 2645 10 Aug 2007
24 Leadoff (leadoff) 27 27 48 1 49 3417 07 Aug 2007
25 Васильев С.Б. (SerjSV) 28 28 49 0 49 3429 10 Aug 2007
26 >Ariam (Ариам) 10 63 15 30 45 532 10 Aug 2007
27 >Бушуев (Bushee) 26 26 45 0 45 3539 10 Aug 2007
28 >Лазарева Е. (elena_laz) 13 49 30 10 40 1017 10 Aug 2007

Изучаем SQL

Мастерская XML - FOR XML PATH (продолжение, начало в вып.149)

Jacob Sebastian (оригинал: XML Workshop - FOR XML PATH )
Перевод Моисеенко С.И.

Сравнение PATH с AUTO и RAW

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

Давайте попробуем разобраться на примере как каждый режим XML (AUTO, RAW и PATH) может быть использован для выполнения одной и той же задачи. Пусть у нас имеется 3 таблицы: Клиент (Customer), Город (City) и Страна (Country). Нам требуется извлечь данные из этих таблиц и представить их в структуре XML, показанной ниже.

1 <customersByRegion> 2 <country name="USA" currency="US Dollars"> 3 <city name="NY"> 4 <customer id="MK" name="John Mark" phone="111-111-1111"/> 5 <customer id="WS" name="Will Smith" phone="222-222-2222"/> 6 </city> 7 <city name="NJ"> 8 <customer id="EN" name="Elizabeth Lincoln" phone="333-333-3333"/> 9 </city> 10 </country> 11 <country name="England" currency="Pound Sterling"> 12 <city name="London"> 13 <customer id="TH" name="Thomas Hardy" phone="444-444-4444"/> 14 </city> 15 </country> 16 <country name="India" currency="Rupees"> 17 <city name="New Delhi"> 18 <customer id="JS" name="Jacob Sebastian" phone="555-555-5555"/> 19 </city> 20 </country> 21 </customersByRegion>

Запустите скрипт для создания таблиц и наполнения их нужными нам данными:

 

CREATE TABLE Countries (CountryID INT, CountryName VARCHAR(20), Currency VARCHAR(20))
CREATE TABLE Cities (CityID INT, CityName VARCHAR(20), CountryID INT)
CREATE TABLE Customers (CustomerNumber VARCHAR(2), CustomerName VARCHAR(40), Phone VARCHAR(20), CityID INT)

INSERT INTO Countries(CountryID, CountryName, Currency)
        SELECT 1 AS CountryID, 'USA' AS CountryName, 'US Dollars' as Currency UNION
        SELECT 2, 'England', 'Pound Sterling' UNION
        SELECT 3, 'India', 'Rupee'

INSERT INTO Cities(CityID, CityName, CountryID)
        SELECT 1 AS CityID, 'NY' AS CityName, 1 AS CountryID UNION
        SELECT 2, 'NJ', 1 UNION
        SELECT 3, 'London', 2 UNION
        SELECT 4, 'New Delhi', 3

INSERT INTO Customers(CustomerNumber, CustomerName, Phone, CityID)
        SELECT 'MK' AS CustomerNumber, 'John Mark' AS CustomerName, '111-111-1111' AS Phone, 1 AS CityID UNION
        SELECT 'WS', 'Will Smith', '222-222-2222', 1 UNION
        SELECT 'EN', 'Elizabeth Lincoln', '333-333-3333', 2 UNION
        SELECT 'TH', 'Thomas Hardy', '444-444-4444', 3 UNION
        SELECT 'JS', 'Jacob Sebastian', '555-555-5555', 4

 

Позвольте мне начать с PATH и посмотреть, сможем ли мы создать структуру XML с его помощью. Напишем первую версию нашего кода TSQL следующим образом

 

SELECT
                Country.CountryName AS 'country/name',
                Country.Currency AS 'country/currency',
                City.CityName AS 'country/city/name',
                Customer.CustomerNumber AS 'country/city/customer/id',
                Customer.CustomerName AS 'country/city/customer/name',
                Customer.Phone AS 'country/city/customer/phone'
        FROM
                Customers Customer
                INNER JOIN Cities City ON (City.CityID = Customer.CityID)
                INNER JOIN Countries Country ON (Country.CountryID = City.CountryID)
        ORDER BY CountryName, CityName
        FOR XML PATH

 

/* Результат: <row> <country> <name>England</name> <currency>Pound Sterling</currency> <city> <name>London</name> <customer> <id>TH</id> <name>Thomas Hardy</name> <phone>444-444-4444</phone> </customer> </city> </country> </row> <row> <country> <name>India</name> <currency>Rupee</currency> <city> <name>New Delhi</name> <customer> <id>JS</id> <name>Jacob Sebastian</name> <phone>555-555-5555</phone> </customer> </city> </country> </row> <row> ... </row> ... */

Хорошо, но не очень. Вы, должно быть, заметили, что формат не совсем тот, который нам нужен. Нам нужны значения как Атрибуты, а наш запрос возвращает значения как XML-узлы. Давайте теперь рассмотрим следующий запрос, который дает результаты, где значения представлены как Атрибуты.

 

SELECT
                Country.CountryName AS 'country/@name',
                Country.Currency AS 'country/@currency',
                City.CityName AS 'country/city/@name',
                Customer.CustomerNumber AS 'country/city/customer/@id',
                Customer.CustomerName AS 'country/city/customer/@name',
                Customer.Phone AS 'country/city/customer/@phone'
        FROM
                Customers Customer
                INNER JOIN Cities City ON (City.CityID = Customer.CityID)
                INNER JOIN Countries Country ON (Country.CountryID = City.CountryID)
        ORDER BY CountryName, CityName
        FOR XML PATH(''), ROOT('CustomersByRegion')

 

/* <CustomersByRegion> <country name="England" currency="Pound Sterling"> <city name="London"> <customer id="TH" name="Thomas Hardy" phone="444-444-4444" /> </city> </country> <country name="India" currency="Rupee"> <city name="New Delhi"> <customer id="JS" name="Jacob Sebastian" phone="555-555-5555" /> </city> </country> <country name="USA" currency="US Dollars"> <city name="NJ"> <customer id="EN" name="Elizabeth Lincoln" phone="333-333-3333" /> </city> </country> <country name="USA" currency="US Dollars"> <city name="NY"> <customer id="MK" name="John Mark" phone="111-111-1111" /> </city> </country> <country name="USA" currency="US Dollars"> <city name="NY"> <customer id="WS" name="Will Smith" phone="222-222-2222" /> </city> </country> </CustomersByRegion> */

Мы получили результаты очень близкие к тому, что нам требуется. Но мы кое-что пропускаем. Обратите внимание, что результаты не сгруппированы. USA имеет 3 узла в данных XML, полученных при выполнении запроса. Их следует сгруппировать в один узел. Однако PATH не предоставляет способа сделать это. Давайте обратимся к другим режимам, чтобы проверить, могут ли они нам помочь в этом сценарии.

(Окончание следует...)

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

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

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

§ Желающих поспособствовать популяризации сайта прошу проголосовать/поставить закладку в социальных сетях:
del.icio.us
dzone.com
Digg.com
Reddit.com

Контакты

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

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

В избранное