Итоги
няется удаление или для которой выполняется обновление, с использованием внешней ссылки. Но эти подзапросы не могут ссылаться на модифицируемую таблицу, имя ко
торой указано в предложении FROM.
В следующих главах будет рассмотрен вопрос создания новых таблиц.
175
г
Работаем на SQL
1.Предположим, существует таблица с именем Multicust, определения столбцов которой полностью совпадают с определениями таблицы Salespeople. Запишите
команду, которая вставляет в эту таблицу всех продавцов, имеющих более одно
го покупателя.
2.Запишите команду, которая удаляет всех покупателей, не имеющих в настоящее
время заказов.
3.Запишите команду, увеличивающую на 20% комиссионные всех продавцов, об щее количество заказов которых превышает $3,000.
(Ответы см. в приложении А.)
176
17
Глава 17. Создание таблиц
Задача этой книги- рассмотреть как можно больше проблем, связанных с обра
боткой информации на компьютере, начиная с наиболее часто встречающихся на практике, и постепенно переходя к более специфичным проблемам.
В этой главе обсуждаются проблемы создания, изменения и удаления таблиц. Речь пойдет об определениях таблиц, а не о данных, в них хранящихся. Реальная потреб
ность в выполнении этих операций может и не возникнуть, но следует на концепту
альном уровне иметь представление об этих операциях, что повышает компетентность пользователя в области применения SQL и в плане понимания приро ды используемых таблиц. Это относится к разделу SQL, называемому языком опреде ления данных (Data Definition Language - DDL), в котором происходит создание объектов SQL.
В этой главе обсуждается и другой тип объектов данных SQL - индексы, приме няемые для более эффективной организации поиска и для того, чтобы убедиться, что значения отличаются друг от друга. Подобные операции выполняются невидимо (без участия пользователя), но при попытке ввести значения в таблицу они могут отвер гаться (не восприниматься), так как не являются уникальными. Это означает, что хотя две строки могут иметь в поле одинаковое значение, попе все равно будет обладать
своим уникальным индексом, в противном случае происходит нарушение ограниче
ний целостности.
Команда CREATE TABLE
Таблицы определяются с помощью команды CREATE TABLE, создающей пустую таблицу - таблицу, не имеющую строк. Значения вводятся с помощью команды DML (языка манипулирования данными) INSERT (см. главу 15). Команда CREATE ТАВLЕ определяет имя таблицы и множество поименованных столбцов в указанном порядке. Для каждого столбца устанавливаются тип и размер. Каждая таблица должна иметь, по крайней мере, один столбец. Синтаксис команды CREATE TABLE:
CREATE TABLE <имя таблицы>
(<имя столбца> <тип данных> [(<размер>)], <имя столбца> <тип данных> [(<размер>)], ... );
Типы данных существенно различаются в разных програмVIных продуктах. Однако
в цепях совместимости со стандартом, они, как минимум, поддерживают стандартные
АNSI-типы. Они приводятся в приложении В.
Поскольку пробелы используются для разделения отдельных частей команд в SQL, их нельзя использовать как часть имени таблицы (либо как часть какого-либо другого объекта, например, индекса). Символ подчеркивания U наиболее часто используется для разделения слов в именах таблиц.
Значение аргу.,,.ента размера зависит от типа данных. Если он не указывается, то система установит значение автоматически. Вероятно, это наиболее удачное решение
для числовых значений, поскольку в данном случае все поля определенного типа име
ют один и тот же размер, что позволяет впоследствии не заботиться о совместимости
178
Индексы
по объединению. Использование аргумента размера с некоторыми числовыми типами является непростой задачей. Для хранения больших чисел вы должны убедиться, что
поле имеет достаточную длину.
Тип данных, для которого обязательно следует указывать размер, - это CHAR. В
данном случае аргумент размера - целое число, задающее максимальное число сим
волов, которые могут содержаться в поле. Реальное количество символов в поле мо жет изменяться от нуля (если в поле содержится NULL-значение) до заданного максимального значения. По умолчанию это 1, т.е. в поле может содержаться единст венный символ.
Таблицы принадлежат пользователю, который их создал, а имена этих таблиц долж ны различаться, как и имена столбцов, в пределах одной таблицы. Даже если различные таблицы принадлежат одному пользователю, они могут иметь одноименные столбцы. Примером такой ситуации является столбец с именем city, представленный в таблицах Salespeople и Customers. Пользователи, от,1ичные от владельца таблицы, ссылаются на
нее, указав имя владельца, непосредственно после которого следует точка, непосредст
венно за ней - имя таблицы. Например, на таблицу Employees, созданную Smith, лю бой другой пользователь ссьmается таким образом: Smith.Employees. Предположим, в данном случае Smith является идентификатором пользователя. В SQL предполагается, что имя пользователя может использоваться в качестве идентификатора.
Следующая команда позволяет создать таблицу Salespeople:
CREATE TABLE Salespeople
(snum |
integer, |
sname |
char( 10), |
city |
char( 10), |
comm |
decimal); |
Порядок столбцов в определении таблицы существенен, он определяет порядок, в котором задаются значения элементов строк. Определения столбцов не должны зада
ваться в отдельных строках, но они должны разделяться запятыми.
Индексы
Индекс (index) - это упорядоченный (в алфавитном или числовом порядке) спи сок содержимого столбцов или группы столбцов в таблице. Таблицы могут иметь большое количество строк и, поскольку строки задаются в любом произвольном по рядке, поиск их по значению какого-либо из полей может занять достаточно много времени. Индексы предназначены для решения этой проблемы и для объединения
всех значений в группы из одной или нескольких строк, отличных друг от друга.
В главе 18 будет рассмотрен более простой способ унификации значений, отсутство вавший в ранних версиях SQL, в которых для этих целей использовались только ин
дексы.
179