Что такое SQL
SQL - structured query language
Язык запросов для работы с реляционными бд.
Состоит из нескольких групп команд:
1) DML (insert, update, delete)
2) DDL (create, truncate, alter, drop)
3) DCL (grant, revoke)
4) TCL (start/begin transaction, checkpoint, commit, rollback)
Что такое PRIMARY KEY?
Первичный ключ – столбец (или набор столбцов), уникально идентифицирующий каждую строку в таблице:
Гарантирует уникальность значений
Не допускает NULL значений
Автоматически создает кластеризованный индекс (в большинстве СУБД)
CREATE TABLE Users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
Для чего нужен FOREIGN KEY?
Внешний ключ - позволяет связать таблицы между собой.
Обеспечивает целостность данных.
А также автоматическое удаление или обновление связанных таблиц (каскады)
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES Users(id)
);
Разница между CHAR и VARCHAR?
CHAR – фиксированная длина (дополняется пробелами до указанного размера)
VARCHAR – переменная длина (хранит только фактическое количество символов)
Char быстрее, потому что длина фиксированная, если же мы знаем, что длина может меняться, то лучше использовать varchar
Разница кластеризованного и некластеризованного индекса
Индекс - это структура (обычно B-tree), которая позволяет быстро находить необходимые записи. Это происходит за счет бинарного поиска.
Кластеризованный индекс (обычно создается на Primary key). Данный индекс характеризуется тем, что таблица строиться по данному индексу. Дополнительно в памяти отдельная структура не создается.
Некластеризованный индекс. Их может быть много на таблицу, плюс мы можем их создавать на функции для фильтрации. В этом случае создается отдельная структура с hash-значениями, которые ссылаются на записи в оригинальной таблице.
Кластеризованный индекс - это упорядоченый порядок книг на полке.
Некластеризованный - отдельные карточки, где на полке какая книга стоит.
Как правильно проверять NULL значения?
Для проверки NULL используется оператор IS NULL вместо сравнения с = NULL:
– Правильно:
SELECT * FROM Employees WHERE phone IS NULL;
Также можно использовать coalesce, ifnull()
Типы ограничений Constraint
1) Unique
2) Primary key
3) Foreign key
4) Not null
5) Check
6) Default
Разница между DELETE, TRUNCATE и DROP?
Delete - удалить запись в таблице, работает медленно, возможно откатиться и вернуть прежние значения, автоинкремент сохраняется
Truncate - удалить все записи таблицы, работает быстро, откатиться обычно нельзя, (в postgres и sql server в транзакции), автоинкремент обнуляется. (по сути очистка таблицы до первоначального состояния)
Drop - полное удаление таблицы, работает мгновенно, вернуть значения нельзя.
Как выбрать уникальные записи без DISTINCT?
Воспользовать group by, который сгруппирует все записи по уникальным значениям
Как найти дубликаты email?
select email, count() from t1
group by email
having count() > 1;
Как удалить дубликаты?
DELETE FROM t t1
WHERE EXISTS (
SELECT 1
FROM t t2
WHERE t1.email = t2.email
AND t1.id > t2.id
);
Что такое SELF JOIN? Пример
Соединение таблицы саму с собой.
Пример: поиск сотрудников и их менеджеров.
Виды логических JOIN
1) INNER JOIN (дефолт)
2) LEFT JOIN
3) RIGHT JOIN
4) FULL OUTER JOIN
5) SELF JOIN
6) CROSS JOIN
7) NATURAL JOIN (сам соединяет схожие по названию колонки, не надежен)
Как работает INSERT INTO SELECT?
Может вставлять записи запросом:
INSERT INTO t1(id, name, salary)
SELECT id, name, salary
FROM other_table;
Как обновить данные из другой таблицы?
UPDATE first_table t1
JOIN other_table t2 using(id)
SET t1.age = t2.age;
Как добавить столбец в таблицу?
ALTER TABLE Employees
ADD COLUMN birth_date DATE;
Разница между WHERE и HAVING?
WHERE фильтрует строки до группировки
HAVING фильтрует результаты после группировки
Как вывести топ-3 самых дорогих товаров?
– MySQL
SELECT * FROM Products
ORDER BY price DESC
LIMIT 3;
– SQL Server
SELECT TOP 3 * FROM Products
ORDER BY price DESC;
Уровни изолированности
Это сердце транзакций. Оно показывает, как параллельные транзакции видят друг друга.
Read uncommitted (полный доступ) - могут читать незакоммиченные данные. Не используется
Read committed (по дефолту в постгрес) - не могут видеть незакомиченные данные.
REPEATABLE read (повторное чтнение) - если транзакция берет данные из места, то каждый select получает одни и те же данные, они как заморожены.
SERIALIZABLE - полный запрет. Гарантирует, что транзакции выполняться так, словно они последовательные. Минусы: может проседать производительность.
Оконные фукнции
Функции, которые позволяют обрабатывать групповые вычисления не схлопывая строки в одну, как это делает group by.
Шаблон оконной функции:
WINDOW_FUNCTION(column_name)
OVER (
PARTITION BY partition_column
ORDER BY order_column
ROWS BETWEEN UNBOUNDED
PRECEDING AND CURRENT ROW
)
Как посчитать скользящее среднее
SELECT date, amount,
AVG(amount) OVER (
ORDER BY date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moving_avg
FROM Sales;
Разница между RANK() и DENSE_RANK()?
RANK() – пропускает номера при одинаковых значениях (1, 2, 2, 4)
DENSE_RANK() – не пропускает номера (1, 2, 2, 3)
Как работает LAG() and LEAD()
Ответ: Доступ к данным из предыдущей/следующей строки:
sql
SELECT date, amount,
LAG(amount) OVER (ORDER BY date) AS prev_amount,
LEAD(amount) OVER (ORDER BY date) AS next_amount
FROM Sales;
Как рассчитать долю от общей суммы? Окно
```sql
SELECT category, amount,
amount / SUM(amount) OVER () AS total_share
FROM Sales;
~~~