SQL Flashcards

1
Q

Что такое Реляционная Модель?

A

Предполагает мультитабличную систему организации данных, имитирующую отношения между сущностями программы (one-to-many/many-to-many/one-to-one)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Зачем в таблице primary key? Что это такое?

A

1) Чтобы соблюсти принцип Integrity: таблица не может содержать 2 полностью одинаковых ряда.
2) комбинация NOT NULL и UNIQUE constraints. Помечает каждую запись в базе данных уникальным значением.
~~~
country_name VARCHAR(40) NOT NULL UNIQUE, =>
ALTER TABLE countries ADD PRIMARY KEY (country_name);
also:
ADD CONSTRAINT pk_student PRIMARY KEY (name,birth_date);
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Зачем в таблице foreign key?

A

1) создает связь между двумя таблицами и защищает от действий, которые могут нарушить связи между таблицами: он всегда ссылается на PRIMARY KEY другой таблицы.
2) С его помощью создаётся many-to-one relation.

3) Поддерживает referential actions при UPDATE / DELETE:
CASCADE:
SET NULL
SET DEFAULT
RESTRICT
NO ACTION

CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(60)
department_id INT,
[ CONSTRAINT fk_department ] FOREIGN KEY (department_id)
REFERENCES departments(id) );

ALTER TABLE employees
ADD FOREIGN KEY (department_id)
REFERENCES departments(department_id)
ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE employees DROP FOREIGN KEY fk_department;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое one-to-one?

A

одному ряду (tuple) в данной таблице (relation) может соответствовать лишь один ряд в другой таблице, обратное тоже верно:гражданин - паспорт

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что такое many-to-many?

A

сотрудник - зона ответственности. Это отношение воплощено через сводную таблицу по принципу one-to-many.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое identifying ralationship?

A

Когда ФК становится ПК или частью составного ПК в таблице.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Почему SQL - декларативный язык?

A

Потому, что он говорит что надо сделать но не говорит как.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Какие базовые типы данных есть в SQL?

A
  • INTEGER
  • FLOAT
  • DECIMAL(20, 2): 20 - precision / 2 - scale
  • VARCHAR(10): 10- max length.
  • BOOLEAN
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Что такое DDL? Какие операции в него входят? (4) Рассказать про них.

A

Операторы определения данных:
* CREATE создает объект БД (базу, таблицу, представление, пользователя и т. д.);
* ALTER изменяет объект;
- - ADD / MODIFY / DROP COLUMN | rename: CHANGE old new;
* DROP удаляет объект;
* TRUNCATE удаляет таблицу и создает ее пустую заново, но если в таблице были foreigh key, то создать таблицу не получится,
rollback после TRUNCATE невозможен.

NB: DDL команды транзакционны - разработчик не контролирует транзакцию, она открывается и закрывается сама.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что такое DML? Какие операции в него входят? Рассказать про них.

A
  • SELECT … FROM … WHERE … выбирает данные, удовлетворяющие заданным условиям;

SELECT concat(first_name, ' ', last_name) FROM persons;

**CASE** : ~~~ SELECT customer_id, first_name, CASE   WHEN age >= 18 THEN 'Allowed' END AS can_vote FROM Customers; ~~~

COALESCE: ~~~    SELECT  name,     COALESCE(department, 'No department') AS dept ~~~
  • INSERT INTO добавляет новые данные ( VALUES );INSERT INTO SELECT FROM:
    ~~~
    INSERT INTO table1 (column_1, column_2, …, column_n)
    SELECT column_1, column_2, …, column_n
    FROM table2 WHERE condition;
    ~~~
  • UPDATE изменяет существующие данные;
      UPDATE table SET col1 = expr1, colN = exprN WHERE
  • DELETE FROM удаляет данные при выполнении условия WHERE или все данные: DELETE FROM table_name;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Что такое TCL? Какие операции в него входят? Рассказать про них.

A

Transaction Control Language, TCL):
* BEGIN служит для определения начала транзакции;
* COMMIT применяет транзакцию;
* ROLLBACK откатывает все изменения, сделанные в контексте текущей транзакции;
* SAVEPOINT разбивает транзакцию на более мелкие.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Что такое DCL? Какие операции в него входят? Рассказать про них.

A

Data Control Language, DCL):
* GRANT предоставляет пользователю (группе) разрешения на определенные
операции с объектом;
* REVOKE отзывает ранее выданные разрешения;
* DENY задает запрет, имеющий приоритет над разрешением.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

the order of evaluation of the statements in a quiery

A

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Нюансы работы с NULL в SQL. Как проверить поле на NULL?

A

NULL означает отсутствие значения и не принадлежит ни одному типу данных. Поэтому NULL не равно ни логическому значению FALSE, ни пустой строке, ни 0.

1) При любой операции с NULL получится NULL (a + null = null)
2) При сравнении NULL с любым значением будет получен NULL
3) в агрегатных функциях значения null игнорируются
4)В логических операциях (OR) может вернуться true / false :
(NULL = 1) OR TRUE equals to TRUE
5) можно использовать COALISE:
SELECT id, name, COALESCE(age, 0) as age, grade FROM students;
6) можно задать constraint NOT NULL

Проверить на null: IS NULL, IS NOT NULL, сравнение с помощью “=” вернёт NULL.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что такое JOIN? Виды Join’ов?

A

JOIN предназначен для обеспечения выборки данных из двух и более таблиц на основе общей колонки и включения этих данных в результирующую таблицу. Prymary key из одной таблицы должен ссылаться на Foreigh key другой таблицы.

* (INNER) JOIN Результатом объединения таблиц являются записи, общие для левой и правой таблиц. Порядок таблиц для оператора не важен, поскольку оператор является симметричным.

SELECT table1.col_name1 [AS name1], tableN.col_name2 [AS nameN]
FROM table1 [AS a]
[type_of_join] JOIN table2 [AS b]
    ON table1.id = table2.id;
[type_of_join] JOIN table3
    ON table2.col_name_table2 = table3.col_name_table3;
	LIMIT 10, 5;

* LEFT (OUTER) JOIN. Производит выбор всех записей первой таблицы и соответствующих им записей второй таблицы. Если записи во второй таблице не найдены, то вместо них подставляется пустой результат (NULL). Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

* RIGHT (OUTER) JOIN с операндами, расставленными в обратном порядке. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

* FULL (OUTER) JOIN. Результатом объединения таблиц являются все записи, которые присутствуют в таблицах. Порядок таблиц для оператора не важен, поскольку
оператор является симметричным.

* CROSS JOIN (декартово произведение) При выборе каждая строка одной таблицы объединяется с каждой строкой второй таблицы, давая тем самым все возможные сочетания строк двух таблиц. Порядок таблиц для оператора не важен, поскольку оператор является симметричным.

NB: вместо JOIN можно применять WHERE:
SELECT table1.col_name1, table2.col_name2
FROM table1 [AS a], table2 [AS b]
WHERE table1.id = table2.id;

	https://sky.pro/media/join-v-sql/
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что лучше использовать join или подзапросы? Почему?

A

Подзапросы могут размещаться в SELECT, UPDATE, INSERT, and DELETE;

В SELECT могут размещаться в FROM и WHERE

Обычно лучше использовать JOIN, поскольку в большинстве случаев он более понятен и лучше оптимизируется СУБД (но 100% этого гарантировать нельзя).
Подзапросы лучше использовать в случаях, когда нужно выбрать данные из таблицы на основании данных другой таблицы.

UPDATE students SET exams_passed = TRUE WHERE name in (
SELECT name FROM exam_results WHERE
math_exam_mark >= 18 AND english_exam_mark >= 18 );

DELETE FROM orders WHERE customer_id =
(SELECT customer_id FROM customers WHERE name = ‘Ann Smith’);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Что делает UNION?

A

UNION применяется для объединения результатов нескольких SQL-запросов в единую таблицу, состоящую из схожих записей. Оба запроса должны возвращать одинаковое число столбцов и совместимые типы данных в соответствующих столбцах.

UNION сам по себе не гарантирует порядок записей. В случаях, когда требуется определенный порядок, необходимо использовать ORDER BY.

Разница между UNION и UNION ALL заключается в том, что UNION будет пропускать дубликаты записей, тогда как UNION ALL будет включать дубликаты записей.

SELECT name FROM teachers 
UNION [ALL] / INTERSECT / MINUS (EXCEPT)
SELECT name FROM administrative_staff
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Что такое HAVING и чем отличается от WHERE (3) ?

A

SELECT customer_id, SUM(amount) AS total
FROM Orders
GROUP BY customer_id
HAVING SUM(amount) < 500;

HAVING используется для фильтрации результата применения агрегатных функций ( MIN(), MAX(), SUM(), AVG(), COUNT()) и для спецификации GROUP BY, WHERE проверяет условие для каждого ряда по отдельности и не используется с агрегатными функциями.
HAVING используется после GROUP BY, WHERE перед GROUP BY.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Что такое TRIGGER?

A

Это блок кода, который отработает до и/или после события.
Работают с событиями: INSERT , UPDATE , DELETE
Работают до или после события: BEFORE , AFTER
Можно организовать их последовательность: FOLLOWS , PRECEDES

CREATE TRIGGER some_trigger
BEFORE INSERT ON some_table
FOR EACH ROW [PRECEDES / FOLLOWS other_trigger]
SET @sum = @sum + NEW.int_value;

SELECT @sum as sum_of_values;

CREATE TRIGGER save_fired_employee
AFTER DELETE
ON employee
FOR EACH ROW
BEGIN
INSERT INTO fired_employee VALUES (OLD.id, OLD.name, CURDATE());
SET @sum = @sum - OLD.salary;
END;

DROP TRIGGER some_trigger;
SHOW TRIGGERS [FROM table_name];

20
Q

Что такое ORDER BY?

A

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

21
Q

Что такое GROUP BY?

A

GROUP BY используется для колонок с повторяющимися значениями применяя агрегатную функцию к значениям ячеек других колонок:
Создает отдельную группу для всех возможных значений (включая значение NULL).

Делит результат запроса на группы рядов согласно значениям колонки-аттрибута обычно с целью применения к этой группе агрегатных функций. Таким образом SELECT, в котором выполнен GROUP BY вернёт один результат на каждую такую группу.

При использовании GROUP BY все значения NULL считаются равными.

SELECT column_name [, list_of_other_columns]
     , aggregation [, list_of_aggregations]
FROM table_name
[WHERE list_of_conditions]
GROUP BY column_name [, list_of_other_columns]
[HAVING list_of_aggregate_conditions]
[ORDER BY list_of_columns/aliases];

SELECT country, state, MIN(age) as min_age
FROM Persons
GROUP BY country, state;

22
Q

Что такое DISTINCT?

A

указывает, что для вычислений используются только уникальные значения колонки.

23
Q

Что такое LIMIT / OFFSET?

A

LIMIT Ограничивает выборку заданным числом.
OFFSET = skip() в Stream API
SELECT first_name, last_name
FROM Customers
LIMIT 2 OFFSET 3;

24
Q

Что такое EXISTS?

A

EXISTS используется в WHERE
Берет подзапрос, как аргумент, и оценивает его как TRUE, если подзапрос возвращает какие-либо записи, и FALSE, если нет.
Если вернулось TRUE - результат внешнего запроса добавляется в resultset,
если FALSE - результат скипается и идёт проверка следующего ряда.

SELECT customer_id, first_name
FROM Customers
WHERE [NOT] EXISTS (
SELECT order_id
FROM Orders
WHERE Orders.customer_id = Customers.customer_id
);

25
Q

Расскажите про операторы BETWEEN, IN, LIKE, ANY,
IS DISTINCT FROM

A

BETWEEN - выдает диапазон включительно

IN перечисляет точные значения к поиску, сокращая использование OR. Можно использовать с NOT

LIKE проверяет соответствует ли строка шаблону:
- - % - любое кол-во символов: %с% -> …c…
- - _ - один символ. c -> aca / bcs / ccc / …

ANY сравнивает значение ячейки из первой таблицы со всеми значениями заданной колонки второй таблицы и возвращает подходящее значение из первой.
Найти учителей-ровестников учеников:
SELECT * FROM Teachers WHERE age = ANY (
SELECT age FROM Students );

IS DISTINCT FROM : != / <>
NULL IS NOT DISTINCT FROM NULL => TRUE
WHERE city IS DISTINCT FROM 'New-York'; => name 'John' city 'null'

26
Q

Что делает оператор MERGE? Какие у него есть ограничения?

A

MERGE служит для обмена данными между таблицами:
позволяет осуществить слияние данных одной таблицы с данными другой таблицы.
При слиянии таблиц проверяется условие, и если оно TRUE, то выполняется UPDATE, а если нет – INSERT, если в целевой таблице присутствует значение, отсутствующее в исходной - DELETE

При этом изменять поля таблицы в секции UPDATE, по которым идет связывание двух таблиц, нельзя.

MERGE TargetProducts AS Target
USING SourceProducts	AS Source
ON Source.ProductID = Target.ProductID
    
-- For Inserts
WHEN NOT MATCHED BY Target THEN
    INSERT (ProductID,ProductName, Price) 
    VALUES (Source.ProductID,Source.ProductName, Source.Price)
    
-- For Updates
WHEN MATCHED THEN UPDATE SET
    Target.ProductName	= Source.ProductName,
    Target.Price		= Source.Price
    
-- For Deletes
WHEN NOT MATCHED BY Source THEN
    DELETE;
27
Q

Какие агрегатные функции вы знаете?

A

Агрегатных функции – функции, которые берут группы значений и сводят их к одиночному значению.

SELECT FUNCTION(column_name) FROM table_name ...;
  • CONCAT соединяет строки;
  • COUNT производит подсчет записей, удовлетворяющих условию запроса
    SELECT COUNT( * / [DISTINCT] column ), AVG(column) FROM
  • SUM вычисляет арифметическую сумму всех значений колонки;
  • AVG вычисляет среднее арифметическое всех значений;
  • MAX определяет наибольшее из всех выбранных значений;
  • MIN определяет наименьшее из всех выбранных значений.
28
Q

Что такое ограничения (constraints)? Какие вы знаете?

A

Ограничения ( CONSTRAINT ) – это ключевые слова, которые помогают установить правила размещения данных в базе.
~~~
CONSTRAINT pk_employee PRIMARY KEY (department_id, employee_id)
CONSTRAINT uq_id_last_name UNIQUE (personal_id, last_name)
ALTER TABLE employees DROP INDEX uq_id_last_name;
~~~

NOT NULL указывает, что значение не может быть пустым.
UNIQUE обеспечивает отсутствие дубликатов.
PRIMARY KEY один на таблицу

FOREIGN KEY один на таблицу

CHECK проверяет, вписывается ли значение в заданный диапазон (s_id int CHECK(s_id > 0)).

DEFAULT устанавливает значение по умолчанию, если значения не предоставлено (name VARCHAR(20) DEFAULT ‘noname’).

29
Q

Что такое суррогатные ключи?

A

Суррогатный ключ – это служебное поле, задача которого гарантировать уникальность конкретного ряда, независимо от содержащейся в нем информации, в отличии от РК, который используется для разграничения рядов как единиц информации.
Мы оставляем системе следить за уникальностью суррогатного ключа и как правило используем его в качестве PK.
Значение суррогата выбирается один раз для каждой строки и потом никогда не изменяется.

CREATE TABLE Example (
SurrogateKey INT IDENTITY(1,1) – A surrogate key that increments automatically )

	CREATE TABLE Example (
PrimaryKey INT PRIMARY KEY -- A primary key is just an unique identifier)
30
Q

Что такое индексы? В чём их минусы?

A

Индексы относятся к настройке производительности, и позволяют быстрее извлекать записи из таблицы, засчет создания дополнительной стр-ры данных, элементы которой хранят ссылки на адрес соответствующих рядов таблицы.
но
- требует дополнитульного места.
- при изменении данных в БД сначала обновляется исходная таблица, а затем все её индексы, таким образом если БД постоянно обновляется, ее индексы обновляться не будут и станут бесполезны.
- Чем больше в таблице индексов, тем дольше обновляются данные в БД.

31
Q

Какие существуют классификации индексов?

A
  • simple / compound - одно / несколко полей.
  • Unique Index: гарантирует уникальность поля или уникальную комбинацию включенных в него полей.
    Создание уникального индекса для СУБД равносильно объявлению unique constraint при создании таблицы или модификации таблицы. Считается, сто последнее предпочтительнее в силу наглядности.
  • Partial - создаётся на сабсет данных таблицы:
    CREATE INDEX unpaidOrdersIdx ON orders (order_id)
    WHERE is_paid = false;
  • Кластеризованный индекс (Clustered Index): Создается автоматически при объявлении РК и физически изменяет порядок строк, сортируя их на основе РК. Для поиска использует бинарный поиск.
    Это ускоряет операции чтения из БД.

-** Некластеризованный индекс (Non-Clustered Index):** не меняет структуру данных а создает отдельную структуру, хранящую ссылки на элементы таблицы.

NB: таблица может содержать 1 кластеризованный и анлим некластеризованных.

32
Q

В каких структурах данных хранятся индексы?

A
  • B-Tree: самобалансирующееся дерево - дефолтная структура данных для хранения индексов
  • Hash TAble
  • Bitmap - переводит значения в битовое представление, подходит для узкой области значений (true / false)
  • Spatial - для хранения координат и прочих геометрических данных.

DBSM сама решает какую структуру данных выбрать, но мы можем задать её явно:
CREATE INDEX index_name
ON table_name (column_name) USING BTREE;

33
Q

Когда лучше не использовать индексы?

A

1) в небольших таблицах
2) в таблицах с частыми массовыми update & insert
3) в столбцах, значение которых часто меняется
4) в столбцах, где много null

34
Q

Как правильно составить составной индекс?

A

Следуя правилу “left-prefix-rule”:
CREATE INDEX full_date ON people(year, month, day) - пойдёт для поиска по
year only
year and month
year, month, and day
Он не поможет при поиске по day / month and day

35
Q

Что будет, если в WHERE указать сначала неиндексированное поле, а потом индексированное (where … and …) ?

A

СУБД сама сначала просканирует по индексированным полям, а потом просканирует получившийся результат по неинексированной колонке.

36
Q

Что такое план запроса? Как с ним работать?

A

СУБД анализирует все возможные пути выполнения запроса и оптимизатор запроса (!1) выбирает оптимальный и исполняет его. Каждый возможный путь - ПЛАН ЗАПРОСА.

План имеет древовидную структуру (как диспетчер файлов) и читается снизу вверх:

SELECT * FROM customers WHERE age > 25 =>
SELECT
-> Filter: (age > 25)
-> Table scan on customers

EXPLAIN [ANALIZE] - позволяет увидеть план запроса с ключевыми метриками cost & rows, алгоритмы поиска, …
- ANALIZE помимо вывода предполагаемых метрик запроса исполнит этот запрос и выведет фактические метрики

!1 - компонент СУБД, анализирующий возможные пути выполнения запроса и выбирающий оптимальный из них.

37
Q

Чем TRUNCATE отличается от DELETE?

A

DELETE Медленнее, чем TRUNCATE, так как удаляет записи по одной. Есть возможность восстановить данные (вызвав ROLLBACK). Её лучше использовать когда в таблице есть foreign key, так как будет использована referential action.
TRUNCATE – DDL оператор, удаляет всю таблицу и создает её заново. Нет возможность восстановить данные – сделать ROLLBACK. Её не стоит использовать если на таблицу ссылается foreigh_key, но мы можем применить TRUNCATE сначала на дочернюю таблицу, затем на основную, тогда всё сработает.

38
Q

Что такое хранимые процедуры? Для чего они нужны?

A

Объект базы данных, представляющий собой набор SQL- инструкций, который хранится DBMS.

CREATE PROCEDURE my_procedure ()
BEGIN
UPDATE table SET col_1 = 100 WHERE col_2 = ‘a’; SELECT * FROM table;
END;
CALL my_procedure;
DROP PROCEDURE my_procedure;

Хранимые процедуры очень похожи на обыкновенные методы языков высокого уровня, у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам.
В хранимых процедурах могут выполняться стандартные операции с базами данных (как DDL, так и DML). Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления процессом исполнения.
Хранимые процедуры позволяют повысить производительность, расширяют возможности программирования и поддерживают функции безопасности данных.
В большинстве СУБД при первом запуске хранимой процедуры она компилируется (выполняется синтаксический анализ и генерируется план доступа к данным) и в дальнейшем ее обработка осуществляется быстрее.

PROCEDURE с параметрами:
CREATE PROCEDURE SomeName(
IN SomeParameter VARCHAR(50),
OUT SomeParameter1 INT,
)
BEGIN
– PROCEDURE BODY;
END;
CALL SomeName(“foo”, @value)
SELECT @value;

39
Q

Что такое представления (VIEW)? Для чего они нужны?

A

View – виртуальная таблица, представляющая данные одной или более таблиц в виде хранимого в памяти именного SELECT стэйтмента.

Они работают в запросах и операторах DML точно так же, как и таблицы-родители, но не содержат никаких собственных данных. Выполнять DML команды над View можно лишь если соблюдён ряд условий по его созданию:
1) не использовались подзапросы, агрегатные функции & GROUP BY & DISTINCT
2) использовалась только одна таблицп
3) вью должен содержать уникальный или праймари ключ
4) все значения должны быть NOT NULL

Позволяют:
- дать публичный доступ к некоторой информации из основной таблицы.
- сократить код сложных запросов
- кастомизировать вид таблицы для разных пользоователей таблицы.

CREATE [OR REPLACE]
VIEW view_name AS
SELECT 
    column1, 
    column2, 
    ...
FROM 
    table_name
WHERE 
    condition;
40
Q

Что такое временные таблицы? Для чего они нужны?

A

Нужна
- для сложных запросов, требующих промежуточных результатов.

2 Вида:
1) Локальные: # - Таблица, которая существует только в период текущей сессии и доступна только внутри неё. Удаляется автоматически по её окончании.
2) Глобальные: ## - Таблица, которая доступна всем открытым сессиям и удалится, когда прекратся последняя сессия, использовавшая её.

CREATE TABLE #ProductSummary
(ProdId INT IDENTITY,
ProdName NVARCHAR(20),
Price MONEY)

41
Q

Что такое транзакции? Какие у нее могут быть состояния (5)?

A

Транзакция – это единица работы DBMS, выраженная в переводе БД из одного целостного состояния в другое.

Состояния транзакции:
active / partially commited / failed state / aborted / commited

42
Q

Расскажите про принципы ACID

A
  • Атомарность (atomicity) гарантирует, что транзакция будет полностью выполнена или полностью отменена. Это означает, что при сбое любой части транзакции происходит сбой всей транзакции и состояние базы данных остается неизменным.
  • Согласованность (consistency). Выполненная транзакция не нарушает согласованность базы данных (соблюдение всех правил и ограничений схемы).
  • Изолированность (isolation). параллельные транзакции не должны оказывать влияние на результат друг друга:
    изменения, сделанные транзакцией не видны другим транзакциям, до её завершения.
  • Долговечность (durability). Независимо от проблем (потеря питания, сбои / ошибки любого рода) изменения, сделанные успешно завершенной транзакцией, обязаны быть отражены в системе.
43
Q

Какие есть Transaction Isolation Issues?

A

Lost Update - когда две транзакции меняют один сегмент, первая транзакция успешно коммитится, а вторая делает ролбэк. В итоге апдэйт теряется

Dirty Read - первая транзакция производит запись. Между тем вторая транзакция считывает ту же cамую запись до завершения первой.
Позже первая транзакция делает ролбэк, и теперь у нас есть грязные данные во второй транзакции.

Non-Repeatable Read:
Когда первая транзакция дважды читает данные, но между этими чтениями вторая транзакция изменяет эти данные и делает commit.
В результате первая транзакция получает 2 разных результата.
Last Commit Wins - частный случай NRR, когда 2 транзакции параллельно читают и меняют данные, в базусохранятся результаты последней закоммиченной транзакции.

Phantom Read: Первая транзакция читает набор записей. Затем вторая транзакция вставляет или удаляет запись в диапазон первой транзакции.
Позднее первая транзакция снова считывает тот же диапазон и в том числе получает запись, которую только что вставила транзакция B.

44
Q

Расскажите про уровни изолированности транзакций.

A

1) Read Uncommited : транзакция читает любую инфу, независимо от того, закоммичена ли она.
Исключается Lost Update , возможен Dirty Read:

2) Read Commited: транзакция видит состояние базы на момент своего старта.
Исключается Dirty Read. При нескольких селектах возможен non-repeatable read:

3) Repeatable Read : вся читаемая текущей т. инфа блокируется от модификации другими транзакциями до конца текущей т.
Исключается non-repeatable read, При нескольких селектах возможен phantom read.

4) Serializable: исключает все возможные аномалии.

45
Q

Что такое нормализация и денормализация? Расскажите про 3 нормальные формы?

A

Избыточность - когда одни и те же данные хранятся в базе в нескольких местах, что приводит к аномалиям ().

Нормализация - последовательный обратимый процесс приведения БД к эталонному виду (от одной нормальной формы к следующей) с целью достижения минимальной избыточности.

Нормальная форма - Состояние схемы БД, отвечающее определенному набору критериев.

Перед нормализацией нужно, чтобы база соответствовала реляционной модели (отсутствие нумерации строк и столбцов).

1) Первая нормальная форма (1NF): таблица соответствует реляционной модели и соблюдает правила:
- строки не дублируются
- в каждой ячейке хранится атомарное значение (одно несоставное значение)
- в столбце хранятся данные одного типа
- отсутствуют массивы и списки в любом виде

2) Вторая нормальная форма (2NF): Таблица находится в 1NF и соблюдает принципы:
- Таблица должна иметь ключ
- Все неключевые столбцы должны зависеть от полного ключа (не должно быть данных, которые можно получить по части составного ключа)
PK{ project | participant } | position | project duration

3) Третья нормальная форма (3NF): Таблица находится в 2NF и соблюдает принципы:
* Отсутствие транзитивной зависимости: когда один неключевой столбец связан с РК через другой неключевой столбец:
- uuid | name | department | department description

3 * ) Нормальная форма Бойса-Кодда: таблица находится в 3НФ и
* Часть составного РК не должна зависеть от неключевого столбца:
PK{ проект | направление } | куратор

4) В таблице не должно быть мгогозначных зависимостей:
B !-> C & A –> B & A –> C ; (курс- препод - аудитория)

5) невозможно определить без понимания предметной области

    • декомпозиция: разделение таблицы на несколько
  • Денормализация базы данных – это процесс обратный от нормализации. Эта техника добавляет избыточные данные в таблицу, учитывая частые запросы к базе данных, которые объединяют данные из разных таблиц в одну таблицу. Необходимо для повышения производительности и скорости извлечения данных за счет увеличения избыточности данных.

Каждая сущность должна храниться в отдельной таблице.

46
Q

Какие типы работают с датами?

A

DATE, TIME, DATETIME, TIMESTAMP, and INTERVAL

DATETIME
Хранит время в виде целого числа в формате YYYYMMDDHHMMSS, используя для этого 8 байт. Это время не зависит от временной зоны. Оно всегда отображается при выборке точно так же, как было сохранено, независимо от того какой часовой пояс установлен в SQL.

create table dt1 ( col datetime NOT NULL );
SET @@session.time_zone=’+00:00’;
insert into dt1 values(now());
select * from dt1; => 2009-06-04 18:14:10
SET @@session.time_zone=’+01:00’;
select * from dt1; => 2009-06-04 18:14:10

TIMESTAMP
хранит значение равное количеству секунд, прошедших с полуночи 1 января 1970 года по усредненному времени Гринвича. При получении из базы отображается с учетом часового пояса. Размер 4 байта.
Часовой пояс может быть задан в операционной системе, глобальных настройках MySQL или в конкретной сессии.
TIMESTAMP по умолчанию NOT NULL, а его значение по умолчанию равно NOW().

create table tm1 (col timestamp not null);
set @@session.time_zone = ‘+00:00’;
insert into tm1 values(now());
select * from tm1; => 2009-06-04 18:25:08
mysql> set @@session.time_zone = ‘+01:00’;
select * from tm1; => 2009-06-04 19:25:08

SELECT CURDATE() / CURTIME() / CURRENT_TIMESTAMP()
SELECT DATEDIFF(first_date, second_date);
SELECT EXTRACT(MONTH FROM ‘2020-11-04’);
SELECT DATE_ADD / DATE_SUB(CURDATE(), INTERVAL 10 DAY);