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

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


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

Выпуск 257 от 29 августа 2009 г.

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

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

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

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

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


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

§ Написал подсказку к новой задаче #2.

§ Учитывая общее мнение о том, что уровень задачи 61 более соответствует второму сертификационному этапу, поменял местами задачи 61 и 73. Также добавил подсказку от Ozzy для теперь уже задачи 73.

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
5. anddros (159)
10. pvv (158)
12. Faust_zp (147, 151)
46. Nariman Kurbanoff (139, 142)

§ Продвинулись в рейтинге:
58. Replikon (136, 11.463)
59. Wiedzmen (135, 27.904)
60. AlexPhil (134, 12.275)
70. ivan.korobov (132, 330.440)
75. Балуткин (128, 401.842)
83. Allex (125, 87.277)
84. modicus (125, 8.996)
85. Romul_T (125, 163.493)
88. GrImago (124, 26.730)
89. Johnnymnemonic (124, 118.295)

§ Новые лица в ТОР 100 и вернувшиеся туда:
100. alx_ol (121, 166.401)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
115. Corleone (119, 5.949)
120. vitaliiS (118, 109.470)
137. maar (114, 88.677)
139. Eagleoff (116, 12.954)
157. _ORA_ (114, 97.416)
160. Magnetic (113, 138.209)

§ На этой неделе сертифицированы:
Allex (B09032896) [AR] - г.Демидов, Россия

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Умрихина Е.В. (Umrikhina)1 160 161 22 388 489 41.362 58.776 65 26 Aug 2009 28 Aug 2009
2 Креславский О.М. (Arcan)1 160 161 22 388 937 102.989 84.375 65 24 Aug 2009 28 Aug 2009
3 Зотов П.Г. (Ozzy)1 158 161 21 381 532 190.678 206.396 65 24 Aug 2009 28 Aug 2009
4 Сальников С.А. ($erges)1 159 161 22 385 547 5.360 5.583 62 26 Aug 2009 28 Aug 2009
5 Дроздков А.Н. (anddros)5 158 161 22 381 454 7.423 8.046 61 24 Aug 2009 28 Aug 2009
6 Карасёва Н.В. (vlksm)1 157 158 22 381 1200 98.347 69.151 61 18 Aug 2009 19 Aug 2009
7 Сенкевич С.В. (GreyC)1 141 152 21 351 358 57.860 27.102 44 26 Jan 2009 29 Jul 2009
8 Селезнёв А.С. (Артём С.)1 139 152 21 345 444 47.248 37.524 44 25 Jan 2009 03 Mar 2009
9 Никотин В.М. (@Nikotin)1 142 150 21 348 283 8.371 3.751 38 06 Jun 2009 28 Aug 2009
10 >Печатнов В.В. (pvv)1 151 158 21 359 679 37.011 19.973 37 28 Aug 2009 28 Aug 2009
11 Мурашкин И.В. (lepton)1 135 156 21 331 1139 69.490 59.005 36 05 May 2009 23 Aug 2009
12 >Яцук А.А. (Faust_zp)12 151 73 22 357 936 36.625 591.662 34 28 Aug 2009 28 Aug 2009
13 Муллаханов Р.Х. (rem)9 145 152 22 350 649 14.627 20.056 33 20 Jun 2009 03 Aug 2009
14 Шиндин А.В. (AlShin)10 136 150 21 335 79 20.458 7.203 28 05 Jan 2009 25 May 2009
15 Анисимов Д. (danilko)13 148 160 22 348 32 12.722 9.542 28 12 Aug 2009 17 Aug 2009
16 Держальцев В.А. (MadVet)7 128 146 21 315 1509 60.783 28.482 26 03 Jun 2009 16 Jun 2009
17 Любченко В.А. (IAS56)6 138 146 21 332 1048 420.338 373.617 26 18 Jul 2009 28 Jul 2009
18 Тарасов Д.Б. (Gavrila)16 146 161 22 345 1459 43.492 13.164 25 24 Aug 2009 28 Aug 2009
19 Голубин Р.С. (Roman S. Golubin)3 132 145 21 321 1413 93.162 58.822 23 01 Jul 2009 11 Jul 2009
20 Nikolaenko A.V. (Shadow77)12 131 147 21 319 436 77.451 14.010 21 22 Oct 2008 11 Dec 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Наумкин М.Ю. (МихаилЮ) 34 34 67 0 67 2587 28 Aug 2009
2 >Левитин И.А. (Spider244) 16 36 30 32 62 1333 28 Aug 2009
3 >Воевуцкий С.А. (SergLK) 29 37 58 0 58 2439 28 Aug 2009
4 >Буйняченко А. (AleAle) 23 23 43 5 48 4298 28 Aug 2009
5 >Киракосянц Виталий (Robb) 26 64 39 0 39 614 28 Aug 2009
6 >Хайруллин (gerrard) 20 41 38 1 39 1964 28 Aug 2009
7 >Казаров С.В. (ALion) 6 38 9 24 33 1231 28 Aug 2009
8 Викторов А. (vavdubna) 13 29 32 0 32 3041 27 Aug 2009
9 Галкин Е.Н. (InTechs) 4 19 8 22 30 3075 27 Aug 2009
10 Петров А.И. (gji) 10 16 30 0 30 5522 27 Aug 2009
11 Kumrey V. (Kumrey) 16 19 30 0 30 5786 28 Aug 2009
12 >Колетвинова А. (Поганка) 17 66 28 0 28 541 28 Aug 2009
13 Mchedlishvili G.M. (goga_27) 13 14 26 1 27 6959 25 Aug 2009
14 Бондарев А.С. (php master) 3 30 6 20 26 1749 26 Aug 2009
15 >B (vtan) 12 105 25 0 25 217 28 Aug 2009
16 >И С. (alex.i) 16 65 25 0 25 561 28 Aug 2009
17 Юников А. (SunStroke) 0 0 23 23 26 Aug 2009
18 Андреев И.В. (x@meleon) 8 25 17 5 22 3576 28 Aug 2009
19 Бичев А.В. (Arcady) 2 2 5 16 21 5354 28 Aug 2009
20 C (Anryx1) 11 23 20 0 20 3971 26 Aug 2009
21 >Шипилова Е.А. (Mope) 10 10 20 0 20 8564 28 Aug 2009

Изучаем SQL

Функция ROW_NUMBER()

Моисеенко С.И.

Функция ROW_NUMBER, как следует из ее названия, нумерует строки, возвращаемые запросом. С ее помощью можно выполнить более сложное упорядочивание строк в отчете, чем то, которое дает предложение ORDER BY в рамках Стандарта SQL-92.

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

Замечание. Естественно, можно выполнить нумерацию средствами процедурных языков, используя при этом курсоры и/или временные таблицы. Но мы здесь говорим о "чистом" SQL.

Используя функцию ROW_NUMBER можно:

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

    Проще всего возможности функции ROW_NUMBER показать на простых примерах, к чему мы и переходим.

    Пример 1. Пронумеровать все рейсы из таблицы Trip в порядке возрастания их номеров. Выполнить сортировку по {id_comp, trip_no}.

    Решение

    SELECT ROW_NUMBER() OVER(ORDER BY trip_no) num,
     trip_no, id_comp
    FROM Trip
    WHERE ID_comp < 3
    ORDER BY id_comp, trip_no
    

    Предложение OVER, с которым используется функция ROW_NUMBER задает порядок нумерации строк. При этом используется дополнительное предложение ORDER BY, которое не имеет отношения к порядку вывода строк запроса. Если вы посмотрите на результат, то заметите, что порядок строк в результирующем наборе и порядок нумерации не совпадают:

    num trip_no id_comp 
    3 1181 1
    4 1182 1
    5 1187 1
    6 1188 1
    7 1195 1
    8 1196 1
    1 1145 2
    2 1146 2
    

    Примечание. Условие отбора id_comp <3 использовано лишь с целью уменьшения размера выборки.

    Конечно, мы можем потребовать выдачу в порядке нумерации, переписав последнюю строку в виде

    ORDER BY trip_no (или, что то же самое, ORDER BY num ).

    Или, наоборот, пронумеровать строки в порядке заданной сортировки:

     
    SELECT ROW_NUMBER() OVER(ORDER BY id_comp, trip_no) num,
     trip_no, id_comp
    FROM Trip
    WHERE id_comp < 3
    ORDER BY id_comp, trip_no
     
    num trip_no id_comp  
    1 1181 1
    2 1182 1
    3 1187 1
    4 1188 1
    5 1195 1
    6 1196 1
    7 1145 2
    8 1146 2
    

    А если требуется пронумеровать рейсы для каждой компании отдельно? Для этого нам потребуется еще одна конструкция в предложении OVER - PARTITION BY.

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

    Пример 2. Пронумеровать рейсы каждой компании отдельно в порядке возрастания номеров рейсов.

    SELECT ROW_NUMBER() OVER(PARTITION BY id_comp ORDER BY id_comp, trip_no) num,
      trip_no, id_comp
    FROM Trip
    WHERE id_comp < 3
    ORDER BY id_comp, trip_no
    

    PARTITION BY id_comp означает, что рейсы каждой компании образуют группу, для которой и выполняется независимая нумерация. В результате получим:

    num trip_no id_comp    
    1 1181 1
    2 1182 1
    3 1187 1
    4 1188 1
    5 1195 1
    6 1196 1
    1 1145 2
    2 1146 2
    

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

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

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

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

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

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

    Контакты

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

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

    В избранное