мета-данные страницы
  •  

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
некоторые_особенности_firebird [01.04.2022 17:35]
некоторые_особенности_firebird [01.04.2022 17:35]
OLDest
Строка 1: Строка 1:
 +====== Некоторые особенности FireBird ======
 +=== Активная работа с жестким диском ===
  
 +FireBird пишет в файл базы данных "по каждому чиху"​. Это связано с тем что FB не имеет журнала транзакций,​ в отличии от MS SQL. На современном оборудовании (SSD диски) это не оказывает никакого влияния. ​
 +
 +=== Зацикливание ===
 +
 +<code sql>
 +INSERT INTO TABLE1 SELECT * FROM TABLE1
 +</​code>​
 +В версии FireBird до 3 сработает и повесит его наглухо. Будьте внимательны
 +
 +=== Транзакция по умолчанию - это SNAPSHOT ===
 +
 +Если в транзакции READ COMMITED выполнить запрос
 +<​code>​SELECT * FROM TABLE1</​code>​
 +из таблицы с большим числом записей и не спеша двигаться в конец таблицы,​ то мы запросто может встретить новые записи,​ добавленные в таблицу после выполнения указанного 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 являются необязательными выражениями\\
 +\\
 +Синтаксис:​\\
 +<​code>​
 +SELECT
 +[FIRST <m>] [SKIP <n>]
 +FROM ...
 +...
 +<m>, <n> ::= integer literal
 + | query parameter
 + | (integer-expression)
 +</​code>​
 +или\\
 +<​code>​
 +SELECT
 +...
 +FROM ...
 +...
 +ROWS m [TO n]
 +m, n ::= integer-expression
 +</​code>​
 +\\
 +**Типичные ошибки**\\
 +\\
 +1. Пытаемся удалить первые 10 записей\\
 +<​code>​
 +DELETE FROM MYTABLE
 +WHERE ID IN (SELECT FIRST 10 ID FROM MYTABLE)
 +</​code>​
 +В итоге получим пустую таблицу. Подзапрос будет выбирать каждый раз по 10 записей и они будут удаляться\\
 +\\
 +2.В некоторых случаях IN=EXISTS \\
 +<​code>​
 +WHERE F1 IN (SELECT FIRST 5 F2
 + FROM TABLE2
 + ORDER BY 1 DESC)
 +</​code>​
 +=
 +<​code>​
 +WHERE EXISTS (SELECT * F2
 + FROM TABLE2
 + WHERE TABLE2.F2 = TABLE1.F2
 + ORDER BY 1 DESC)
 +</​code>​
 +=== Order by 1,2,3,4 ===
 +В конструкцию **Order by** и **Group by** вместо названия полей в сортировке можно подставлять их порядковый номер. Не не забывайте,​ чем больше полей в запросе тем труднее потом ​ искать.
 +<​code>​
 +select id, name, adress, inn
 +from table1
 +order by 1,2,4
 +</​code>​
 +=== Объединение значений в строку ===
 +В стандарте T-SQL для объединения текстовых строковых аргументов используется функция CONCAT, в FierBird используется две вертикальные черты ||
 +<​code>​
 +select name||'​ '​||adress
 +from table 1
 +</​code>​
 +Результат
 +<​code>​
 +Имя Адрес
 +</​code>​
 +Значение может быть текстовым,​ числовым или датой. Но с датой будут свои особенности\\
 +{{:​pasted:​20220401-172318.png}}
 +например нам нужно вывести дату когда был оформлен выезд и адрес склада в одном поле. ​
 +<​code>​
 +select mp.dttm||'​ '​||mp.address from
 +mobile_plan mp
 +</​code>​
 +результат будет таким:​\\
 +{{:​pasted:​20220401-172534.png}}