
Реляционная модель
- Реляционная алгебра
- Реляционное исчисление
Основан на реляционной алгебре: ISBL
Эдгар Франк «Тед» Кодд и Кристофер Дейт Эдгар Кодд (1923–2003) — британский учёный, работы которого заложили основы теории реляционных баз данных. Он создал реляционную модель данных, работая в компании IBM. Кристофер Дейт дал наиболее распространённую трактовку реляционной модели данных. Согласно его мнению, модель состоит из трёх частей: структурной, манипуляционной и целостной.
Типы операций
- Теоретико-множественные
- UNION, INTERSECT, etc…
Специальные реляционные
Выборка (унарная операция)
Применяется к одному отношению и определяет результирующее отношение, которое содержит только те кортежи из исходного отношения, которые удовлетворяют заданному условию (предикату). $\sigma$ предикат $(R)$
{sql}SELECT * FROM "Персоны" WHERE "Возраст" >= 34
Проекция (унарная операция).
Применяется к одному отношнеию и определяет новое отношение, содержащее вертикальное подномжество исходного отношения, создаваемое посредством извлечения значений указанных атрибутов и исключения из результата строк-дубликатов. $Па_1,…,a_n(R)$
{sql}SELECT "Возраст", "ВЕС" FROM "Персоны"
Объединение.
Объединение двух отношений $R$ и $S$ определяет новое отношение, которое включает все кортежи, содержащиеся только в $R$, все кортежи, содержащиеся только в $S$ и кортежи, содержащиеся одновременно в $R$ и в $S$ с исключением дубликатов. $R$ и $S$ должны быть совместимы по объединению, то есть состоять из одинакового количества атрибутов и каждая пара соответствующих атрибутов должна иметь одинаковый домен. Для совместимости можно предварительно применить проекцию. Имена атрибутов могут не совпадать - главное, чтобы совпадали домены. $R \cup S$
{sql}SELECT * FROM "Персоны" UNION SELECT * FROM "Персоны"
Пересечение
Операция пересечения определяет отношение, которое содержит кортежи, присутствующие как в отношении $R$, так и в отношении $S$. Отношения $R$ и $S$ должны быть совместимы по объединению. $R \cup S$
Разность
Разность двух отношений $R$ и $S$ состоит из кортежей, которые имеются в отношении $R$, но отсутствуют в отношении $S$. Отношения $R$ и $S$ должны быть совместимы по объединению. $R-S$
Произведение
Декартово произведение. Операция декартова произведения определяет новое отношение, которое является результатом конкатенации (сцепления) каждого кортежа из отношения $R$ с каждым кортежем из отношения $S$. $R \times S$. В чистом виде применяется редко, но служит основой для построения соединений.
Деление
Определяет отношение, состоящее из множества кортежей отношения $R$, которые определены на атрибуте $С$, соответствующем комбинации всех кортежей отношения $S$, где $C$ - множество атрибутов, имеющихся в отношении $R$, но отсутствующих в отношении $S$.
Соединение
Тета-соединение. Определяет отношение, которое содержит кортежи из декартова произведения отношений $R$ и $S$, удовлетворяющие предикату $F$. Где предикат $F$ имеет вид $R_{ai} \Theta S_{bi}$, гдо вместо тета может быть указана одна из операций сравнения ($<$, $<=$ и т.Д.). $R \blacktriangleright FS$
Если используются только сравнения по равенству, то такое соединение называется соединением по эквивалентности.
Естественное соединение - соединение по эквивалентности двух отношений, выполненное по всем общим атрибутам, из результатов которого исключается по одному экземпляру каждого общего атрибута. $R><S$
Критика Дейта
Избыточность
- достаточно всего лишь пяти
- пересечение, соединение, деление выводятся
Недостаточность
- переименование атрибутов
- вычисление атрибутов
- агрегирующие функции (SUM, AVG)
- присваивание результатов временным отношениям
Синтаксический порядок SELECT
… Выбор типа
- TIMESTAMPTZ
- Если важны события и их последовательность
- логи, аудиты
- при запросе смотрит на клиентскую тайм-зону
- не хранит тайм-зоны
- постоянно конвертирует
- Если важны события и их последовательность
- TIMESTAMP
- даты из прошлого, для которого не важен часовой пояс
Пусть сервер на -3 часа, я на +3 часа, Есть разные клиенты (проги) Вот открыли 3 разных клиента. Возвращаем текущее время на каждой из них
INSERT
[ WITH [ RECURSIVE ] _with_query_ [, ...] ]
INSERT INTO _table_name_ [ AS _alias_ ] [ ( _column_name_ [, ...] ) ]
[ OVERRIDING { SYSTEM | USER } VALUE ]
{ DEFAULT VALUES | VALUES ( { _expression_ | DEFAULT } [, ...] ) [, ...] | _query_ }
[ ON CONFLICT [ _conflict_target_ ] _conflict_action_ ]
[ RETURNING [ WITH ( { OLD | NEW } AS _output_alias_ [, ...] ) ]
{ * | _output_expression_ [ [ AS ] _output_name_ ] } [, ...] ]
where _conflict_target_ can be one of:
( { _index_column_name_ | ( _index_expression_ ) } [ COLLATE _collation_ ] [ _opclass_ ] [, ...] ) [ WHERE _index_predicate_ ]
ON CONSTRAINT _constraint_name_
and _conflict_action_ is one of:
DO NOTHING
DO UPDATE SET { _column_name_ = { _expression_ | DEFAULT } |
( _column_name_ [, ...] ) = [ ROW ] ( { _expression_ | DEFAULT } [, ...] ) |
( _column_name_ [, ...] ) = ( _sub-SELECT_ )
} [, ...]
[ WHERE _condition_ ]
Если происходит конфликт, обработка идёт в ON CONFLICT,
- если ON CONFLICT DO NOTHING, то если будет ошибка, то ничего не делаем(не вставляем, не заменяем)
- если ON CONFLICT DO UPDATE SET, то заменем
%%upsert, автоинкремент%%
UPDATE
[ WITH [ RECURSIVE ] _with_query_ [, ...] ]
UPDATE [ ONLY ] _table_name_ [ * ] [ [ AS ] _alias_ ]
SET { _column_name_ = { _expression_ | DEFAULT } |
( _column_name_ [, ...] ) = [ ROW ] ( { _expression_ | DEFAULT } [, ...] ) |
( _column_name_ [, ...] ) = ( _sub-SELECT_ )
} [, ...]
[ FROM _from_item_ [, ...] ]
[ WHERE _condition_ | WHERE CURRENT OF _cursor_name_ ]
[ RETURNING [ WITH ( { OLD | NEW } AS _output_alias_ [, ...] ) ]
{ * | _output_expression_ [ [ AS ] _output_name_ ] } [, ...] ]
🌱 Авторы:
salt-caramel
notakeith