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

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


Новости сайта "Упражнения по SQL"

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

Выпуск 223 от 03 января 2009 г.

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

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

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

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

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


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

§ На третий этап выставлена новая задача от anddros - 151 (сложность 3 балла).

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
14. anddros (151)
15. AlShin (146)

§ Продвинулись в рейтинге:
74. shadon (задач 128, время 30.451)
80. Alex Wolker (126, 57.127)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
157. Vasilko (127, 8.444)

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

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

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

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

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

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

NoPersonNumber of
Sel_ex
Last_SelNumber of
DML_ex
ScoresDaysDays_2Days_3S_3LastSolvedLastVisit
1Никотин В.М. (@Nikotin)150150213641088.3713.7514013 Dec 2008 02 Jan 2009
2Сальников С.А. ($erges)150150213642913.4873.8244013 Dec 2008 31 Dec 2008
3Креславский О.М. (Arcan)1501162136468958.24839.3734019 Dec 2008 02 Jan 2009
4Карасёва Н.В. (vlksm)1501502136495378.64949.5854014 Dec 2008 01 Jan 2009
5Печатнов В.В. (pvv)1461492135235730.84917.4903610 Oct 2008 30 Dec 2008
6Селезнёв А.С. (Артём С.)1451492134932238.50029.2353625 Sep 2008 21 Nov 2008
7Сенкевич С.В. (GreyC)1481492135832648.81318.0563425 Dec 2008 02 Jan 2009
8Муллаханов Р.Х. (rem)1481502135646014.35119.9793213 Dec 2008 02 Jan 2009
9Мурашкин И.В. (lepton)1421502134299547.79737.3123012 Dec 2008 18 Dec 2008
10Держальцев В.А. (MadVet)13714621333125760.78328.4822824 Sep 2008 30 Dec 2008
11Зотов П.Г. (Ozzy)1411462134026461.11178.8262829 Nov 2008 02 Jan 2009
12Любченко В.А. (IAS56)13614621332615403.343373.6172811 May 2008 01 Dec 2008
13Голубин Р.С. (Roman S. Golubin)14014521335112293.04258.8222513 Sep 2008 06 Dec 2008
14Дроздков А.Н. (anddros)145151213482174.5931.1532430 Dec 2008 02 Jan 2009
15Шиндин А.В. (AlShin)145146213487419.5976.3432431 Dec 2008 02 Jan 2009
16Nikolaenko A.V. (Shadow77)1421472133943677.45114.0102322 Oct 2008 11 Dec 2008
17Солдатенков Ю.С. (SolYUtor)1381462133181922.6156.1022014 Aug 2008 23 Oct 2008
18Белогурова К. (Katy_Ekb)1331432132155210.6664.6731827 Nov 2008 09 Dec 2008
19Егоров А.Б. (ABEgorov)1371442132918012.8978.8151803 Aug 2008 12 Aug 2008
20Войнов П.Е. (pаparome)1391462133011253.124.2131722 Sep 2008 11 Dec 2008

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

Nosurnamen_selsel_allsel_scoresdml_scoresscoresratinglast_visit
1>Олонцев С.А. (TORCH)35366734101156502 Jan 2009
2Шелудько В.В. (Bитеk)3649742397121731 Dec 2008
3Сидоров (asy6)2031451762267929 Dec 2008
4Popok I. (Serendipity)2424431558387401 Jan 2009
5Samante J.K. (niknhosje)292952557397331 Dec 2008
6>Гладких Д.С. (ЗлобнЫЙ_ДобР)295351051152602 Jan 2009
7Мельничук С. (Sasha M.)1849311950130030 Dec 2008
8>Казанцев (Бородач)244847047188002 Jan 2009
9delrosario S.G. (jokjok)242443043552031 Dec 2008
10victoria N.P. (netz)202942042450731 Dec 2008
11Акимова М. (Li_Li)172841041437730 Dec 2008
12celocia K.S. (duniekeith)232341041577330 Dec 2008
13escarro D.S. (kade30)192540040520531 Dec 2008
14Gayon E.P. (ai-ai)172739039471601 Jan 2009
15demetilla K. (xangxang)192438038559531 Dec 2008
16paboreal R.A. (pabz)202138038606831 Dec 2008
17Ефимова О.Ю. (Эльга)114331637145601 Jan 2009
18valencia V.A. (varz)182437037561730 Dec 2008
19>zilberman (oziman)142835035450901 Jan 2009
20calinawan J.D. (calinawan)172233033615130 Dec 2008

Изучаем SQL

Массивы и списки в SQL Server 2005 (начало в вып.217-222)

Erland Sommarskog (оригинал: Arrays and Lists in SQL Server 2005 )
Перевод: Моисеенко С.И.

Распаковка списков в таблицу

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

Modelid Colours
A200 Blue, Green, Magenta, Red
A220 Blue, Green, Magenta, Red, White
A230 Blue, Green, Magenta, Red, Cyan, White, Black
B130 Brown, Orange, Red
B150 Yellow, Brown, Orange, Red

Таким образом, цвета, которые могут иметь модели, представлены списком, разделенным запятыми. Подчеркну, что это чрезвычайно плохая структура, которая нарушает основополагающий принцип реляционных баз данных: никаких повторяющихся групп. Как следствие, так спроектированные таблицы вызывают массу проблем при работе с ними. Если Вы сталкиваетесь с подобным проектом, следует серьезно рассмотреть возможность изменения модели данных с тем, чтобы подчиненная таблица включала по одной строке на каждую пару {модель, цвет}. В этом случае Вы должны быть в состоянии расщепить эти списки на строки.

В SQL 2000 не было возможно вызвать табличнозначную функцию и передать в нее столбец таблицы в качестве параметра, но SQL 2005 уже имеет оператор APPLY, который позволяет нам сделать это. Вот скрипт, который создает вышеприведенную таблицу и затем распаковывает список с помощью запроса:

CREATE TABLE models (modelid  char(4)      NOT NULL,
-- other columns like modelname etc.
colours varchar(200) NOT NULL,
CONSTRAINT pk_models PRIMARY KEY (modelid))
go
INSERT models (modelid, colours)
SELECT 'A200', 'Blue, Green, Magenta, Red'
UNION
SELECT 'A220', 'Blue, Green, Magenta, Red, White'
UNION
SELECT 'A230', 'Blue, Green, Magenta, Red, Cyan, White, Black'
UNION
SELECT 'B130', 'Brown, Orange, Red'
UNION
SELECT 'B150', 'Yellow, Brown, Orange, Red'
go
SELECT m.modelid, t.str AS colour
FROM models m
CROSS APPLY iter_charlist_to_tbl(m.colours, ',') AS t
ORDER BY m.modelid, t.str

(Код фукнции iter_charlist_to_tbl приводится чуть позже.)

Подобно оператору JOIN, APPLY имеет на входе две таблицы. Входная таблица - это все, что представляет столбцы в виде таблицы: представление, табличнозначная функция, производная таблица, функция, возвращающая наборы строк (rowset function), или общее табличное выражение (CTE). (Последнее - еще одна новая возможность, к которой я вернусь еще в этой статье). При соединении табличных источников последние должны быть независимы друг от друга: например, табличнозначная функция не может иметь в качестве параметра таблицу слева. Это именно то, что позволяет сделать APPLY. Функция вычисляется для каждой строки из табличного источника слева, и эта строка будет порождать столько строк, сколько строк будет вычислено для табличного источника справа.

Чтобы закончить с этим, я должен добавить, что есть две формы оператора APPLY: CROSS APPLY и OUTER APPLY. Различие между ними состоит в обработке случая, когда табличный источник справа не возвращает ни одной строки. При использовании CROSS APPLY строка слева будет отсутствовать в результирующих данных, а при использовании OUTER APPLY эта строка сохраняется.

Для получения дополнительной информации относительно APPLY обратитесь к статьям FROM и Using Apple в Books Online.

Итерационный метод

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

Я решил начать с итерационного метода, поскольку этот метод, наряду с использованием рекурсивного CTE, требует минимального количества подготовительных действий. Просто создайте функцию, и Вы - в эфире. Большинство других методов требует некоторых дополнительных шагов. Другое преимущество состоит в том, что код итерационного метода очень легок для понимания, особенно если Вы имели дело с Cи или Visual Basic. При использовании этого метода легко адаптировать код к специальному входному формату.

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

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

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

§ Приглашаем вас посетить новый проект - Интерактивный учебник по SQL.
   Ресурс позиционируется как "справочное обеспечение" для сайта SQL-EX.RU, но может использоваться и независимо от него.

§ Онлайновый выпуск рассылки можно почитать на сайте.

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

§ Хотите поддержать проект? Вот инструкция по применению. :-)

Контакты

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

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

В избранное