Шрифт:
RDB$DATABASE является системной таблицей, содержащей одну и только одну строку, которая хранит сведения заголовочной информации о базе данных. Что там находится, неважно для пользователей Firebird. Тот факт, что там всегда содержится одна строка - ни больше, ни меньше - делает эту таблицу удобной, когда мы хотим найти значение на сервере, которое не хранится ни в таблице, ни в просмотре, ни в хранимой процедуре.
Например, для получения приложением нового значения генератора, что иногда может нам понадобиться для создания строк подчиненной стороны в новой структуре главная-подчиненная, мы создаем в приложении функцию, которая обращается к следующему запросу:
SELECT GEN_ID(MyGenerator, 1) FROM RDB$DATABASE;
В РСУБД Oracle для аналогичных целей используется таблица DUAL.
Используйте это предложение, чтобы добавить имена и условия соединения для второго и каждого последующего потока данных (таблица, просмотр или хранимая процедура выбора), который объединяется в многотабличном операторе SELECT - одно предложение JOIN ... ON для каждого исходного набора. Синтаксис и использование JOIN подробно обсуждается в главе 22. Следующий оператор иллюстрирует простое внутреннее соединение между двумя таблицами из предыдущего примера:
SELECT
TABLEA.ID,
TABLEA.BOOK_TITLE,
TABLEB.CHAPTER_TITLE,
CURRENT_TIMESTAMP AS RETRIEVE_DATE
FROM TABLEA
JOIN TABLEB
ON TABLEA.ID = TABLEB.ID_В ...
В том же фрагменте оператора идентификаторы таблиц могут быть заменены на алиасы таблиц, например:
SELECT
T1.ID,
T1.BOOK_TITLE,
T2.CHAPTER_TITLE,
CURRENT_TIMESTAMP AS RETRIEVE_DATE
FROM TABLEA T1
JOIN TABLEB T2
ON T1.ID = T2.ID_B ...
Использование алиасов таблиц в многотабличных запросах подробно рассматривается в главе 22.
Условия поиска, ограничивающие выводимые строки, размещаются в приложении WHERE. Условия поиска могут изменяться от условия простого соответствия для одного столбца до сложных условий, включающих выражения, предикаты AND, OR и NOT, преобразование типов, условия наборов символов и последовательностей сортировки и многое другое.
Предложение WHERE является фильтрующим предложением, определяющим, какие строки являются кандидатами для включения в выходной набор. Те строки, которые не были исключены условиями поиска в предложении WHERE, могут быть готовы для передачи инициатору запроса или они могут передаваться для последующей обработки, упорядочения на основании предложения ORDER BY С объединением или без объединения на основании предложения GROUP BY.
Следующие простые примеры иллюстрируют некоторые предложения WHERE, использующие условия выборки для ограничения отыскиваемых строк:
SELECT COLUMN 1, C0LUMN2 FROM ATABLE
WHERE ADATE BETWEEN '2002-12-25' AND '2004-12-24'...
/**/
SELECT TL.ID, T2.TITLE, CURRENT_TIMESTAMP AS RETRIEVE_DATE
FROM TABLEA
JOIN TABLEB
ON TABLEA.ID = TABLEB.ID_B
WHERE TABLEA.ID = 99 ;
/**/
SELECT MAX(COST * QUANTITY) AS BEST_SALE
FROM SALES
WHERE SALES_DATE > '31.12.2003'...
Глава 21 посвящена выражениям и предикатам, используемым в условиях поиска.
Интерфейсы доступа к данным, реализованные в API Firebird, имеют возможность обрабатывать константы в условиях поиска как заменяемые параметры. Следовательно, приложение может создавать оператор с динамическими условиями поиска в предложении WHERE, значения которых можно устанавливать непосредственно перед выполнением запроса. Такая возможность иногда называется динамическим связыванием.
Подробности см. в одном из следующих разд. "Использование параметров".
Выход оператора SELECT может быть разделен на одну или более вложенных групп, которые обобщают (суммируют) наборы данных, возвращенных с каждого вложенного уровня. Такое группирование часто использует агрегирующие выражения, т. е. выражения, содержащие функции, которые работают с множеством значений, таких как итоги, средние значения, счетчики строк, минимальные/максимальные значения.
Следующий простой пример иллюстрирует группирующий запрос. Агрегатная SQL - функция SUMO используется для вычисления общего количества продаж для каждого типа продукции: