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

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


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

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

http://www.sql-ex.ru

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

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

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

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


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

§ Как я услышал в теленовостях, на Украине (в Киеве) открыт филиал российского Внешторгбанка. Наш счет находится именно в этом банке. Надеюсь, что теперь будет меньше проблем с оплатой сертификатов :-).

§ Футбольная база с данными ЧМ 1930 доступна для скачивания: http://msi77.narod.ru/downld.html

§ Поспела страница сертифицированных специалистов. Посмотреть можно здесь: http://sql-ex/users_page.php?cs=4

§ Добавлены проверочные данные для 39 задачи. Огрех в проверке замечен Oleon'ом.

§ s обнаружил вариант данных, блокирующий его же неверное решение задачи 75. Соответствующие данные добавлены в проверочную базу.

§ По просьбе VIG в описании предметной области БД "Аэрофлот" отмечено то, что рейсы выполняются ежедневно. Это оказалось не вполне очевидным, и некоторые участники в задачах, где требовалось подобрать рейс, использовали таблицу Pass_in_trip вместо Trip. Замечу, что таблицу Trip следует трактовать как расписание (ежедневных) рейсов, а таблицу Pass_in_trip - как информацию о перевозках пассажиров.
Заодно решил последовать совету murzic, и в описании этой БД каждую таблицу разместил для наглядности на отдельной строке. 17-ти дюймовые мониторы уже давно не диковинка, так что будем оптимизировать размещение информации под них :-).

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 LastSolved LastVisit
1 Колосов А.С. (KAS) 137 137 20 311 25 3.441 11 Mar 2005 26 Mar 2005
2 Кувалкин К.С. (Cyrilus) 137 137 20 311 102 4.896 06 Mar 2005 25 Mar 2005
3 Сныткин В.Л. (Ded I) 136 136 20 307 202 7.445 23 Mar 2005 26 Mar 2005
4 Валуев Д.И. (Fiolent) 136 136 20 307 556 19.425 13 Mar 2005 26 Mar 2005
5 Hakobyan H.H. (hamlet) 136 136 20 307 161 37.812 09 Mar 2005 14 Mar 2005
6 Галиаскаров Э.Г. (Galogen) 136 136 20 307 109 52.933 11 Mar 2005 24 Mar 2005
7 Мельникова И.А. (Iris_m) 136 136 20 307 301 66.951 09 Mar 2005 25 Mar 2005
8 Шипунов И. (IAS) 136 136 20 307 265 82.049 05 Mar 2005 21 Mar 2005
9 Зверев Д.Л. (dimzv) 135 136 19 304 450 2.291 27 Jan 2005 28 Jan 2005
10 Иткин И.Л. (joseph_itkin) 135 136 20 304 375 2.853 07 Mar 2005 23 Mar 2005
11 Spirin (spirin) 134 136 19 301 158 13.467 21 Jan 2005 24 Jan 2005
12 Леденев С.А. (Shurgenz) 132 136 19 299 146 8.298 11 Jan 2005 25 Mar 2005
13 Михайлов В.Г. (mslava) 135 136 17 298 648 10.512 25 Mar 2005 25 Mar 2005
14 Пятница О.А. (Robin) 128 128 20 292 754 74.640 19 Mar 2005 20 Mar 2005
15 >Рахманов И.Е. (bloom) 124 124 20 284 102 10.069 26 Mar 2005 26 Mar 2005
16 Gershovich (VIG) 121 121 20 277 732 8.218 13 Mar 2005 26 Mar 2005
17 Якутин Н.В. (ZrenBy) 132 136 6 275 511 3.991 14 Sep 2004 18 Jan 2005
18 Рассказов А. (ra) 120 121 19 274 70 29.764 28 Jan 2005 25 Feb 2005
19 Губарь Д.К. (DEathkNIghtS) 120 124 17 272 23 1.046 03 Nov 2004
20 Смирнов А. (Leshich) 120 124 17 272 205 84.171 30 Sep 2004 19 Nov 2004

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Токмаков С.С. (mK.PatRioT) 59 59 106 30 136 254 24 Mar 2005
2 Pakhomov D. (Philin ) 58 58 103 17 120 301 25 Mar 2005
3 Черницын А.Ю. (KapCher) 51 57 96 1 97 307 25 Mar 2005
4 Семафоров (tet) 35 55 68 17 85 342 26 Mar 2005
5 Леонтьев О.В. (Oleon) 35 64 62 19 81 162 25 Mar 2005
6 >Стуков А.С. (Memento) 42 42 74 0 74 471 26 Mar 2005
7 Арсентьев В.В. (Graff) 43 48 70 3 73 467 23 Mar 2005
8 Шерстнев С.Б. (Seb) 45 45 71 0 71 500 24 Mar 2005
9 >Koberidze M. (kobra) 31 59 57 9 66 274 26 Mar 2005
10 Титов Д.В. (Deonisy) 33 34 58 3 61 624 25 Mar 2005
11 Грановская (gyuol) 38 38 51 9 60 703 25 Mar 2005
12 Зотеев А.В. (Awas) 30 44 54 0 54 512 25 Mar 2005
13 Alickin D.J. (Blade Runner) 28 28 49 5 54 716 20 Mar 2005
14 Gontovoy (noname) 13 79 30 23 53 92 26 Mar 2005
15 Семенов О.А. (olegs) 29 57 53 0 53 308 22 Mar 2005
16 noname N.N. (SP1/1) 31 31 52 0 52 685 25 Mar 2005
17 Кубанов Н.Х. (Тигр) 28 47 51 0 51 488 26 Mar 2005
18 >Хайрова В.Р. (venera) 17 59 44 4 48 266 26 Mar 2005
19 Family N.O. (Dantist1) 14 59 35 13 48 284 23 Mar 2005
20 Пономарев А.Г. (andy194) 20 34 44 0 44 623 25 Mar 2005
21 Мочалов А.В. (MAVi) 25 37 43 0 43 599 26 Mar 2005
22 >Томилин (rocknroll) 26 26 43 0 43 820 26 Mar 2005
23 Субботин А.М. (c[InIMat]ic) 25 25 40 1 41 866 26 Mar 2005
24 Gerehov D.A. (D_AGe) 14 51 28 11 39 400 26 Mar 2005
25 Романов В. (Vladir) 13 62 28 9 37 221 24 Mar 2005
26 Францкевич Г.И. (George040875) 23 23 34 3 37 1016 25 Mar 2005
27 Царицын С.С. (s) 12 78 28 6 34 95 25 Mar 2005
28 Кучнова Л.П. (OlgaKLP) 14 49 34 0 34 420 24 Mar 2005
29 Кривошеев В. (shatl) 23 23 34 0 34 978 23 Mar 2005
30 Mikhailov D.Y. (daemonhome) 16 23 27 5 32 1009 25 Mar 2005
31 >Баранов М.А. (horseman) 21 21 29 3 32 1171 26 Mar 2005
32 Коряковский А.В. (w3er) 26 26 30 0 30 1135 24 Mar 2005

Изучаем SQL

Функции работы со строками в SQL SERVER 2000 (продолжение, начало в вып.24)

Функция

REPLACE ( <строка1> , <строка1> , <строка1> )

Заменяет в строке1 все вхождения строки2 на строку3. Эта функция, безусловно, полезна в операторах обновления (Update), если нужно изменить (исправить) содержимое столбца. Пусть, например, нужно заменить все пробелы дефисом в названиях кораблей. Тогда можно написать

UPDATE Ships
SET name = REPLACE(name, ' ', '-')

(Этот пример можно выполнить на странице с упражнениями DML, где разрешаются запросы на изменение данных)

Однако эта функция может найти применение и в более нетривиальных случаях. Давайте определим, сколько раз в названии корабля используется буква "a". Идея проста: заменим каждую искомую букву двумя любыми символами, после чего посчитаем разность длин полученной и искомой строки. Итак,

SELECT name, LEN(REPLACE(name, 'a', 'aa')) - LEN(name) FROM Ships

А если нам нужно определить число вхождений произвольной последовательности символов, скажем, передаваемой в качестве параметра в хранимую процедуру? Использованный выше алгоритм в этом случае следует дополнить делением на число символов в искомой последовательности:

DECLARE @str AS VARCHAR(100)
SET @str='ma'
SELECT name, (LEN(REPLACE(name, @str, @str+@str)) - LEN(name))/LEN(@str) FROM Ships

Для удвоения числа искомых символов здесь применялась конкатенация - @str+@str. Однако для этой цели можно использовать еще одну функцию - REPLICATE, которая повторяет первый аргумент такое число раз, которое задается вторым аргументом.

SELECT name, (LEN(REPLACE(name, @str, REPLICATE(@str, 2))) - LEN(name))/LEN(@str) FROM Ships

Т.е. мы повторяем дважды подстроку, хранящуюся в переменной @str.

Если же нужно заменить в строке не определенную последовательность символов, а заданное число символов, начиная с некоторой позиции, то проще использовать функцию STUFF:

STUFF ( <строка1> , <стартовая позиция> , <L> , <строка2> )

Эта функция заменяет подстроку длиной L, которая начинается со стартовой позиции в строке1 на строку2.

Пример. Изменить имя корабля: оставив в его имени 5 первых символов, дописать "_" (нижнее подчеркивание) и год спуска на воду. Если в имени менее 5 символов, дополнить его пробелами.

Можно решать эту задачу с помощью разных функций. Мы же попытаемся это сделать с помощью функции STUFF.

В первом приближении напишем (ограничимся запросом на выборку):

SELECT name, STUFF(name, 6, LEN(name), '_'+launched) FROM Ships

Третьим аргументом (количество символов для замены) я использую LEN(name), т.к. мне нужно заменить все символы до конца строки, поэтому я беру с запасом - исходное число символов в имени. И все же этот запрос вернет ошибку. Причем дело не в третьем аргументе, а в четвертом, где выполняется конкатенация строковой константы и числового столбца. Ошибка приведения типа. Для преобразования числа к его строковому представлению можно воспользоваться еще одной встроенной функцией - STR:

STR ( <число с плавающей точкой> [ , <длина> [ , <число десятичных знаков> ] ] )

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

STR(3.3456, 5, 1)         3.3
STR(3.3456, 5, 2)       3.35
STR(3.3456, 5, 3)     3.346
STR(3.3456, 5, 4)     3.346

Обратите внимание, что если полученное строковое представление числа меньше заданной длины, то добавляются лидирующие пробелы. Если же результат больше заданной длины, то усекается дробная часть (с округлением); в случае же целого числа получаем соответствующее число звездочек "*":

STR(12345,4,0)     ****

Кстати, по умолчанию используется длина в 10 символов. Имея в виду, что год представлен четырьмя цифрами, напишем

SELECT name, STUFF(name, 6, LEN(name), '_'+STR(launched, 4)) FROM Ships

Уже почти все правильно. Осталось учесть случай, когда число символов в имени менее 6, т.к. в этом случае функция STUFF дает NULL. Ну что ж вытерпим до конца мучения, связанные с использованием этой функции в данном примере, попутно применив еще одну строковую функцию.

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

SPACE(<число пробелов>):

SELECT name, STUFF(name + SPACE(6), 6, LEN(name), '_'+STR(launched,4)) FROM Ships

(Окончание следует...)

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

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

§ Мы выставили наш сайт на конкурс Интернить 2005. Победитель определяется числом поданых голосов. Просьба проголосовать. (рекомендуемая оценка 3 :-)).

Контакты

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

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

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

В избранное