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

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


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

Выпуск 279 от 30 января 2010 г.

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

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

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

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

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


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

§ Поднял сложность задачи 143 до 5 баллов. Рейтинг пересчитал.

§ Под номером 132 выставил новую 3-х бальную задачу от risp. Это привело к ряду перестановок:
- старая задача 132 теперь имеет номер 123;
- старая задача 123 теперь имеет номер 43;
- старая задача 43 теперь имеет номер 18;
- старая задача 18 перенесена на обучающий этап.
Второй этап теперь начинается с задачи 43.
Под номером 57 выставил новую 2-х бальную задачу от Ozzy.
Cтарая задача 57 теперь имеет номер 10.
Cтарая задача 10 перенесена на обучающий этап.
Под номером 140 выставлена задача от _bkmz_ (сложность 2).
Старая задача 140 открыла новый раздел "Головоломки", который начинается с номера 251.
Трансферное окно закрыто. :-) До конца апреля - начала мая задач, влияющих на сертификацию, выставлять не планирую. Буду собирать.
Авторы могут сосредоточиться на 3-м и на обучающем этапах. :-)

§ В формулировку задачи 163 добавлено определение, дабы не гуглить. :-)
Уточнена также формулировка задачи 43. Почему-то задача не вызывала вопросов, когда называлась 123. :-)

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
Смена лидера!
1. vlksm (163)
24. _yizraor (143)
62. Валдай (142)

§ Продвинулись в рейтинге:
66. risp (135, 17.851)
69. Allex (133, 90.174)
70. silver (131, 50.263)

§ Новые лица в ТОР 100 и вернувшиеся туда:
96. vasya29 (121, 9.342)
98. GrImago (119, 25.949)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
103. ARF (118, 53.727)
115. Magnetic (117, 250.961)
136. uon (112, 291.280)
139. antihero (110, 20.778)
180. IrishkaS (120, 104.680)

§ На этой неделе сертифицированы:
risp (A10043034) [BK] - г. Москва, Россия
serghei z (A10057973) [BK] - г. Valby, Дания
risp (B10043034) [AR] - г. Москва, Россия

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

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

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

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

На обучающем этапе - 10035

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Карасёва Н.В. (vlksm)1 162 251 22 401 1361 127.027 93.974 72 26 Jan 2010 29 Jan 2010
2 Яцук А.А. (Faust_zp)2 162 251 22 401 1087 121.516 95.322 72 26 Jan 2010 28 Jan 2010
3 Креславский О.М. (Arcan)1 162 251 22 401 1093 118.959 95.812 72 27 Jan 2010 29 Jan 2010
4 >Зотов П.Г. (Ozzy)1 162 57 22 400 690 197.605 209.129 72 29 Jan 2010 29 Jan 2010
5 Дроздков А.Н. (anddros)5 157 251 22 388 594 8.034 8.368 64 11 Jan 2010 29 Jan 2010
6 Сальников С.А. ($erges)1 156 251 22 385 686 5.729 5.749 61 12 Jan 2010 29 Jan 2010
7 Умрихина Е.В. (Umrikhina)1 150 251 22 372 488 41.244 47.651 61 25 Aug 2009 29 Sep 2009
8 Сенкевич С.В. (GreyC)1 133 251 21 337 612 57.718 26.238 41 07 Oct 2009 01 Jan 2010
9 Селезнёв А.С. (Артём С.)1 130 251 21 329 444 47.221 34.492 41 25 Jan 2009 03 Mar 2009
10 >Тарасов Д.Б. (Gavrila)10 146 251 22 357 1617 67.326 35.630 37 29 Jan 2010 29 Jan 2010
11 Никотин В.М. (@Nikotin)1 134 251 21 334 471 8.335 3.704 35 11 Dec 2009 23 Jan 2010
12 Печатнов В.В. (pvv)1 141 251 21 343 679 36.963 19.888 33 28 Aug 2009 29 Jan 2010
13 Мурашкин И.В. (lepton)1 126 251 21 314 1139 69.439 58.709 32 05 May 2009 14 Dec 2009
14 Муллаханов Р.Х. (rem)9 136 251 22 334 649 14.598 20.041 29 20 Jun 2009 03 Aug 2009
15 Анисимов Д. (danilko)13 139 160 22 332 32 12.700 9.542 28 12 Aug 2009 17 Aug 2009
16 Бойко Д.М. (Angellore)15 147 251 22 352 893 733.606 91.106 28 16 Jan 2010 28 Jan 2010
17 Орлов М.В. (Eagleoff)15 145 251 22 350 621 43.567 18.016 26 29 Dec 2009 29 Jan 2010
18 Шиндин А.В. (AlShin)10 127 251 21 319 79 20.351 5.088 24 05 Jan 2009 27 Nov 2009
19 Держальцев В.А. (MadVet)7 120 251 21 300 1715 60.690 28.209 23 26 Dec 2009 26 Dec 2009
20 Любченко В.А. (IAS56)6 129 251 21 316 1048 419.368 138.580 23 18 Jul 2009 28 Jul 2009

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >A (Chesnok) 38 86 71 0 71 297 29 Jan 2010
2 Моников А.С. (sylar) 15 15 37 31 68 2231 25 Jan 2010
3 >Громов А.П. (grap) 30 30 66 1 67 2285 29 Jan 2010
4 Титов А.В. (asbestos) 15 21 37 19 56 2447 28 Jan 2010
5 Medvedev D.A. (second_try) 26 26 55 0 55 2957 23 Jan 2010
6 >Петрова (aser99) 21 21 44 3 47 3667 29 Jan 2010
7 Джура В.О. (Mexanik) 16 29 39 0 39 2652 27 Jan 2010
8 >Багдасарьян В.Д. (vasya29) 15 121 38 0 38 96 29 Jan 2010
9 Mikhailov S. (curiouser) 2 41 4 34 38 929 29 Jan 2010
10 Беспятов А. (lelik_b) 9 47 12 24 36 910 29 Jan 2010
11 Гвоздь (PavelGvozd) 0 0 34 34 28 Jan 2010
12 Ванин В. (_Virt_) 2 42 3 29 32 909 28 Jan 2010
13 xxx (}{elga) 18 35 32 0 32 1636 28 Jan 2010
14 Демидова К.А. (Demidova Kseniya) 0 26 0 27 27 1703 28 Jan 2010
15 >Litvinov A. (Litvin) 1 16 1 24 25 2555 29 Jan 2010
16 >Звонова Т.С. (Звончик) 15 44 22 1 23 1612 29 Jan 2010
17 Алексеев (mindanaoabv) 1 1 1 22 23 6906 28 Jan 2010
18 >Семака (tolikas) 10 105 22 0 22 197 29 Jan 2010
19 Фомченков В.Н. (hamp) 11 83 20 0 20 460 29 Jan 2010
20 Kyrgyzbay (aldarkoso) 0 0 19 19 29 Jan 2010

Изучаем SQL

Функция LEN(), концевые пробелы и уникальность

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

Недавно я столкнулся с тем, что не смог добавить два значения типа VARCHAR, отличающиеся только концевым пробелом в столбец составного первичного ключа (SQL Server 2008). Возможно, этот факт для кого-то является очевидным, но мне показалось странным, что в принципе разные значения считаются дубликатами.

Со значениями типа CHAR(n), который имеет фиксированную длину, все понятно, т.к. короткие строки дополняются пробелами до длины n. Поэтому вводимые значения, которые отличаются лишь концевыми пробелами, оказываются неразличимыми. Но концевой пробел в значении типа VARCHAR является как бы обычным символом.

Вот простой эксперимент.

CREATE TABLE Test_Trailing_Space2
(
num int NOT NULL,
name VARCHAR(10) NOT NULL,
PRIMARY KEY(num, name)
)
GO
INSERT INTO Test_Trailing_Space2
 VALUES(1, 'John')
INSERT INTO Test_Trailing_Space2
 VALUES(1, 'John ')
GO

Вторая строка не будет вставлена в таблицу, при этом будет получено сообщение о нарушении ограничения первичного ключа. Т.е. вторая строка считается дубликатом первой. Может быть дело в том, что при вставке концевой пробел был отсечен. Но нет, вставим другую уникальную строку с концевым пробелом и проверим наличие в ней концевого пробела:

INSERT INTO Test_Trailing_Space2
 VALUES(2, 'John ')
GO
SELECT *, LEN(name) len1,DATALENGTH(name) len2
FROM Test_Trailing_Space2
 
Результат:
num name    len1    len2 
1 John 4 4
2 John  4 5

Значение в столбце len2 показывает, что пробел присутствует в данных, но, тем не менее, значения 'John' и 'John ' считаются дубликатами:

SELECT DISTINCT name
FROM Test_Trailing_Space2
 
name
John

Очевидно, что все дело в функции LEN(), которая, как известно, не учитывает концевые пробелы. Я не нашел этой информации в BOL, но, видимо, именно эта функция используется при сравнении значений любых строковых типов.

Мне стало интересно, как ведут себя другие СУБД в этом случае, и я повторил эксперимент для MySQL и PostgreSQL. Были получены следующие результаты.

MySQL (версия 5.0)

SELECT *, OCTET_LENGTH(name) AS len1, LENGTH(name) AS len2
FROM Test_Trailing_Space2;
 
1 John 4 4
2 John  5 5
 
SELECT DISTINCT name FROM Test_Trailing_Space2;
 
John

PostgreSQL (версия 8.3.6)

SELECT *, OCTET_LENGTH(name) AS len1, LENGTH(name) AS len2 FROM Test_Trailing_Space2;
 
1;"John";4;4
2;"John ";5;5
 
SELECT DISTINCT name FROM Test_Trailing_Space2;
"John"
"John "

Как видно, и MySQL, и PostgreSQL учитывают пробел как в числе символов, так и в числе байтов, используемых для хранения строкового значения. При этом MySQL и SQL Server, в отличие от PostgreSQL, считают строки, различающиеся лишь концевыми пробелами, дубликатами. Естественно, PostgreSQL позволяет вставить и такую строку в рассматриваемую таблицу:

INSERT INTO Test_Trailing_Space2
 VALUES(1, 'John ');

Вместо выводов.

Я далек от того, чтобы высказываться относительно правильности той или иной реализации и, тем более, спорить о том, какая СУБД лучше. Я считаю, что нужно знать досконально ту СУБД, которую вы используете в своей профессиональной деятельности. Изучайте документацию и все подвергайте проверке, не полагаясь на интуицию и "здравый" смысл. :

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

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

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

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

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

Контакты

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

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

В избранное