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

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
некоторые_особенности_firebird [01.04.2022 17:25]
OLDest
некоторые_особенности_firebird [01.04.2022 17:35]
Строка 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=EXIST\\ 
-<​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}}