В SQL используются следующие основные типы данных, форматы которых могут несколько различаться для разных СУБД:
Тип данных |
Описание |
NUMBER(p,s) |
Числовое значение, максимальное количество цифр в котором равно "р", а количество десятичных знаков - "s". |
INTEGER |
Целое число (обычно до 7 значащих цифр и знак). Аналог NUMBER(7). |
VARCHAR2(s) |
Символьная строка переменной длины, максимальный размер которой равен "s". В системе Oracle 7 максимально возможное значение s составляет 2000 символов. |
DATE |
Значение даты и времени между 1 января 4712 г. до нашей эры и 31 декабря 4712 г. нашей эры. |
CHAR(s) |
Символьное значение постоянной длины "s". В системе Oracle 7 максимально возможное значение s составляет 256 символов. |
LONG |
Символьные значения переменной длины размером до 2Гб |
RAW и LONG RAW |
Эквиваленты VARCHAR2 и LONG для двоичных данных. |
В некоторых СУБД еще существует тип данных LOGICAL, DOUBLE и ряд других. Некоторые СУБД предоставляет пользователю возможность самостоятельного определения новых типов данных, например, плоскостные или пространственные координаты, единицы различных метрик, пяти- или шестидневные недели (рабочая неделя, где сразу после пятницы или субботы следует понедельник), дроби, графика, большие целые числа и т.п.
Правила присвоения имен объектам базы данных
Иногда требуется изменить способ вывода данных, произвести вычисления или просмотреть сценарии "а что, если ...". Это можно сделать с помощью арифметических выражений. Арифметическое выражение может содержать имена столбцов, числовые константы и арифметические операторы.
Арифметические операторы
Ниже перечислены арифметические операторы, доступные в SQL. Использовать их можно в любом предложении команды SQL, кроме FROM.
Оператор |
Описание |
+ | Сложение |
- | Вычитание |
* | Умножение |
/ | Деление |
|| | Конкатенация |
Порядок выполнения операторов
Если арифметическое выражение содержит более одного оператора, то умножение и деление выполняются в первую очередь. Если операторы в выражении имеют один и тот же приоритет, они выполняются слева направо. Изменить порядок действий при вычислении арифметического выражения можно с помощью скобок.
Пример Вычисление годовых компенсационных. Сумма выплат за год вычисляется путем умножения заработной платы (значение переменной salary) на 12 и прибавления одноразовой премии в размере 100.
Примечание: Для изменения порядка действий и упрощения чтения можно использовать скобки. Если, например, записать вышеуказанное выражение в виде (12*SALARY) + 100, то результат не изменится.
Пример Вывод фамилии, заработной платы и суммы выплат за год для каждого служащего. Размер выплат за год вычисляется путем прибавления к заработной плате ежемесячной премии в размере 100 и умножения суммы на 12.
Оператор конкатенации “||” позволяет соединять значения одних столбцов с другими столбцами, арифметическими выражениями или постоянными значениями для создания символьных выражений. Столбцы, указанные по обе стороны этого оператора, объединяются для вывода в один столбец.
Пример Соединение двух строковых констант.
Операторы сравнения.
Операторы сравнения делятся на две категории: логические и операторы SQL. Они используются для сравнения значений выражений.
Операторы сравнения проверяются следующими условиями:
Оператор |
Значение |
= |
Равно |
> |
Больше |
>= | Больше или равно |
< | Меньше |
<= | Меньше или равно |
Имеется четыре оператора SQL, используемых с данными всех типов:
Оператор |
Значение |
BETWEEN...AND… |
Между двумя значениями (включительно) |
IN(список) |
Совпадает с каким-то из значений в списке |
LIKE |
Соответствует символьному шаблону |
IS NULL |
Является неопределенным значением |
Логические операторы:
Оператор |
Значение |
AND |
Если обе части условия истинны, то условие истинно. |
OR |
Если хотя бы одна часть условия истинна, то условие истинно. |
NOT |
Возвращает противоположное условие. |
Отрицание выражений:
Оператор |
Значение |
!= |
Не равно (VAX. UNISX. PC) |
^= |
Не равно (IBM) |
<> |
Не равно (все операционные системы) |
NOT имя столбца = |
Не равно |
NOT имя столбца > |
Не больше |
Отрицание операторов SQL:
Оператор |
Значение |
NOT BETWEEN...AND… |
НЕ между двумя значениями (включительно) |
NOT IN(список) |
НЕ входит в список значений |
NOT LIKE |
Не подобно заданной строке |
IS NOT NULL |
Не является неопределенным значением |
Порядок выполнения операций:
Порядок вычисления |
Оператор |
1 |
Все операторы сравнения |
2 |
AND |
3 |
OR |
Стандартный порядок выполнения операций отменяется скобками.
Строки символов (литералы).
Литерал — это любой символ, выражение или число, включенные в список SELECT и не являющиеся ни именем, ни псевдонимом столбца. Они печатаются для каждой возвращаемой строки. Литералы в виде текста произвольного формата могут быть включены в результат запроса. В списке SELECT они рассматриваются как столбцы. Символьные литералы и литералы-даты должны быть заключены в апострофы (‘’), а числовые литералы - нет.
Пример:
Выражения с датами.
Для данных типа дата в SQL возможно применять некоторые арифметические операторы:
Операция |
Результат |
Описание |
Дата + число | Дата |
Прибавление количества дней к дате |
Дата - число | Дата |
Вычитание количества дней из даты |
Дата – дата | Кол-во дней |
Вычитание одной даты из другой |
Дата + число/24 | дата |
Прибавление к дате часов |
Обработка неопределенных значений.
Неопределенным значением (NULL) называется недоступное, неприсвоенное, неизвестное или неприменимое значение. Неопределенное значение - это не ноль и не пробел. Ноль — это число, а пробел — символ. Издержки "хранения" неопределенного значения - это один байт внутренней памяти.
Неопределенные значения возможны в столбцах любых типов, если при создании таблицы они не были описаны как столбцы только с определенными значениями (NOT NULL) или столбцы, содержащие первичный ключ (PRIMARY KEY).
Если выражение содержит неопределенное значение в любом из столбцов, то и результатом вычисления выражения будет неопределенное значение. При попытке деления на ноль вы получите сообщение об ошибке, а результатом деления на неопределенное значение будет неопределенное значение.
Для преобразования неопределенного значения в фактическое используется функция NVL:
NVL (выражение1, выражение 2) |
где:
выражение1 |
Исходное или вычисленное значение, которое может быть неопределенным. |
Выражение2 |
Значение, которое подставляется вместо неопределенного значения. |
Примечание: функцию NVL можно применять для преобразования любого типа данных, но результат всегда будет того же типа, что и выражение1.
Пример: при вычислении значений по следующей формуле
не возникает неопределенности в интерпретации получаемого результата, поскольку если значение переменой salary будет неопределено, функция возвратит значение “ноль”.
Преобразование NVL для различных типов:
Тип данных |
Пример преобразования |
NUMBER |
NVL (числовой столбец, 9) |
DATE |
NVL (столбец даты, '01-ЯНВ-95') |
CHAR или VARCHAR2 |
NVL (символы|столбец, 'Недоступно') |
В языке SQL существуют два класса функций – однострочные и групповые.
Однострочные функции принимают на вход одну строку (запроса или арифметического выражения) и выдают один результат. Этот результат, как и в случае понятия функции в любом языке программирования, связывается с ее именем. Однострочные функции могут быть разных типов. Мы рассмотрим следующие типы функций: символьные; числовые; для работы с датами; функции преобразования. Аргументом однострочных функций может быть: константа, заданная пользователем; значение переменной; имя столбца таблицы; выражение.
Групповая функция принимает на входе группу строк и выдает одно значение после обработки этой группы.
Различие в интерпретации входных данных обуславливает и различие в применении этих функций. Так однострочные функции могут использоваться там, где в качестве результата запроса к базе данных подразумевается получение только одной строки данных. Для использование групповой функции необходимо сначала сформировать из “многострочного” результата запроса группы строк, а затем для каждой из них применить групповую функцию.
Синтаксис:
имя_функции (столбец | выражение, [аргумент1, аргумент2, …]) |
---|
где:
имя_функции | имя функции |
столбец |
любой именованный столбец из базы данных. |
выражение |
любая строка символов или вычисляемое выражение. |
аргумент1, аргумент2 |
любой аргумент, используемый функцией. |
Числовые функции.
Функция |
Возвращаемое значение |
ABS(n) |
Абсолютное значение величины n |
CEIL(n) |
Наименьшее целое, большее или равное n |
COS(n) |
Косинус n (угла, выраженного в радианах) |
COSH(n) |
Гиперболический косинус n |
ЕХР(n) |
e в степени n |
FLOOR(n) |
Наибольшее целое, меньшее или рапное n |
LN(n) |
Натуральный логарифм n, где n>0 |
LOG(m,n) | Логарифм n по основанию m |
MOD(m,n) |
Остаток от деления m на n |
POWER(w,n) |
w в степени n |
ROUND(n[,m]) |
n, округленное до m позиций после десятичной точки. По умолчанию m равно нулю |
SIGN(n) |
-1 (если n<0); 0 (если n=0); 1 (если n>0) |
SIN(n) |
Синус n (угла, выраженного в радианах) |
SINH(n) |
Гиперболический синус |
SQRT(n) |
Квадратный корень от n. Если n<0, возвращает значение NULL |
TAN(n) |
Тангенс n (угла, выраженного в радианах) |
TANH(n) |
Гиперболический тангенс n |
TRUNC(n[,m]) |
n, усеченное до m позиций после десятичной точки. По умолчанию m равно нулю |
Символьные функции.
Функция |
Возвращаемое значение |
Символьные функции, возвращающие символьные значения: | |
CHR(n) | Символ с кодом n |
СОNСАТ(сhar1,char2) |
Конкатенация символьных строк char1 и char2 |
INITCAP(char) |
Символьная строка сhar, первые буквы всех слов в которой преобразованы в прописные |
LOWER(char) |
Символьная строка char, все буквы которой преобразованы в строчные |
LPAD(char1,n[,char2]) |
Символьная строка char1, которая дополняется слева последовательностью символов из char2 так, чтобы общая длина строки стала равна n. Значение char2 по умолчанию – (один пробел). Если часть многобайтового символа не помещается в добавляемой строке, то конец строки заполняется пробелами. |
LTRIM(char[,set]) |
Символьная строка char, в которой удалены все символы от начала вплоть до первого символа, которого нет в строке set. Значение set по умолчанию - '' (один пробел). |
NLS_INITCAP(char[,nls_sort]) | Символьная строка char, в которой первые буквы всех слов преобразованы в прописные. Параметр nls_sort определяет последовательность сортировки |
NLS_LOWER(char[,nls_sort]) |
Символьная строка char, все буквы которой преобразованы в строчные. Параметр nls_sort определяет последовательность сортировки |
NLS_UPPER(char[,nls_sort]) |
Символьная строка char, все буквы которой преобразованы в прописные. Параметр nts_sort определяет последовательность сортировки |
REPLACE(char, search_string [,replacement_string]) |
Символьная строка char, в которой все фрагменты search_string заменены на replacement_string. Если параметр replacement_string не определен, все фрагменты search_string удаляются |
RPAD(char1,n[,char2]) |
Символьная строка char1, которая дополнена справа последовательностью символов из char2 так, что общая длина строки равна n. Если часть многобайтового символа не помещается в добавляемой строке, то конец строки заполняется пробелами |
RTRIM(char[,set]) |
Символьная строка char, в которой удалены все символы справа вплоть до первого символа, которого нет в строке set. Значение параметра set по умолчанию – ‘ ’ (один пробел). |
SOUNDEX(char) |
Символьная строка, содержащая фонетическое представление для char, на английском языке |
SUBSTR(char,m[,n]) |
Фрагмент символьной строки char, начинающийся с символа m, длиной n символов (до конца строки, если параметр n не указан). |
SUBSTRB(char,m[,n]) |
Фрагмент символьной строки char, начинающийся с символа m, длиной n байтов (до конца строки, если параметр n не указан). |
TRANSLATE(char,from, to) |
Символьная строка char, в которой все символы, встречающиеся в строке from, заменены на соответствующие символы из to. |
UPPER(char) |
Символьная строка char, в которой все буквы преобразованы в прописные |
Символьные функции, возвращающие числовые значения: | |
ASCII(char) |
Возвращает десятичный код первого символа строки char в кодировке, принятой в базе данных. (Код ASCII в системах, использующих кодировку ASCII). Возвращает значение первого байта многобайтового символа. |
INSTR(char1,char2[,n[,m]]) |
Позиция первого символа m-ого фрагмента строки char1, совпадающего со строкой char2, начиная с n-ого символа. По умолчанию n и m равны 1. Номер символа отсчитывается от первого символа строки char1, даже когда n> 1 |
INSTRB(char1,char2[,n[,m]]) |
Позиция первого символа n-ого фрагмента строки char1, совпадающего со строкой char2, начиная с m-ого байта. По умолчанию n и m равны 1. Номер байта отсчитывается от первого символа строки char1, даже когда n> 1. |
LENGTH(char) |
Длина строки char в символах |
LENGTHB(char) |
Длина строки char в байтах |
NLSSORT(char1,char2[,n[,m]]) |
Зависящее от национального языка значение, используемое при сортировке строки char. |
Функции для работы с датами.
Oracle хранит данные во внутреннем цифровом формате: век, год, месяц, число, часы, минуты, секунды. По умолчанию дата выдается в формате “DD-MON-YY”.
Функция |
Назначение |
MONTHS_BETWEEN(date1, date2) |
Определяет число месяцев, разделяющих две даты. Дробная часть результата представляет собой долю месяца. |
ADD_MONTHS(date,n) |
Добавление календарных месяцев к дате. |
NEXT_DAY(date, ‘char’) |
Ближайшая дата, когда наступит заданный день. Аргумент ‘char’ может задавать порядковый номер или название дня недели. |
LAST_DAY(date) |
Определение последнего дня месяца, содержащего заданную дату. |
ROUND(date[, ‘fmt’]) |
Округление до целого числа суток. Если fmt=YEAR, определяет первый день года. |
TRUNC(date[, ‘fmt’]) |
Возвращает первый день месяца, указанного в аргументе date. Если fmt=YEAR, возвращает дату первого дня года. |
SYSDATE() |
Возвращает текущую дату и время. |
Функции преобразования типа.
Функция |
Возвращаемое значение |
TO_CHAR (date[, 'fmt']) |
Преобразование даты в строку символов в соответствии с форматной моделью fmt. |
TO_CHAR (number[, 'fmt']) |
Преобразование числа в строку символов в соответствии с форматной моделью fmt. |
TO_NUBER (char) |
Преобразование строки символов в числовой формат. |
TO_DATE (char[, 'fmt']) |
Преобразование строки символов в формат даты в соответствии с форматной моделью fmt. |
Форматные модели.
Модель формата:
Модель |
Описание |
Форматные модели для работы с датами | |
YY[YY] | Полный год цифрами. |
YEAR | Год прописью. |
MM | Двузначное цифровое обозначение месяца. |
MON | Трехсимвольное сокращенное название месяца. |
MONTH | Полное название месяца. |
DD | День недели цифрами. |
DY | Трехсимвольное сокращенное название дня недели. |
DAY | Полное название дня недели. |
HH | Часы цифрами в 12-ти часовом формате. |
HH24 | Часы цифрами в 24-х часовом формате. |
MI | Минуты цифрами. |
SS | Секунды цифрами. |
AM | Символы ‘AM’|’PM’. |
Числовые модели формата | |
9 | Вывод цифры с подавлением ведущих нулей. |
0 | Вывод цифры, если ведущий нуль – вывод нуля. |
$ | Плавающий знак доллара. |
L | Плавающий символ местной валюты |
. | Вывод десятичной точки. |
, | Вывод разделителя троек цифр. |
Групповые функции.
Функция |
Возвращаемое значение |
AVG([DISTINCT|ALL]n) |
Среднее значение от n, нулевые значения опускаются |
COUNT([ALL]*) |
Число строк, извлекаемых в запросе или подзапросе |
COUNT([DISTINCT|ALL] expr) |
Число строк, для которых expr принимает не пустое значение |
MAX([DISTINCT|ALL] expr) |
Максимальное значение выражения eхрr |
MIN([DISTINCT|ALL] expr) |
Минимальное значение выражения eхрr |
STDDEV([DISTINCT|ALL] n) |
Стандартное отклонение величины n, нулевые значения опускаются |
SUM([DISTINCT|ALL] n) |
Сумма значений n |
VARIANCE([DIST1NCT|ALL]n) |
Дисперсия величины n, нулевые значения опускаются |
Примеры использования некоторых функций.
Функция округления:
Пример использования |
Значение |
ROUND (45.923, 2) | 45.92 |
ROUND (45.923, 0) | 46 |
ROUND (45.923, -1) | 50 |
Функция усечения:
Пример использования |
Значение |
TRUNC (45.923, 2) | 45.92 |
TRUNC (45.923) | 45 |
TRUNC (45.923, -1) | 40 |
Вычисление остатка от деления двух чисел:
Пример использования |
Значение |
MOD(1600,300) | 100 |
Функции работы с датами:
Пример использования |
Значение |
MONTHS_BETWEEN('01-SEP-95','11-JAN-94') | 19.6774194 |
ADD_MONTHS('11-JAN-94',6) | '11-JUL-94' |
NEXT_DAY('01-SEP-95','FRIDAY') | '08-SEP-95' |
LAST_DAY('01-SEP-95') | '30-SEP-95' |
ROUND('25-MAY-95','MONTH') | '01-JUN-95' |
ROUND('25-MAY-95 ','YEAR') | '01-JAN-95' |
TRUNC('25-MAY-95 ','MONTH') | '01-MAY-95' |
TRUNC('25-MAY-95 ','YEAR') | '01-JAN-95' |