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

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


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

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

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

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

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

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


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

§ Сравнив число подписчиков рассылки с числом участников рейтинга, решил выкладывать последний выпуск на сайте для чтения онлайн.
Тем более, что проходит некоторое время, прежде чем статья/перевод появляется на sqlbooks.ru.
Адрес странички будет постоянный, меняться будет лишь содержимое.

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

§ Новые лица в ТОР 100 и вернувшиеся туда:
Sysa (128, 23.994)
serge77777 (125, 19.773)
Лори (124, 27.194)

§ Продвинулись в рейтинге:
Shadow77 (137, 13.103)
Bulldozer (136, 184.320)
iglbeat (133, 18.841)
Чумазик (127, 79.422)
Kos123 (126, 28.956)
zjor (125, 95.555)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
125. Robin (117, 164.209)
139. comrade (114, 140.781)
153. Leshik (110, 25.904)
160. Gendalf (109, 78.278)
189. andrij (107, 17.008)

§ На этой неделе сертифицированы:
Sysa (B08023918) [AR] - г.Воронеж, Россия
lexaNRJ (B08015593) [AR] - г.Москва, Россия
serge77777 (B08022465) [AR] - г.Санкт-Петербург, Россия
MaoDzeDOOM (A08025475) [BK] - г.Москва, Россия
denvk (A08005520) [BK] - г.Москва, Россия
Flok (A08024904) [BK] - г.Москва, Россия

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

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

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

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

Лучшие результаты (ТОР 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 15 Feb 2008
2 Креславский О.М. (Arcan) 146 12 21 357 367 22.436 12.553 28 01 Feb 2008 15 Feb 2008
3 Карасёва Н.В. (vlksm) 145 12 21 354 636 53.277 26.801 25 01 Feb 2008 15 Feb 2008
4 Голубин Р.С. (Roman S. Golubin) 145 12 21 354 897 92.541 58.822 25 01 Feb 2008 13 Feb 2008
5 Белогурова К. (Katy_Ekb) 142 12 21 344 257 9.559 4.673 18 06 Feb 2008 15 Feb 2008
6 Войнов П.Е. (pаparome) 143 12 21 346 891 3.013 .213 17 01 Feb 2008 15 Feb 2008
7 Любченко В.А. (IAS56) 141 145 21 342 497 253.551 95.835 17 14 Jan 2008 13 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 15 Feb 2008
10 Солдатенков Ю.С. (SolYUtor) 140 142 21 339 490 17.852 2.695 14 20 Sep 2007 15 Feb 2008
11 Шептунов П.П. (Dzen) 140 142 21 339 279 8.130 3.499 14 02 Oct 2007 15 Nov 2007
12 Мурашкин И.В. (lepton) 141 12 21 340 690 15.737 5.539 14 11 Feb 2008 11 Feb 2008
13 Держальцев В.А. (MadVet) 142 134 21 343 1024 39.622 7.309 14 04 Feb 2008 15 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 11 Feb 2008
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 15 Feb 2008
18 Агапов В. (KERBEROS) 133 141 20 323 89 6.140 1.262 11 20 Nov 2006 27 Jul 2007
19 Кувалкин К.С. (Cyrilus) 140 12 21 337 1172 12.779 2.519 11 09 Feb 2008 09 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 Фадеев В.А. (dot) 57 56 109 34 143 764 15 Feb 2008
2 Лицкалов Д.О. (litmit) 55 55 106 34 140 765 14 Feb 2008
3 Диденко Т. (Tey) 51 51 96 19 115 1192 15 Feb 2008
4 >Егоров А.Б. (ABEgorov) 54 97 114 0 114 197 15 Feb 2008
5 Lepin P. (Pbl) 42 42 79 34 113 1225 15 Feb 2008
6 Рёвин Т.Т. (Revin) 58 58 110 2 112 1243 12 Feb 2008
7 >Пестерев А. (PandNsk) 58 58 110 0 110 1272 15 Feb 2008
8 Kondratov (hvint) 53 53 100 0 100 1515 13 Feb 2008
9 >Кротов О. (MadUser) 43 55 92 0 92 1387 15 Feb 2008
10 Balobanov D. (HerrDmitry) 48 48 91 0 91 1829 15 Feb 2008
11 >Штерн А.Е. (HD82) 46 46 86 2 88 1922 15 Feb 2008
12 Koshevarov D.V. (Asterlinta) 46 46 86 0 86 1972 13 Feb 2008
13 Казанцев К.В. (Кирилл) 43 43 82 0 82 2098 12 Feb 2008
14 Гречкин А.А. (Ander) 36 51 79 0 79 1206 12 Feb 2008
15 >Dolzhenkov D.V. (DDV) 40 40 77 0 77 2247 15 Feb 2008
16 shadrunov O.N. (shadon) 27 27 49 26 75 2347 15 Feb 2008
17 >Enikeev (m-e) 34 47 74 0 74 1927 15 Feb 2008
18 >Усков Д.Б. (Денис Усков) 37 37 70 0 70 2565 15 Feb 2008
19 Ижевский А.Е. (iz) 36 36 68 0 68 2662 12 Feb 2008
20 Цыбанков Ю. (jurgen) 35 35 67 0 67 2741 15 Feb 2008
21 >Бойко Е.В. (Zjizik) 29 50 66 0 66 1571 15 Feb 2008
22 >Гончаренко М.А. (Goncharenko) 33 33 57 9 66 2794 15 Feb 2008
23 Попов А. (Zzzz) 34 34 63 0 63 2963 14 Feb 2008
24 Макунин А.А. (Макунин Алексей) 35 35 60 3 63 2971 15 Feb 2008
25 Чернышенко Д.Н. (Longbow) 33 33 63 0 63 2972 14 Feb 2008
26 >Borisov (чумАданщик) 32 32 60 0 60 3156 15 Feb 2008

Изучаем SQL

Сортировка и коллации, чувствительные к регистру

Louis Davidson (оригинал: Sorting and case sensitive collations )
Перевод Моисеенко С.И.

Этот материал - дополнение к странице 255 моей книги в конце раздела, посвященного коллации (естественно перед сообщением о том, что я не буду копаться глубже в коллациях :)). Я хочу добавить немного информации о коллациях (схемах сопоставления), в частности, о том, как они влияют на сортировку и поиск.

Вы можете загрузить все приложение с исходным кодом отсюда: Pro SQL Server 2005 Database Design and Optimization Homepage

Сортировка и поиск

Одно из наиболее путаных свойств коллации - это то, как они влияют на упорядочивание данных при сортировке, и как это может повлиять на такие операторы как LIKE. В случае нечувствительных к регистру коллаций все довольно ясно, данные сортируются так, будто 'A' и 'a' являются одним и тем же символом. Еще один общий случай - нечувствительность к акценту, когда 'a' и 'á' воспринимаются как один символ. Когда Вы используете нечувствительные к регистру и акценту коллации, не будет никакой гарантии, что при сортировке данных какой-либо из этих символов попадет в начало списка. Более того, когда Вы выполняете поиск с помощью '%A %', то без проблем получите: aardvark, Abel, Pená.

В некоторых ситуациях нежелательно, чтобы это имело место, и тогда Вы настраиваете столбец, таблицу или базу данных, чтобы они были чувствительными к регистру и к акценту. Именно в этом случае Вас может поставить в тупик использование between, like или запросов других типов на диапазонах символов.

В качестве примера давайте создадим следующую таблицу и наполним ее небольшим количеством символов:

 

create table dbo.TestSorting
(
     value nvarchar(1) collate Latin1_General_CI_AI
)
insert into dbo.TestSorting
select 'A'
union all
select 'a'
union all
select nchar(256) --Ā
union all
select 'b'
union all
select 'B'

 

Выполнение обычного нечувствительного к регистру поиска, использующего базовую коллацию:

 

select value
from dbo.TestSorting
where value like '[A-Z]%'

 

Все строки возвращаются, как и ожидалось:

value
-----
A
a
Ā
b
B

Проблема возникает, когда Вы хотите выполнить чувствительный к регистру поиск. Вы выбираете чувствительную к регистру коллацию, и либо указываете ее в предложении WHERE, либо в определении вашей таблицы:

 

select value
from dbo.TestSorting
where value like '[A-Z]%' collate Latin1_General_CS_AI

 

Этот запрос вернет что-то непонятное:

value
-----
A
Ā
b
B

Каждый, кто делает это впервые, думает "Почему?" Я тоже не являюсь исключением (фактически, именно поэтому я и написал этот раздел книги!). Ключ к разгадке находится в том, как сортируются значения в этой коллации:

 

select value
from dbo.TestSorting
order by value collate Latin1_General_CS_AI

 

value
-----
a
Ā
A
b
B

Чувствительность к регистру сортирует так aAbBcC, а не так, как интуитивно представляет себе большинство из нас - программистов: ABCabc. Фактически так работает бинарная коллация, поскольку она сортирует символы на основе значения символа ASCII или Unicode. Использование бинарной коллации работало бы, но тогда Вы теряете возможность включить специальные символы в ваш поиск, которую дает использование нечувствительности к акценту.

Вместо этого Вы можете просто использовать LIKE, например:

 

select value
from dbo.TestSorting
where value like '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%' collate Latin1_General_CS_AI

 

Этот запрос возвращает только заглавные буквы, включая акцентируемую заглавную букву, которая у нас есть.

value
-----
A
Ā
B

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

Сначала в данных, которые у вас есть в таблице. Вот пример, если Вы хотите посмотреть, как выполняется сортировка данных в двоичной коллации:

 

select value
from dbo.TestSorting
order by value collate Latin1_General_bin

 

value
-----
A
B
a
b
Ā

Кроме того, у меня есть запрос, который я использую с этой целью. Этот запрос генерирует интересующие меня символы, чтобы я мог посмотреть, как они сортируются

 

;with digits (i) as( select 1 as i union all select 2 as i union all select 3 union all
                           select 4 union all select 5 union all select 6 union all select 7 union all
                           select 8 union all select 9 union all select 0)
,sequence (i) as (
                           SELECT D1.i + (10*D2.i) + (100*D3.i) + (1000*D4.i) + (10000*D5.i)
                           FROM digits AS D1 CROSS JOIN digits AS D2 CROSS JOIN digits AS D3
                                        CROSS JOIN digits AS D4 CROSS JOIN digits as D5
)
select i, nchar(i) as character
from sequence
where i between 48 and 122 -- меняйте здесь, чтобы включить любые символы в выбранном наборе символов
order by nchar(i) collate Latin1_General_bin

 

20-05-2007

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

§ Хочу порекомендовать вам интересный компьютерный журнал Cooler и его автора Александра Чижова.

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

 

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

Контакты

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

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

В избранное