2-й час
Структура данных

На этом уроке мы рассмотрим структуру данных, о которых шла речь в конце предыдущего урока. Вы ознакомитесь с характеристиками самих данных и с тем, как такие данные представлены в базе данных. Как вы вскоре обнаружите, данные могут быть нескольких типов.

Основными на этом уроке будут следующие темы.

• Анализ размещенных в таблице данных

• Основные типы данных

• Рекомендации по использованию основных типов данных

• Примеры, раскрывающие различия между типами данных

  Что такое данные?

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

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

Данные являются основой любой базы данных, и они должны быть защищены. Такую защиту обычно осуществляет администратор базы данных, хотя и каждый пользователь базы данных должен осознать, что необходимо принять определенные меры для защиты данных. Защита данных подробно обсуждается в ходе урока 18, "Управление доступом к базе данных", и урока 19, "Обеспечение сохранности данных".

  Основные типы данных

В следующих разделах обсуждаются основные типы данных, поддерживаемые стандартом ANSI SQL. Типы данных являются характеристиками самих данных, чьи атрибуты размещаются прямо в соответствующих полях таблицы. Например, можно указать, что некоторое поле должно содержать только числовые значения, и это не позволит вводить буквенно-числовые значения, когда, например, вы не хотите, чтобы последние появлялись в поле, предназначенном для хранения денежных значений.

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

Самыми общими типами в SQL, как и в большинстве других языков, являются

• символьные строки;

• числовые строки;

• значения даты и времени.

  Строки фиксированной длины

Строки фиксированной длины —- это строки, длина которых фиксирована и постоянна. В SQL они стандартно определяются следующим образом:

CHARACTER:n

где n должно быть числом, задающим длину (точнее, максимальную длину) соответствующего поля.

Некоторые реализации SQL для определения строк фиксированной длины используют тип данных CHAR. Этот тип данных предполагает хранение буквенно-числовых данных. Такой тип данных годится, например, для хранения аббревиатур штатов, поскольку все такие аббревиатуры предполагаются двухбуквенными.

При использовании строк фиксированной длины для заполнения незанятых позиций обычно используются пробелы. Например, если длина строки задана равной 10, а введенные данные занимают лишь пять позиций, то оставшиеся пять мест будут заполнены пробелами. Такое дополнение обеспечивает фиксированную длину всех данных соответствующего поля.

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

  Строки переменной длины

SQL поддерживает строки переменной длины. Стандартное определение строк переменной длины в SQL выглядит так:

CHARACTER VARYING(n)

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

Обычными типами данных для строк переменой длины являются VARCHAR и VARCHAR2. VARCHAR соответствует стандарту ANSI и используется, например, в Microsoft SQL Server, a VARCHAR2 используется Oracle, чтобы не зависеть от возможных изменений VARCHAR в будущем. Этот тип данных предполагает хранение буквенночисловых значений.

Не забывайте, что строки фиксированной длины предполагают заполнение оставшихся пустыми позиций пробелами, а строки переменной длины — нет. Например, если для строки переменной длины выделено 10 позиций, а введенные данные занимают всего пять, то это введенное значение и займет всего 5 позиций. Пробелы для заполнения остальных позиций в столбце использоваться не будут.

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

  Числовые значения

Числовые значения хранятся в полях, определенных как некоторого типа числа и обычно имеющих атрибуты типа NUMBER, INTEGER, REAL, DECIMAL и т. п. Стандартными для SQL являются следующие значения:

BIT(П)

BIT VARYING (n)

DECIMAL(p,S)

INTEGER

SMALLINT

FLOAT(p)

REAL(s)

DOUBLE PRECISION(p)

где p представляет число позиций, выделяемых для соответствующего поля (его максимальную длину), a s задает число позиций справа от десятичного разделителя.

Общим числовым типом данных для всех реализаций SQL является NUMBER, что соответствует рекомендациям ANSI для числовых значений. Числовые значения могут быть нулевыми, положительными, отрицательными, с фиксированной точкой или плавающей точкой. Вот пример использования оператора NUMBER:

NUMBER(5)

Здесь вводимые в поле значения ограничиваются сверху максимальным значением 99999.

  Десятичные значения

Десятичные значения — это числовые значения, в которых используется десятичная точка (десятичный разделитель). Вот стандартный оператор SQL для определения десятичного типа данных, где р задает точность, as — масштаб числа:

DECIMAL(p,s)

Точность — это общая длина числового значения. Например, определение DECIMAL(4,2) задает для числовых значений точность, равную 4, что соответствует общему числу позиций, выделенному для хранения числа.

Масштаб — это число знаков справа от десятичного разделителя. В предыдущем примере DECIMAL (4,2) масштаб задается равным 2.

Если в поле, определенное как DECIMAL (3,1), ввести значение 34 .33, то введенное значение округлится до 34.3.

Если для значений в поле при определении назначен тип DECIMAL (4, 2), это значит, что значения, хранимые в поле, будут ограничены сверху числом 99.99.

Точность 4 задает общую длину соответствующего числового значения. Масштаб 2 задает число знаков или байтов, отведенных для дробной части числа (справа от десятичного разделителя). Сам десятичный разделитель здесь как символ не учитывается.

Например, для столбца, определенного как DECIMAL (4,2), допустимыми будут следующие значения:

12

12.4

12.44

12. 449,

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

  Целые

Целое значение — это числовое значение, не содержащее дробной части (оно может быть как положительным, так и отрицательным). Вот несколько примеров целых значений.

1 п

99

-99

199

  Десятичные значения с плавающей точкой

Десятичные значения с плавающей точкой (float-point decimals) — это десятичные значения, чьи точность и масштаб имеют переменную длину и практически не имеют предела. Для таких значений допустимы любые точность и масштаб. Тип данных REAL используется для определения столбца с десятичными числами (с плавающей точкой) обычной точности, а тип данных DOUBLE PRECISION соответствует десятичным числам (с плавающей точкой) двойной точности. Чтобы значение считалось значением обычной точности, его точность должна задаваться числом от 1 до 21 включительно, а для значений двойной точности она должна быть между 22 и 53 включительно. Вот несколько примеров использования типа данных FLOAT:

FLOAT FLOAT(15) FLOAT(50)

  Значения даты и времени

Тип данных даты и времени, очевидно, используется для хранения информации о датах и времени. Стандарт SQL поддерживает соответствующие типы данных, называемые DATETIME, которые представлены следующими конкретными типами:

DATE TIME

INTERVAL ТIMESTAMP

Тип данных TIMESTAMP состоит из следующих элементов:

YEAR

MONTH

DAY

HOUR

MINUTE

SECOND

Элемент SECOND содержит также доли секунды. Диапазон его изменения от 00.000 до 61.999, хотя отдельные реализации SQL могут поддерживать другой диапазон.

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

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

  Буквальные значения

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

Обычно для буквальных значений тип данных не объявляется — просто указывается нужная строка. Вот несколько примеров:

'Hello'

45000

"45000"

3.14

' 1 ноября 1997'

Здесь буквенно-числовые строки заключены в одиночные кавычки, а, например, значение 45000 — нет. Обратите также внимание на то, что второе значение 45000 заключено в обычные кавычки. Вообще говоря, строки символов требуют заключения их в кавычки, а числовые значения — нет. Позже вы узнаете, как используются буквальные значения в запросах к базе данных.

  Значения NULL

Как вы уже знаете из урока 1, значение NULL означает пропущенное значение или поле в строке данных, которому не было присвоено значения. Значение NULL используется в SQL почти повсюду — при создании таблиц, условий поиска в запросах и даже в буквальных строках.

Для значения NULL можно использовать следующие две формы ссылки на него.

• NULL (ключевое слово NULL)

• ' ' (два знака одиночной кавычки и ничего между ними)

Следующая строка не представляет значения NULL, а представляет строку, содержащую символы N-U-L-L:

'NULL'

  Значения типа BOOLEAN

Значения типа BOOLEAN (логические значения) могут принимать значения TRUE (истина), FALSE (ложь) или NULL. Значения типа BOOLEAN используются для сравнения данных. Например, если в запросе заданы несколько критериев, каждое из заданных условий оценивается и им присваиваются значения TRUE, FALSE или NULL. Соответствующие данные включаются в ответ на запрос только тогда, когда для всех условий возвращается логическое значение TRUE. Если же среди возвращенных значений будут либо FALSE, либо NULL, данные в ответ на запрос могут не"включаться.

Рассмотрим следующий пример.

WHERE NAME = 'SMITH'

Такая строка вполне может быть одним из условий в запросе. Тогда условие оценивается для каждой строки данных той таблицы, которой адресован запрос, и если оказывается, что значением NAME является SMITH, условие получает значение TRUE, и запрос возвращает ассоциированные с соответствующей записью данные.

  Пользовательские типы данных

Пользовательский тип данных — это тип данных, определяемый пользователем. Пользовательские типы данных дают возможность строить свои типы данных на основе уже имеющихся. Для создания такого типа данных используется оператор CREATE TYPE. Например,

CREATE TYPE PERSON AS OBJECT

(NAME VARCHAR2(30),

SSN VARCHAR2(9));

Ссылаться на определенный таким образом пользовательский тип данных можно так:

CREATE TABLE EMP_PAY (EMPLOYEE PERSON, SALARY NUMBER(10,2), HIRE_DATE DATE);

Обратите внимание на то, что для первого столбца с именем EMPLOYEE задан тип данных PERSON, являющийся пользовательским типом данных, созданным в первом примере.

ALTER DOMAIN MONEY_D

ADD CONSTRAINT MONEY__CON1

CHECK (VALUE > 5};

Сослаться на домен можно так:

CREATE TABLE EMP__PAY

(EMP_ID NUMBER(9),

EMP_NAME VARCHAR2(30),

PAY_RATE MONEY_D);

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

  Резюме

SQL предлагает несколько типов данных. Если у вас есть опыт программирования на других языках, многие из этих типов данных покажутся вам знакомыми. Типы данных позволяют хранить в базе данных различные по своей природе данные от любых символов до десятичных чисел, значений дат и времени. Подход к разделению данных на типы во всех языках одинаков — и при работе с переменными в языках третьего поколения типа С, и при работе с реляционными базами данных с помощью SQL. Хотя в каждой реализации SQL для стандартных типов данных используются разные имена, работают они практически одинаково.

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

  Вопросы и ответы

Почему можно вводить числа (например, идентификационный код) в поля, определенные как строки символов?

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

Я никак не могу понять разницу между типами данных фиксированной длины и переменной длины. Можно ли получить более подробные объяснения?

Скажем, фамилия некой персоны определена как тип данных фиксированной длины с заданной длиной 20 байт. Предположим также, что это фамилия Смит. После ввода данных в таблицу окажутся занятыми все 20 байт: 4 займет фамилия и 16 — пробелы (так как тип данных предполагается фиксированной длины). Если же использовать тип данных переменной длины с максимальной длиной 20 байт, то введенная фамилия Смит займет ровно 4 байта.

  Практикум

Задания практических занятий разделены на тесты и упражнения. Тесты предназначены для проверки общего уровня понимания рассмотренного материала. Упражнения дают возможность применить на практике идеи, обсуждавшиеся в ходе текущего урока, в комбинации с идеями из предыдущих уроков. Мы рекомендуем ответить на тестовые вопросы и выполнить упражнения прежде, чем продолжать дальнейшее чтение книги. Ответы можно про'верить по Приложению Б, "Ответы".

  Тесты

1. Верно ли утверждение: "Индивидуальный идентификационный код может быть любым из следующих типов данных: символьным фиксированной длины, символьным переменной длины или числовым?"

2. Верно ли утверждение: "Масштаб числового значения — это максимальная допустимая для значения длина?"

3. Все ли реализации используют одинаковые типы данных?

4. Какими для определенных ниже типов данных являются точности и масштабы значений?

DECIMAL(4,2) DECIMAL(10,2) DECIMAL(14,1)

5. Какие из следующих данных могут быть введены в столбец, тип данных которого DECIMAL(4,1)? а. 16.2 б. 116.2 в. 16.21 г. 1116.2 Д. 1116.21

  Упражнения

1. Рассмотрите следующие имена столбцов и выберите для них подходящий тип данных и подходящую длину.

a ssn

б state

в. city

г. phone_number

д. zip

е. last__name

ж. firs t_name

з middle_narre

и. salary

к. houriy_pay_rate

л. date_hired

2. Для столбцов с теми же именами решите, следует ли для них определить значения NULL или NOT NULL. Обратите внимание на то, что в некоторых случаях, когда для столбца предусмотрено NOT NULI, значением соответствующего поля в строке может быть NULL, и наоборот 

a ssn 

б state 

в city 

г. phone_number 

д. zip 

е. last_name 

ж. first_name 

з. middle_name 

и. salary 

к hourly_pay_rate 

л. date_hired