Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТИПЫ ДАННЫХ.doc
Скачиваний:
6
Добавлен:
09.09.2019
Размер:
123.39 Кб
Скачать

ТИПЫ ДАННЫХ

В спецификации SQL:признаны пять предопределенных, общих типов, внутри которых могут быть подтипы:

строковый (символьный):

  1. • CHARACTER (ИЛИ CHAR);

  2. • CHARACTER VARYING (ИЛИ VARCHAR))

  3. • CHARACTER LARGE ОВЮЕСТ (ИЛИ CLOB);

ЧИСЛОВОЙ:

точные числовые типы:

    1. INTEGER;

    2. SMALLINT;

    3. BIGINT;

    4. NUMERIC;

    5. DECIMAL;

приблизительные числовые типы:

  1. REAL;

  2. DOUBLE PRECISION;

  3. FLOAT;

логический (булевский) — BOOLEAN;

даты-времени:

  1. • DATE;

  2. • TIME WITHOUT TIME ZONE;

  3. • TIME WITH TIME ZONE;

  4. • TIMESTAMP WITHOUT TIME ZONE;

  5. TIMESTAMP WITH TIME ZONE;

интервальный.

Интервалы

  1. YEAR — год;

  2. MONTH — месяц;

  3. DAY — день;

  4. HOUR — час;

  5. MINUTE — минута;

  6. SECOND — секунда.

Кроме того, существуют особые типы:

Row (запись),

ARRAY (массив) и

MULTISET (мультимножество).

В следующем примере на основе типа ROW создается тип addr, а затем он назначается столбцу Адрес при создании таблицы клиенты.

CREATE ROW TYPE addr

(

PostCode VARCHAR (9),

City VARCHAR (30),

Street VARCHAR (30),

House VARCHAR (10)

);

CREATE TABLE клиенты

(

ID_клиента INTEGER PRIMARY KEY,

Имя VARCHAR ( 2 5 ),

Адрес addr,

Телефон VARCHAR (15)

);

Пример, в котором каждая ячейка столбца телефон может содержать до трех номеров телефона:

CREATE TABLE Клиенты (

Id_клиента integer primary key,

Имя VARCHAR (2 5 ),

Адрес addr,

Телефон VARCHAR (15) ARRAY [3] );

Следующее SQL-выражение добавляет в таблицу клиенты новую запись и вводит в нее значения столбцов:

INSERT INTO Клиенты (Имя, Телефон)

VALUES ('Петров Петр Петрович', ('444-4444', '123-4567',

'777-8899'});

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

(User Defined Types, UDT)

Отдельные типы

Синтаксис создания отдельного типа данных такой:

CREATE DISTINCT TYPE имяТипа AS определенныйТип;

Определим в качестве примера тип MONEY для хранения денежных сумм. С этой целью можно воспользоваться уже определенным

числовым типом DECIMAL:

CREATE DISTINCT TYPE MONEY AS DECIMAL (9,2);

По аналогии с типом MONEY можно создать типы данных для различных валют, чтобы исключить возможность сравнения их просто как обычных чисел:

CREATE DISTINCT TYPE EURO AS DECIMAL (9,2);

CREATE DISTINCT TYPE USD AS DECIMAL (9,2);

CREATE DISTINCT TYPE RU AS DECIMAL (9,2);

Предположим, что курс доллара к рублю изменился, и мы хотим изменить цены в рублях. Если бы столбцы цена_USD и цена_RU были одного и того же типа, то данную операцию можно было бы выполнить с помощью следующего SQL-выражения:

UPDATE Прайс_лист SET Цена_RU = k * Цена_USD

Здесь k — коэффициент конвертации.

Но поскольку столбцы цена_USD и цена_RU имеют различные типы, то необходимо выполнить такое выражение:

UPDATE Прайс_лист

SET CAST(Цена_RU AS DECIMAL (9,2) = k * CAST(Цена_USD

AS DECIMAL (9,2));

Структурированные типы

При создании структурированного типа СУБД автоматически создает для него три функции:

  • функцию-конструктор с именем, совпадающим с именем создаваемого типа;

  • функцию-мутатор, с помощью которой можно изменить значение атрибута создаваемого типа;

  • функцию-наблюдатель, позволяющую узнать значение атрибута создаваемого типа.

.

Рассмотрим пример, в котором создаются некий тип и его подтип данных, таблица со столбцом созданного типа, а также блок операторов SQL, которые производят изменения данных в таблице. Вначале создадим тип данных Book, содержащий сведения (атрибуты) о книгах, затем создадим его подтип myBooks, который наследует атрибуты своего супертипа Books.

CREATE TYPE Books AS

Title CHAR (50),

Author CHAR (20),

Publisher CHAR (20),

Year INTEGER,

Volume INTEGER,

N0T FINAL;

Здесь в типе Books (книги) определяются атрибуты (имена и типы данных):

Title (наименование), Author (автор), Publisher (издательство), Year (год издания), Volume (количество страниц). Ключевые слова N0T FINAL (не конец) означают, что данный тип имеет хотя бы один подтип.

Определим подтип myBooks для хранения данных, например, о моих любимых книгах:

CREATE TYPE myBooks UNDER Books FINAL;

По-русски это выглядит как:

СОЗДАТЬ ТИП myBooks ПОД Books ЗАКОНЧИТЬ;

Создадим таблицу, которая использует тип myBooks

CREATE TABLE Книги

(

Книга myBooks,

Цена NUMERIC (6,2)

);

Теперь добавим новые записи в созданную таблицу книги.

BEGlN

DECLARE х myBooks; /* объявление переменной х типа myBooks*/

SET х = myBooks(); /* Вьполняем функцию-конструктор */ /* Вызов функций-мутаторов */

SET х = х.Title('HTML, скрипты и стили');

SET х = х .Author('Дунаев Вадим');

SET х = х.Publisher('БХВ-Петербург');

SET х =х.Year(2005);

SET х.Volume(832);

/* Добавление новой записи с установкой значений столбцов */ INSERT INTO книги (х, 350.50);

END;

Здесь ключевые слова BEGIN (начало) и END (конец)

В следующем примере из таблицы Клиенты выбираются все записи, в которых не определено имя клиента:

SELECT * FROM Клиенты WHERE ИМЯ IS NULL;

Преобразование типов

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

  • строковые CHARACTER и CHARACTER VARYING;

  • все числовые типы;

  • дата, время, дата-время и соответствующие интервалы. Соответствующие типы не обязательно приводить друг к другу. Приведение значения одного типа к другому осуществляется

с помощью функции CAST ():

CAST (выражение AS тип);

Например:

CAST ('1234.52' AS NUMERIC (9, 2) );

CAST ('2005-10-03 ' AS DATE);

CAST (CURRENT TIMESTAMP (2) AS CHAR (20) );

  • SELECT 'Цена: ' || CAST (Цена AS CHAR(5) ) FROM Продажи;

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

Основное SQL-выражение для выборки данных

  • Чтобы выбрать из таблицы базы данных требуемые записи, сле- дует, по крайней мере, указать столбцы и имя этой таблицы. Это требование было бы естественно сформулировать так:

ВЫБРАТЬ такие-то столбцы ИЗ такой-то таблицы;

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

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

SELECT списокСтолбцов FROM списокТаблиц;

Операторы SELECT (выбрать) и FROM (из) в SQL-выражении,

Примечание

Так, например, если исходная таблица R содержит столбцы A1, A2, ...,An (другими словами, таблица представляет некоторое отношение R(A1, А2, ..., An) над атрибутами (А1, А2, ..., An), то оператор:

SELECT A1, A2, Ak FROM R;

реализует проекцию R[A1, А2, Аk] этого отношения на атрибуты А1, А2, Ak (k= 1, 2, ..., n).

Тривиальный запрос, возвращающий все данные (все столбцы и все записи) из одной таблицы, формулируется так:

SELECT * FROM имяТаблицы;

Основное SQL-выражение может быть дополнено другими операторами, уточняющими запрос. Чаще всего употребляется оператор WHERE (где), с помощью которого можно задать условие выборки записей (строк таблицы). Таким образом, если выражение SELECT задает столбцы таблицы, указанной в операторе FROM то выражение WHERE определяет записи (строки) из этой таблицы. Выражение, определяющее запрос на выборку данных, находящихся в некоторой таблице, имеет следующий вид:

SELECT * FROM имяТаблицы WHERE условиеПоиска;

Условие, указанное в выражении WHERE, принимает одно из двух логических значений: true (ИСТИНА) или false (ЛОЖЬ).

Ключевые слова: ALL(все), DISTINCT(отличающиеся)

Например:

SELECT ClientName AS Клиент, Address AS Адрес FROM Клиенты;

Псевдонимы таблиц, более короткие, чем их имена, удобно использовать в сложных запросах. Например:

SELECT Tl.Имя, Т2.Адрес FROM Клиенты Т1, Контакты T2;

Уточнения запроса

Основное SQL-выражение для выборки данных, имеет вид:

SELECT списокСталбцов FROM списокТаблиц;

Для уточнения запроса на выборку данных служит ряд дополнительных операторов:

  • WHERE (где) — указывает записи, которые должны войти в результатную таблицу (фильтр записей);

  • GROUP BY (группировать по) — группирует записи по значениям определенных столбцов;

  • HAVING (имеющие, при условии) — указывает группы записей, которые должны войти в результатную таблицу (фильтр групп);

  • ORDER BY (сортировать по) — сортирует (упорядочивает). Таким образом, запрос данных из таблицы с применением всех перечисленных операторов уточнения запроса имеет следующий вид:

SELECT списокСтолбцов FROM имяТаблицы

WHERE условиеПоиска

GROUP BY столбец группировки

HAVING условиеПоиска

ORDER BY условиеСортировки;

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

1. FROM — выбирает таблицу из базы данных; если указано несколько таблиц, то выполняется их декартово произведение и результирующая таблица передается для обработки следующему оператору.

2. WHERE — из таблицы выбираются записи, отвечающие условию поиска, и отбрасываются все остальные.

3. GROUP BY — создаются группы записей, отобранных с помощью оператора WHERE (если он присутствует в SQL-выражении); каждая группа соответствует какому-нибудь значению столбца группирования. Столбец группирования может быть любым столбцом таблицы, заданной в операторе FROM, а не только тем, который указан в SELECT.

4. HAVING — обрабатывает каждую из созданных групп записей, оставляя только те из них, которые удовлетворяют условию поиска; этот оператор используется только вместе с оператором GROUP BY.

5. SELECT — выбирает из таблицы, полученной в результате применения перечисленных операторов, только указанные столбцы.

6. ORDER BY — сортирует записи таблицы. При этом в условии сортировки можно обращаться лишь к тем столбцам, которые указаны в операторе SELECT.

Для этой цели подойдет следующее SQL-выражение:

SELECT Имя, Адрес FROM Клиенты WHERE Сумма заказа > 500;

ВЫБРАТЬ СТОЛБЦЫ имя, Адрес ИЗ ТАБЛИЦЫ клиенты ГДЕ Сумма заказа > 500;

Выбираются только те записи, в которых Сумма заказа превышает 500, и они группируются по значениям столбцов Регион, Имя и Адрес. Это означает, что в результатной таблице записи, имеющие одинаковые значения в столбце Регион, будут расположены рядом друг с другом. Наконец, все записи в результатной таблице упорядочиваются по значениям столбца Имя.

SELECT Регион, Имя, Адрес FROM Клиенты

WHERE Сумма заказа > 500

GROUP BY Регион, Имя, Адрес

ORDER BY Имя;