Хелен Борри - Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ стр 89.

Шрифт
Фон

Выражения и константы в качестве выходных полей

Константы или выражения - которые могут включать, а могут и не включать имя столбца- могут возвращаться только как неизменяемые, вычисляемые в момент выполнения поля. Такому столбцу должно назначаться имя, уникальное среди имен

выходного набора. Имена для столбцов времени выполнения называются алиасами столбцов. Для большей ясности алиас столбца необязательно может быть отмечен ключевым словом AS.

Возьмем предыдущий пример:

SELECT 'EASTER' || CAST (EXTRACT (YEAR FROM CURRENT_DATE) AS CHAR(4)) AS SEASON ...

В 2004 году этот алиас столбца будет возвращен для каждой строки набора в виде:

SEASON

======

EASTER2004

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

! ! !

ПРИМЕЧАНИЕ. Константы типа BLOB и массивы не могут быть использованы для выходных полей времени выполнения.

. ! .

О выражениях и функциях читайте в следующей главе.

FROM <таблица-или-процедура-или-просмотр>

Предложение FROM задает источник данных, который может быть таблицей, просмотром или хранимой процедурой, имеющей выходные аргументы. Если оператор включает соединение двух или более структур, то предложение FROM задает структуру, находящуюся в левой части. Другие таблицы добавляются в спецификацию при использовании последующих предложений ON (СМ. разд. "JOIN <спецификация> ").

В следующих примерах предложения FROM добавляются к спецификациям SELECT предыдущих примеров:

SELECT COLUMN1, COLUMN2 FROM ATABLE . . .

SELECT

TABLEA.ID,

TABLEA.BOOK_TITLE,

TABLEB.CHAPTER_TITLE,

CURRENT_TIMESTAMP AS RETRIEVE_DATE

FROM TABLEA . . .

SELECT MAX(COST * QUANTITY) AS BEST_SALE

FROM SALES ...

SELECT 'EASTER'||CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS CHAR(2))

AS SEASON

FROM RDB$DATABASE ;

SELECT ACOLUMN, BCOLUMN, CURRENT_USER, 'Jaybird' AS NICKNAME

FROM MYTABLE ...

Синтаксис внутреннего соединения SQL-89

Firebird обеспечивает поддержку устаревшего синтаксиса неявного внутреннего соединения SQL-89. Например:

SELECT

TABLEA.ID,

TABLEA.BOOK_TITLE,

TABLEB.CHAPTER_TITLE,

CURRENT_TIMESTAMP AS RETRIEVE_DATE

FROM TABLEA, TABLEB ...

По разным причинам вам не следует использовать этот синтаксис в новых приложениях (см. главу 22).

Что это за таблица RDB$DATABASE?

RDB$DATABASE является системной таблицей, содержащей одну и только одну строку, которая хранит сведения заголовочной информации о базе данных. Что там находится, неважно для пользователей Firebird. Тот факт, что там всегда содержится одна строка - ни больше, ни меньше - делает эту таблицу удобной, когда мы хотим найти значение на сервере, которое не хранится ни в таблице, ни в просмотре, ни в хранимой процедуре.

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

SELECT GEN_ID(MyGenerator, 1) FROM RDB$DATABASE;

В РСУБД Oracle для аналогичных целей используется таблица DUAL.

JOIN <спецификация>

Используйте это предложение, чтобы добавить имена и условия соединения для второго и каждого последующего потока данных (таблица, просмотр или хранимая процедура выбора), который объединяется в многотабличном операторе 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 <условия-поиска>

Условия поиска, ограничивающие выводимые строки, размещаются в приложении 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 посвящена выражениям и предикатам, используемым в условиях поиска.

Параметры в предложении WHERE

Интерфейсы доступа к данным, реализованные в API Firebird, имеют возможность обрабатывать константы в условиях поиска как заменяемые параметры. Следовательно, приложение может создавать оператор с динамическими условиями поиска в предложении WHERE, значения которых можно устанавливать непосредственно перед выполнением запроса. Такая возможность иногда называется динамическим связыванием.

Подробности см. в одном из следующих разд. "Использование параметров".

GROUP BY <список-группируемых-столбцов>

Выход оператора SELECT может быть разделен на одну или более вложенных групп, которые обобщают (суммируют) наборы данных, возвращенных с каждого вложенного уровня. Такое группирование часто использует агрегирующие выражения, т. е. выражения, содержащие функции, которые работают с множеством значений, таких как итоги, средние значения, счетчики строк, минимальные/максимальные значения.

Следующий простой пример иллюстрирует группирующий запрос. Агрегатная SQL - функция SUMO используется для вычисления общего количества продаж для каждого типа продукции:

SELECT PRODUCT_TYPE, SUM(NUMBER_SOLD) AS SUM_SALES

FROM TABLEA

WHERE SERIAL_NO BETWEEN 'A' AND 'K'

GROUP BY PRODUCT_TYPE;

Результат может быть похожим на следующий:

PRODUCT TYPE SUM SALES

Gadgets 174

Whatsits 25

Widgets 117

Firebird предоставляет широкий диапазон возможностей группирования с весьма ограниченными правилами управления их логикой.

! ! !

ВНИМАНИЕ! Если вы конвертируете базу данных из InterBase в Firebird, то это одна из областей, где вам нужно помнить о различиях. Firebird является менее терпимым к нелогичным спецификациям группирования, чем его предшественник. Это позволяет исключить возможность выполнения запросов, возвращающих некорректные результаты.

. ! .

Обобщающие выражения обсуждаются в главе 21. Подробную информацию о предложении GROUP BY см. в главе 23.

HAVING <предикат-группирования>

Необязательное предложение HAVING может быть использовано вместе со спецификацией группирования для включения или исключения строк или групп, как это делает предложение WHERE, ограничивая набор строк. Часто в группирующих запросах предложение HAVING может заменить предложение WHERE. При этом, поскольку HAVING оперирует с промежуточным набором, созданным в качестве входа для спецификации GROUP BY, может оказаться более экономичным использование условия WHERE для ограничения количества строк и условия HAVING для ограничения количества групп.

Изменим предыдущий пример, добавив предложение HAVING для получения только тех PRODUCT_TYPE, которые имели количество продаж больше 100:

SELECT PRODUCT_TYPE, SUM(NUMBER_SOLD) AS SUM_SALES

FROM TABLEA

WHERE SERIAL_NO BETWEEN 'A' AND 'K'

AND PRODUCT_TYPE = 'WIDGETS'

GROUP BY PRODUCT_TYPE

HAVING SUM(NUMBER_SOLD) > 100;

Вывод будет таким:

PRODUCT TYPE SUM SALES

Widgets 117

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке