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

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


Информационный Канал Subscribe.Ru

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

http://www.sql-ex.ru

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

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

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

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


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

§ Автором (Fiolent) незначительно изменена формулировка задачи 122.

§ Новая страница с упражнениями на SELECT (ранее exercises2.php) стала основной и доступна по ссылкам на сайте. Надеемся, что она вам больше понравится.

§ Вместо трех старых задач выставлены новые: 61, 62 и 111 (Fiolent). В результате
1. Второй этап теперь начинается с 61 задачи.
2. Результаты рейтинга по замененным задачам аннулированы.
3. Тем, кто находится в процессе решения задачи второго этапа, дается возможность ее закончить, после чего следующей задачей будет 61-я и т.д.
4. Замененные задачи остаются в системе вместе с решениями участников и топиками форума по ним. Со временем планируется разделить "рейтинговые бои" и задачи для обучения. Задачи первого этапа и замененные задачи второго составят обучающий набор. Что-нибудь придумаем для ускорения доступа к рейтинговому этапу, например, решение только задач на 3 обучающего этапа (пока нужно решить все 60 задач).
5. Формально сертификационные требования не изменились (65 и 121 задача).

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

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

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

No Surname Number of
Sel_ex
Number of
DML_ex
Scores Days Days_2 Last_Solved Last_Visit
1 >Сныткин В.Л. (vlad_snt) 136 19 276 141.92 7.398 22 Jan 2005 22 Jan 2005
2 Валуев Д.И. (Fiolent) 136 19 276 503.35 19.337 19 Jan 2005 22 Jan 2005
3 Hakobyan H.H. (hamlet) 136 19 276 113.92 33.952 21 Jan 2005 22 Jan 2005
4 Мельникова И.А. (Iris_m) 136 19 276 253.88 66.765 21 Jan 2005 21 Jan 2005
5 Spirin (spirin) 135 19 273 158.12 13.467 21 Jan 2005 21 Jan 2005
6 Зверев Д.Л. (dimzv) 133 17 271 252.92 2.213 14 Jul 2004 19 Jan 2005
7 Иткин И.Л. (joseph_itkin) 133 17 271 245.84 2.790 29 Oct 2004 21 Jan 2005
8 Якутин Н.В. (ZrenBy) 133 6 271 428.80 3.991 24 Jun 2004 18 Jan 2005
9 Леденев С.А. (Shurgenz) 133 19 271 60.94 8.298 18 Oct 2004 11 Jan 2005
10 Михайлов В.Г. (mslava) 133 17 271 498.01 9.731 26 Oct 2004 26 Oct 2004
11 Карабанов А. (gipa) 130 0 265 138.58 5.019 10 Jul 2004 10 Jul 2004
12 Новиков Д.А. (DimaN) 127 0 261 68.17 2.101 01 Mar 2004 01 Mar 2004
13 Драконов Ф.А. (f_d) 127 0 261 36.32 7.240 03 Jun 2004 11 Nov 2004
14 Пятница О.А. (Robin) 125 17 256 589.55 70.821 06 Oct 2004 12 Dec 2004
15 Кувалкин К.С. (Cyrilus) 124 19 253 58.09 4.203 21 Jan 2005 22 Jan 2005
16 Шипунов И. (IAS) 122 19 251 203.95 68.022 03 Jan 2005 21 Jan 2005
17 Губарь Д.К. (DEathkNIghtS) 121 17 248 22.67 1.046 03 Nov 2004 03 Nov 2004
18 Смирнов А. (Leshich) 121 17 248 147.15 84.171 03 Aug 2004 19 Nov 2004
19 Ганя А.Д. (Sandman25) 120 1 245 154.83 3.126 16 Jun 2004 13 Jan 2005
20 сафрошкин В.Ю. (safervas) 120 14 245 102.29 80.138 26 Nov 2004 12 Dec 2004

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Косоурхин С. (kosour) 52 52 89 0 89 321 18 Jan 2005
2 Мячин Д.В. (Odin) 43 43 71 0 71 428 21 Jan 2005
3 Бурков (burc) 27 27 46 0 46 658 21 Jan 2005
4 Пшеницин И.В. (pshonnew) 28 28 41 0 41 707 21 Jan 2005
5 Кузьмов А.А. (Auburn) 25 25 40 0 40 720 21 Jan 2005
6 Dankin A.M. (adan84) 25 25 40 0 40 727 19 Jan 2005
7 Хромченков Д.А. (olap) 22 44 39 0 39 431 19 Jan 2005
8 Круговец А. (ask) 24 24 37 0 37 778 21 Jan 2005
9 >Tutisani T. (tengo) 15 28 35 0 35 628 22 Jan 2005
10 Рассказов А. (ra) 15 110 34 0 34 33 21 Jan 2005
11 Телицына И.Г. (Telicyna) 21 21 29 0 29 1003 18 Jan 2005
12 Ершов В.В. (vlad_itd) 21 21 29 0 29 1004 18 Jan 2005
13 Александр (sanya_tir) 20 20 27 0 27 1040 21 Jan 2005
14 Reznick S.Y. (kinzer) 12 36 26 0 26 492 17 Jan 2005
15 Igor G. (ncc-1701) 19 19 25 1 26 1079 21 Jan 2005
16 >Галиаскаров Э.Г. (edart) 13 103 25 0 25 36 22 Jan 2005
17 X L. (LoDes) 17 17 22 1 23 1149 21 Jan 2005
18 >Шугаева А.С. (Яна) 9 25 21 0 21 741 22 Jan 2005
19 Пестровский А.Ю. (Marcell) 9 34 19 0 19 541 22 Jan 2005
20 Mitin A. (Andrew_) 11 11 19 0 19 1211 21 Jan 2005

Изучаем SQL

Трехзначная логика и предложение Where

Рассмотрим следующий пример. Пусть требуется определить корабли с неизвестным годом спуска на воду.

Если мы напишем

SELECT * FROM Ships WHERE launched = NULL

Как бы ни казалось это странным, но мы не получим ни одной записи, даже если такие корабли там есть. Поскольку в доступной базе данных нет кораблей с неизвестным годом спуска на воду, давайте их создадим, чтобы вы могли проверить справедливость данного утверждения:

SELECT * FROM
(
   SELECT name, launched, CASE WHEN launched < 1940 THEN NULL ELSE launched END year
        FROM Ships
) x
WHERE year = NULL

Здесь мы добавили в подзапросе поле year, которое содержит NULL, если корабль был спущен на воду до 1940 года.

Итак, почему мы ничего не получили? Здесь следует вспомнить о том, что в SQL (и вообще в реляционной теории) используется трехзначная логика, т.е. истинностным значением операции сравнения может быть не только TRUE (истина) и FALSE (ложь), но и UNKNOWN (неизвестно). Это обусловлено существованием NULL-значения, сравнение с которым и дает это истинностное значение. Это интуитивно понятно, если держать в уме, что NULL-значение используется для замены неизвестной информации. Если мы спросим: "Является ли годом спуска на воду корабля Бисмарк 1939 год"? Ответом будет: "Не знаю". Так как у нас нет информации в базе данных о годе спуска на воду этого корабля. Это "не знаю" и есть UNKNOWN.

Что происходит, если в предложении WHERE мы используем сравнение с NULL-значением явно или неявно (NULL-значением в сравниваемом столбце)? Запись попадает в результирующий набор, если предикат дает истинностное значение TRUE. И все, т.е. при FALSE или UNKNOWN запись не попадает в результат. Именно поэтому мы ничего и не получили в приведенном выше примере, поскольку для всех строк мы получаем UNKNOWN.

Так как же получить список кораблей с неизвестным годом спуска на воду? Для этого в стандарте SQL имеется специальный предикат IS NULL (и обратный ему IS NOT NULL). Истинностным значением этого предиката не может быть UNKNOWN, т.е. год либо известен (FALSE), либо неизвестен (TRUE). Тогда для решения нашей задачи можно написать:

SELECT * FROM Ships WHERE launched IS NULL

Это стандарт. А что же реализации? Все сказанное выше справедливо для SQL Server. Однако это не единственная возможность. Видимо, чтобы сделать программирование на SQL более привычным для тех, кто пользуется традиционными языками программирования, можно отключить стандартную трактовку NULL-значений (по умолчанию включено) с помощью соответствующей установки параметра ANSI_NULLS:

SET ANSI_NULLS OFF|ON

Напишите в Query Analyzer следующий код, и вы все поймете:

SET ANSI_NULLS OFF
SELECT * FROM
(
    SELECT name, launched, CASE WHEN launched < 1940 THEN NULL ELSE launched END year
        FROM Ships
) x
WHERE year = NULL

Продолжение следует...

§ Приведенные здесь примеры можно выполнить непосредственно на сайте, установив флажок "Без проверки" на странице с упражнениями на SELECT.

Контакты

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

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

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.db.sqlex
Отписаться

В избранное