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

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


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

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

http://www.sql-ex.ru

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

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

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

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


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

§ По итогам региональной конференции "Современные информационные технологии в образовании: Южный федеральный округ" (РГУ, 21-22 апреля 2005 г.) было принято решение рекомендовать использование сайта в учебном процессе.
На третьем году своего существования мы начинаем получать официальное признание:-).

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

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

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

Лучшие результаты (ТОР 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 21 Apr 2005
2 Кувалкин К.С. (Cyrilus) 137 137 20 311 102 4.896 06 Mar 2005 22 Apr 2005
3 Валуев Д.И. (Fiolent) 137 137 20 311 581 28.554 07 Apr 2005 22 Apr 2005
4 Галиаскаров Э.Г. (Galogen) 137 137 20 311 137 63.128 08 Apr 2005 13 Apr 2005
5 Мельникова И.А. (Iris_m) 137 137 20 311 324 89.881 01 Apr 2005 20 Apr 2005
6 Зверев Д.Л. (dimzv) 136 136 20 307 513 2.428 31 Mar 2005 31 Mar 2005
7 Gontovoy (noname) 136 136 20 307 35 6.987 20 Apr 2005 22 Apr 2005
8 Сныткин В.Л. (Ded I) 136 136 20 307 202 7.445 23 Mar 2005 22 Apr 2005
9 Рахманов И.Е. (bloom) 136 136 20 307 118 14.144 11 Apr 2005 22 Apr 2005
10 Hakobyan H.H. (hamlet) 136 136 20 307 161 37.812 09 Mar 2005 18 Apr 2005
11 Шипунов И. (IAS) 136 136 20 307 265 82.049 05 Mar 2005 31 Mar 2005
12 Иткин И.Л. (joseph_itkin) 135 136 20 304 375 2.853 07 Mar 2005 13 Apr 2005
13 Spirin (spirin) 134 136 19 301 158 13.467 21 Jan 2005 24 Jan 2005
14 Леденев С.А. (Shurgenz) 132 136 19 299 146 8.298 11 Jan 2005 12 Apr 2005
15 Михайлов В.Г. (mslava) 135 136 17 298 648 10.512 25 Mar 2005 25 Mar 2005
16 Пятница О.А. (Robin) 128 128 20 292 754 74.640 19 Mar 2005 10 Apr 2005
17 Gershovich (VIG) 122 122 20 280 764 10.557 14 Apr 2005 22 Apr 2005
18 Якутин Н.В. (ZrenBy) 132 136 6 275 511 3.991 14 Sep 2004 18 Jan 2005
19 Тортумашев Е.А. (Johnny) 120 120 20 274 167 17.343 28 Mar 2005 12 Apr 2005
20 Рассказов А. (ra) 120 121 19 274 70 29.764 28 Jan 2005 25 Feb 2005

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Skidan T.S. (tim_ss) 54 54 93 9 102 375 22 Apr 2005
2 Абретов (UncleSlonic) 52 52 90 3 93 393 22 Apr 2005
3 Iobidze D.A. (Davita) 38 98 83 0 83 50 23 Apr 2005
4 >Держальцев В.А. (MadVet) 46 46 74 0 74 509 22 Apr 2005
5 Shelest V.N. (Alex85) 20 59 53 19 72 295 22 Apr 2005
6 Рыжков А. (RagMan) 35 35 61 9 70 642 22 Apr 2005
7 Turkin A. (alekseiT) 38 38 65 0 65 581 22 Apr 2005
8 Матвеева (maxa) 25 59 37 21 58 318 22 Apr 2005
9 Юрков О. (BoeBoga) 30 30 55 3 58 718 19 Apr 2005
10 Симоненко Ю.В. (Faust05) 35 35 53 2 55 742 21 Apr 2005
11 Иванов М.А. (Миха) 36 36 50 0 50 768 20 Apr 2005
12 Golev (dmn_s) 25 25 41 9 50 911 22 Apr 2005
13 Меньшиков С.И. (Menya) 8 59 20 19 39 287 21 Apr 2005
14 Макеев И. (IgorM) 5 63 7 31 38 217 19 Apr 2005
15 Lyseyko V.I. (MuLan2) 24 44 38 0 38 563 22 Apr 2005
16 Морозов (defender) 2 59 5 32 37 272 19 Apr 2005
17 >Демченко А.В. (DAV) 24 24 37 0 37 993 23 Apr 2005
18 Белов (optimizm) 3 97 3 32 35 54 22 Apr 2005
19 >Gerehov D.A. (D_AGe) 15 89 32 0 32 83 23 Apr 2005
20 >Юра С.М. (Lord) 21 21 30 0 30 1204 23 Apr 2005

Изучаем SQL

Случайная выборка строк из таблицы в SQL Server 2000 (продолжение и, надеюсь, окончание)

Поступило первое опровержение (VIG). Оптимизм внушает то, что оно первое за 31 выпуск рассылки. Вспоминается старый анекдот о ребенке, который молчал лет до 5, и родители считали его немым. И вот однажды за обедом к нему в тарелку с супом попала муха. А он и говорит: "Мама, убери муху". "Так ты говорить умеешь? Что же ты раньше-то молчал?", - обрадовалась мать. "Так раньше все было нормально", - отвечает ребенок…

Суть опровержения заключается в том, что функция, генерирующая случайное число, имеется в T-SQL. Принося свои извинения за ошибочную информацию, предлагаю рассмотреть использование этой функции.

Итак, эта функция называется RAND и генерирует псевдослучайное число с плавающей точкой в диапазоне от 0 до 1.

Термин "псевдослучайное" означает, что такое число вычисляется с помощью некоторого арифметического алгоритма. Т.е. при одинаковых начальных условиях (входных параметрах) получаемое число будет одним и тем же. Эти начальные условия могут быть заданы явно с помощью аргумента функции, которым может быть любое число типа tinyint, int или smallint, или неявно. В последнем случае аргумент опускается, в результате чего начальное значение будет выбрано SQL Server.

Попробуем выполнить следующий запрос:

SELECT TOP 1 RAND(), RAND(350) FROM Product

Выполним этот запрос в QA. У меня получилось: 0.0485421339242268 и 0.72009490018203537. Могу с уверенностью утверждать, что первое число у вас другое, однако второе должно быть тем же самым, т.к. во втором случае мы задали начальное значение (350). Правда, с одной оговоркой, если при этом еще не используются параметры конкретного компьютера, на котором выполняется запрос. Я не могу дать исчерпывающую информацию по использованию данной функции. Например, о том, будет ли распределение таким образом получаемой случайной величины равномерным.
В связи с чем, я прошу поделиться информацией тех, кто ей обладает, чтобы опубликовать ее на страницах данной рассылки.

Попробуем теперь применить функцию RAND для задачи, рассмотренной в предыдущей рассылке, а именно, для выдачи двух случайным образом выбранных моделей:

SELECT TOP 2 model FROM Product
ORDER BY RAND(model)

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

SELECT model, RAND(model) FROM Product
ORDER BY RAND(model)

По причинам сокращения объема приведу их не все:

1001     0.73222496447112351
1002     0.73224359744238177
1003     0.73226223041363991
1004     0.73228086338489817
1005     0.73229949635615632
1006     0.73231812932741458
1007     0.73233676229867273

Я не знаю, какой алгоритм используется для вычисления случайного числа, однако могу утверждать, что функция RAND ведет себя монотонно в данном диапазоне номеров моделей. Потому у нас ничего и не получилось.

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

SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
     + (DATEPART(ss, GETDATE()) * 1000 )
     + DATEPART(ms, GETDATE()) )

Однако в таком виде запрос может быть использован только в медленно выполняющихся пакетах, чтобы неоднократное выполнение запроса происходило в не чаще, чем минимальная единица времени, используемая в запросе (миллисекунды). Очевидно, что использование этой функции в выборке модели не будет отвечать этому условию. Однако, если умножить аргумент на некоторый уникальный для модели идентификатор, то мы можем добиться успеха, что, собственно, и было предложено VIG (номер модели уникален в таблице Product):

SELECT model, RAND(model*(DATEPART(mm, GETDATE()) * 100000 )
     + (DATEPART(ss, GETDATE()) * 1000 )
     + DATEPART(ms, GETDATE())) FROM Product
ORDER BY model

Сравните результаты:

1001     0.4278393574257387
1002     0.88102794651359417
1003     0.33421654885756019
1004     0.78740513794541567
1005     0.24059374028938171
1006     0.69378232984289845
1007     0.14697093172120321

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

SELECT TOP 2 model FROM Product
ORDER BY RAND(model*(DATEPART(ss, GETDATE()) * 1000
     + DATEPART(ms, GETDATE())))

Субъективный вывод таков: Для решения рассматриваемой задачи проще и надежней использовать функцию NEWID(), которая гарантирует уникальность значений. Однако эти значения не являются числовыми. Поэтому там, где нужно получить именно число, следует обратить внимание на функцию RAND().

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

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

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

Контакты

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

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

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

В избранное