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

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


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

Выпуск 230 от 21 февраля 2009 г.

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

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

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

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

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


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

§ Настойчивость Ozzy привела к тому, что комбинация "ctrl+enter" теперь работает на странице плана выполнения запроса. :-)

§ В рейтинге ТОР 100 и на форуме теперь дополнительно выводится лучшая позиция в рейтинге, которую когда-либо удалось достичь участнику. Поскольку такая информация раньше не сохранялась, то за основу была взята текущая позиция в рейтинге. Поэтому общайтесь, чтобы восстановить историческую справедливость. :-)

§ Исправил форматирование FAQ. Ошибка, на которую обратили внимание Bagyr и $erges, проявлялась в обрезании текста по правой границе страницы.

§ Ozzy серьезно отнесся к своим обязанностям по поддержке задачи 153.
Уже уточнена формулировка и добавлены проверочные данные. Еще одна порция данных на подходе. :-)

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
Смена лидера
1. $erges (151)
8. Ozzy (153)
10. lepton (152)
39. AKudrakov (145)

§ Продвинулись в рейтинге:
72. Nariman Kurbanoff (задач 128, время 103.180)
83. ValdemarES (126, 18.488)

§ Новые лица в ТОР 100 и вернувшиеся туда:
76. a66at (128, 5.234)
91. B o r i s (125, 181.463)
92. Pavel_yu (125, 246.125)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
142. -=ac=- (115, 61.146)
161. SCAT (115, 5.404)
173. _irina_ (113, 25.414)
184. Lohmatyi (111, 2.162)
189. GrImago (110, 14.787)
190. Elz (110, 10.809)

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

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

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

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

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

Лучшие результаты (ТОР 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)1 152 151 21 371 356 3.781 4.118 46 16 Feb 2009 20 Feb 2009
2 Сенкевич С.В. (GreyC)1 152 152 21 371 358 57.860 27.102 46 26 Jan 2009 20 Feb 2009
3 Селезнёв А.С. (Артём С.)1 150 152 21 365 444 47.248 37.524 46 25 Jan 2009 20 Feb 2009
4 Креславский О.М. (Arcan)1 152 152 21 371 707 59.893 41.017 46 06 Jan 2009 20 Feb 2009
5 Карасёва Н.В. (vlksm)1 152 152 21 371 975 79.787 50.723 46 05 Jan 2009 20 Feb 2009
6 Никотин В.М. (@Nikotin)1 150 150 21 365 108 8.371 3.751 40 13 Dec 2008 20 Feb 2009
7 Печатнов В.В. (pvv)1 146 149 21 352 357 30.849 17.490 36 10 Oct 2008 20 Feb 2009
8 Зотов П.Г. (Ozzy)8 144 153 21 348 341 93.533 111.247 36 14 Feb 2009 20 Feb 2009
9 Муллаханов Р.Х. (rem)9 149 152 21 360 483 14.427 20.056 35 05 Jan 2009 20 Feb 2009
10 Мурашкин И.В. (lepton)1 143 152 21 345 1059 68.203 57.718 33 14 Feb 2009 17 Feb 2009
11 Дроздков А.Н. (anddros)11 147 151 21 356 260 6.074 6.723 31 11 Feb 2009 20 Feb 2009
12 Шиндин А.В. (AlShin)12 147 150 21 355 79 20.458 7.203 30 05 Jan 2009 28 Jan 2009
13 Умрихина Е.В. (Umrikhina)13 146 146 21 353 295 13.521 15.879 28 13 Feb 2009 20 Feb 2009
14 Держальцев В.А. (MadVet)14 137 146 21 333 1257 60.783 28.482 28 24 Sep 2008 30 Dec 2008
15 Любченко В.А. (IAS56)15 136 146 21 332 615 403.343 373.617 28 11 May 2008 01 Dec 2008
16 Голубин Р.С. (Roman S. Golubin)16 141 145 21 338 1260 93.162 58.822 25 29 Jan 2009 08 Feb 2009
17 Nikolaenko A.V. (Shadow77)17 142 147 21 339 436 77.451 14.010 23 22 Oct 2008 11 Dec 2008
18 Солдатенков Ю.С. (SolYUtor)18 138 146 21 331 819 22.615 6.102 20 14 Aug 2008 23 Oct 2008
19 Белогурова К. (Katy_Ekb)19 133 143 21 321 552 10.666 4.673 18 27 Nov 2008 18 Jan 2009
20 Егоров А.Б. (ABEgorov)20 137 144 21 329 180 12.897 8.815 18 03 Aug 2008 12 Aug 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Ковальков М.К. (kamazoh) 37 48 79 0 79 1950 20 Feb 2009
2 >Froloff A. (inside1986) 40 40 76 3 79 2437 20 Feb 2009
3 >Филимонов А.В. (AFilAFil) 37 37 70 6 76 2605 20 Feb 2009
4 Хайруллин С. (JSerge) 34 34 64 9 73 2813 16 Feb 2009
5 Исланов (Naglec) 30 30 57 8 65 3390 20 Feb 2009
6 Vartencova I. (IrinaV) 26 26 48 11 59 3920 19 Feb 2009
7 Дроздовский С.В. (Arcus) 18 30 40 12 52 2952 19 Feb 2009
8 >Павленко Д.К. (Fantast) 24 76 49 0 49 433 20 Feb 2009
9 >Филипцов А.В. (Alpex) 25 25 47 0 47 5148 20 Feb 2009
10 Косолапов А.В. (Андрей Косолапов) 26 26 46 0 46 5259 19 Feb 2009
11 >Щербонос А.Н. (shcherbo) 24 24 38 0 38 6271 20 Feb 2009
12 >Голиков С.С. (Sergey) 8 45 13 23 36 1453 20 Feb 2009
13 Смирнов (smirnovpavel) 22 22 35 1 36 6477 16 Feb 2009
14 sumina (garfy) 15 26 35 0 35 5164 15 Feb 2009
15 >Токарев Е.Ю. (Gloom_T) 7 29 21 13 34 3307 20 Feb 2009
16 >Z E. (Elz) 13 110 33 0 33 190 20 Feb 2009
17 Кривочурова (Julie_) 20 20 31 0 31 7289 20 Feb 2009
18 >Малышко А. (Hruks) 20 20 30 0 30 7458 20 Feb 2009
19 Тотьмянин С.А. (SCAT) 10 115 27 0 27 161 20 Feb 2009
20 >Пыткин А.В. (aslin) 11 82 25 2 27 357 20 Feb 2009
21 >Котляров П.А. (antyblin) 19 19 27 0 27 8142 20 Feb 2009
22 Евтисов С.С. (Minimal) 12 88 23 0 23 309 19 Feb 2009
23 Chakraborty S. (Shub) 11 11 12 9 21 9330 19 Feb 2009
24 >Шапкин Р.Ю. (shar.nir) 10 23 20 0 20 6628 20 Feb 2009

Изучаем SQL

Как добавить новый столбец в таблицу между существующими столбцами?

Моисеенко С.И.

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

Я говорю "наивный", поскольку по определению атрибуты отношения не упорядочены, и обращение к значениям атрибута выполняется по его имени, но не по позиции. Что же касается языка SQL, то столбцы в таблице имеют порядок, который задается в операторе CREATE TABLE. Новый же столбец, который добавляется с помощью оператора ALTER TABLE, становится последним в таблице. Т.е. стандарт языка SQL не предусматривает возможности непосредственно добавить столбец в определенную позицию в списке столбцов.

Справедливости ради следует сказать, что некоторые реализации языка SQL расширяют стандарт в этом плане. Например, в MySQL в операторе ALTER TABLE вы можете указать позицию добавляемого столбца (новый столбец может стать первым или после указанного столбца).

Другой вопрос, а зачем это нужно? Мне приходит в голову такой вариант. Скажем, в клиентском приложении для генерации отчетов используется запрос типа


SELECT * FROM Employees
ORDER BY last_name, first_name;

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

Итак, имеется таблица Employees, которая создается следующим оператором:


CREATE TABLE Employees(
emp_num INT NOT NULL PRIMARY KEY,
first_name CHAR(30) NOT NULL,
last_name CHAR(30) NOT NULL
);

Теперь нам требуется добавить столбец middle_name (отчество) между столбцами first_name и last_name.

В MySQL это можно сделать просто:


ALTER TABLE Employees ADD COLUMN middle_name CHAR(10) NULL AFTER first_name;

В SQL Server так поступить нельзя, но можно использовать следующий алгоритм:

» создание новой таблицы требуемой структуры;
» копирование данных из таблицы Employees в эту новую таблицу;
» удаление таблицы Employees;
» переименование новой таблицы в таблицу с именем Employees.

Ниже приводятся операторы T-SQL, которые реализуют этот алгоритм.


-- Создаем временную таблицу требуемой структуры
CREATE TABLE Emp_temp(
emp_num INT NOT NULL PRIMARY KEY,
first_name CHAR(30) NOT NULL,
middle_name CHAR(30) NULL,
last_name CHAR(30) NOT NULL
);
GO
-- Копируем данные из старой таблицы в новую
INSERT INTO Emp_temp(emp_num, first_name, last_name)
SELECT * FROM Employees;
GO
-- Удаляем старую таблицу
DROP TABLE Employees;
GO
-- Переименовываем новую
EXEC sp_rename 'Emp_temp', 'Employees';
GO

Обратите внимание, что столбец middle_name допускает NULL-значения. Мы не можем добавить столбец в существующую таблицу (или, как в нашем случае, не задавая значения для этого столбца при копировании данных из таблицы Employees в таблицу Emp_temp), если он не имеет значения по умолчанию. Здесь мы принимаем по умолчанию значение NULL.

Мы можем выполнить два первых шага за одно действие с помощью оператора SELECT INTO, который "на лету" создает новую таблицу:


SELECT emp_num, first_name, CAST(NULL AS CHAR(30)), last_name
INTO Emp_temp
FROM Employees;

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

Если вы хотите проверить работу последнего скрипта, приведите таблицу в исходное состояние, удалив добавленный ранее столбец:


ALTER TABLE Employees DROP COLUMN middle_name;

Заметим, что при использовании оператора SELECT INTO теряются ключи. Поэтому нам придется добавить ограничение PRIMARY KEY (первичный ключ) либо во временную таблицу, либо уже в переименованную, чтобы получить в точности требуемую структуру:


ALTER TABLE Emp_temp
ADD CONSTRAINT emp_PK PRIMARY KEY(emp_num);

Аналогичный алгоритм можно применить и для перестановки уже существующих столбцов. Помимо указанной причины такая перестановка может повысить производительность, связанную с сокращением объема данных, записываемых в журнал транзакций в некоторых реализациях. Это связано со спецификой обработки строк фиксированной и переменной длины. Вот какие рекомендации по этому поводу дает Джо Селко*:

» помещайте первыми нечасто обновляемые столбцы постоянной длины;
» затем помещайте нечасто обновляемые столбцы переменной длины;
» последними помещайте часто обновляемые столбцы;
» ставьте рядом столбцы, которые, как правило, обновляются одновременно.

*Селко Д. Стиль программирования Джо Селко на SQL. - М.: Изд-во "Русская редакция"; СПб.: Питер, 2006

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

§ Приглашаем вас посетить новый проект - Интерактивный учебник по SQL.
   Ресурс позиционируется как "справочное обеспечение" для сайта SQL-EX.RU, но может использоваться и независимо от него.

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

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

§ Хотите поддержать проект? Вот инструкция по применению. :-)

Контакты

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

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

В избранное