| Каталог | Оглавление | Индекс раздела |
Фраза SELECT
Столбцовое выражение
Константы
Функции
Агрегатные функции
CAST-выражение
Специальные регистры/функции
Скалярный запрос
CASE-выражение
Операции
Фраза WHERE
Предикаты
Предикаты сравнения
Предикат BETWEEN
Предикат LIKE
Предикат NULL
Предикат IN
Предикаты с кванторами
Предикат EXISTS
Внутренние и внешние соединения
DB2
Oracle
Иерархические запросы Основой языка SQL является "выражение подзапроса", синтаксис которого приведен на рисунке.
Oracle
DB2
|
Ниже разбирается синтаксис отдельных фраз подзапроса. Фраза CONNECT, являющаяся элементом диалекта SQL Oracle, рассматривается в разделе "Иерархические запросы".
Фраза SELECT определяет перечень столбцов в таблице - результате подзапроса. Ее синтаксис:
|
Столбцовое_выражение во фразе SELECT определяется как:
|
Константы, которые могут быть элементами столбцового выражения, записываются по следующим правилам.
Целочисленные константы представляются в общепринятой форме целого десятичного числа со знаком, например:
64 -15 +100 32767 720176 12345678901
Вещественные константы представляются в общепринятой форме десятичного числа с точкой, например:
25.5 1000. -15. +37589.3333333333
или в E-форме, например:
15E1 2.E5 2.2E-1 +5.E+2
Строковые константы представляют собой последовательности символов произвольной длины, ограниченные с двух сторон символом "апостроф" ('). Символ апостроф в составе строковой константы кодируется двумя апострофами. Примеры символьных констант:
'Hello'
'ORACLE.dbs'
'Jackie''s raincoat'
'09-MAR-92'
Константы даты и времени описаны в отдельном справочнике.
Некоторые общие функции, которые могут быть элементами столбцового выражения, приведены в нижеследующих таблицах:
Числовые функции
| Назначение функции | DB2 | Oracle |
| Абсолютное значение x | ABS(x) ABSVAL(x) |
ABS(x) |
| Возведение x в степень y | POWER(x,y) | |
| Извлечение квадратного корня из y | SQRT(x) | |
| Знак числа x | SIGN(x) | |
| Косинус x | COS(x) | |
| Синус x | SIN(x) | |
| Тангенс x | TAN(x) | |
| Арккосинус x | ACOS(x) | |
| Арксинус x | ASIN(x) | |
| Арктангенс x | ATAN(x) | |
| ex | EXP(x) | |
| Натуральный логарифм x | LN(x) LOG(x) |
LN(x) |
| Десятичный логарифм x | LOG10(x) | |
| Логарифм x по основанию y | LOG(x,y) | |
| Наименьшее целое, большее или равное x | CEIL(x) CEILING(x) |
CEIL(x) |
| Наибольшее целое, меньшее или равное x | FLOOR(x) | |
| Округление x до y знаков | ROUND(x,y) | ROUND(x,[y]) |
| Остаток от деления x на y | MOD(x,y) | |
| Усечение x до y знаков | TRUNC(x,y) TRUNCATE(x,y) |
TRUNC(x,y) |
| Cлучайное число в интервале 0 - 1 | RAND(x) | |
Строковые функции
| Назначение функции | DB2 | Oracle |
| Конкатенация строк s1 и s2 | CONCAT(s1,s2) | |
| Выравнивание s1 по правому краю до n символов | RIGHT(s1,n) | |
| Выравнивание s1 по правому краю до n символов с заполнителем s2 | LPAD(s1,n,s2) | |
| Выравнивание s1 по левому краю до n символов | LEFT(s1,n) | |
| Выравнивание по s1 левому краю до n символов с заполнителем s2 | RPAD(s1,n,s2) | |
| Удаление в s1 пробелов слева | LTRIM(s1) | |
| Удаление в s1 заполнителей s2 слева | LTRIM(s1,s2) | |
| Удаление в s1 пробелов справа | RTRIM(s1) | |
| Удаление в s1 заполнителей s2 справа | RTRIM(s1,s2) | |
| Удаление в s1 пробелов слева и справа | TRIM(s1) | |
| Замена в строке s1 подстроки s2 на s3 | REPLACE(s1,s2,s3) | |
| Выделение из s1 подстроки, начиная с позиции n1, длиной n2 символов | SUBSTR(s1,n1[,n2]) | |
| Перекодировка строки s1 из алфавита s2 в алфавит s3 | TRANSLATE(s1,s2,s3) | |
| Удаление из строки s1 n2 символов, начиная с позиции n1 и вставка, начиная с позиции n1 строки s2. | INSERT(s1,n1,n2,s2) | |
| Перевод s1 в нижний регистр | LOWER(s1) LCASE(s1) |
LOWER(s1) |
| Перевод s1 в верхний регистр | UPPER(s1) UCASE(s1) |
UPPER(s1) |
Строковые функции, возвращающие целое число
| Назначение функции | DB2 | Oracle |
| ASCII-код символа с | ASCII(c) | |
| Поиск в строке s1, начиная с позиции n1, n2-го вхождения строки s2 | INSTR(s1,s2,n1,n2) | |
| Поиск в строке s1 вхождения строки s2 | POSSTR(s1,s2) | |
| Поиск в строке s1, начиная с позиции n1, вхождения строки s2 | LOCATE(s1,s2,n1) | |
| Длина строки s1 | LENTH(s1) | |
Функции даты и времени описаны в отдельном документе.
Функции преобразования типов.
В DB2 функции преобразования типов имеют имена целевого типа: CHAR(x), DECIMAL(x), DOUBLE(x) и т.д.
В Oracle основные функции преобразования типов: TO_CHAR(x, format_string), TO_NUMBER(x, format_string), TO_DATE(x, format_string).
Агрегатные функции возвращают единственное значение для множества строк. Синтаксис большинства агрегатных функций:
|
Наиболее общие агрегатные функции:
| Минимум | MIN |
| Максимум | MAX |
| Среднее значение | AVG |
| Сумма | SUM |
| Количество | COUNT |
Агрегатные функции не учитывают строки с пустыми (NULL) значениями. Исключение в этом отношении составляет функция COUNT(*).
В DB2 для преобразования типов (как базовых, так и объектных) может применяться также CAST-выражение. В Oracle выражение CAST применяется только для преобразования объектных типов.
Специальные регистры DB2 представляют собой область памяти, которую менеджер СУБД определяет для каждого приложения и записывает в нее некоторую общую информацию, могущую быть полезной в составе запроса.
В Oracle для тех же целей используются некоторые функции SQL (эти функции не имеют параметров). Некоторые, на наш взгляд, наиболее полезные специальные регистры/функции приведены в таблице.
| Специальные регистры DB2 | Функции Oracle |
| CURRENT DATE - текущая дата CURRENT TIME - текущее время CURRENT TIMESTAMP - текущая дата и время |
SYSDATE - текущая дата и время |
| USER - имя текущего пользователя | USER - имя текущего пользователя |
Скалярный_запрос, который может выступать в качестве столбцового_выражения только в DB2, является запросом, возвращающим единственное значение (таблицу, состоящую из одной строки и одного столбца). Так, запрос:
SELECT last_name, (SELECT MAX(salary) FROM employee)-salary
FROM employee;
выполнится в DB2, но будет воспринят как синтаксическая ошибка в Oracle.
CASE-выражение, которое может выступать в качестве столбцового_выражения только в DB2, является выражением выбора по условию/условиям и имеет синтаксис:
|
Запрос:
SELECT last_name,
CASE
WHEN hire_date>='01.01.1986' THEN 'old'
ELSE 'new'
END
FROM employee;
выполнится в DB2, но будет воспринят как синтаксическая ошибка в Oracle.
Операции, которые могут выполняться над компонентами столбцового выражения следующие:
|
Первые четыре операции - общепринятые арифметические операции. Две последние - различные представления операции конкатенации строк.
Хотя стандарт SQL предусматривает также операцию ** - возведение в степень, обе наши СУБД реализуют эту операцию функциями.
Фраза FROM определяет перечень таблице (базовых, виртуальных, промежуточных), из которых происходит выборка данных. Во фразе FROM обязательно указываются также и те таблицы, значения из которых не попадают в конечную выборку, но используются во фразе WHERE. Cинтаксис фразы FROM:
|
DB2 требует обязательного присвоения псевдонима запросу, указанному в списке фразы FROM, Oracle разрешает этого не делать.
Соединение как табличное выражение мы описываем ниже.
Фраза WHERE определяет условия отбора строк для результирующей таблицы (реализует реляционную операцию ограничения). Синтаксис фразы WHERE:
|
Предикат является выражением, результат которого - TRUE, FALSE или UNKNOWN. Различаются следующие предикаты:
|
Предикат сравнения позволяет сравнивать как результаты вычисления двух выражений, так и результат вычисления выражения с результатом запроса
|
В Oracle запрос обязательно должен быть правым операндом операции сравнения (как показано на диаграмме). В DB2 не только может быть как левым, так и правым операндом, но и оба операнда операции сравнения могут быть запросами.
Предикат BETWEEN имеет синтаксис:
|
Предикат LIKE имеет синтаксис:
|
escape-выражение задает символ, который может ставиться перед служебным символом шаблона. Двойное вхождение escape-символа в выражение шаблона означает его одинарное вхождение.
Предикат NULL имеет синтаксис:
|
Предикат IN имеет синтаксис:
|
Предикаты с кванторами имеют синтаксис:
|
Предикат EXISTS имеет синтаксис:
|
Фраза GROUP определяет результирующую таблицу, которая содержит группировку строк той таблицы, которая получилась от выполнения предыдущих фраз подзапроса. Синтаксис фразы:
|
Группирование должно производиться так, чтобы значение выражения группирования было общим для всех строк группы. Выражение группирования не может содержать запросы.
Выражение группирования может использоваться в условии поиска фразы HAVING, в выражениях фразы SELECT и во фразе ORDER BY.
Если выражение SELECT содержит GROUP BY, в списке выбора могут быть только:
Выражения в GROUP BY могут содержать любые столбцы из таблиц, указанных в фразе FROM, независимо от того, фигурируют ли они в списке выборки.
Выражения в GROUP BY могут содержать любые столбцы из таблиц, указанных в фразе FROM, независимо от того, фигурируют ли они в списке выборки.
Фраза HAVING применяется только совместно с фразой GROUP. Она оставляет в результирующей таблице только те группы, для которых условие является истинным. Синтаксис фразы HAVING:
|
Каждое столбцовое выражение, фигурирующее в условии, должно быть:
Внутренние и внешние соединения
Наиболее распространенный способ соединения таблиц - эквисоединение - указание во фразе WHERE условия равенства значений в столбцах, например:
SELECT name, regional_group
FROM department, location
WHERE department.location_id = location.location_id
Такое соединение (как эквисоединение, так и соединение по любому произвольному условию) дает результирующую таблицу, в которой каждая строка одной таблице комбинируется со строкой другой таблице и для результирующей строки условие соединения является истинным.
Внешнее соединение включает в себя внутреннее соединение, а также некоторые строки отсутствующие в результате внутреннего соединения. Типы внешних соединений:
Для строк, которым нет соответствия в другой таблице, значения тех столбцов результата, которые должны выбираться из другой таблицы устанавливаются пустыми.
В DB2 внешние соединения обеспечивается как частный случай операции соединения. В DB2 табличное выражение во фразе FROM может представлять собой соединение таблиц. Синтаксис соединения следующий:
|
В Oracle нет операции JOIN. Внешние соединения обеспечиваются в Oracle оператором (+) в эквисоединении. Базовый синтаксис для соединения двух таблиц в Oracle выглядит следующим образом:
|
Операция (+) применяется к столбцу той таблицы, которая дополняет строку пустыми значениями
Дополнительные ограничения:
|
UNION - реляционная операция объединения Иерархические запросы в Oracle обеспечиваются фразой CONNECT в операторе SELECT:
INTERSECT - реляционная операция пересечения
EXECPT (DB2) / MINUS (Oracle) - реляционная операция вычитания
|
START WITH - задает строку/строки, лежащие в корне иерархии. Эта фраза определяет условие, которому должны соответствовать корневые строки. Условие не должно содержать подзапросов. Если эта фраза не задана, то все строки таблицы являются корневыми.
CONNECT BY - задает отношение между родительскими и дочерними строками в иерархии. Отношение задается условием, это может быть любое условие, но какая-то его часть должна содержать оператор PRIOR, относящийся к родительской строке:
|
Чтобы найти дочерние строки Oracle вычисляет PRIOR-выражение для родительской строки, а другое выражение - для каждой строки таблицы. Строки, для которых это выражение дает истину, являются дочерними. CONNECT BY может содержать и другие условия-фильтры. CONNECT BY не может содержать подзапросов.
Примеры формулирования иерархических запросов в Oracle:
Пример 1. Выбрать фамилии всех прямых начальников ADAMS.
SELECT employee_id, last_name, manager_id
FROM employee
CONNECT BY PRIOR manager_id=employee_id
START WITH last_name= 'ADAMS';
Пример 2. Вывести структуру подчиненности в фирме.
SELECT level, employee_id, last_name, manager_id
FROM employee
CONNECT BY PRIOR employee_id=manager_id
START WITH last_name=
(SELECT last_name
FROM employee, job
WHERE employee.job_id=job.job_id
AND function ='PRESIDENT' );
Выборки Oracle, использующие иерархические свойства запросов, могут использовать псевдостолбец level. Этот псевдостолбец имеет значение 1 для узла дерева, находящегося в корне, 2 - для узлов, являющихся непосредственными потомками корневого, и т.д.
Та же самая (и даже несколько более широкая) задача в DB2 решается с помощью временных представлений. Такое представление/представления определяется в операторе SELECT - только для данного запроса и существует только на время выполнения этого запроса.
Синтаксис определения временных представлений следующий:
|
Временное представление может применяться для сокращения записи, но также временные представления могут определяться рекурсивными запросами.
Примеры формулирования иерархических запросов в DB2:
Пример 1. Выбрать фамилии всех прямых начальников ADAMS.
WITH temp (name, id, mid) AS
(SELECT last_name, employee_id, manager_id
FROM employee
WHERE last_name= 'ADAMS'
UNION ALL
SELECT last_name, employee_id, manager_id
FROM employee, temp
WHERE employee_id=mid )
SELECT DISTINCT name, id, mid
FROM temp;
Пример 2. Вывести структуру подчиненности в фирме.
WITH temp (level, name, id, mid) AS
(SELECT 1 AS level, last_name, employee_id, manager_id
FROM employee
WHERE last_name=
(SELECT last_name
FROM employee, job
WHERE employee.job_id=job.job_id
AND function ='PRESIDENT' )
UNION ALL
SELECT level+1 AS level, last_name, employee_id, manager_id
FROM employee, temp
WHERE manager_id=id )
SELECT DISTINCT level, name, id, mid
FROM temp
ORDER BY level;
Псевдостолбец level в DB2 отсутствует, но программист может ввести его сам.
| Каталог | Оглавление | Индекс раздела |