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

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


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

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

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

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

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

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

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


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

§ Проверка задачи 87 обучающего этапа выполнялась на базе для соответствующей задачи рейтингового этапа, на что обратили внимание Publexus и Пак Владимир. Исправил.

§ Поработал над проверочной базой 104 задачи. В результате 3 решения, опубликованные на последней странице форума задачи, не проходят проверки.

§ Еще одна задача от pvv - 145 (сложность 3 балла) - выставлена на третьем этапе.

§ В четверг по неизвестным причинам во второй половине дня не грузилась главная страница сайта. Заработала только после замены файла страницы :-(. В связи с этим хочу предупредить, что в таких случаях можно заходить с других страниц, тем более, что авторизоваться можно при заходе на упражнения и форум сайта.

§ Смена лидера. Решив 143 задачу, на первую строчку рейтинга поднялся pvv - автор двух последих задач. Он пока единственный, кто решил все задачи на сайте.
IAS56 решил непростую 143 задачу и занимает сейчас 14-ю позицию.
В одном щаге от 20-ки остановился man2, решивший 139-ю и 142-ю задачи третьего этапа.

§ Новые лица в ТОР 100 и вернувшиеся туда:
Sysa (задач 124, время 17.753)
antihero (125, 13.661)

§ Продвинулись в рейтинге:
Артём С. (127, 7.272)
paul (126, 5.961)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
Robin (118, 133.753)
Scorpion (117, 45.626)
comrade (112, 124.691)
TheMax (114, 10.717)

§ На этой неделе сертифицированы:
zjor (B08019015) [AR] - г. Люберцы, МО, Россия

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

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

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

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

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

NoPersonNumber of
Sel_ex
Last_SelNumber of
DML_ex
ScoresDaysDays_2Days_3S_3LastSolvedLastVisit
1Печатнов В.В. (pvv)145145213538118.8335.9792508 Jan 2008 11 Jan 2008
2Креславский О.М. (Arcan)1441442135033918.4978.7032204 Jan 2008 11 Jan 2008
3Белогурова К. (Katy_Ekb)143143213461559.5634.6731827 Oct 2007 11 Dec 2007
4Карасёва Н.В. (vlksm)1431432134652938.11812.4141817 Oct 2007 11 Jan 2008
5Голубин Р.С. (Roman S. Golubin)1431432134679569.10143.8851822 Oct 2007 11 Jan 2008
6Северюхин Ю.А. (Venser)142142213422004.950.6551419 Sep 2007 08 Jan 2008
7Тарасов Д.Б. (Gavrila)1421422134275523.4232.5011420 Sep 2007 11 Jan 2008
8Солдатенков Ю.С. (SolYUtor)1421422134249017.8532.6951420 Sep 2007 11 Jan 2008
9Шептунов П.П. (Dzen)142142213422798.1863.4991402 Oct 2007 15 Nov 2007
10Мурашкин И.В. (lepton)1421422134254415.8005.5391418 Sep 2007 07 Jan 2008
11Мальцев А.В. (Палкин)1421422134242249.7387.6901413 Oct 2007 20 Nov 2007
12Васьков Е.В. (Johan)1421422134249314.35012.7671424 Nov 2007 30 Nov 2007
13Бураков С.Г. (burakov58)1421422134297451.70219.8141430 Sep 2007 09 Nov 2007
14Любченко В.А. (IAS56)14214321342493249.00891.2791410 Jan 2008 11 Jan 2008
15Агапов В. (KERBEROS)13514120326896.1431.2621120 Nov 2006 27 Jul 2007
16Кувалкин К.С. (Cyrilus)14114121339113712.7942.5191105 Jan 2008 11 Jan 2008
17Зверев Д.Л. (dimzv)1381412133415039.3744.9381116 Dec 2007 16 Dec 2007
18Войнов П.Е. (pаparome)141142213387652.788.0491028 Sep 2007 09 Jan 2008
19Валуев Д.И. (Fiolent)141142213381547122.20166.3601029 Nov 2007 11 Jan 2008
20Юлдашев М.Р. (Snowbear)140142213348744.350.188609 Dec 2007 06 Jan 2008

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

Nosurnamen_selsel_allsel_scoresdml_scoresscoresratinglast_visit
1Мазунин А.А. (rebelperm)44448223105135211 Jan 2008
2>Калинин В.В. (vovochka)4047811899131111 Jan 2008
3>Зубов Ю.В. (IOResult)3939701787190711 Jan 2008
4sudoer Д.Г. (sudoer)3434611576227110 Jan 2008
5Полежаева А.Н. (anp)414174074234608 Jan 2008
6Свиридов К.Ю. (orange)2453472370101411 Jan 2008
7>Кудряков А.И. (AKudrakov)353566066277311 Jan 2008
8>Сафина Д.Б. (diiina)2424392362298811 Jan 2008
9Arcanoid G.A. (arcadius)146224345864310 Jan 2008
10Пузырин Н.В. (Neverminder)27585625891008 Jan 2008
11Бородулин К.В. (qdask)195737195692009 Jan 2008
12>Кулишов Е.И. (kei)1616203454690611 Jan 2008
13Комаров А.С. (KomarovAS)243244953308511 Jan 2008
14>Darbinyan A.R. (mewss)292953053374011 Jan 2008
15>Shinji (katake)292953053374310 Jan 2008
16Карамазов И.Ф. (bububu)282952052374407 Jan 2008
17Назаров (TheMax)181144504518411 Jan 2008
18>Iovova (Osya)1324281745345311 Jan 2008
19Тутисани Т. (Тенго)183144044327609 Jan 2008
20>Семчук Д. (Xenoid)252544044452211 Jan 2008
21Kholodenko S. (Fitz)252542143457310 Jan 2008
22Kargovskaya (ksusik)272741041474407 Jan 2008
23Я А.В. (Alexey_Yar)272740040480009 Jan 2008

Изучаем SQL

Советы Oracle: Как NULL-значения влияют на оценку предикатов IN и EXISTS

Scott Stephens (оригинал: Oracle Tip: Understand how NULLs affect IN and EXISTS )
Перевод Моисеенко С.И.

Аннотация: Понимая различия между IN, EXISTS, NOT IN и NOT EXISTS, вы сможете избежать довольно общих проблем, возникающих, когда в данных подзапроса появляются NULL-значения. Scott Stephens поможет вам понять эти различия.

С одной стороны, может показаться, что SQL предложения IN и EXISTS взаимозаменяемы. Однако они совершенно различаются в том, как они обрабатывают NULL-значения, и могут давать различные результаты. Возникающие проблемы связаны с тем, что в базе данных Oracle, NULL-значение имеет смысл "неизвестно", поэтому любое сравнение или операция с NULL-значением является также NULL, и любые проверки, которые возвращают NULL, всегда игнорируются. Например, ни один из этих запросов не вернет ни одной строки:

select 'true' from dual where 1 = null;
select 'true' from dual where 1 != null;

 

(DUAL - таблица, автоматически создаваемая Oracle и доступная для всех пользователей. Она имеет один столбец, DUMMY, содержащий одну строку - прим. перев.)

Значение 1 и ни равно, и ни не равно NULL. Только IS NULL должен дать true на NULL-значении и вернуть строку.

select 'true' from dual where 1 is null;
select 'true' from dual where null is null;

 

Когда вы используете IN, вы говорите SQL взять значение и сравнить его с каждым значением или набором значений в списке, используя =. Если имеются NULL-значения, строка не будет возвращена - даже если оба значения есть NULL.

select 'true' from dual where null in (null);
select 'true' from dual where (null,null) in ((null,null));
select 'true' from dual where (1,null) in ((1,null));

 

Функциональность IN эквивалентна использованию предложения = ANY:

select 'true' from dual where null = ANY (null);
select 'true' from dual where (null,null) = ANY ((null,null));
select 'true' from dual where (1,null) = ANY ((1,null));

 

Когда вы используете эквивалентную форму EXISTS, SQL подсчитывает строки и игнорирует значение(я) в подзапросе - даже если вы возвращаете NULL.

select 'true' from dual where exists (select null from dual);
select 'true' from dual where exists (select 0 from dual where null is null);

 

IN и EXISTS логически одинаковы. Предложение IN сравнивает значения, возвращаемые подзапросом, и отфильтровывает строки во внешнем запросе; предложение EXISTS сравнивает значения и отфильтровывает строки внутри подзапроса. В случае NULL-значений результирующий набор строк одинаков.

select ename from emp where empno in (select mgr from emp);
select ename from emp e where exists (select 0 from emp where mgr = e.empno);

 

Однако проблемы возникают, когда логика переворачивается на использование NOT IN и NOT EXISTS, что приводит к различным результирующим наборам строк (первый запрос возвращает 0 строк; второй - возвращает ожидаемые данные; они уже не представляют один и тот же запрос):

select ename from emp where empno not in (select mgr from emp);
select ename from emp e where not exists (select 0 from emp where mgr = e.empno);

 

Предложение NOT IN виртуально эквивалентно сравнению каждого значения на = и проваливается, если всякое испытание есть FALSE или NULL. Например:

select 'true' from dual where 1 not in (null,2);
select 'true' from dual where 1 != null and 1 != 2;
select 'true' from dual where (1,2) not in ((2,3),(2,null));
select 'true' from dual where (1,null) not in ((1,2),(2,3));

 

Эти запросы не возвращают строк. Второй - более очевиден, 1 != NULL есть NULL, поэтому все условие в предложении WHERE ложно для данной строки. В то же время нижеприведенные запросы работают:

select 'true' from dual where 1 not in (2,3);
select 'true' from dual where 1 != 2 and 1 != 3;

 

Как видно, вы все же можете использовать запрос NOT IN, пока вы предотвращаете появление NULL в возвращаемых результатах (опять же, они оба работают, но я предполагаю, что empno is not null, что является хорошим предположением в данном случае):

select ename from emp where empno not in (select mgr from emp where mgr is not null);
select ename from emp where empno not in (select nvl(mgr,0) from emp);

 

Понимая различие в IN, EXISTS, NOT IN и NOT EXISTS, вы можете избежать довольно общей проблемы при появлении NULL-значений в данных подзапроса.

22-08-2004

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

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

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

Контакты

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

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

В избранное