Главная Программы Учебное пособие Практикум Дополнительно
    Введение
  Глава 1
  Глава 2
  Глава 3
  Глава 4
  Глава 5
  Глава 6
  Глава 7
  Глава 8
  Задания
  Литература
  Приложение 1
  Приложение 2
  Приложение 3

Практикум

Глава 2. Первое, что нужно знать

 

2.1. Типы данных

В таблице далее представлены использующиеся в SQL основные типы данных, форматы которых могут несколько различаться для разных СУБД.

 

Таблица 1. Основные типы данных SQL

Тип данных 

Описание 

NUMBER(p,s)

Числовое значение, максимальное количество цифр в котором равно "р", а количество десятичных знаков – "s".

INTEGER

Целое число (обычно до 7 значащих цифр и знак).  Аналог NUMBER(7).

VARCHAR2(s)

Символьная строка переменной длины, максимальный размер которой равен "s".

DATE

Значение даты и времени между 1 января 4712 г. до нашей эры и 31 декабря 4712 г. нашей эры.

CHAR(s)

Символьное значение постоянной длины "s".  В системе Oracle 7 максимально возможное значение s составляет 256 символов.

LONG

Символьные значения переменной длины размером до 2Гб.

RAW и LONG RAW

Эквиваленты VARCHAR2 и LONG для двоичных данных.

 

В некоторых СУБД еще существует тип данных LOGICAL, DOUBLE и ряд других. Некоторые СУБД предоставляют пользователю возможность самостоятельного определения новых типов данных, например, плоскостные или пространственные координаты, единицы различных метрик, пяти- или шестидневные недели (рабочая неделя, где сразу после пятницы или субботы следует понедельник), дроби, графика, большие целые числа и т.п.

 

2.2. Правила присвоения имен объектам базы данных

  • Должны начинаться с буквы.
  • Могут включать от 1 до 30 символов.
  • Могут содержать только символы A-Z, a-z, 0-9, _ (подчеркивание), $ и #.
  • Не могут совпадать с именем другого объекта, принадлежащего этому же пользователю.
  • Не могут совпадать с зарезервированным словом сервера базы данных.

 

2.3. Арифметические выражения

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

 

Арифметические операторы

Ниже перечислены арифметические операторы, доступные в SQL.  Использовать их можно в любом предложении команды SQL, кроме FROM.

 

Таблица 2. Арифметические операторы.

Оператор Описание
+ Сложение
- Вычитание
* Умножение
/ Деление
|| Конкатенация

 

Порядок выполнения операторов

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

Пример.  Вычисление годовых компенсационных. Сумма выплат за год вычисляется путем умножения заработной платы (значение переменной salary) на 12 и прибавления одноразовой премии в размере 100.

 

 

Примечание: Для изменения порядка действий и упрощения чтения можно использовать скобки. Если, например, записать вышеуказанное выражение в виде (12*SALARY) + 100, то результат не изменится.

Пример.  Вывод фамилии, заработной платы и суммы выплат за год для каждого служащего.  Размер выплат за год вычисляется путем прибавления к заработной плате ежемесячной премии в размере 100 и умножения суммы на 12.

Оператор конкатенации “||” позволяет соединять значения одних столбцов с другими столбцами, арифметическими выражениями или постоянными значениями для создания символьных выражений.  Столбцы, указанные по обе стороны этого оператора, объединяются для вывода в один столбец.

Пример.  Соединение двух строковых констант.

 

 

Операторы сравнения

Операторы сравнения делятся на две категории: логические и операторы SQL.  Они используются для сравнения значений выражений.

 

Таблица 3. Условия операторов сравнения.

Оператор Значение
= Равно
Больше
>= Больше или равно
Меньше
<= Меньше или равно

 

Имеется четыре оператора SQL, используемых с данными всех типов

Таблица 4. Операторы SQL, используемых с данными всех типов.

 

Оператор Значение
BETWEEN...AND… Между двумя значениями (включительно)
IN(список) Совпадает с каким-то из значений в списке
LIKE Соответствует символьному шаблону
IS NULL Является неопределенным значением

 

Таблица 5. Логические операторы.

Оператор Значение
AND Если обе части условия истинны, то условие истинно.
OR Если хотя бы одна часть условия истинна, то условие истинно.
NOT Возвращает противоположное условие.

 

Таблица 6. Отрицание выражений.

Оператор Значение
!= Не равно (VAX. UNISX. PC)
^= Не равно (IBM)
<>  Не равно (все операционные системы)
NOT имя столбца = Не равно
NOT <имя столбца > Не больше

 

Таблица 7. Отрицание операторов SQL.

Оператор Значение
NOT BETWEEN...AND… НЕ между двумя значениями (включительно)
NOT IN(список) НЕ входит в список значений
NOT LIKE Не подобно заданной строке
IS NOT NULL Не является неопределенным значением

 

Таблица 7. Порядок выполнения операций.

Порядок вычисления Оператор
1 Все операторы сравнения
2 AND
3 OR

 

Стандартный порядок выполнения операций отменяется скобками.

 

Строки символов (литералы)

Литерал — это любой символ, выражение или число, включенные в список SELECT и не являющиеся ни именем, ни псевдонимом столбца. Они печатаются для каждой возвращаемой строки. Литералы в виде текста произвольного формата могут быть включены в результат запроса. В списке SELECT они рассматриваются как столбцы. Символьные литералы и литералы-даты должны быть заключены в апострофы (‘’), а числовые литералы – нет.

Пример:

 

Выражения с датами

Для данных типа дата в SQL возможно применять некоторые арифметические операторы.

 

Таблица 8. Применение арифметических операций для дат. 

Операция Результат Описание
Дата + число Дата Прибавление количества дней к дате
Дата - число Дата Вычитание количества дней из даты
Дата – дата Кол-во дней Вычитание одной даты из другой
Дата + число/24 дата Прибавление к дате часов

 

Обработка неопределенных значений

Неопределенным значением (NULL) называется недоступное, не присвоенное, неизвестное или неприменимое значение.  Неопределенное значение – это не ноль и не пробел.  Ноль – это число, а пробел – символ.  Издержки "хранения" неопределенного значения – это один байт внутренней памяти.

Неопределенные значения возможны в столбцах любых типов, если при создании таблицы они не были описаны как столбцы только с определенными значениями (NOT NULL) или столбцы, содержащие первичный ключ (PRIMARY KEY).

Если выражение содержит неопределенное значение в любом из столбцов, то и результатом вычисления выражения будет неопределенное значение.  При попытке деления на ноль вы получите сообщение об ошибке, а результатом деления на неопределенное значение будет неопределенное значение.

Для преобразования неопределенного значения в фактическое используется функция NVL:

 

NVL (выражение1, выражение 2)

где:

выражение1

Исходное или вычисленное значение, которое может быть неопределенным.

Выражение2

Значение, которое подставляется вместо неопределенного значения.

Примечание: Функцию NVL можно применять для преобразования любого типа данных, но результат всегда будет того же типа, что и выражение1.

Пример: при вычислении значений по следующей формуле не возникает неопределенности в интерпретации получаемого результата, поскольку если значение переменой salary будет не определено, функция возвратит значение «ноль» ().

 

Таблица 8. Преобразование NVL для различных типов.

Тип данных Пример преобразования
NUMBER NVL (числовой столбец, 9)
DATE NVL (столбец даты, '01-ЯНВ-95')
CHAR или VARCHAR2 NVL (символы|столбец, 'Недоступно')

 

2.4. Функции

В языке SQL существуют два класса функций – однострочные и групповые.

Однострочные функции принимают на вход одну строку (запроса или арифметического выражения) и выдают один результат.  Этот результат, как и в случае понятия функции в любом языке программирования, связывается с ее именем.  Однострочные функции могут быть разных типов.  Мы рассмотрим следующие типы функций: символьные; числовые; для работы с датами; функции преобразования.  Аргументом однострочных функций может быть: константа, заданная пользователем; значение переменной; имя столбца таблицы; выражение.

Групповая функция принимает на входе группу строк и выдает одно значение после обработки этой группы.

 

Рисунок 4. Однострочные и групповые функции

 

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

Синтаксис:

имя_функции (столбец | выражение, [аргумент1, аргумент2, …])

где:

имя_функции

имя функции

Столбец

любой именованный столбец из базы данных.

Выражение

любая строка символов или вычисляемое выражение.

аргумент1, аргумент2

любой аргумент, используемый функцией.

 

Однострочные функции

Таблица 9. Числовые функции.

Функция Возвращаемое значение
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 равно нулю

 

Таблица 10. Символьные функции.

Функция Возвращаемое значение
Символьные функции, возвращающие символьные значения:
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».

 

Таблица 11. Функции работы с датами.

Функция Назначение
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() Возвращает текущую дату и время.

 

Таблица 12. Функции преобразования типа.

Функция Возвращаемое значение
TO_CHAR (date[, 'fmt']) Преобразование даты в строку символов в соответствии с форматной моделью fmt.
TO_CHAR (number[, 'fmt']) Преобразование числа в строку символов в соответствии с форматной моделью fmt.
TO_NUBER (char) Преобразование строки символов в числовой формат.
TO_DATE (char[, 'fmt']) Преобразование строки символов в формат даты в соответствии с форматной моделью fmt.

 

Модель формата:

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

 

Таблица 13. Форматные модели.

Модель Описание
Форматные модели для работы с датами
YY[YY] Полный год цифрами.
YEAR Год прописью.
MM Двузначное цифровое обозначение месяца.
MON Трехсимвольное сокращенное название месяца.
MONTH Полное название месяца.
DD День недели цифрами.
DY Трехсимвольное сокращенное название дня недели.
DAY Полное название дня недели.
HH Часы цифрами в 12-ти часовом формате.
HH24 Часы цифрами в 24-х часовом формате.
MI Минуты цифрами.
SS Секунды цифрами.
AM Символы ‘AM’|’PM’.
Числовые модели формата
9 Вывод цифры с подавлением ведущих нулей.
0 Вывод цифры, если ведущий нуль – вывод нуля.
$ Плавающий знак доллара.
L Плавающий символ местной валюты
. Вывод десятичной точки.
, Вывод разделителя троек цифр.

 

Групповые функции

Таблица 14. Групповые функции.

Функция Возвращаемое значение
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