====== Некоторые особенности 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 ] [SKIP ]
FROM ...
...
, ::= 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
Результат
Имя Адрес
Значение может быть текстовым, числовым или датой. Но с датой будут свои особенности\\
{{:pasted:20220401-172318.png}}
например нам нужно вывести дату когда был оформлен выезд и адрес склада в одном поле.
select mp.dttm||' '||mp.address from
mobile_plan mp
результат будет таким:\\
{{:pasted:20220401-172534.png}}