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

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


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

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

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

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

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

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


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

§ Закрыл "дыры" в проверке задачи 12, которые заметили WildSery, lexaNRJ, pref и Fiction.
При этом, чтобы охватить все известные ошибочные варианты, пришлось добавить данные и в основную базу. Обновил и скрипт для скачивания по базе данных "Окраска".
Проверьте свои решения.

§ Изменения среди лидеров:
Fiolent решил 141 задачу (17 место).

§ Одна задача осталась до 3 этапа AlexFJ (задач 137, время 160.759).

§ Продвинулись в рейтинге:
Inuyasha (137, 2.555)
yuriy.rozhok ( 137, 22.487)
Артём С. (136, 8.300)
ivan.korobov (136, 45.795)
Scorpion (136, 63.974)
ikhomeriki (134, 4.160)
nebiros (135, 84.057)
Bulldozer (135, 169.342)
runaway (129, 15.081)
lexaNRJ (126, 80.987)
maar (125, 87.617)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
111. Demonius (120, 98.920)
116. FanOfBeer (120, 79.254)
122. serge77777 (118, 18.117)
144. comrade (113, 135.826)
152. mz (110, 25.544)

§ На этой неделе сертифицированы:
AlexFJ (B08018112) [AR] - г.Мерефа, Украина
maar (B08009433) [AR] - г.Москва, Россия
vovochka (A08026534) [BK] - г.Калининград, Россия
Serg Alex Lad (A08020079) [BK] - г.Пермь, Россия

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Печатнов В.В. (pvv) 146 12 21 357 105 19.165 6.326 28 01 Feb 2008 08 Feb 2008
2 Креславский О.М. (Arcan) 146 12 21 357 367 22.436 12.553 28 01 Feb 2008 08 Feb 2008
3 Карасёва Н.В. (vlksm) 145 12 21 354 636 53.277 26.801 25 01 Feb 2008 08 Feb 2008
4 Голубин Р.С. (Roman S. Golubin) 145 12 21 354 897 92.541 58.822 25 01 Feb 2008 08 Feb 2008
5 Белогурова К. (Katy_Ekb) 142 12 21 344 257 9.559 4.673 18 06 Feb 2008 08 Feb 2008
6 Войнов П.Е. (pаparome) 143 12 21 346 891 3.013 .213 17 01 Feb 2008 01 Feb 2008
7 Любченко В.А. (IAS56) 141 145 21 342 497 253.551 95.835 17 14 Jan 2008 03 Feb 2008
8 Северюхин Ю.А. (Venser) 141 12 21 340 335 4.930 .655 14 01 Feb 2008 04 Feb 2008
9 Тарасов Д.Б. (Gavrila) 141 12 21 340 889 23.390 2.501 14 01 Feb 2008 08 Feb 2008
10 Солдатенков Ю.С. (SolYUtor) 140 142 21 339 490 17.852 2.695 14 20 Sep 2007 07 Feb 2008
11 Шептунов П.П. (Dzen) 140 142 21 339 279 8.130 3.499 14 02 Oct 2007 15 Nov 2007
12 Мурашкин И.В. (lepton) 140 142 21 339 544 15.737 5.539 14 18 Sep 2007 12 Jan 2008
13 Держальцев В.А. (MadVet) 142 134 21 343 1024 39.622 7.309 14 04 Feb 2008 04 Feb 2008
14 Мальцев А.В. (Палкин) 140 142 21 339 422 48.788 7.690 14 13 Oct 2007 20 Jan 2008
15 Васьков Е.В. (Johan) 140 142 21 339 493 14.323 12.767 14 24 Nov 2007 30 Nov 2007
16 Бураков С.Г. (burakov58) 140 142 21 339 974 51.701 19.814 14 30 Sep 2007 09 Nov 2007
17 >Валуев Д.И. (Fiolent) 142 141 21 343 1618 188.425 131.545 14 08 Feb 2008 08 Feb 2008
18 Агапов В. (KERBEROS) 133 141 20 323 89 6.140 1.262 11 20 Nov 2006 27 Jul 2007
19 Кувалкин К.С. (Cyrilus) 139 141 21 336 1137 12.779 2.519 11 05 Jan 2008 08 Feb 2008
20 Зверев Д.Л. (dimzv) 136 141 21 331 1503 9.352 4.938 11 16 Dec 2007 16 Dec 2007

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Borisenkov D.V. (xuser) 71 71 138 34 172 415 08 Feb 2008
2 >Егоров А.Б. (ABEgorov) 49 49 91 34 125 981 08 Feb 2008
3 >Maksunova O.A. (Olcha) 54 54 103 11 114 808 08 Feb 2008
4 >Сафиев Р.Р. (Rash ST) 50 50 94 17 111 1243 08 Feb 2008
5 >Надеев М.Х. (creat0r85) 42 42 79 17 96 1623 08 Feb 2008
6 >Rzhevskiy (Karapuzzz) 35 35 61 23 84 2012 08 Feb 2008
7 Тарелкин С.А. (SATurn7) 41 41 77 0 77 2223 06 Feb 2008
8 >Бочарников Д.С. (D_MON) 29 29 49 17 66 2767 08 Feb 2008
9 Медведев К.А. (Медведев Кирилл) 34 34 64 0 64 2885 05 Feb 2008
10 >Сыроватский В.В. (DemiaN) 29 29 55 7 62 2998 08 Feb 2008
11 >Сусликов П.А. (Паха) 32 32 60 0 60 3124 08 Feb 2008
12 >Бойко Е.В. (Zjizik) 26 47 59 0 59 1801 08 Feb 2008
13 >Пакельман (Bafff) 29 29 55 0 55 3541 08 Feb 2008
14 >Куваев А.А. (alhimic) 27 64 51 2 53 629 08 Feb 2008
15 >Солонин М.С. (Smike) 29 29 53 0 53 3709 08 Feb 2008
16 Деркач А. (ArtD) 15 31 36 12 48 2490 08 Feb 2008
17 Пухарев (Rub_in) 25 25 44 3 47 4248 04 Feb 2008
18 >Шамова И.В. (Sh_Ira) 26 26 47 0 47 4293 08 Feb 2008
19 >Panasyuk (Vitek_Live) 19 48 33 9 42 1675 07 Feb 2008
20 >Boyko V. (zyrian_v_v) 25 25 42 0 42 4700 08 Feb 2008
21 >Шарапова А. (evilmachine) 22 59 41 0 41 1254 08 Feb 2008
22 Круглик А. (Seldoff) 24 23 40 0 40 4945 06 Feb 2008

Изучаем SQL

Oracle и регулярные выражения

James F. Koopmann (оригинал: Oracle and Regular Expressions )
Перевод Моисеенко С.И.

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

Я подумал, что неплохо бы посвятить статью регулярным выражениям, тому как мы, включая меня, знакомимся или освежаем в памяти мощь, которую могут дать эти выражения.

Я познакомился с регулярными выражениями давным-давно, программируя на Perl или скриптовой оболочке unix с помощью команд awk и sed. Также, если Вы используете vi редактор, то можете быть знакомыми с регулярными выражениями и сравнением с образцом. Регулярные выражения в действительности представляют собой маленький язык программирования, который предназначен для поиска символьных образцов в текстовой строке. Если честно, когда я начал использовать сравнение с образцом в мои дни Perl, оно показалось мне весьма путаным. Главным образом, потому что было столь много изменений и вариантов, что я не знал, как начать. Хотя спустя некоторое время, я приобрел некоторые навыки. И Вы сможете также. Наберитесь терпения прочесть эту статью и понять, насколько мощным может быть это сравнение с образцом.

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

 

SELECT text FROM my_text WHERE text LIKE '%Deborah%';

 

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

 

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '\Deborah\');

 

Итак, зачем мы хотим использовать регулярные выражения вместо того, чтобы просто использовать сравнение LIKE, с которым мы очень хорошо знакомы? Главным образом, потому, что как только Вы начинаете задавать высокоуровневые вопросы о "сходстве" строки образцу, то, наиболее вероятно, закончите условием WHERE c многократными сравнениями 'OR' и 'LIKE', чтобы вытащить то, что Вы действительно ищете. С помощью регулярных выражений Вы можете в большинстве случаев написать только один образец сравнения. Возьмем предыдущий пример. Предположим теперь, что нам требуется найти в романе главный персонаж Deborah, которую также называют 'Debbie'. В этом случае мы можем изменить наше условие для поиска текста на LIKE '%Deb%', и тем самым решить проблему. Но что случится, в этом конкретном романе обсуждаются также финансовое состояние нашей девушки из высшего общества. Мы можем прекратить поиск, найдя предложения, которые содержат слова типа 'Debt', или 'Debutante'. Мы теперь имеем очень сложную проблему. Чтобы гарантировать, что мы найдем текст, имеющий непосредственное отношение к Деборе, мы должны использовать регулярное выражение. Вот SQL-запрос, который Вы должны выполнить. Теперь он находит все предложения, где в романе говорится о Деборе.

 

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '\Deb(bie|orah)\');

 

Видно, что в пределах образца соответствия мы программируем варианты текста, содержащего 'Debbie' или альтернативу 'Deborah', с помощью опции (bie|orah) в выражении. Это - каноническая форма построения шаблона, по которому выполняется сравнение строки.

Другой сложный пример, с которым вы можете справиться только используя выражения, находит адреса электронной почты. Это можно быстро сделать с помощью следующего выражения. При этом Вы строите части адреса электронной почты перед знаком '@' и после него. Посмотрите внимательно на этот образец, поскольку он требует трех разных частей адреса электронного адреса и учитывает присутствие '.', а так же как нижнего подчеркивания '_' в имени. Все эти символы вполне допустимы.

 

SELECT text FROM my_text
WHERE REGEXP_LIKE (text, '[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}');

 

Теперь, если Вы хотите искать только '.com' адреса электронной почты, то можно изменить SQL-код на следующий.

 

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '[A-Z0-9._%-]+@[A-Z0-9._%-]+\.com');

 

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

 

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '[0-9]?\.[0-9]+');

 

Регулярные выражения являются мощным орудием, когда ищутся образцы текстов или проверяется соответствие определенному образцу, подобное телефонному номеру, адресу электронной почты, IP-адресу или почти любому образцу, который нуждается в проверке. Обратным вариантом является проверка недопустимых форматов и образцов символов. В нашем предыдущем примере мы могли бы легко разыскать текст, где 'Debbie' написано с ошибкой, например, как 'Debbbie' или 'Debie'.

 

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

 

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '(Debbbie)');

 

Чтобы получить имена, набранные тяжелыми пальцами, где 'b', возможно, был набит более 3-х раз; мы можем использовать следующий запрос

 

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '(Deb)(b){2,}');

 

Регулярные выражения поначалу могут показаться очень замысловатыми. Мне даже требуются некоторые усилия, чтобы вспомнить эти образцы, если я не использовал их какое-то время. Но после некоторых затрат времени на изучение их построения Вы будете вознаграждены, столкнувшись со сложными критериями поиска.

Итак, где же узнать, как строить регулярные выражения. Это действительно не столь трудно, как Вы могли бы подумать. Регулярные выражения всегда сопутствовали миру Unix, и поэтому есть много информации по ним в сети. Руководства Оракл включают несколько страниц, около 5, которые посвящены регулярным выражениям; поэтому лучше начать отсюда, а в особо тяжелых случаям обращаться к сети. Вы можете смело довериться Yahoo, Google или любой другой вашей любимой поисковой машине в поиске руководств и вебсайтов, посвященным исключительно регулярным выражениям.

20-07-2007

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

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

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

Контакты

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

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

В избранное