КаталогОглавлениеИндекс раздела


Справка. Синтаксис запроса

Фраза SELECT
   Столбцовое выражение
       Константы
       Функции
       Агрегатные функции
       CAST-выражение
       Специальные регистры/функции
       Скалярный запрос
       CASE-выражение
       Операции

Фраза FROM

Фраза WHERE
   Предикаты
       Предикаты сравнения
       Предикат BETWEEN
       Предикат LIKE
       Предикат NULL
       Предикат IN
       Предикаты с кванторами
       Предикат EXISTS

Фраза GROUP

Фраза HAVING

Внутренние и внешние соединения
   DB2
   Oracle

Полный запрос

Иерархические запросы
   Oracle
   DB2

Основой языка SQL является "выражение подзапроса", синтаксис которого приведен на рисунке.

Ниже разбирается синтаксис отдельных фраз подзапроса. Фраза 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 - реляционная операция объединения
INTERSECT - реляционная операция пересечения
EXECPT (DB2) / MINUS (Oracle) - реляционная операция вычитания

Иерархические запросы в Oracle обеспечиваются фразой CONNECT в операторе SELECT:

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 отсутствует, но программист может ввести его сам.


КаталогОглавлениеИндекс раздела