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

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


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

http://www.sql-ex.ru

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

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

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

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

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


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

§ Добавил проверочных данных для задачи 17 (SELECT), поскольку проходила простая подгонка результата (замечено tamb).
Родион1976 обнаружил прореху и в достаточно "проработанной" задаче 98. И тут меры уже приняты ;-).

§ Testo оправдал наши ожидания и занимает второе место, показав на 138 задаче лучший пока результат около 3 дней. Итоговые показатели - задач 138, время 6.716.
Итого на третьем этапе уже может выступить 7 человек. Немного, ну так и третьего этапа пока еще нет :-).

§ В сотне появился новый участник - Alexey Spirin (97, 1.319).

§ Сохранили шансы попасть в ТОР 10:
a2010 (108, 3.222)

§ Продолжили свое восхождение к вершине:
gps (124, 194.166)
f.nietzsche (121, 25.796)
arm (121, 33.019)
Lord Nick (121, 25.298)
Blur (109, 60.987)
Gosha (108, 21.271)
ds (98, 28.831)

§ На этой неделе сертифицированы:
Robert Tappan Moris (A06006154) [BK] (Россия, г.Москва)
Dealer (A06009822) [BK] (Россия, г.Долгопрудный МО)
f.nietzsche (B06005269) [AR] (Россия, г.Новосибирск)

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 LastSolved LastVisit
1 Кувалкин К.С. (Cyrilus) 138 138 20 320 484 5.460 23 Mar 2006 02 Jun 2006
2 Slobodcicov A.N. (Testo) 138 138 20 320 252 6.716 01 Jun 2006 02 Jun 2006
3 Kamaev V.M. (Heromantor) 138 138 20 320 128 9.066 14 Mar 2006 25 Mar 2006
4 Бураков С.Г. (burakov58) 138 138 20 320 419 17.395 24 Mar 2006 07 Apr 2006
5 Тарасов Д.Б. (Gavrila) 138 138 20 320 208 19.424 22 Mar 2006 02 Jun 2006
6 Голубин Р.С. (Roman S. Golubin) 138 138 20 320 210 20.835 16 Mar 2006 02 Jun 2006
7 Валуев Д.И. (Fiolent) 138 113 20 320 971 48.000 02 May 2006 02 Jun 2006
8 Войнов П.Е. (pаparome) 137 137 20 316 203 1.769 15 Mar 2006 02 Jun 2006
9 Зверев Д.Л. (dimzv) 137 137 20 316 869 3.278 22 Mar 2006 04 Apr 2006
10 Юлдашев М.Р. (Snowbear) 137 137 20 316 239 3.448 14 Mar 2006 02 Jun 2006
11 Абашин П.И. (Dizil) 137 137 20 316 203 3.776 15 Mar 2006 22 May 2006
12 Самохвалов В. (ValdemarES) 137 137 20 316 117 7.788 14 Mar 2006 01 Jun 2006
13 Мурашкин И.В. (lepton) 137 137 20 316 25 7.943 17 Apr 2006 30 May 2006
14 Носков Н.В. (niko2) 137 137 20 316 274 8.472 06 Apr 2006 16 May 2006
15 Крижевич С.А. (yaff) 137 137 20 316 259 14.801 16 Mar 2006 05 May 2006
16 Иванов А.Н. (Goapsy) 137 137 20 316 128 16.076 18 Mar 2006 01 Jun 2006
17 Держальцев В.А. (MadVet) 137 137 20 316 357 18.639 08 Apr 2006 15 Apr 2006
18 Зырин В.Е. (Vezyr) 137 137 20 316 63 20.618 17 Mar 2006 30 May 2006
19 Страшников А.С. (EffEct) 137 137 20 316 305 59.972 16 Mar 2006 02 May 2006
20 Матвеева Ю.Б. (Julia_M) 137 137 20 316 137 68.931 24 Mar 2006 24 May 2006

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Черный Ю.В. (Crab) 41 41 74 1 75 1137 28 May 2006
2 >Кормалев Д. (D.K.) 41 41 74 0 74 1162 02 Jun 2006
3 Картошкин Д.Б. (KJB) 37 43 64 9 73 1064 02 Jun 2006
4 >Вязовецков А.С. (alex_v) 40 40 73 0 73 1182 02 Jun 2006
5 Юрченко (rosomaha) 40 40 71 0 71 1243 01 Jun 2006
6 Суслов Д.В. (Platon) 27 55 56 9 65 581 02 Jun 2006
7 >Hakimov R.I. (sCandal) 35 35 63 0 63 1405 02 Jun 2006
8 >- -.-. (cleradz) 30 30 53 9 62 1442 02 Jun 2006
9 Сергеев В.В. (v.v.s.) 25 25 40 19 59 1535 01 Jun 2006
10 Давкова Е. (Yelena) 30 30 54 2 56 1641 01 Jun 2006
11 Wahi S. (Wahi) 30 30 55 1 56 1646 02 Jun 2006
12 Карасёва Н. (vlksm) 17 91 36 19 55 144 02 Jun 2006
13 >Бруцкий Ю.В. (YuryBr) 28 28 49 4 53 1723 02 Jun 2006
14 Denisov (DOS) 27 51 52 0 52 915 01 Jun 2006
15 Пересыпкин М.А. (Ingie) 29 29 52 0 52 1749 01 Jun 2006
16 singh S. (babli) 29 29 52 0 52 1756 01 Jun 2006
17 Das A. (munu) 29 29 52 0 52 1757 02 Jun 2006
18 Uutma H. (Hardi) 31 31 52 0 52 1763 01 Jun 2006
19 Спичин Е.Н. (Lening) 25 33 50 0 50 1538 02 Jun 2006
20 sathish P.S. (philip) 28 28 49 1 50 1825 30 May 2006
21 >Красных О.В. (Banap) 24 44 49 0 49 1127 02 Jun 2006
22 Болгов В.В. (vaso82) 28 28 49 0 49 1862 29 May 2006
23 >Горскин О.В. (Goro) 27 27 46 0 46 1979 02 Jun 2006
24 >Иванов (teko) 29 29 46 0 46 1984 02 Jun 2006

Изучаем SQL

Умножение и деление чисел типа NUMERIC

Mat (оригинал: Multiplication and Division with Numerics )
Перевод Моисеенко С.И.

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

declare @num1 numeric(38,10)
declare @num2 numeric(38,10)
set @num1 = .0000006
set @num2 = 1.0
select cast( @num1 * @num2 as numeric(38,10))

Дает: .0000010000
Вместо: .0000006000

Почему?

Ну, BOL (смотри Precision, Scale и Length) определяет следующие правила для арифметических операций c числами типа NUMERIC:

Операция Точность результата Масштаб результата *
e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 * e2 p1 + p2 + 1 s1 + s2
e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1)
e1 { UNION | EXCEPT | INTERSECT } e2 max(s1, s2) + max(p1-s1, p2-s2) max(s1, s2)

В нашем случае точность и масштаб умножения вычисляется так:

Точность = P1 + P2 + 1 = 38 + 38 + 1 = 77
Масштаб = S1 + S2 = 10 + 10 = 20

Соответственно, результатом должно быть число типа numeric(77, 20), что не допускается. Вот где нам понадобится сноска:

* Точность и масштаб результата имеет абсолютный максимум 38. Если точность результата превышает 38, соответствующий масштаб уменьшается, чтобы предотвратить усечение целой части результата.

BOL в настоящий момент не вдается в подробности того, как выполняется усечение.

Поскольку точность превышает 38, мы постараемся избежать усечения целой части значения уменьшением масштаба (вместо этого усекая дробную часть значения). Каким количеством масштаба пожертвовать? Здесь нет правильного ответа. Если оставить слишком много, то будет потерян результат умножения больших чисел. Если оставить слишком мало, умножение малых чисел станет проблемой.

В SQL Server 2005 RTM (и предыдущих версиях) мы решили оставить минимальный масштаб - 6 как для умножения, так и деления. Поэтому наше numeric(77,20) усекалось до numeric(38,6), а затем приводилось к numeric(38,10). Однако это было сделано слишком поздно, и некоторые данные были потеряны. Это объясняет результат, который вы можете увидеть выше.

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

declare @num1 numeric(18,10)
declare @num2 numeric(18,10)
set @num1 = .0000006
set @num2 = 1.0
select cast( @num1 * @num2 as numeric(38,10))

тип результата должен быть numeric(37,20). Поскольку точность и масштаб типа не превышает наших текущих пределов, неявное усечение не проводится. Затем мы приводим результат к numeric(38,10), что не вызывает потери данных в нашем случае.

Если вы не можете точно типизировать значения, участвующие в умножении и делении, например, если они являются параметрами процедуры, которая вызывается с большим разбросом значений, возможно, стоит обратить внимание на приближенные числовые типы (float, real) или определить свой собственный "высокоемкий" пользовательский точный числовой тип данных, используя CLR.

Я надеюсь, что это было полезно для вас. Дайте нам знать, если вы хотите прочитать о чем-то конкретно.

29/03/2006

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

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

§ Поступила в продажу книга SQL. Задачи и решения, посвященная анализу ошибок, допускаемых при решении задач первого этапа. На сайте издательства Питер можно сделать заказ и познакомиться с содержанием.

Контакты

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

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

В избранное