SQL Flashcards

(64 cards)

1
Q

Что такое SQL

A

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)

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

Что такое PRIMARY KEY?

A

Первичный ключ – столбец (или набор столбцов), уникально идентифицирующий каждую строку в таблице:

Гарантирует уникальность значений
Не допускает NULL значений
Автоматически создает кластеризованный индекс (в большинстве СУБД)

CREATE TABLE Users (
id INT PRIMARY KEY,
name VARCHAR(50)
);

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

Для чего нужен FOREIGN KEY?

A

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

CREATE TABLE Orders (
order_id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES Users(id)
);

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

Разница между CHAR и VARCHAR?

A

CHAR – фиксированная длина (дополняется пробелами до указанного размера)
VARCHAR – переменная длина (хранит только фактическое количество символов)
Char быстрее, потому что длина фиксированная, если же мы знаем, что длина может меняться, то лучше использовать varchar

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

Разница кластеризованного и некластеризованного индекса

A

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

Кластеризованный индекс (обычно создается на Primary key). Данный индекс характеризуется тем, что таблица строиться по данному индексу. Дополнительно в памяти отдельная структура не создается.

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

Кластеризованный индекс - это упорядоченый порядок книг на полке.
Некластеризованный - отдельные карточки, где на полке какая книга стоит.

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

Как правильно проверять NULL значения?

A

Для проверки NULL используется оператор IS NULL вместо сравнения с = NULL:
– Правильно:
SELECT * FROM Employees WHERE phone IS NULL;
Также можно использовать coalesce, ifnull()

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

Типы ограничений Constraint

A

1) Unique
2) Primary key
3) Foreign key
4) Not null
5) Check
6) Default

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

Разница между DELETE, TRUNCATE и DROP?

A

Delete - удалить запись в таблице, работает медленно, возможно откатиться и вернуть прежние значения, автоинкремент сохраняется
Truncate - удалить все записи таблицы, работает быстро, откатиться обычно нельзя, (в postgres и sql server в транзакции), автоинкремент обнуляется. (по сути очистка таблицы до первоначального состояния)
Drop - полное удаление таблицы, работает мгновенно, вернуть значения нельзя.

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

Как выбрать уникальные записи без DISTINCT?

A

Воспользовать group by, который сгруппирует все записи по уникальным значениям

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

Как найти дубликаты email?

A

select email, count() from t1
group by email
having count(
) > 1;

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

Как удалить дубликаты?

A

DELETE FROM t t1
WHERE EXISTS (
SELECT 1
FROM t t2
WHERE t1.email = t2.email
AND t1.id > t2.id
);

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

Что такое SELF JOIN? Пример

A

Соединение таблицы саму с собой.
Пример: поиск сотрудников и их менеджеров.

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

Виды логических JOIN

A

1) INNER JOIN (дефолт)
2) LEFT JOIN
3) RIGHT JOIN
4) FULL OUTER JOIN
5) SELF JOIN
6) CROSS JOIN
7) NATURAL JOIN (сам соединяет схожие по названию колонки, не надежен)

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

Как работает INSERT INTO SELECT?

A

Может вставлять записи запросом:
INSERT INTO t1(id, name, salary)
SELECT id, name, salary
FROM other_table;

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

Как обновить данные из другой таблицы?

A

UPDATE first_table t1
JOIN other_table t2 using(id)
SET t1.age = t2.age;

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

Как добавить столбец в таблицу?

A

ALTER TABLE Employees
ADD COLUMN birth_date DATE;

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

Разница между WHERE и HAVING?

A

WHERE фильтрует строки до группировки
HAVING фильтрует результаты после группировки

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

Как вывести топ-3 самых дорогих товаров?

A

– MySQL
SELECT * FROM Products
ORDER BY price DESC
LIMIT 3;

– SQL Server
SELECT TOP 3 * FROM Products
ORDER BY price DESC;

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

Уровни изолированности

A

Это сердце транзакций. Оно показывает, как параллельные транзакции видят друг друга.

Read uncommitted (полный доступ) - могут читать незакоммиченные данные. Не используется
Read committed (по дефолту в постгрес) - не могут видеть незакомиченные данные.
REPEATABLE read (повторное чтнение) - если транзакция берет данные из места, то каждый select получает одни и те же данные, они как заморожены.
SERIALIZABLE - полный запрет. Гарантирует, что транзакции выполняться так, словно они последовательные. Минусы: может проседать производительность.

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

Оконные фукнции

A

Функции, которые позволяют обрабатывать групповые вычисления не схлопывая строки в одну, как это делает group by.

Шаблон оконной функции:
WINDOW_FUNCTION(column_name)
OVER (
PARTITION BY partition_column
ORDER BY order_column
ROWS BETWEEN UNBOUNDED
PRECEDING AND CURRENT ROW
)

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

Как посчитать скользящее среднее

A

SELECT date, amount,
AVG(amount) OVER (
ORDER BY date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moving_avg
FROM Sales;

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

Разница между RANK() и DENSE_RANK()?

A

RANK() – пропускает номера при одинаковых значениях (1, 2, 2, 4)
DENSE_RANK() – не пропускает номера (1, 2, 2, 3)

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

Как работает LAG() and LEAD()

A

Ответ: Доступ к данным из предыдущей/следующей строки:

sql

SELECT date, amount,
LAG(amount) OVER (ORDER BY date) AS prev_amount,
LEAD(amount) OVER (ORDER BY date) AS next_amount
FROM Sales;

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

Как рассчитать долю от общей суммы? Окно

A

```sql
SELECT category, amount,
amount / SUM(amount) OVER () AS total_share
FROM Sales;
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Как найти накопленную сумму?
SELECT date, amount, SUM(amount) OVER (ORDER BY date) AS cumulative_sum FROM Sales;
26
Разница между COUNT(*) и COUNT(column)?
COUNT(*) – считает все строки COUNT(column) – считает строки с не-NULL значениями в указанном столбце
27
Что такое покрывающий индекс?
Индекс, содержащий все поля, необходимые для запроса, что позволяет избежать чтения самой таблицы: -- Создание покрывающего индекса CREATE INDEX idx_cover ON Orders (customer_id, order_date, amount); -- Запрос использует только индекс SELECT customer_id, order_date, amount FROM Orders WHERE customer_id = 123;
28
Как проверить план выполнения запроса?
-- MySQL EXPLAIN SELECT * FROM Employees WHERE department_id = 5; -- PostgreSQL EXPLAIN ANALYZE SELECT * FROM Employees WHERE department_id = 5; -- SQL Server SET SHOWPLAN_TEXT ON; GO SELECT * FROM Employees WHERE department_id = 5;
29
Когда индексы не используются
1) При использовании функций над полями, если нет функционального индекса: WHERE UPPER(name) = 'ИВАН' 2) При условиях (когда отбирается >15-20% данных) 3) При маленьких таблицах 4) При оператарах, которые делают полную выборку данных (not in, not exists, not like)
30
Что такое статистика запросов?
Статистика запросов — это набор данных о таблицах и колонках (количество строк, уникальность значений, гистограммы, частоты), которые оптимизатор использует для построения оптимального плана выполнения запроса. На основе статистики оптимизатор решает: 1) какие индексы использовать, 2) какой порядок join выбрать, 3) какие таблицы читать первыми, 4) как оценить селективность условий.
31
Как работает составной индекс? (создание индекса, примеры эффективных и неэффективных запросов)
Индекс по нескольким столбцам, эффективный для запросов с префиксными полями (первой частью): -- Создание индекса CREATE INDEX idx_composite ON Employees (department_id, salary); -- Эффективные запросы SELECT * FROM Employees WHERE department_id = 5; SELECT * FROM Employees WHERE department_id = 5 AND salary > 50000; -- Неэффективные запросы SELECT * FROM Employees WHERE salary > 50000;
32
Как написать фильтр для записей created_at не старше 30 дней с сегодня
WHERE created_at > NOW() - INTERVAL '30 days'
33
Как найти сумму всех транзакций пользователя user_id? (оконная функция)
SUM(amount) OVER (PARTITION BY user_id)
34
Как посчитать среднюю сумму за последние 3 часа? (amount, user_id, event_time) (оконная функция)
AVG(amount) OVER ( PARTITION BY user_id ORDER BY event_time RANGE BETWEEN INTERVAL '3 hours' PRECEDING AND CURRENT ROW )
35
Как оптимизировать запрос с JOIN?
1) Использовать индексы на полях соединения 2) Фильтровать данные до соединения (с помощью cte или подзапросов) 3) Использовать наименьшую из таблиц первой (это делается из-за того, что левая таблица загружается в память) 4) Избегать преобразования типов в условиях JOIN
36
Риски избыточных индексов?
1) Замедление операций INSERT/UPDATE/DELETE 2) Увеличение размера базы данных (памяти)
37
Стратегии резервного копирования?
1( Полное резервное копирование (Full): Копирование всех данных 2) Дифференциальное (Differential): Копирование изменений с момента последнего полного бэкапа (как ком собирает данные) (быстрое восстановление, максимальная отказоустойчивость) 3) Инкрементальное (Incremental): Копирование изменений с момента последнего бэкапа любого типа (чтобы восстановить, нужно по цепочке собрать данные) (большие данные, частые бэкапы)
38
Порядок выполнения команд запроса
from join where group by having window functions select distinct order by limit/offset/fetch
39
Рекурсивный cte
WITH RECURSIVE EmployeeHierarchy AS ( -- Якорь рекурсии SELECT id, name, manager_id, 1 AS level FROM Employees WHERE manager_id IS NULL UNION ALL -- Рекурсивная часть SELECT e.id, e.name, e.manager_id, eh.level + 1 FROM Employees e JOIN EmployeeHierarchy eh ON e.manager_id = eh.id ) SELECT * FROM EmployeeHierarchy;
40
Что такое триггер? Типы
Ответ: Автоматически выполняемый код при событиях в БД: Типы по времени: BEFORE, AFTER, INSTEAD OF Типы по событию: INSERT, UPDATE, DELETE Типы по уровню: ROW-LEVEL (исполнится для каждой строки), STATEMENT-LEVEL (исполнится один раз) CREATE TRIGGER update_timestamp BEFORE UPDATE ON Orders FOR EACH ROW SET NEW.updated_at = NOW();
41
Отличие процедуры от функций
1. **Нет `RETURN`** — процедура не возвращает значение. 2. **Вызываются через `CALL`**, а не через `SELECT`. 3. **Часто изменяют данные** (`INSERT`, `UPDATE`, `DELETE`). 4. **Могут работать с транзакциями** (`COMMIT`, `ROLLBACK`) — то, чего нельзя в функциях. 5. Могут иметь **`IN`, `OUT`, `INOUT` параметры**, через которые можно передавать или получать значения.
42
Что такое материализованное представление?
Ответ: Представление, которое физически хранит результаты запроса и периодически обновляется: Ускоряет сложные запросы Требует обновления при изменении данных Полезно для отчетности и аналитики ``` -- PostgreSQL CREATE MATERIALIZED VIEW sales_summary AS SELECT product_id, SUM(amount) FROM Sales GROUP BY product_id; -- Обновление REFRESH MATERIALIZED VIEW sales_summary; ```
43
Как приводить типы данных в sql
column :: int
44
Материализуется ли cte? И как указать не материализованное cte?
До 12 версии Postgres - да, после - нет. with cte as not materialized(...)
45
Создание индекса и удаление
CREATE INDEX index_name ON table_name (column); DROP INDEX index_name;
46
Что если использовать join без on, то какой вид join будет использован?
Будет использован cross join, то бишь декартовое произведение. А на практике, я проверил, будет ошибка.
47
Как отключить определенный тип join?
SET enable_hashjoin = off; SET enable_nestejoin = off; SET enable_mergejoin = off;
48
Разница между index scan, bitmap scan и seq scan
Seq Scan – последовательное сканирование всей таблицы. Используется когда: * нет подходящего индекса; * условие низко-селективное (выбирается большая часть таблицы); * таблица маленькая (индекс не даёт выигрыша). Index Scan – поиск строк через индекс с последующим обращением к таблице по TID. Эффективен когда: *выбирается малая доля строк (высокая селективность); * индекс точный и хорошо подходит под условие. Недостаток: много случайных чтений (random I/O). Bitmap Index Scan + Bitmap Heap Scan – оптимизатор строит битовую карту строк, удовлетворяющих условиям, а затем читает их пачками. Используется когда: * выбирается “средний” процент строк; * несколько индексных условий AND/OR; * random I/O слишком дорогой, а пачки читать выгоднее.
49
Разница физических соединения join
**Hash Join** Используется, когда: - выполняется соединение по равенству (=) - индексов нет или слишком дорого их использовать - хотя бы одна сторона помещается в память (или частично) Плюсы: - быстрый при больших объёмах данных - хорошо работает параллельно - не требует индексов Минусы: - требует много памяти (work_mem) - может перейти на дисковые batch-и → это замедляет --- **Merge Join** Используется, когда: - обе таблицы отсортированы по join-ключу (или могут быть отсортированы) - join по “=”, “<”, “>”, “<=”, “>=” Плюсы: - один из самых быстрых join’ов - стабилен для больших таблиц - может быть очень эффективным при использовании индексов Минусы: - требует сортировки, если нет индекса - работает только с упорядочиваемыми условиями --- **Nested Loop** Используется, когда: - одна таблица маленькая (малое количество строк) - по второй можно быстро искать через индекс Плюсы: - лучший выбор при высокоселективном запросе - быстрый, когда индекс хороший Минусы: - без индекса — может работать очень медленно - не оптимален для больших выборок
50
Типы индексов
1) B-tree - почти всегда используется 2) Hash - работает только с операциями (=). Редка используется, почти всегда B-tree 3) Gin - для поиска в тексте в таких операциях как like, rglike
51
Селективность
Селективность — это доля строк таблицы, которые соответствуют условию фильтра или join’а. Оптимизатор PostgreSQL использует селективность для оценки стоимости плана (`cost`) и выбора оптимального способа доступа к данным. Например: - высокая селективность (мало строк) → выгодно использовать Index Scan или Nested Loop, - низкая селективность (много строк) → лучше Seq Scan или Hash Join. Если статистика устарела или неточная, оптимизатор может выбрать неоптимальный план.
52
Как использовать distinct on
Позволяет вывести одну первую запись для группы. Аналог: select user_id, max(amout) from users group by user_id;
53
Какое минимальное и максимальное возможное количество строк в результате: SELECT COUNT(*) FROM A FULL JOIN B ON A.id = B.id
5/15
54
Как заджойнить таблицу саму с собой?
``` select * from table_name t1 join table_name t2 on t1.id = t2.id; ```
55
Как округлять вниз и как просто округлять?
FLOOR(column) Просто округлять round(column, 2) Важно: column должно быть numeric
56
Как вывести все агрегированные записи, даже где count() == 0
Нужно использовать left join на все айдюки
57
Fact tables and dimension tables
Fact tables - центральные таблицы, хранят внешние ключи на dimension table. Dimension tables - таблицы измерений, хранят основную информацию о объектах.
58
Как настроить партицирование
-- По диапазону дат CREATE TABLE Sales ( id INT, sale_date DATE, amount DECIMAL ) PARTITION BY RANGE (sale_date); -- Создание партиций CREATE PARTITION sales_q1 VALUES LESS THAN ('2025-04-01'); CREATE PARTITION sales_q2 VALUES LESS THAN ('2025-07-01');
59
Что за vacuum в postgres?
Позволяет удалять старые строки в postgres.
60
Какие ошибки решают транзакции?
1) Грязное чтение 2) Non-repeatable read (два select в одной транзакции дают разные результаты) 3) Фантомное чтение (два select в одной транзакции дают разное количество строк) 4) Update lost (два update из разных транзакций затирают друг друга) Решение: uncomited read 1 - commited read 1, 2, частично остальные - repeatable read 1, 2, 3, 4 - serializable
61
Что вернет sum(null)?
null
62
Функциональный блок с циклом па датам внутри
``` DO $$ DECLARE d DATE; BEGIN FOR d IN SELECT generate_series(DATE '2025-12-05', DATE '2025-12-13', INTERVAL '1 day')::DATE LOOP RAISE NOTICE 'Date: %', d; END LOOP; END $$; ```
63
Чем ROW_NUMBER, RANK, DENSE_RANK отличаются?
ROW_NUMBER - задает порядок от 1 до n (если будут одинаковые записи, то первая будет i, вторая i + 1) [1 2 3 4] RANK - задает ранк каждой строке (если записи одинаковые, то они имеют один и тот же номер, но следующая запись будет i + (сколько записей пропустили)) [1 1 1 4] DENSE_RANK - то же, что и RANK, только ничего не пропускает [1 1 1 2]
64
Write a solution to find the second highest distinct salary from the Employee table. If there is no second highest salary, return null (return None in Pandas).
Три решения: 1) Оконные функции 2) Через max 3) Через limit offset with c1 as ( select salary, dense_rank() over (order by salary desc) as rnk from Employee ) select max(salary) as SecondHighestSalary from c1 where rnk = 2; with c1 as ( select salary from Employee where salary != (select max(salary) from Employee) ) select max(salary) as SecondHighestSalary from c1; select max(salary) as SecondHighestSalary from ( select distinct salary from Employee order by salary desc limit 1 offset 1) t1;