- •Основы sql Что такое sql
- •Внимание
- •Типы данных
- •Логические данные
- •Дата и время
- •Интервалы
- •Interval 'длина' year | month | day | hour | minute | second
- •Специальные типы данных
- •Id_клиента integer primary key,
- •Структурированные типы
- •Insert into Книги (х, 350.50);
- •Неопределенные значения
- •Преобразование типов
Внимание
Ключевые слова в выражениях на языке SQL могут записываться как прописными, так и строчными буквами, в одну или несколько строк. В конце выражения должна стоять точка с запятой (;). Однако во многих системах, обеспечивающих ввод, редактирование и отправку на выполнение SQL-выражений, в случае ввода одного такого выражения допускается не указывать признак окончания (;). Если же требуется выполнить блок из нескольких SQL-выражений, то они обязательно должны быть разделены точкой с запятой.
Все ключевые слова SQL (команды, операторы и проч.) являются зарезервированными и не должны использоваться в качестве имен таблиц, столбцов, переменных и т. п. Вот пример неправильного использования ключевых слов:
SELECT SELECT FROM WHERE WHERE SELECT=UPDATE;
Типы данных
Во всех языках программирования, а также в SQL важное место занимают поддерживаемые типы данных. Данные, которые хранятся в памяти компьютера и подвергаются обработке, можно отнести к различным типам. Понятие типа данных возникает естественным образом, когда необходимо применить к ним операции обработки. Например, операция умножения применяется к числам, т. е. к данным числового типа. А что получится, если умножить слово "Вася" на число 25? Поскольку трудно дать вразумительный ответ на этот вопрос, то напрашивается вывод: некоторые операции не следует применять к разнотипным данным. Мы также не знаем, что должно получиться в результате умножения слов "Саша" и "Маша", поэтому заключаем, что определенные операции вообще не применимы к данным некоторых типов.
С другой стороны, существуют операции, результат которых зависит от типа данных. Например, операция сложения, обозначаемая символом (+), может применяться и к двум числам, и к двум строкам, состоящим из произвольных слов. В первом случае результатом применения этой операции будет некоторое число, а во втором — строка, получающаяся путем приписывания второй строки к концу первой. В случае строк операцию сложения еще называют склейкой или конкатенацией. Операции, применимые к различным типам данных, но обозначаемые одним и тем же символом, называют перегруженными. Так, операция, обозначаемая символом (+), является перегруженной: применительно к числам она выполняет арифметическое сложение, а применительно к строкам символов — склейку.
Типы данных столбцов таблиц базы данных могут отличаться от типов данных, поддерживаемых SQL. Это обстоятельство необходимо учитывать при составлении SQL-запросов. Так, например, если в таблице Сотрудники столбец Зарплата определен по каким-либо причинам как символьный, то следующий запрос приведет к ошибке из-за несоответствия типов сравниваемых данных:
SELECT Фамилия FROM Сотрудники WHERE Зарплата > 25000;
Данный запрос пытается получить список всех сотрудников, у которых зарплата больше 25 000. Однако в таблице сотрудники столбец Зарплата содержит символьные, а не числовые данные. В условии запроса (оператор WHERE) сравниваются символьное и числовое значения. На практике данная проблема легко преодолима с помощью функции CAST () приведения значения к требуемому типу. Кроме того, между некоторыми типами столбцов таблицы и данных, участвующих в SQL-выражениях, существуют соответствия, допускающие их совместное использование. Такие типы называют согласованными.
Различные СУБД поддерживают несколько отличающиеся наборы типов данных для столбцов таблиц базы данных. Аналогичная ситуация и с типами данных, поддерживаемых различными версиями и реализациями SQL. Вместе с тем, всегда имеются типы данных, которые поддерживаются всеми реализациями SQL.
В спецификации SQL:2003 признаны пять предопределенных общих типов, внутри которых могут быть подтипы:
строковый (символьный):
CHARACTER (или CHAR);
CHARACTER VARYING (или VARCHAR);
CHARACTER LARGE OBJECT (или CLOB);
числовой:
точные числовые типы:
INTEGER;
SMALLINT;
BIGINT;
NUMERIC;
DECIMAL;
приблизительные числовые типы:
REAL;
DOUBLE PRECISION;
FLOAT;
логический (булевский) — BOOLEAN;
даты-времени:
DATE;
TIME WITHOUT TIME ZONE;
TIME WITH TIME ZONE;
TIMESTAMP WITHOUT TIME ZONE;
TIMESTAMP WITH TIME ZONE;
интервальный.
Кроме того, существуют особые типы: ROW (запись), ARRAY (массив) и MULTISET (мультимножество).
СТРОКИ
Строковые данные (последовательности символов) имеют три главных строковых типа. Для столбца таблицы можно указать тип CHARACTER (n) или CHAR (n) (строка фиксированной длины), где n — максимальное количество символов, содержащихся в строке. Если (n) не указано, то предполагается, что строка состоит из одного символа. Если в столбец типа CHARACTER (n) вводится m < n символов, то оставшиеся позиции заполняются пробелами.
Тип данных CHARACTER VARYING (n) или VARCHAR (n) (строка переменной длины) применяется тогда, когда вводимые данные имеют различную длину и нежелательно дополнять их пробелами. При этом сохраняется только то количество символов, которое ввел пользователь. В данном случае указание максимального количества символов обязательно (в отличие от CHARACTER). Данные типов CHARACTER и CHARACTER VARYING могут участвовать в одних и тех же строковых операциях.
Тип данных CHARACTER LARGE OBJECT (CLOB - большой символьный объект) используется для представления очень больших символьных строк (например, статей, книг и т. п.). В некоторых СУБД данный тип называется MEMO, а в других — TEXT. С данными этого типа можно выполнять не все операции, предусмотренные для типов CHARACTER и CHARACTER VARYING. Так, их нельзя использовать в операциях сравнения, за исключением равенства и неравенства. Кроме того, столбцы этого типа не могут быть первичными и внешними ключами, а также быть объявлены как имеющие уникальные значения. Иначе говоря, при создании таблиц с помощью оператора CREATE и объявлении столбцов типа СLOB нельзя использовать ключевые слова PRIMARY KEY, FOREIGN, KEY и UNIQUE.
В следующем примере создается таблица с обычным символьным столбцом и столбцом типа СLOB, значения которого могут содержать 100 000 символов:
CREATE TABLE myTable
(
FIELD1 CHARACTER (60),
FIELD2 CLOB (100000)
);
Здесь оператор CREATE TABLE создает таблицу с именем myTable, которая состоит из двух столбцов с именами FIELD1 и FIELD2, типы столбцов указаны рядом с их именами.
Различные языки используют различные наборы символов. Даже английский и немецкий наборы отличаются, не говоря уж о русском и китайском. Система может быть настроена на некоторый набор символов, принимаемый по умолчанию. Однако при этом можно использовать и другие национальные символьные наборы. Так, в следующем примере создается таблица, в которой столбец FIELD1 объявляется как строковый с набором символов, принятым по умолчанию, а столбец FIELD2 — как строковый с греческим набором символов:
CREATE TABLE myTable
(
FIELDI CHARACTER (60),
FIELD2 CHARACTER VARYING (80) CHARACTER SET GREEK
);
Значения строкового типа в SQL-выражениях заключаются в одинарные кавычки. Например, 'Иванов Иван Иванович', '12345 рублей', 'тел. (812) 123-4567'. Пустая строка не содержит ни одного символа и имеет вид: ' '. Строка, содержащая один или более пробелов, не является пустой.
Иногда бывает так, что строковый столбец в таблице содержит только числа (точнее, строки, содержащие цифры, знаки числа и разделительные точки). Чтобы использовать такие данные в операциях с числами, необходимо привести данные одного типа к другому типу с помощью функции CAST ().
Значения типа CHARACTER и CHARACTER VARYING (VARCHAR) совместимы в том смысле, что они могут участвовать как операнды в строковых операциях и операциях сравнения.
ЧИСЛА
Числовой тип данных может быть двух видов — точный и приблизительный. Точные числовые типы позволяют точно выразить значение числа. Некоторые величины имеют очень большой диапазон значений, и в таких случаях достаточно ограничиться некоторым приближенным их представлением с учетом технических возможностей компьютера (размеров регистра).
К точным числовым данным относятся следующие пять типов:
INTEGER — целое (без дробной части) число. Количество разрядов (точность) зависит от реализации SQL. В некоторых реализациях числа этого типа лежат в диапазоне от -2 147 483 648 до 2 147 483 647 (четырехбайтное целое число);
SMALLINT — малое целое число. Количество разрядов зависит от реализации SQL, но не больше количества разрядов INTEGER в этой же реализации. В некоторых реализациях числа этого типа лежат в диапазоне от -32 768 до 32 767 (двухбайтное целое число);
BIGINT — большое целое число. Количество разрядов зависит от реализации SQL и превышает количество разрядов числа типа INTEGER;
NUMERIC (х, у) — число, в котором всего х разрядов (точность), из которых у разрядов (масштаб) отводится для дробной части. Если у не указано (NUMERIC (x)), то для дробной части отводится количество разрядов, установленное в системе по умолчанию. Если не указаны ни х, ни у (NUMERIC), то принимаются обе эти величины, установленные по умолчанию. Например, если указан тип NUMERC (6, 2), то максимальное значение числа равно 9999.99;
DECIMAL (х, у) — десятичное число, в котором всего х разрядов, из которых у разрядов отводятся для дробной части. Если х или/и у не указаны, то принимаются значения по умолчанию. Этот тип очень похож на NUMERIC. Отличие состоит в том, что если в DECIMAL (x, у) указанные х и у меньше, чем допустимые реализацией SQL, то будут использоваться последние. Если х и у не указаны, то применяется система умолчаний. Например, вы задали для столбца тип DECIMAL (6, 2). Если реализация SQL позволяет, то в этот столбец можно ввести числа, превышающие 9999.99. В отличие от DECIMAL (x, у), тип NUMERIC (x, у) жестко задает диапазон возможных значений числовой величины.
К приблизительным числовым типам относятся следующие три типа:
REAL — вещественное число одинарной точности с плавающей разделительной точкой (эта точка "плавает", появляясь в различных местах числа). Например, 5.25, 5.257, 5.2573. Точность представления числа зависит от реализации SQL и оборудования. Например, 32-битовый компьютер дает большую точность, чем 16-битовый;
DOUBLE PRECISION — вещественное число двойной точности с плавающей разделительной точкой. Точность представления числа зависит от реализации SQL и оборудования. Применяется для представления научных данных (например, результатов измерений) в широком диапазоне значений, т. е. как очень малых (близких к 0), так и очень больших;
FLOAT (x) — вещественное число с плавающей разделительной точкой и минимальной точностью х, занимающее не более 8 байтов. Если компьютер может поддержать указанную точность, используя аппаратную одинарную точность, то система будет использовать арифметику одинарной точности. Если указанная точность требует арифметики с двойной точностью, то система будет использовать ее. Данный тип следует применять, если предполагается возможность переноса базы данных на другую аппаратную платформу, отличающуюся размерами регистров. Пример значения типа FLOAT: 5.318Е-24 (т. е. 5.318, умноженное на 10 в степени -24). Такую же форму представления имеют и числа типа REAL и DOUBLE PRECISION.
При создании таблиц целочисленные типы применяются для столбцов, содержащих разного рода идентификаторы, например, номера (коды) клиентов, товаров, заказов и т. п. Разумеется, если содержимое столбца должно быть целым числом (например, количество ящиков, бутылок, штук и т. п.), то тип этого столбца естественно определить как INTEGER, SMALLINT или BIGINT.
Допустим, в таблице Клиенты имеется столбец ID_клиента, содержащий уникальные идентификаторы клиентов. Если количество клиентов не превышает 32 000, то тип столбца можно определить как SMALLINT. Если в вашей таблице будут храниться сведения о сотнях тысяч клиентов, то тип столбца ID_клиента следует определить как INTEGER.
Если столбец в проектируемой таблице должен содержать числа с дробной частью, то для него можно задать какой-нибудь нецелочисленный тип. Если вы не уверены, что применить: точные числовые типы или приблизительные, выбирайте точные (NUMERIC, DECIMAL). Они требуют меньше ресурсов и дают точные результаты. Если в столбце предполагается хранить данные из очень широкого диапазона (и очень малые, и очень большие числа), то используйте приблизительные типы данных (FLOAT, REAL).
Обратите внимание, что строка, содержащая число (например, '12345.47'), является данным строкового, а не числового типа. Чтобы в SQL-выражениях сравнивать строковые и числовые данные, необходимо их привести к одному типу с помощью функции CAST ().
