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

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


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

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

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

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

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

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


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

§ Подлатал проверку задачи 14 (DML). Прореху заметил Ecliptic.

§ Уточнили формулировку задачи 81.

§ Shurgenz любезно предоставил мне "нормальные" скрипты учебных баз данных, которые корректно все чистят при переустановке базы данных. Скрипты используют T-SQL, поэтому при запуске под другой СУБД нужно будет вычистить все "навороты" вплоть до создания таблиц.
Если будет такая необходимость, я полагаю, что найдутся люди, которые перепишут этот скрипт под Oracle и другие популярные СУБД. :-)
Заодно решил привести скрипты в полное соответствие со схемами, приведенными в справке на сайте. Поправил даже регистр имен таблиц и столбцов, т.к. были нарекания со стороны пользователей (Limp) регистрозависимых баз.
Новые скрипты выложены на sqlbooks.ru.

§ В результатах голосования по упражнениям добавил число голосов. Ссылка на голосование теперь появляется сразу после решения задачи 2/3 этапа. Есть еще некоторые пожелания по улучшению работы сервиса, которые мы реализуем в ближайшее время.

§ Одна задача до третьего этапа осталась Toxa Moskit (задач 137, время 61.770).

§ Новые лица в ТОР 100 и вернувшиеся туда:
80. denzel (129, 111.420)
96. lexaNRJ (126, 81.115)

§ Продвинулись в рейтинге:
33. ABEgorov (138, 6.918)
48. Bulldozer (135, 184.232)
56. Botch (131, 19.840)
65. DeadLock5 (132, 110.580)
81. Shurgenz (129, 12.587)
95. antihero (126, 13.688)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
121. Toxa Moskit (137, 61.770)
158. comrade (114, 142.061)
175. Ozzy (110, 14.197)

§ На этой неделе сертифицированы:
Дрон25 (A08024659) [BK] - г.Орел, Россия
dante_mos (A08024813) [BK] - г.Москва, Россия
shock (B08029234) [AR]) - г.Москва, Россия
DeadLock5 (B08014391) [AR]) - г.Москва, Россия

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Сальников С.А. ($erges) 147 147 21 359 81 2.751 3.359 31 17 May 2008 06 Jun 2008
2 Карасёва Н.В. (vlksm) 147 147 21 359 750 72.877 46.383 31 25 May 2008 06 Jun 2008
3 Печатнов В.В. (pvv) 145 146 21 354 190 19.151 6.326 28 26 Apr 2008 06 Jun 2008
4 Креславский О.М. (Arcan) 146 146 21 356 466 22.488 12.553 28 10 May 2008 05 Jun 2008
5 Держальцев В.А. (MadVet) 146 146 21 356 1128 60.815 28.482 28 18 May 2008 20 May 2008
6 Любченко В.А. (IAS56) 146 146 21 356 615 403.439 373.617 28 11 May 2008 04 Jun 2008
7 Голубин Р.С. (Roman S. Golubin) 145 145 21 353 997 92.927 58.822 25 11 May 2008 06 Jun 2008
8 Мурашкин И.В. (lepton) 143 146 21 347 767 37.107 26.815 21 28 Apr 2008 12 May 2008
9 Белогурова К. (Katy_Ekb) 142 143 21 344 361 10.714 4.673 18 20 May 2008 27 May 2008
10 Войнов П.Е. (pаparome) 143 146 21 345 992 3.045 .213 17 12 May 2008 05 Jun 2008
11 Северюхин Ю.А. (Venser) 138 142 21 335 335 4.925 .655 14 01 Feb 2008 04 Feb 2008
12 Борисенков Д.В. (xuser) 141 142 21 340 92 3.217 .926 14 02 May 2008 30 May 2008
13 Мишин С.А. (CepbIu) 142 142 21 342 40 9.754 2.148 14 28 May 2008 06 Jun 2008
14 Тарасов Д.Б. (Gavrila) 141 142 21 339 998 23.531 2.501 14 20 May 2008 06 Jun 2008
15 Солдатенков Ю.С. (SolYUtor) 139 142 21 336 703 17.844 2.695 14 20 Apr 2008 06 Jun 2008
16 Кувалкин К.С. (Cyrilus) 139 142 21 336 1207 13.037 2.782 14 15 Mar 2008 06 Jun 2008
17 Шептунов П.П. (Dzen) 137 142 21 334 279 8.120 3.499 14 02 Oct 2007 15 Nov 2007
18 Селезнёв А.С. (Артём С.) 140 142 21 339 127 15.589 4.279 14 14 Mar 2008 31 Mar 2008
19 iglbeat (iglbeat) 142 142 21 342 281 27.442 6.641 14 21 May 2008 21 May 2008
20 Мальцев А.В. (Палкин) 137 142 21 334 422 48.779 7.690 14 13 Oct 2007 20 Jan 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Дроздков А.Н. (anddros) 45 80 93 34 127 356 06 Jun 2008
2 Bakunovitch D. (atzkey) 32 50 70 34 104 1055 05 Jun 2008
3 >Перфилов Б. (B o r i s) 44 44 87 17 104 1570 06 Jun 2008
4 Подковырин Д.С. (sbj-ss) 44 44 84 3 87 2149 06 Jun 2008
5 >Ржеутский А.В. (GRAD) 35 79 74 0 74 375 06 Jun 2008
6 >Ключникова А.И. (Anna_08) 26 49 62 10 72 1360 06 Jun 2008
7 >Карахтанов Р.С. (KRS544) 21 60 37 33 70 770 06 Jun 2008
8 >Шелковников (shelk) 13 13 33 34 67 2999 06 Jun 2008
9 Karginov (tty13) 33 33 57 9 66 3077 06 Jun 2008
10 >Ушаков О.Н. (uon) 28 40 63 0 63 2533 06 Jun 2008
11 >Zaikin A. (_Allex_) 34 34 63 0 63 3269 06 Jun 2008
12 Kurbanoff N.I. (Nariman Kurbanoff) 10 56 21 34 55 852 06 Jun 2008
13 >Tatarenko (=marinos=) 23 35 53 0 53 3093 06 Jun 2008
14 >Акимов Н. (NikiAki) 29 29 50 3 53 4106 06 Jun 2008
15 Mad`yarov D.N. (Damkrat CJ) 9 9 18 34 52 4180 02 Jun 2008
16 >Syuzev A.P. (Kbl4AH) 29 29 43 9 52 4215 06 Jun 2008
17 >Андреева М.Ю. (Мари_Андреева) 29 29 51 0 51 4347 06 Jun 2008
18 Lyulina Е.И. (elena3188) 16 51 30 19 49 1363 05 Jun 2008
19 >ivanov (dyp) 27 27 49 0 49 4506 06 Jun 2008
20 christysun (cchristysun) 25 25 47 0 47 4706 06 Jun 2008
21 Булдаков (BadBigBoy) 27 27 46 0 46 4860 05 Jun 2008
22 asd A.A. (vonpoland) 20 20 36 9 45 5019 04 Jun 2008
23 >Татаренко В.С. (Aviaradist) 25 25 42 3 45 5029 06 Jun 2008
24 >Klimovs S. (DSerz) 19 49 42 0 42 1856 06 Jun 2008
25 Mok (moksiu) 21 27 41 0 41 4754 06 Jun 2008

Изучаем SQL

MS SQL 2005: оконные функции

Краткое переложение Карасевой Н.В. статьи Ивана Бодягина (оригинал)

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

Сначала формируется выборка, выполняются все объединения, условия WHERE, GROUP BY, HAVING - все, кроме сортировки, и только затем к практически готовому набору данных применяется аналитическая функция. Именно поэтому аналитические функции можно указывать лишь в списке выборки или в условии сортировки.

В общем случае принцип работы аналитических функций можно представить примерно следующим образом. Допустим, что у нас есть результирующий набор данных, полученный вышеописанным способом - выполнено все, кроме сортировки. На каждую запись в этом наборе накладывается так называемое "окно", размеры и положение которого определяются в соответствии с некоторым аналитическим условием (собственно отсюда и название этого класса функций - "оконные функции", window functions).

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

Строго говоря, практически все, что можно получить с помощью аналитических функций, можно получить и без них, с помощью обычного T-SQL, но это будет заведомо более громоздко и зачастую не так эффективно.

В MS SQL Server 2005 реализованы два типа аналитических функций - агрегатные и функции ранжирования.

Агрегатные функции

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

Отличие состоит в том, что "обычные" агрегаты уменьшают степень детализации результирующего набора, а в аналитическом варианте степень детализации не уменьшается.

Это относится не только к агрегатам, но и к другим типам аналитических функций.

Сравним результат выполнения двух запросов (база данных "Окраска"). В одном COUNT выступает в качестве обычного агрегата:

SELECT B_Q_ID,B_V_ID,COUNT(*)C
FROM UTB
WHERE B_Q_ID < 4 -- чтобы уменьшить объем выборки
GROUP BY B_Q_ID,B_V_ID
Результат
B_Q_ID   B_V_ID   C
-------------------
1 1   2
2 2   1
3 3   1
1 4   1
2 5        1
3 6   1
1 7   1
2 8   1
3 9   1

А в другом уже в качестве аналитической функции:

SELECT B_DATETIME, B_Q_ID, B_V_ID,
COUNT(*)OVER(PARTITION BY B_Q_ID,B_V_ID) C
FROM UTB
WHERE B_Q_ID < 4 -- чтобы уменьшить объем выборки

Результат
B_DATETIME            B_Q_ID B_V_ID     C
-----------------------------------------
2003-01-01 01:12:01.000 1 1 2
2003-06-23 01:12:02.000 1  1 2
2003-01-01 01:12:05.000 1  4 1
2003-01-01 01:12:08.000 1 7 1
2003-01-01 01:12:03.000 2 2 1
2003-01-01 01:12:06.000 2 5 1
2003-01-01 01:12:09.000 2 8 1
2003-01-01 01:12:04.000 3 3 1
2003-01-01 01:12:07.000 3 6 1
2003-01-01 01:12:10.000 3 9 1

При просмотре результатов второго запроса можно заметить, что сервер не стал ругаться на указание колонки B_DATETIME выборке, несмотря на отсутствие агрегирующей функции или группировки по этой колонке.

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

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

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

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

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

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

Контакты

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

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

В избранное