Шрифт:
Интервал:
Закладка:
Следующий пример вернет пять строк, начиная со строки 101 упорядоченного набора:
SELECT FIRST 5 SKIP 100 MEMBER_ID, MEMBERSHIP_TYPE, JOIN_DATE
FROM MEMBERS
ORDER BY JOIN DATE;
! ! !
СОВЕТ. Для получения n строк с самыми большими значениями столбцов в соответствии с условиями упорядочения установите порядок сортировки DESC[ENDING].
. ! .
SELECT <список-столбцов>Предложение SELECT определяет список столбцов, которые будут помещаться в выходной набор. Список должен содержать, по меньшей мере, один столбец, который не обязательно должен быть столбцом, присутствующим в таблице. Эта фраза не является столь странной, как она звучит. Список столбцов действительно является выходной спецификацией и относится к языку манипулирования данными (DML). Выходные спецификации могут включать следующее:
* идентификатор столбца, который хранится в таблице, задан в просмотре или объявлен как выходной аргумент хранимой процедуры. При некоторых условиях идентификатор столбца должен содержать уточнение в виде имени или алиаса содержащей его таблицы;
* простое или сложное выражение, сопровождаемое идентификатором времени выполнения;
* константное значение, сопровождаемое идентификатором времени выполнения;
* контекстная переменная сервера, сопровождаемая идентификатором времени выполнения;
* символ *, часто называемый "звездочкой выбора", который задает все столбцы. Хотя SELECT * не исключает выбор одного или более столбцов из той же таблицы индивидуально, вообще-то в этом нет смысла. Чтобы включить дубликаты столбцов для специальных целей, применяйте для него ключевое слово AS и алиас, возвращая его как вычисляемое (только для чтения) поле.
Все следующие спецификации SELECT правильны.
Простой список столбцов:
SELECT COLUMN1, COLUMN2 ...
Уточненные имена столбцов, требуемые для спецификаций со многими таблицами:
SELECT
TABLEA.ID,
TABLEA.BOOK_TITLE,
TABLEB.CHAPTER_TITLE,
CURRENT_TIMESTAMP AS RETRIEVE_DATE . . .
Выражение (агрегирующее):
SELECT MAX (COST * QUANTITY) AS BEST_SALE ...
Выражение (преобразующее):
SELECT 'EASTER' || CAST (EXTRACT (YEAR FROM CURRENT_DATE) AS CHAR(4)) AS SEASON ...
Переменные и константы:
SELECT
ACOLUMN,
BCOLUMN,
CURRENT_USER, /* контекстная переменная */
'Jaybird' AS NICKNAME ...
/* константа времени выполнения */
Все столбцы таблицы:
SELECT * ...
Режимы выборки:
SELECT FIRST 5 SKIP 100 ACOLUMN, BCOLUMN ...
/* это не будет иметь смысла при отсутствии в дальнейшем предложения ORDER BY */
Выражения и константы в качестве выходных полейКонстанты или выражения - которые могут включать, а могут и не включать имя столбца- могут возвращаться только как неизменяемые, вычисляемые в момент выполнения поля. Такому столбцу должно назначаться имя, уникальное среди имен
выходного набора. Имена для столбцов времени выполнения называются алиасами столбцов. Для большей ясности алиас столбца необязательно может быть отмечен ключевым словом 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 может быть разделен на одну или более вложенных групп, которые обобщают (суммируют) наборы данных, возвращенных с каждого вложенного уровня. Такое группирование часто использует агрегирующие выражения, т. е. выражения, содержащие функции, которые работают с множеством значений, таких как итоги, средние значения, счетчики строк, минимальные/максимальные значения.
- Delphi. Учимся на примерах - Сергей Парижский - Программирование
- Сделай видеоигру один и не свихнись - Слава Грис - Программирование / Руководства
- Психбольница в руках пациентов - Алан Купер - Программирование