Некоторые особенности FireBird

Активная работа с жестким диском

FireBird пишет в файл базы данных «по каждому чиху». Это связано с тем что FB не имеет журнала транзакций, в отличии от MS SQL. На современном оборудовании (SSD диски) это не оказывает никакого влияния.

Зацикливание

INSERT INTO TABLE1 SELECT * FROM TABLE1

В версии FireBird до 3 сработает и повесит его наглухо. Будьте внимательны

Транзакция по умолчанию - это SNAPSHOT

Если в транзакции READ COMMITED выполнить запрос

SELECT * FROM TABLE1

из таблицы с большим числом записей и не спеша двигаться в конец таблицы, то мы запросто может встретить новые записи, добавленные в таблицу после выполнения указанного SELECT-запроса.
Таким образом, SELECT-запрос в рамках транзакции READ COMMITED не является «атомарным».Но кто сказал, что SELECT-запрос должен быть во всех случаях «атомарным»? В данном вопросе каждая СУБД поступает так, как считает правильным.
Для Firebird транзакция по умолчанию - это SNAPSHOT, и здесь SELECT-запрос является атомарным на 100%!

FIRST, SKIP и ROWS

FIRST и SKIP используются только в Firebird, они не включены в стандарт SQL. Рекомендуется использовать ROWS везде, где это возможно.

Выражение FIRST <число записей> ограничивает результирующий набор данным указанным числом записей.
Выражение SKIP <число записей> пропускает указанное число записей перед выдачей результирующего набора данных.
Когда эти выражения используются совместно, например FIRST m SKIP n, то в результате n записей будет пропущено и, из оставшихся, m записей будет возвращено в результирующем наборе данных.
FIRST и SKIP являются необязательными выражениями

Синтаксис:

SELECT
[FIRST <m>] [SKIP <n>]
FROM ...
...
<m>, <n> ::= integer literal
 | query parameter
 | (integer-expression)

или

SELECT
...
FROM ...
...
ROWS m [TO n]
m, n ::= integer-expression


Типичные ошибки

1. Пытаемся удалить первые 10 записей

DELETE FROM MYTABLE
WHERE ID IN (SELECT FIRST 10 ID FROM MYTABLE)

В итоге получим пустую таблицу. Подзапрос будет выбирать каждый раз по 10 записей и они будут удаляться

2.В некоторых случаях IN=EXISTS

WHERE F1 IN (SELECT FIRST 5 F2
 FROM TABLE2
 ORDER BY 1 DESC)

=

WHERE EXISTS (SELECT * F2
 FROM TABLE2
 WHERE TABLE2.F2 = TABLE1.F2
 ORDER BY 1 DESC)

Order by 1,2,3,4

В конструкцию Order by и Group by вместо названия полей в сортировке можно подставлять их порядковый номер. Не не забывайте, чем больше полей в запросе тем труднее потом искать.

select id, name, adress, inn
from table1
order by 1,2,4

Объединение значений в строку

В стандарте T-SQL для объединения текстовых строковых аргументов используется функция CONCAT, в FierBird используется две вертикальные черты ||

select name||' '||adress
from table 1

Результат

Имя Адрес

Значение может быть текстовым, числовым или датой. Но с датой будут свои особенности
например нам нужно вывести дату когда был оформлен выезд и адрес склада в одном поле.

select mp.dttm||' '||mp.address from
mobile_plan mp

результат будет таким: