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

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


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

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

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

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

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

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


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

§ _Bkmz_ заметил расхождение результатов олимпийского рейтинга с непосредственным подсчетом мест по отдельным упражнениям. Расхождение было связано с тем, что из результатов второго исключались лица, подвергшиеся наказанию, т.к. эти результаты были получены не вполне честным путем. Привел рейтинги в соответствие.

§ Сделал отдельную проверочную базу для 93 задачи, добавив туда проверочные данные, которые предложил VetaleG. Многие решения, опубликованные на форуме, перестали проходить. Проверьте свои решения.
_Bkmz_ продолжил формирование проверочной базы для задачи 89.

§ Поменял вызывавшую многочисленные нарекания формулировку задачи 97 на предложенную WildSery.

§ Одна задача до третьего этапа осталась _Bkmz_ (задач 137, время 4.255) и Ozzy (задач 137, время 24.917).

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
9. Shadow77 (140, 147)
27. ABEgorov (139, 141, 142)

§ Новые лица в ТОР 100 и вернувшиеся туда:
88. Rash ST (125, 7.914)

§ Продвинулись в рейтинге:
41. Gendalf (135, 128.421)
43. avk (135, 70.489)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
105. shadon (123, 18.448)
117. Vendigo (121, 27.548)
120. HandKot_ (121, 189.263)
131. FanOfBeer (120, 122.516)
142. rage (116, 1.346) - второй результат на промежуточном этапе после $erges
143. Umrikhina (116, 2.055)
148. mz (116, 26.054)
168. KRS (111, 2.956)

§ На этой неделе сертифицированы:
Tokolist (A08035275) [BK] - г.Львов, Украина

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Сальников С.А. ($erges) 147 147 21 357 118 2.842 3.359 31 23 Jun 2008 24 Jul 2008
2 Креславский О.М. (Arcan) 147 147 21 357 517 37.671 27.498 31 30 Jun 2008 25 Jul 2008
3 Карасёва Н.В. (vlksm) 147 147 21 357 778 73.340 46.383 31 22 Jun 2008 25 Jul 2008
4 Печатнов В.В. (pvv) 146 146 21 354 257 19.426 6.326 28 02 Jul 2008 25 Jul 2008
5 Держальцев В.А. (MadVet) 142 146 21 347 1128 60.815 28.482 28 18 May 2008 23 Jun 2008
6 Любченко В.А. (IAS56) 142 146 21 347 615 403.439 373.617 28 11 May 2008 08 Jun 2008
7 Голубин Р.С. (Roman S. Golubin) 144 145 21 348 1044 92.981 58.822 25 27 Jun 2008 24 Jul 2008
8 Мурашкин И.В. (lepton) 144 146 21 347 839 37.289 26.815 21 09 Jul 2008 22 Jul 2008
9 Nikolaenko A.V. (Shadow77) 144 140 21 345 346 34.808 11.501 19 24 Jul 2008 25 Jul 2008
10 Белогурова К. (Katy_Ekb) 138 143 21 335 361 10.714 4.673 18 20 May 2008 08 Jul 2008
11 Войнов П.Е. (pаparome) 143 146 21 343 1034 3.103 .213 17 23 Jun 2008 25 Jul 2008
12 Северюхин Ю.А. (Venser) 134 142 21 326 335 4.925 .655 14 01 Feb 2008 04 Feb 2008
13 Борисенков Д.В. (xuser) 137 142 21 331 92 3.217 .926 14 02 May 2008 30 May 2008
14 Мишин С.А. (CepbIu) 140 142 21 335 69 9.772 2.148 14 26 Jun 2008 04 Jul 2008
15 Тарасов Д.Б. (Gavrila) 140 142 21 334 1054 23.637 2.501 14 15 Jul 2008 25 Jul 2008
16 Солдатенков Ю.С. (SolYUtor) 135 142 21 327 703 17.844 2.695 14 20 Apr 2008 25 Jul 2008
17 Кувалкин К.С. (Cyrilus) 135 142 21 327 1207 13.037 2.782 14 15 Mar 2008 01 Jul 2008
18 Шептунов П.П. (Dzen) 133 142 21 325 279 8.120 3.499 14 02 Oct 2007 15 Nov 2007
19 Селезнёв А.С. (Артём С.) 140 74 21 335 257 15.649 4.279 14 22 Jul 2008 22 Jul 2008
20 iglbeat (iglbeat) 142 142 21 340 336 28.490 6.641 14 15 Jul 2008 15 Jul 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Буланов П. (rage) 35 115 81 32 113 148 25 Jul 2008
2 М (dkm) 55 55 102 9 111 1317 24 Jul 2008
3 >marat (lMn) 58 58 108 2 110 1340 25 Jul 2008
4 >Слюсаренко А.А. (Al @xey) 49 62 98 0 98 1278 25 Jul 2008
5 Anonym J.N. (habdl) 40 51 84 0 84 1681 23 Jul 2008
6 pmv (mix@) 41 41 75 0 75 2549 25 Jul 2008
7 Зверев К.А. (!kaz!) 38 38 72 0 72 2704 22 Jul 2008
8 >Souc J. (sulo) 35 80 70 0 70 334 25 Jul 2008
9 >Dubrava V. (Cloun) 32 55 68 0 68 1517 25 Jul 2008
10 >Шишкинский А.А. (Shish) 28 41 62 0 62 2509 25 Jul 2008
11 >Shevyakov M. (Mikha) 26 88 61 0 61 272 25 Jul 2008
12 >Поляков А.Н. (Warri) 26 88 61 0 61 273 25 Jul 2008
13 Kolesen A. (imm0use) 21 45 42 19 61 1452 25 Jul 2008
14 Власов П.В. (Rider) 26 40 59 2 61 1746 25 Jul 2008
15 >Архипов (Nev1) 32 32 60 0 60 3476 25 Jul 2008
16 >Kuzmichev K. (God Like) 29 29 50 9 59 3550 25 Jul 2008
17 Лукашов В.В. (Vistor) 26 32 53 0 53 3546 22 Jul 2008
18 >Chernov S.A. (Serhio) 21 36 50 0 50 2885 25 Jul 2008
19 Рябчук В.В. (Hous) 7 30 18 31 49 1906 25 Jul 2008
20 >Худик П.И. (her) 27 27 49 0 49 4512 25 Jul 2008
21 >Черненко Н.В. (Chen) 23 66 43 4 47 582 25 Jul 2008
22 >Иваницкий Ю.И. (Аскана) 21 32 47 0 47 3563 25 Jul 2008
23 >Брыксин (dontaskme) 20 31 47 0 47 3565 25 Jul 2008
24 zv (VeraZv) 24 34 47 0 47 3569 24 Jul 2008
25 Илюхин П.Е. (Джинж) 26 26 47 0 47 4706 23 Jul 2008
26 Бычков Д.А. (ДмитрийАБ) 26 26 47 0 47 4712 25 Jul 2008
27 Markus A. (mkn) 26 26 46 0 46 4827 21 Jul 2008
28 Komyagina (cheerful) 19 30 43 0 43 3903 24 Jul 2008
29 >Федоров П.Д. (PavelF) 18 35 40 2 42 2725 25 Jul 2008
30 >Андрейченко (woox) 24 24 42 0 42 5292 25 Jul 2008
31 >Ivan J. (qpo) 25 25 42 0 42 5296 25 Jul 2008
32 >Игнатов А.Е. (Bucashic) 12 28 26 15 41 3097 25 Jul 2008
33 >Попов А. (~M.[i].X~) 18 43 37 3 40 2139 25 Jul 2008

Изучаем SQL

Столбцы Identity

Nigel Rivett (оригинал: Identity Columns )
Перевод Моисеенко С.И.

Определение

Столбец identity (идентичность, счетчик) имеет имя, начальное значение (seed) и шаг (step). Когда строка вставляется в таблицу, столбец получит текущее значение seed, увеличенное на шаг.

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

Создание и использование столбцов Identity

Создадим таблицу для примеров

CREATE TABLE #a(i INT IDENTITY(1,1), j INT)

Это обычный принимаемый по умолчанию способ использования identity. Аналогичный результат можно получить так:

CREATE TABLE #a(i INT IDENTITY, j INT)

Вставка строк...

INSERT #a SELECT 1
SELECT * FROM #a
i           j
----------- -----------
1           1

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

INSERT #a (j) SELECT 1
SELECT * FROM #a

i           j
----------- -----------
1           1
2           1

Отметим одну особенность использования identity . Если мы вставим дубликаты строк, они будут отличаться значением столбца identity. Identity также показывает порядок, в котором вставлялись строки.

Мы можем узнать текущее значение identity с помощью DBCC checkident...

DBCC checkident (#a)

Checking identity information: current identity value '2', current column value '2'.
(Проверка информации identity : текущая значение identity  '2', текущее значение столбца '2'.)

Таким образом, текущим значением счетчика является 2; напомним, что следующим значением будет текущее значение плюс шаг.

Неудавшиеся вставки

BEGIN TRAN
INSERT #a (j) SELECT 1
ROLLBACK TRAN
SELECT * FROM #a

i           j
----------- -----------
1           1
2           1

DBCC checkident (#a)
Checking identity information: current identity value '3', current column value '3'.
(Проверка информации identity : текущая значение identity  '3', текущее значение столбца '3'.)

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

Замечание. Следующее значение - это шаг, добавленный к текущему значению; а не максимальное значение в таблице и даже не шаг от последнего или максимального значения.

INSERT #a (j) SELECT 1
SELECT * FROM #a
i           j
----------- -----------
1           1
2           1
4           1

Данная ситуация обычно случается, когда происходит нарушение ограничений индекса на j.

Исходные значения для Seed и Step

Заметим, что начальное значение и шаг могут быть любыми целыми числами

CREATE TABLE #b (i INT IDENTITY(-7,5), j INT)
INSERT #b (j) SELECT 1
INSERT #b (j) SELECT 1
INSERT #b (j) SELECT 1
SELECT * FROM #b
i           j
----------- -----------
-7          1
-2          1
3           1
CREATE TABLE #c (i INT IDENTITY(1,-3), j INT)
INSERT #c (j) SELECT 1
INSERT #c (j) SELECT 1
INSERT #c (j) SELECT 1
SELECT * FROM #c
i           j
----------- -----------
1           1
-2          1
-5          1

Вставка определенных значений Identity

Мы можем вставить определенное значение identity, чтобы избежать сгенерированного значения. Для этого выполните команду SET IDENTITY_INSERT #a ON и укажите явно список столбцов.

SET IDENTITY_INSERT #a ON
INSERT #a (i,j) SELECT 2,2
SET IDENTITY_INSERT #a OFF
SELECT * FROM #a

i           j
----------- -----------
1           1
2           1
4           1
2           2

Помните, что identity не гарантирует уникальность? Мы теперь имеем 2 строки со значением счетчика 2.

А что произошло с seed?

DBCC checkident (#a)

Checking identity information: current identity value '4', current column value '4'.
(Проверка информации identity : текущая значение identity  '4', текущее значение столбца '4'.)

Отметьте, что на это значение не повлияла предыдущая вставка. Попробуем вставить большее значение...

SET IDENTITY_INSERT #a ON
INSERT #a (i,j) SELECT 10,3
SET IDENTITY_INSERT #a OFF
SELECT * FROM #a
i           j
----------- -----------
1           1
2           1
4           1
2           2
10          3

DBCC checkident (#a)

Checking identity information: current identity value '10', current column value '10'.
(Проверка информации identity : текущая значение identity  '10', текущее значение столбца '10'.)

На сей раз значение seed изменилось; это произошло потому, что было вставлено значение, которое превышало текущее значение seed. Оно будет увеличиваться, но не уменьшаться.

Но что случится, если шаг отрицателен?

SELECT * FROM #c

i           j
----------- -----------
1           1
-2          1
-5          1

DBCC checkident (#c)
Checking identity information: current identity value '-5', current column value '-5'.
(Проверка информации identity : текущая значение identity  '-5', текущее значение столбца '-5'.)

Замечание: шаг равен -3.

SET IDENTITY_INSERT #c ON
INSERT #c (i,j) SELECT -8,2
SET IDENTITY_INSERT #c OFF

SELECT * FROM #c
i           j
----------- -----------
1           1
-2          1
-5          1
-8          2

DBCC checkident (#c)
Checking identity information: current identity value '-8', current column value '-8'.
(Проверка информации identity : текущая значение identity  '-8', текущее значение столбца '-8'.)
SET IDENTITY_INSERT #c ON
INSERT #c (i,j) SELECT 10,2
SET IDENTITY_INSERT #c OFF
SELECT * FROM #c

i           j
----------- -----------
1           1
-2          1
-5          1
-8          2
10          2

DBCC checkident (#c)

Таким образом, обновление seed учитывает знак шага.

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

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

§ Мы принимаем участие в конкурсе Ростовских сайтов. Голосовать можно один раз в день, если, конечно, есть желание :-).
Чтобы голосовать требуется авторизация.

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

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

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

Контакты

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

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

В избранное