Сортировка

Результат выборки данных при выполнении оператора SELECT по умолчанию никак не упорядочивается (хотя довольно часто происходит упорядочение в хронологическом порядке помещёния строк в таблицу операторами INSERT). Предложение ORDER BY позволяет задать необходимый порядок при выборке данных.

Синтаксис:

SELECT ... FROM ...
...
ORDER BY <ordering-item> [, <ordering-item> ...]
<ordering-item> ::=
    {col-name | col-alias | col-position | expression}
    [COLLATE collation-name]
    [ASC[ENDING] | DESC[ENDING]]
    [NULLS {FIRST | LAST}]

col-name - Полное имя столбца. col-alias - Алиас (псевдоним) столбца. col-position - Позиция столбца. expression - Произвольное выражение. collation-name - Имя сопоставления (порядка сортировки).

В предложении через запятую перечисляются столбцы, по которым нужно упорядочить результирующий набор данных. Можно задавать имя столбца, псевдоним, присвоенный столбцу в списке выбора при помощи ключевого слова AS, или порядковый номер столбца в списке выбора. В одном предложении можно для разных столбцов смешивать форму записи. Например, один столбец в списке сортировки может быть задан своим именем, а другой порядковым номером.

Ключевое слово ASCENDING задаёт упорядочение по возрастанию значений. Допустимо сокращение ASC. Применяется по умолчанию. Ключевое слово DESCENDING задаёт упорядочение по убыванию значений. Допустимо сокращение DESC. В одном предложении упорядочение по одному столбцу может идти по возрастанию значений, а по другому — по убыванию.

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

Ключевое слово NULLS определяет, где в отсортированном наборе данных будут находиться значения NULL соответствующего столбца – в начале выборки (FIRST) или в конце (LAST). По умолчанию принимается NULLS FIRST.

В описанном ниже запросе выборка будет отсортирована по возрастанию по столбцам RDB $CHARACTER_SET_ID, RDB$COLLATION_ID таблицы DB$COLLATIONS:

SELECT
    RDB$CHARACTER_SET_ID AS CHARSET_ID,
    RDB$COLLATION_ID AS COLL_ID,
    RDB$COLLATION_NAME AS NAME
FROM RDB$COLLATIONS
ORDER BY RDB$CHARACTER_SET_ID, RDB$COLLATION_ID

То же самое, но сортировка производится по псевдонимам столбцов:

SELECT
    RDB$CHARACTER_SET_ID AS CHARSET_ID,
    RDB$COLLATION_ID AS COLL_ID,
    RDB$COLLATION_NAME AS NAME
FROM RDB$COLLATIONS
ORDER BY CHARSET_ID, COLL_ID

В следующем запросе производится сортировка, по номерам столбцов:

SELECT
    RDB$CHARACTER_SET_ID AS CHARSET_ID,
    RDB$COLLATION_ID AS COLL_ID,
    RDB$COLLATION_NAME AS NAME
FROM RDB$COLLATIONS
ORDER BY 1, 2