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

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


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

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

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

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

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

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


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

§ По многочисленным просьбам трудящихся изменил сложность задачи 72 с 2 на 3 балла.

§ Если вы не знаете, какой год является високосным, загляните в FAQ для задачи 42 :-).

§ Готовлю две новые задачи от paparome и pvv. Задачи будут выставлены на второй и третий этап.

§ Сразу три лидера решили 145 задачу. В результате Roman S. Golubin перешел на третью позицию, IAS56 - на шестую, а man2 вошел в 20-ку.

§ Новые лица в ТОР 100 и вернувшиеся туда:
TheMax (задач 127, время 13.358)

§ Продвинулись в рейтинге:
wasp (136, 89.979)
Bulldozer (135, 227.733)
iglbeat (129, 18.752)
Tunin (128, 36.288)
Артём С. (128, 7.482)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
Лори (122, 26.351)
Scorpion (121, 54.001)
FanOfBeer (121, 79.267)
ivan.korobov (117, 40.657)
comrade (113, 124.919)
DarkTower (111, 287.557)

§ На этой неделе сертифицированы:
Артём С. (B08023873) [AR] - г. Павловск, СПб, Россия
rhus (A08023766) [BK] - г.Донской, Россия
Leshik (A08022426) [BK] - г.Москва, Россия
iglbeat (B08021192) [AR] - г. Новосибирск, Россия
antihero (B08023900) [AR] - г. Долгопрудный, МО, Россия

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

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

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

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

Лучшие результаты (ТОР 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) 145 145 21 354 81 18.833 5.979 25 08 Jan 2008 18 Jan 2008
2 Креславский О.М. (Arcan) 144 144 21 351 339 18.497 8.703 22 04 Jan 2008 18 Jan 2008
3 Голубин Р.С. (Roman S. Golubin) 144 145 21 350 878 73.145 47.929 21 13 Jan 2008 18 Jan 2008
4 Белогурова К. (Katy_Ekb) 143 143 21 347 155 9.563 4.673 18 27 Oct 2007 11 Dec 2007
5 Карасёва Н.В. (vlksm) 143 143 21 347 529 38.118 12.414 18 17 Oct 2007 18 Jan 2008
6 Любченко В.А. (IAS56) 143 145 21 346 497 253.563 95.835 17 14 Jan 2008 18 Jan 2008
7 Северюхин Ю.А. (Venser) 142 142 21 343 200 4.950 .655 14 19 Sep 2007 08 Jan 2008
8 Тарасов Д.Б. (Gavrila) 142 142 21 343 755 23.423 2.501 14 20 Sep 2007 18 Jan 2008
9 Солдатенков Ю.С. (SolYUtor) 142 142 21 343 490 17.853 2.695 14 20 Sep 2007 18 Jan 2008
10 Шептунов П.П. (Dzen) 142 142 21 343 279 8.186 3.499 14 02 Oct 2007 15 Nov 2007
11 Мурашкин И.В. (lepton) 142 142 21 343 544 15.800 5.539 14 18 Sep 2007 12 Jan 2008
12 Мальцев А.В. (Палкин) 142 142 21 343 422 49.738 7.690 14 13 Oct 2007 20 Nov 2007
13 Васьков Е.В. (Johan) 142 142 21 343 493 14.350 12.767 14 24 Nov 2007 30 Nov 2007
14 Бураков С.Г. (burakov58) 142 142 21 343 974 51.702 19.814 14 30 Sep 2007 09 Nov 2007
15 Агапов В. (KERBEROS) 135 141 20 327 89 6.143 1.262 11 20 Nov 2006 27 Jul 2007
16 Кувалкин К.С. (Cyrilus) 141 141 21 340 1137 12.794 2.519 11 05 Jan 2008 18 Jan 2008
17 Зверев Д.Л. (dimzv) 138 141 21 335 1503 9.374 4.938 11 16 Dec 2007 16 Dec 2007
18 Войнов П.Е. (pаparome) 141 142 21 339 765 2.788 .049 10 28 Sep 2007 18 Jan 2008
19 Валуев Д.И. (Fiolent) 141 142 21 339 1547 122.201 66.360 10 29 Nov 2007 18 Jan 2008
20 Миловидов А.Н. (man2) 141 145 21 338 811 64.900 5.344 9 12 Jan 2008 18 Jan 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Botsenyuk I. (aprog) 47 47 88 9 97 1586 18 Jan 2008
2 Чазов А.А. (Night Elf) 47 47 89 0 89 1862 16 Jan 2008
3 Вахнов А. (Stealth.ts) 40 40 76 0 76 2279 17 Jan 2008
4 >Дужин В.С. (evil_eye) 39 39 74 1 75 2327 18 Jan 2008
5 Назаров (TheMax) 13 127 31 34 65 79 17 Jan 2008
6 >Нагимов Т. (enzo) 33 33 61 0 61 3066 18 Jan 2008
7 avs (asulim) 32 32 61 0 61 3067 17 Jan 2008
8 Мансуров А.А. (BioHazard) 32 32 60 0 60 3135 18 Jan 2008
9 Лебедев П.В. (Soldering Iron) 27 27 47 12 59 2890 18 Jan 2008
10 Dyomin A. (cwallice) 31 31 58 0 58 3281 17 Jan 2008
11 Ruzkoy A.M. (GoZone) 29 29 54 3 57 3360 17 Jan 2008
12 vargin (habibi) 30 30 56 0 56 3461 18 Jan 2008
13 >Овчинников А.Н. (007) 16 37 37 18 55 2044 18 Jan 2008
14 >Синькевич П.В. (Чих) 5 68 13 34 47 486 18 Jan 2008
15 Фёдоров А.Н. (Фантом) 27 27 47 0 47 4346 16 Jan 2008
16 Mr M.G. (aircanada1513) 26 26 44 0 44 4562 18 Jan 2008
17 sanya (sanyastorm1) 24 24 40 3 43 4611 16 Jan 2008
18 >first_name (Pashich) 24 24 40 3 43 4631 18 Jan 2008
19 jimmy sum (jimmy_sum) 25 25 42 0 42 4683 17 Jan 2008
20 >Харин (newcomer2002) 25 25 42 0 42 4706 18 Jan 2008
21 >Вергуленко В.Д. (Walery) 10 58 18 23 41 723 18 Jan 2008
22 >Вальковская Е.В. (genya) 12 59 23 18 41 887 18 Jan 2008
23 zhao E. (eric) 24 24 40 0 40 4851 17 Jan 2008

Изучаем SQL

Особенности использования функций COALESCE(), ISNULL(), NVL()

decipherinfosys (оригинал: COALESCE(), ISNULL(), NVL() )
Перевод Моисеенко С.И.

Функции ISNULL (MS SQL Server), NVL (Oracle) используются, чтобы заменить NULL-значения некоторым другим значением, когда требуется как-то иначе обработать NULL-значение. Функция COALESCE() - обобщенная форма функции NVL() или ISNULL() и входит в стандарт ANSI, в то время как остальные представляют собой функции, реализованные в Oracle/SQL Server. Эта функция имеется во всех ведущих РСУБД (Оракл, SQL Server и DB2). Основное различие между COALESCE и ее конкурентами состоит в том, что COALESCE возвращает первое не NULL-значение, и может иметь более 2-х выражений или значений в качестве аргументов, в то время как ISNULL или NVL принимают только два аргумента. Первый аргумент - это выражение или название столбца, а второй аргумент - выражение или константа, которой мы хотим заменить первый аргумент, если он NULL. Давайте сначала создадим таблицу и наполним ее некоторыми данными (в данном примере используется синтаксис Оракл):

Использование функций Coalesce(), ISNULL() и NVL():

 

CREATE TABLE TEST
(
TEST_ID NUMBER(9),
TEST_COL1 NUMBER(9),
TEST_COL2 NUMBER(9),
TEST_NAME VARCHAR(30)
)
/
INSERT INTO TEST VALUES(1,1000,1101,'Oracle');
INSERT INTO TEST VALUES(2,2000,NULL,'SQLServer');
INSERT INTO TEST VALUES(3,NULL,3000,'DB2?);
INSERT INTO TEST VALUES(4,NULL,4000,'Sybase');
INSERT INTO TEST VALUES(5,NULL,NULL,'Informix');
INSERT INTO TEST VALUES(6,NULL,NULL,'MYSQL');
COMMIT;

 

Ниже - результат выполнения оператора select, использующего NVL. Как упоминалось ранее, функция принимает только 2 аргумента. Если вы попытаетесь указать более 2-х аргументов, Oracle вернет ORA-00909 (ошибка - неверное число аргументов).

 

SQL> SELECT TEST_NAME,NVL(TEST_COL1,TEST_COL2) FROM TEST;

TEST_NAME NVL(TEST_COL1,TEST_COL2)
---------- --------
Oracle   1000
SQLServer  2000
DB2   3000
Sybase   4000
Informix
MYSQL

 

Если Вы взгляните на вышеупомянутый результирующий набор, то заметите, что везде, где значение TEST_COL1 есть NULL, запрос возвратил значение TEST_COL2. Для Informix и MYSQL оба столбца имеют значения NULL, поэтому было возвращено NULL-значение. Теперь давайте выполним подобный оператор с использованием COALESCE. С помощью COALESCE мы хотим получить такие данные: если значение TEST_COL1 есть NULL, то должно быть возвращено значение столбца TEST_COL2, а если значение TEST_COL2 также является NULL, то возвращаться должна константа 9999.

 

SQL> SELECT TEST_NAME,COALESCE(TEST_COL1,TEST_COL2,9999) FROM TEST;

TEST_NAME COALESCE(TEST_COL1,TEST_COL2,9999)
---------- ------------
Oracle   1000
SQLServer  2000
DB2   3000
Sybase   4000
Informix  9999
MYSQL   9999

 

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

 

SELECT TEST_NAME,
CASE WHEN TEST_COL1 IS NOT NULL THEN TEST_COL1
ELSE COALESCE (TEST_COL2,9999)
END as first_Non_Null
FROM TEST

 

После выполнения этот запрос также возвратит то же самое значение, что и оператор с COALESCE. Последний скрывает сложность выражения CASE, когда имеется более 3-х аргументов. Следует помнить один момент, а именно, когда используется COALESCE, все выражения должны иметь один и тот же тип данных или же они должны быть неявно конвертируемыми к одному и тому же типу данных, в противном случае возникает ошибка.

Пожалуйста, не забывайте что, если Вы используете функции на индексируемых столбцах в критериях отбора или в условиях соединения, то индекс использоваться не будет. Есть способы заставить его работать (использование FBI в Оракле, вычисляемые столбцы в SQL Server или столбцы генерации выражения в DB2 LUW), если Вам действительно необходимо это сделать

Другие различия, о которых Вы должны знать:

- Другая важная вещь, когда Вы используете ISNULL(), заключается в том, что эта функция оценивает первое значение, и значение второго параметра автоматически ограничивается этой длиной; COALESCE() не имеет этого ограничения. Вот пример (синтаксис T-SQL):

 

declare @t varchar(1)
set @t = NULL
select isnull (@t, 'ABCD')
select coalesce (@t, 'ABCD')

 

Функция ISNULL() возвращает 'A', в то время как coalesce вернет 'ABCD'. Нужно иметь это в виду, иначе вы получите неожиданные результаты.

- И точно так же, как в посте UNION/UNION ALL, в котором мы рассуждали о неявных преобразованиях типа данных, приводящих к проблемам, неявные преобразования типа данных могут создать головную боль и здесь. В случае функции COALESCE(), если значения имеют различные типы данных, Вы можете получить как ошибки, так и неверные результаты. Пример:

 

select coalesce('test', 100)

 

В результате получаем ошибку: Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'test' to data type int.
(преобразование значение varchar 'test' к тапу данных int вызывает ошибку)

Аналогично:

 

select coalesce(12345678910, current_timestamp)

 

даст:
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type datetime.
(ошибка арифметического переполнения при преобразовании выражения к типу данных datetime)

Такой оператор:

 

select coalesce(100, current_timestamp)

 

вернет неверные результаты в результате неявного преобразования типа. Вы получите: "1900-04-11 00:00:00.000" вместо 100.

Итак, вы должны знать, что при использовании COALESCE(), все значения/выражения должны быть одного и того же типа или должны быть неявно преобразовываемыми к одному и тому же типу данных.

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

02-08-2007

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

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

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

Контакты

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

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

В избранное