SQL Flashcards

1
Q

Что такое «SQL»?

A

SQL, Structured query language («язык структурированных запросов») — формальный непроцедурный язык программирования, применяемый для создания, модификации и управления данными в произвольной реляционной базе данных, управляемой соответствующей системой управления базами данных (СУБД).

Формальный - множество конечных слов (строк, цепочек) над конечным алфавитом. Различают языки естественные, на которых общаются люди, и искусственные (или формальные).

Непроцедурный - каждый оператор выдает результат, соответствующий запрашиваемому выходу. Ответственность за то, как добиться соответствующего выхода, лежит, в значительной степени, на моторе (движке) базы данных.

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

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

A

Реляционная модель была разработана в конце 1960-х годов Е.Ф.Коддом .

Реляционная база данных (RDBMS) - это тип базы данных, в которой данные хранятся в виде таблиц (реляций) с явными связями между ними. Каждая таблица состоит из строк (записей) и столбцов (полей), а связи между таблицами устанавливаются через общие поля.

Реляционная база данных это упорядоченная информация связанная между собой определенными отношениями

В реляционных базах данных информация хранится в виде связанных между собой таблиц.
(one-to-many/many-to-many/one-to-one)

Основные принципы реляционных баз данных:

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

База данных, в том числе и реляционная, используется для формального описания некоторой предметной области реального мира, например, склада, учебного процесса и пр. Обязательным этапом перед созданием базы данных является ее проектирование.

СУБД - “Надстройка” над БД, позволяет работать в БД, и предоставляет дополнительный функционал

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

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

A

Первичный ключ (primary key) - один или несколько столбцов таблицы, которые уникальным образом определяют один ее элемент.

1) Чтобы соблюсти принцип Integrity: таблица не может содержать 2 полностью одинаковых ряда.
2) комбинация NOT NULL и UNIQUE constraints. Помечает каждую запись в базе данных уникальным значением.

Primary key (первичный ключ) - это столбец или группа столбцов в таблице базы данных, который уникально идентифицирует каждую запись в этой таблице. Он используется для обеспечения уникальности идентификации записей и для связи данных между таблицами.

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

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
4
Q

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

A

Foreign 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
5
Q

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

A

One-to-one это отношение между двумя сущностями, где каждый экземпляр одной сущности связан только с одним экземпляром другой сущности, и наоборот. То есть на каждой стороне может быть только одна связь с другой стороной.
Например, каждый человек имеет только один паспорт, и каждый паспорт относится только к одному человеку.

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

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

A

Many-to-many это отношение между двумя сущностями, где каждый экземпляр одной сущности связан с несколькими экземплярами другой сущности, и наоборот. То есть на каждой стороне может быть несколько связей с другой стороной.
Например, ученики могут посещать несколько курсов, и каждый курс может иметь несколько студентов.

Всегда моделируются через третью ( связующую ) таблицу

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

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

A

One-to-many это отношение между двумя сущностями, где одна сущность связана с несколькими экземплярами другой сущности. То есть на стороне “один” может быть только один экземпляр, но на стороне “многие” может быть несколько связанных экземпляров.
Например, у компании может быть много сотрудников, но каждый сотрудник связан только с одной компанией.

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

Что такое identifying ralationship?

A

Identifying relationship - это отношение между двумя сущностями, где первичный ключ одной сущности используется в качестве внешнего ключа в другой сущности для установления связи между ними. Это означает, что связь между этими сущностями определяется по первичному ключу одной из них. Например, в связи между заказом и его деталями, идентифицирующим отношением будет использоваться первичный ключ заказа как внешний ключ для деталей заказа. Если заказ удаляется, все его детали также будут удалены, поскольку они зависят от него и не могут существовать без него.

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

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

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

A

SQL (Structured Query Language) является декларативным языком, потому что пользователь описывает, что нужно получить в результирующей выборке, а не как это сделать. Вместо того, чтобы программируя указывать каждый шаг выполнения запроса, пользователь SQL описывает данные, которые нужно выбрать, и СУБД сама выбирает наиболее эффективный способ выполнения запроса.

Таким образом, SQL скрывает от пользователя множество деталей и позволяет сконцентрироваться на описании необходимых данных. Это упрощает написание запросов и повышает эффективность работы с данными.

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

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

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

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

A

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

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

Проконтролировать создание базы данных можно с помощью оператора SHOW DATABASES, SHOW TABLES кроме пользовательских таблиц отображает также и служебные таблицы.

DESCRIBE table_name – показывает таблицу

DELETE FROM <table_name> - Удаление всех данных из таблицы</table_name>

Проверка на уже существующие базы данных:

CREATE DATABASE IF NOT EXIST имя_базы_данных;

Перед созданием таблицы необходимо выбрать базу данных, в которую таблица будет записана. Это делается с помощью оператора USE: USE имя_базы_данных.

Для того, чтобы посмотреть описание созданной таблицы можно воспользоваться оператором DESCRIBE: DESCRIBE Users;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
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 - определяет одно или несколько полей в таблице как уникальные идентификаторы строк.
PRIMARY KEY набор полей (1 или более), значения которых образуют уникальную комбинацию и используются для однозначной идентификации записи в таблице. Для таблицы может быть создано только одно такое ограничение. Данное ограничение используется для обеспечения целостности сущности, которая описана таблицей. Первичные ключи не могут позволить значений NULL

Ключевые особенности PRIMARY KEY в SQL:

Каждая таблица может иметь только один PRIMARY KEY.
Поля, определенные как PRIMARY KEY, не могут содержать NULL значения.
Значения в полях, определенных как PRIMARY KEY, должны быть уникальными.
Поля, определенные как PRIMARY KEY, обычно связаны с другими таблицами с помощью FOREIGN KEY.

Пример:
~~~
CREATE TABLE users (
user_id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
~~~

FOREIGN KEY защищает от действий, которые могут нарушить связи между таблицами.
FOREIGN KEY в одной таблице указывает на PRIMARY KEY в другой. Поэтому данное ограничение нацелено на то, чтобы не было записей FOREIGN KEY, которым не отвечают записи PRIMARY KEY.
Пример:
~~~
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT NOT NULL,
order_date DATE NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
~~~

CHECK позволяет установить свое условие, которому должно удовлетворять значение вводимое в таблицу, прежде чем оно будет принято.

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  user_id INT NOT NULL,
  order_date DATE NOT NULL,
  total_amount DECIMAL(10,2) NOT NULL,
  CHECK (total_amount >= 0)
);

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

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

Вложенный запрос (подзапрос, внутренний запрос).

A

Вложенный запрос (подзапрос, внутренний запрос) – это запрос внутри другого запроса SQL.

Вложенный запрос используется для выборки данных, которые будут использоваться в условии отбора записей основного запроса. Его применяют для:
* сравнения выражения с результатом вложенного запроса;
* определения того, включено ли выражение в результаты вложенного запроса;
* проверки того, выбирает ли запрос определенные строки.

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

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

A

Операторы манипуляции данными (Data Manipulation Language, DML):

SELECT выбирает данные, удовлетворяющие заданным условиям,
~~~
SELECT [DISTINCT | ALL] поля_таблиц

FROM список_таблиц

[WHERE условия_на_ограничения_строк]

[GROUP BY условия_группировки]

[HAVING условия_на_ограничения_строк_после_группировки по агрегатным функциям]

[ORDER BY порядок_сортировки [ASC | DESC]]

[LIMIT ограничение_количества_записей]
~~~
INSERT добавляет новые данные

Общая структура запроса с оператором INSERT

INSERT INTO имя_таблицы [(поле_таблицы, ...)]

VALUES (значение_поля_таблицы, ...)

| SELECT поле_таблицы, ... FROM имя_таблицы ...

UPDATE изменяет существующие данные
UPDATE FamilyMembers

SET member_name = "Andie Anthony"     что делаем

WHERE member_name = "Andie Quincey"   куда делаем

UPDATE Payments

SET unit_price = unit_price * 2

DELETE удаляет данные;
~~~
DELETE Reservations, Rooms FROM Reservations

JOIN Rooms ON Reservations.room_id = Rooms.id

WHERE Rooms.has_kitchen = false;
~~~
TRUNCATE TABLE имя_таблицы;

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

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

A

Операторы управления транзакциями (Transaction Control Language, TCL):
COMMIT подтверждает все изменения, внесенные в текущую транзакцию, и закрепляет их в базе данных.
~~~
DELETE FROM developers

WHERE SPECIALTY = ‘C++’;

COMMIT;
~~~

ROLLBACK откатывает все изменения, внесенные в текущую транзакцию, и возвращает базу данных к состоянию, которое было до начала транзакции.
SAVEPOINT создает точку сохранения внутри текущей транзакции, которую можно использовать для отката части изменений.
некая засечка в важных местах транзакции
SET TRANSACTION устанавливает свойства текущей транзакции, такие как уровень изоляции и режим блокировки.

BEGIN TRANSACTION - начинает новую транзакцию.

COMMIT TRANSACTION - подтверждает изменения и закрывает текущую транзакцию.

ROLLBACK TRANSACTION - откатывает все изменения и закрывает текущую транзакцию.

Команды управление транзакциями используются только для DML команд: INSERT, UPDATE, DELETE.

TRUNCATE не используется когда в таблице есть внешние ключи надо использовать делит

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

Что такое Транзакция?

A

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

Транзакция - набор команд, которые выполняются поочередно
Если все выполнены - транзакция считается успешной, если нет, то транзакция откатывается назад.

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

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

A

Операторы определения доступа к данным (Data Control Language, DCL):

GRANT предоставляет пользователю (группе) разрешения на определенные операции собъектом,
REVOKE отзывает ранее выданные разрешения,
DENY задает запрет, имеющий приоритет над разрешением;
– Предоставление права чтения таблицы students пользователю alex.

GRANT SELECT ON students TO alex;

– Запрет права выборки из таблицы orders пользователя alex.

DENY SELECT ON orders TO alex;

– Отменить запрет.

REVOKE SELECT ON total FROM piter;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
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
19
Q

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

A

NULL - специальное значение (псевдозначение), которое может быть записано в поле таблицы базы данных. NULL соответствует понятию «пустое поле», то есть «поле, не содержащее никакого значения».
Поэтому NULL не равно ни логическому значению FALSE, ни пустой строке, ни 0.

NULL означает отсутствие, неизвестность информации. Значение NULL не является значением в полном смысле слова: по определению оно означает отсутствие значения и не принадлежит ни одному типу данных. Поэтому NULL не равно ни логическому значению FALSE, ни пустой строке, ни 0. При сравнении NULL с любым значением будет получен результат NULL, а не FALSE и не 0. Более того, NULL не равно NULL!

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
20
Q

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

A

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

Первую таблицу называют Source , Вторую таблицу Target

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

  • (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;
* SELF JOIN - это операция объединения таблицы самой с собой в SQL.

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

В SQL существует несколько видов JOIN:

INNER JOIN - возвращает только те строки, которые имеют соответствующие значения в обеих таблицах.

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

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

FULL JOIN (или FULL OUTER JOIN) - возвращает все строки из обеих таблиц, включая те строки, которые не имеют соответствующих значений в другой таблице. Если значения отсутствуют в одной из таблиц, то возвращается NULL.

CROSS JOIN (или CARTESIAN JOIN) - возвращает комбинацию всех строк из каждой таблицы. Этот тип JOIN не требует условия соответствия.

Выбор определенного типа JOIN зависит от того, какие данные вы хотите получить в результате запроса и какие соответствия существуют между таблицами.

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

Отличия JOIN ON и JOIN USING

A

JOIN ON и JOIN USING - это разновидности оператора объединения таблиц в SQL запросах.

JOIN ON используется для объединения таблиц по условию, которое указывается после ключевого слова ON.

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

Примеры:

JOIN ON: SELECT * FROM table1 JOIN table2 ON table1.id = table2.id
JOIN USING: SELECT * FROM table1 JOIN table2 USING (id)

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

Используйте JOIN ON, когда:

  • Вам нужно объединить таблицы по сложному условию, которое не может быть выражено одним столбцом, например, по нескольким столбцам или с использованием функций
  • Вам нужно управлять порядком выполнения запроса и выбором записей для объединения, когда условие объединения не является простым

Используйте JOIN USING, когда:

  • Вам нужно объединить таблицы по столбцу, имеющему одинаковые имена и типы данных в обеих таблицах
  • Вам нужно написать более читаемый и краткий код запроса, так как оператор JOIN USING позволяет избежать повторения одного и того же столбца в условии объединения
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

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

A

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

Подзапросы лучше использовать в случаях, когда нужно вычислять агрегатные значения и использовать их для сравнений во внешних запросах.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
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

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

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

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

A

WHERE нельзя использовать с агрегатными функциями, HAVING можно (предикаты тоже).

WHERE используется для ограничения результирующей выборки путём накладывания фильтрации по условию.

WHERE - это ограничивающее выражение. Оно выполняется до того, как будет получен результат операции. WHERE служит для задания дополнительного условия выборки, операций вставки, редактирования и удаления записей. Условие (condition) может включать в себя предикаты AND, OR, NOT, LIKE, BETWEEN, IS, IN, ключевое слово NULL, операторы сравнения и равенства (<, >, =).

SELECT * FROM Planets
WHERE Radius BETWEEN 3000 AND 9000

HAVING работает уже с полученными данными, а WHERE непосредственно влияет на условия выборки, соответственно WHERE первичный фильтр, а HAVING вторичный.

HAVING - Оператор SQL HAVING является указателем на результат выполнения агрегатных функций. Агрегатной функцией в языке SQL называется функция, возвращающая какое-либо одно значение по набору значений столбца. Такими функциями являются: SQL COUNT(), SQL MIN(), SQL MAX(), SQL AVG(), SQL SUM().

SELECT Singer, SUM(Sale)
FROM Artists
GROUP BY Singer
HAVING SUM(Sale) > 2000000

Выражения WHERE используются вместе с операциями SELECT, UPDATE, DELETE, в то время как HAVING только с SELECT и предложением GROUP BY.

25
Q

Что такое ORDER BY?

A

ORDER BY - Правило сортировки.

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

26
Q

Что такое GROUP BY?

A

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

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

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

Агрегатные функции применяются для значений, не равных NULL. Исключением является функция COUNT()

SUM(поле_таблицы) Возвращает сумму значений
AVG(поле_таблицы) Возвращает среднее значение
COUNT(поле_таблицы) Возвращает количество записей
MIN(поле_таблицы) Возвращает минимальное значение
MAX(поле_таблицы) Возвращает максимальное значение

27
Q

Что такое DISTINCT?

A

DISTINCT указывает, что для вычислений используются только уникальные значения столбца. NULL считается как отдельное значение. DISTINCT нашел широкое применение в операторе SQL SELECT, для выборки уникальных значений. Так же используется в агрегатных функциях.

SELECT DISTINCT column_name FROM table_name

28
Q

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

A

LIMIT Ограничивает выборку заданным числом.
OFFSET = skip() в Stream API
~~~
SELECT first_name, last_name
FROM Customers
LIMIT 2 OFFSET 3;
~~~
```
SELECT поля_выборки
FROM список_таблиц
LIMIT [количество_пропущенных_записей,] количество_записей_для_вывода;
~~~

29
Q

Что такое EXISTS?

A

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

CREATE DATABASE IF NOT EXIST имя_базы_данных;

Оператор EXISTS обычно используется в качестве условия в операторе SELECT, WHERE, HAVING и других SQL-запросах.
Он может быть полезен, когда нужно проверить, существует ли в базе данных определенная информация или нет, или когда нужно выполнить запрос, только если в таблице есть строки, удовлетворяющие определенным условиям.

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

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

A

BETWEEN - определяет диапазон значений. В отличие от IN, BETWEEN чувствителен к порядку, и первое значение в предложении должно быть первым по алфавитному или числовому порядку.

SELECT * FROM Persons WHERE age BETWEEN 20 AND 25;

IN позволяет узнать входит ли проверяемое значение столбца в
список определённых значений
~~~
SELECT *
FROM Salespeople
WHERE city IN ( ‘Barcelona’, ‘London’ );
~~~

LIKE позволяет узнать соответствует ли строка (только CHAR или VARCHAR) определённому шаблону. В качестве условия используются символы трафаретные символы (wildkards)
Трафаретные символы:
1. символ подчеркивания (_), который можно применять вместо любого единичного символа в проверяемом значении
2. символ процента (%) заменяет последовательность любых символов (число символов в последовательности может быть от 0 и более) в проверяемом значении.

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’

31
Q

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

A

MERGE позволяет осуществить слияние данных одной таблицы с данными другой таблицы.

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

Является командой DML.

MERGE INTO table_name USING table_reference ON (condition)
   WHEN MATCHED THEN
   UPDATE SET column1 = value1 [, column2 = value2 …]
   WHEN NOT MATCHED THEN
   INSERT (column1 [, column2 …]) VALUES (value1 [, value2 …]);
32
Q

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

A

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

SELECT FUNCTION(column_name) FROM table_name ...;

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

В чем разница между COUNT() и COUNT({column})?

COUNT (*) подсчитывает количество записей в таблице, не игнорируя значение NULL, поскольку эта функция оперирует записями, а не столбцами.
COUNT ({column}) подсчитывает количество значений в {column}. При подсчете количества значений столбца эта форма функции COUNT не принимает во внимание значение NULL.

33
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’).

34
Q

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

A

Суррогатный ключ это разновидность primary key.
Используется в ситуациях, когда может повторяться PK(например id)
для дополнительной идентификации.

Суррогатный ключ (surrogate key) - это ключ, который используется в базе данных для идентификации записи, но не отражает никаких реальных свойств объекта, которому принадлежит эта запись. Обычно суррогатный ключ генерируется автоматически базой данных при добавлении новой записи, и может быть числом или строкой.

Суррогатный ключ (Surrogate Key) в базе данных - это уникальный идентификатор для каждой записи в таблице, который не имеет никакого отношения к значению данных.
Суррогатный ключ – это служебное поле, задача которого гарантировать уникальность конкретного ряда, независимо от содержащейся в нем информации, в отличии от РК, который используется для разграничения рядов как единиц информации.
Мы оставляем системе следить за уникальностью суррогатного ключа и как правило используем его в качестве 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)
35
Q

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

A

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

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

Индекс (index) - это структура данных в базе данных, которая ускоряет поиск и сортировку данных в таблице. Индекс создается на одном или нескольких столбцах таблицы и позволяет быстро находить записи, которые удовлетворяют определенным условиям.

Следует индексировать те поля, которые часто участвуют в Where запросах

Преимущества использования индексов в SQL:

  • Ускорение операций поиска, сортировки и объединения данных;
  • Снижение нагрузки на базу данных и увеличение производительности;
  • Улучшение качества запросов и оптимизация работы приложений.

Однако, индексы также имеют некоторые минусы:

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

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

A

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

Если у таблицы нет кластерного индекса, то она называется “кучей”.

  • Кластеризованный индекс (Clustered Index): Создается автоматически при объявлении РК и физически изменяет порядок строк, сортируя их на основе РК. Для поиска использует бинарный поиск(или двоичный).
    Это ускоряет операции чтения из БД.
    Как в телефонном справочнике. Как правило, кластерный индекс - это B-дерево (сбалансированное, сильно ветвистое), где узел - ссылка на запись в таблице. При добавлении строки она вписывается в нужный узел (кластер), а не просто в конц.
  • Некластеризованный индекс (Non-Clustered Index): не меняет структуру данных а создает отдельную структуру, хранящую ссылки на элементы таблицы. В отличие от кластерных, они не перестраивают физическую структуру набора данных, а лишь организуют ссылки на соответствующие записи.

Кластерный индекс может быть только один. Некластерных - сколько угодно.
Поиск по некластерному индексу - это “прыжки” по таблице, а по кластерному - “дошли и дальше читаем последовательно”.

В чем отличие между кластерными и некластерными индексами?

Некластерные индексы - данные физически расположены в произвольном порядке, но логически упорядочены согласно индексу. Такой тип индексов подходит для часто изменяемого набора данных.

При кластерном индексировании данные физически упорядочены, что серьезно повышает скорость выборок данных (но только в случае последовательного доступа к данным). Для одного набора данных может быть создан только один кластерный индекс.

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

37
Q

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

A

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

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

38
Q

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

A

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

39
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

40
Q

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

A

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

41
Q

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

A

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

Компонент СУБД, который определяет наиболее эффективный способ выполнения запроса у счетом анализа всех возможнных планов называется оптимизатором запросов:

Если присутствуют проблемы с производительностью -> EXPLAIN query ( позволяет посмотреть план выполнения запроса)

-синтаксический
-стоимостный

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

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

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

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

42
Q

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

A

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

TRUNCATE – DDL оператор, удаляет всю таблицу и создает её заново. Нет возможность восстановить данные – сделать ROLLBACK. Её не стоит использовать если на таблицу ссылается foreigh_key, но мы можем применить TRUNCATE сначала на дочернюю таблицу, затем на основную, тогда всё сработает.
Truncate предназначен именно для быстрой очистки ВСЕЙ таблицы или партиции - освобождает занятые экстенты.

43
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;

44
Q

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

A

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

~~~
В действительности представление – всего лишь результат выполнения оператора SELECT, который хранится в структуре памяти, напоминающей SQL таблицу. Они работают в запросах и операторах DML точно также как и основные таблицы, но не содержат никаких собственных данных.

Они работают в запросах и операторах 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;

45
Q

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

A

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

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

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

46
Q

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

A

Транзакция – это единица работы СУБД , упорядоченное множество операций переводящих БД из одного состояния в другое и выражаемое в изменении данных, хранящихся в базе данных.

Транзакция - единица работы в рамках соединения с базой данных.
* Выполняется полностью
* Откатывается полностью

Транзакция - савокупность операций над данными

Транзакция может быть выполнена только целиком(Все или ничего)

Транзакция обычно включает в себя операции чтения и записи данных в базе данных, и должна быть выполнена либо полностью, либо не выполнена вообще.

Транзакция в SQL обычно начинается командой “BEGIN TRANSACTION” или ее аналогами и заканчивается командой “COMMIT” или “ROLLBACK”, которые подтверждают или отменяют изменения, сделанные в рамках транзакции.

Существуют пять возможных состояний транзакции:

  • Активная (Active) - транзакция начата и выполняется;
  • Завершенная (Committed) - транзакция успешно завершена, все ее изменения применены к базе данных;
  • Отмененная (Aborted) - транзакция была отменена из-за ошибки или использования команды “ROLLBACK”;
  • Распределенная (Distributed) - транзакция включает в себя операции с несколькими базами данных;
  • Частично завершенная (Partially Committed) - транзакция была успешно завершена, но не все ее изменения были применены к базе данных, например, из-за сбоя в системе или ошибки.

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

47
Q

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

A
  • Атомарность (atomicity) гарантирует, что транзакция будет полностью выполнена или полностью отменена.
    Атомарность гарантирует, что каждая транзакция будет выполнена полностью или не будет выполнена совсем. Не допускаются промежуточные состояния.
    Это означает, что при сбое любой части транзакции происходит сбой всей транзакции и состояние базы данных остается неизменным.
    Гарантирует, что никакая транзакция не будет зафиксирована в системе частично
  • Согласованность (consistency). Выполненная транзакция не нарушает согласованность базы данных (соблюдение всех правил и ограничений схемы).
    Другими словами, каждая успешная транзакция по определению фиксирует только допустимые результаты.
    Как база выглядела на момент вашего запроса, такие вы и получаете результаты на основании той информации из базы.
    этот принцип гарантирует, что транзакция приводит базу данных из одного согласованного состояния в другое. Все ограничения целостности должны быть соблюдены, и данные должны быть валидными после выполнения транзакции.
    Согласованность в SQL - это свойство, которое гарантирует правильность данных в базе данных в любой момент времени. Это означает, что любое изменение, внесенное в базу данных, должно соответствовать определенным правилам целостности, чтобы не было противоречий и ошибок в данных.

Когда мы работаем с базами данных в SQL, мы должны убедиться, что данные в базе всегда точны и не противоречивы друг другу. Это называется “согласованностью” данных. Например, если у нас есть таблица с банковскими транзакциями, то все операции с этой таблицей (вставка, обновление, удаление) должны соответствовать правилам банковских операций, чтобы не было ошибок или дублирования транзакций.
Для того, чтобы обеспечить согласованность данных в базе, мы используем “транзакции”. Транзакции гарантируют, что все изменения, внесенные в базу данных, будут либо успешно выполнены, либо нет

* Изолированность (isolation). во время выполнения транзакции параллельные транзакции не должны оказывать влияния на её результат.изменения, сделанные транзакцией не видны другим транзакциям, до её завершения.
*позволяет сделать так, чтобы параллельные транзакции не могли прочитать или изменить не согласованные данные и не могли увидеть частичные изменения.
И данные обрабатываемые одной транзакции изолируются от других транзакций на некоторое время которое требуется для выполнения действий.
* Долговечность (durability). этот принцип гарантирует, что результаты выполнения транзакции сохранятся даже в случае сбоя системы или отключения питания.
Если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не будут отменены из-за какого-либо сбоя. Обесточилась система, произошел сбой в оборудовании? На выполненную транзакцию это не повлияет.

48
Q

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

A

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

Dirty Read - первая транзакция производит запись. Между тем вторая транзакция считывает ту же cамую запись до завершения первой.
Позже первая транзакция делает ролбэк, и теперь у нас есть грязные данные во второй транзакции.
«Грязное» чтение (Dirty Read): транзакция A производит запись. Между тем транзакция B считывает ту же самую запись до завершения транзакции A. Позже транзакция A решает откатится, и теперь у нас есть изменения в транзакции B, которые несовместимы. Это грязное чтение. Транзакция B работала на уровне изоляции READUNCOMMITTED, поэтому она могла считывать изменения, внесенные транзакцией A до того, как транзакция завершилась.

Проблема чтения частичных(анкоммитед) изменений.

Non-Repeatable Read: (Возникает при UPDATE)
Когда первая транзакция дважды читает данные, но между этими чтениями вторая транзакция изменяет эти данные и делает commit.
В результате первая транзакция получает 2 разных результата.
Неповторяющееся чтение (Non-Repeatable Read): транзакция A считывает некоторые записи. Затем транзакция B записывает эту запись и фиксирует ее. Позже транзакция A снова считывает эту же запись и может получить разные значения, поскольку транзакция B вносила изменения в эту запись и фиксировала их. Это неповторяющееся чтение.
Last Commit Wins - частный случай NRR, когда 2 транзакции параллельно читают и меняют данные, в базу сохранятся результаты последней закоммиченной транзакции.

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

Фантомные чтение (Phantom Read): транзакция A читает ряд записей. Между тем транзакция B вставляет новую запись в этот же ряд, что и транзакция A. Позднее транзакция A снова считывает тот же диапазон и также получит запись, которую только что вставила транзакция B. Это фантомное чтение: транзакция извлекала ряд записей несколько раз из базы данных и получала разные результирующие наборы (содержащие фантомные записи).

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

49
Q

Что такое ACID (jdbc)?

A

Аббревиатура ACID содержит в себе четыре свойства, которые должно обеспечивать правильное управление транзакциями: Atomicity, Consistency, Isolation, Durability (Атомарность, Согласованность, Изоляция, Долговечность).

Atomicity - атомарность. Либо все операции в транзакции завершаются успешно, либо не происходит никакой. Не должно быть такого, чтобы половина операций прошла, а половина - нет.

Consistency - согласованность. После транзакции данные в БД должны быть надежными. С ними должно быть возможно работать дальше. База данных не должна быть испорчена. Про данные в таком случае тоже говорят, что они “согласованные данные”.

Isolation - изоляция. Если две транзакции работают с одними и теми же данными, то одна транзакция не будет мешать другой.

Durability - долговечность. Когда транзакция завершена, то данные остаются в базе надолго. До тех пор, пока над ними не будет выполнена другая транзакция.

50
Q

Проблемы связанные с параллельной работой транзакций

A

(SQL) Что такое “потерянное обновление”? При каком уровне изоляции оно уходит?
1) Lost update - эффект, когда при одновременном изменении одного блока данных разными транзакциями теряются все изменения, кроме последнего.
2) Уходит на уровне изоляции Read Uncommited.
(SQL) Что такое “грязное чтение”? При каком уровне изоляции оно уходит?
1) Dirty reading - чтение данных, добавленных или изменённых транзакцией, которая впоследствии не подтвердится (откатится).
2) То есть значение, прочитанное транзакцией, по факту отличается от значения, хранящегося в базе данных.
3) Уходит на уровне изоляции Read commited.
(SQL) Что такое “неповторяющееся чтение”? При каком уровне изоляции оно уходит?
1) Unrepeatable read - данные, ранее прочитанные в этой транзакции, оказываются измененными.
2) Эффект уходит на изоляции Repeatable Read.
(SQL) Что такое “фантомное чтение”? При каком уровне изоляции оно уходит?
1) Phantom read - ситуация, когда в одной транзакции одна и та же выборка дает разные множества строк.
2) В отличие от “неповторяющегося чтения” здесь не изменились имевшиеся данные, а просто появились новые.
3) Уходит на уровне изоляции Serializable
(SQL) Что такое “затирание изменений”? При каком уровне изоляции оно уходит?
1) Затирание изменений - замена одной транзакцией данных, записанных другой транзакцией.
2) Уходит на уровне изоляции Serializable.
3) Однако, лучше использовать

51
Q

(SQL) Что такое уровни изоляции?

A

(SQL) Что такое уровни изоляции?
1) Уровень изоляции транзакций - условное значение, определяющее: в какой мере в результате выполнения логически параллельных транзакций в СУБД допускается получение несогласованных данных.
2) Выше уровень изоляции - меньше одновременно работающих транзакций, но больше согласованность. И наоборот.
3) Баланс между скоростью и согласованностью данных.
(SQL) Расскажите про уровень изоляции - Read uncommited
1) Самый низкий уровень изоляции (и самый быстрый)
2) Гарантирует только отсутствие потерянных обновлений
3) После работы нескольких параллельных транзакций итоговое значение определяется набором всех успешно завершенных транзакций.
4) Транзакция может считывать даже еще не закоммиченные данные
Реализация:
Типичная реализация - блокировка объекта БД (строки) только на время выполнения команды изменения (update)
(SQL) Расскажите про уровень изоляции - Read commited
1) Транзакция читает закоммиченные данные.
2) Уровень по-умолчанию во многих СУБД (PostgreSQL, SQL Server, OracleDB)
3) Если во время работы нашей транзакции другая транзакция закоммитила данные, то дальше наша транзакция будет читать эти новые закоммиченные данных
Реализация:
1) Вариант - блокирование. Пишущая транзакция полностью блокирует изменяемые ей данные (на чтение и запись) до своего завершения. Но данные, которые она читает - не блокирует (снимает блокировку сразу после выполнения команды SELECT)/
2) Вариант - версионность. СУБД создает копию изменяемой строки, которую и изменяет транзакция. Если две транзакции меняют строку одновременно, то первая строку изменит, а второй - выдастся rollback: “строка уже изменена”.
(SQL) Расскажите про уровень изоляции - Repeatable Read
1) Читающая транзакция “не видит” изменения данных, которые были ей ранее прочитаны.
2) Никакая другая транзакция не может изменить данные, читаемые текущей транзакцией, до ее окончания.
Реализация:
1) Ко всем данным, которые читает транзакция, применяется SHARED блокировка, которая запрещает изменять данные до окончания читающей транзакции.
2) Однако, другие транзакции могут вставлять новые строки в таблицу. Например, если наша транзакция запускает несколько раз инструкцию вида SELECT…WHERE…, то возможно в первый раз получить 5 строк, а во второй раз - 7.
3) Разделяющие блокировки не снимаются до окончания транзакции (в отличие от read commited), поэтому уровень параллелизма ниже.
(SQL) Расскажите про уровень изоляции - Serializable
1) Самый высокий уровень изолированности, самая медленная работа. Транзакции полностью изолируются друг от друга, каждая выполняется последовательно.
2) По сути параллельно идущих транзакций здесь нет
3) Только на этом уровне параллельные транзакции не подвержены эффекту «фантомного чтения».

52
Q

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

A

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

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

3) Повторяемость чтения (repeatable read, snapshot) — чтение всех изменений своей транзакции, любые изменения, внесенные параллельными транзакциями после начала своей, недоступны. Потерянные изменения, грязное и неповторяемое чтение невозможны, возможны фантомы.

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

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED - позволяет читать незафиксированные данные, которые могут быть изменены другими транзакциями.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED - позволяет читать только зафиксированные данные, которые не могут быть изменены другими транзакциями.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ - позволяет читать только зафиксированные данные и гарантирует, что одни и те же данные будут возвращены при повторном чтении в рамках одной транзакции.
SET TRANSACTION ISOLATION LEVEL SNAPSHOT - позволяет читать данные, как если бы они были зафиксированы в определенный момент времени, а не изменялись во время выполнения транзакции.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - позволяет изолировать транзакцию полностью и гарантирует, что данные не могут быть изменены другими транзакциями.

53
Q

Таблица предотвращения Issue - Isolation level

A

«+» — предотвращает, «-» — не предотвращает.
SERIALIZABLE + + + +
REPEATABLE READ - + + +
READ COMMITTED - - + +
READ UNCOMMITTED - - - +
Фантомное чтение
Неповторяющееся чтение
«Грязное» чтение
Потерянное обновление[3]

SERIALIZABLE самый строгий уровень изоляции, который полностью исключает влияние других транзакций
REPEATABLE READ исключение дерти рид и анрипитбл рид, блокировка обрабатываемых строк, не допускает их изменение другими транзакциями, разрешает добавление новых записей
READ COMMITTED Исключение Дерти Рид, но другим транзакциям разрешено изменять заблокированные строки
READ UNCOMMITTED Чтение неподтвержденных данных, самый незащищенный вровень. Возможны все проблемы(Дерти рид, Нон-Репитбл Рид, Фантом рид. Можно использовать, когда все транзакции на чтение

54
Q

Подходы к изоляции транзакций

A

Существует несколько подходов к изоляции транзакций в базах данных:

**Уровни изоляции транзакций: **уровни изоляции определяют, насколько транзакции должны быть изолированы друг от друга. Некоторые из наиболее распространенных уровней изоляции включают уровни “Read Uncommitted”, “Read Committed”, “Repeatable Read” и “Serializable”. Каждый уровень имеет свои особенности и может быть выбран в зависимости от потребностей конкретного приложения.

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

**Многоверсионная изоляция: **Многоверсионная изоляция (MVCC) - это подход, который использует версионирование данных, чтобы позволить транзакциям работать со своим снимком данных, который не затрагивается другими транзакциями. Этот подход позволяет избежать блокировок и конфликтов при одновременной работе с данными.

**Оптимистическая изоляция: **Оптимистическая изоляция - это подход, который не использует блокировки или версионирование, но позволяет транзакциям работать с данными, считая, что они не будут изменены другими транзакциями. Если изменения произошли, то транзакция будет откатываться и повторяться.

Каждый подход имеет свои достоинства и недостатки, и выбор конкретного подхода зависит от требований конкретного приложения и особенностей используемой базы данных.

55
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) невозможно определить без понимания предметной области

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

Полностью нормализованная БД - плохая БД.
Хорошая БД - база, которая достаточно нормализована, чтобы не создавать аномалии для пользователей, и одновременно имеет хорошую производительность.

56
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);

57
Q

Что такое «триггер»?

A

Триггеры - указание, что при определенном событии СУБД должна что-то сделать. Например, можно поставить триггер на события INSERT, UPDATE, DELETE, TRUNCATE.

Триггер может срабатывать до выполнения события (BEFORE), после (AFTER) или даже вместо (INSTEAD OF).

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

Пример: выполнять check_account_update на каждой строке при событии UPDATE
CREATE TRIGGER check_update
BEFORE UPDATE ON accounts FOR EACH ROW
EXECUTE PROCEDURE сheck_account_update();

58
Q

Что такое sql injection? Пример?

A

SQL инъекция - простейший способ взлома сайта.

Суть - внедрение в данные (передаваемые через GET, POST или Cookie) произвольного SQL кода. Если база данных будет выполнять этот код, то по сути с ней можно творить все, что угодно.

Пример:
String query = “SELECT userName, id, pass FROM users WHERE userName=’” + user.name + “’ AND pass = ‘” + user.pass + “’”;

В базе данных: name=admin, pass = pass
Запрос: …WHERE userName=’admin’ AND pass = ‘pass’
Данные верные, выдаст результат.

Теперь введем: admin’ OR ‘1’ = ‘1, blabla
Запрос: …WHERE userName=’admin’ OR ‘1’=’1’ AND pass = ‘blabla’.
И здесь запрос выдаст результат, за счет появившегося OR.