🗄️ Вопросы интервью по SQL

Вопросы 31-40 для разработчиков

Вопрос SQL 31
Что такое SELF JOIN и когда он используется?

Ответ: SELF JOIN — это join в котором таблица объединяется сама с собой. Это полезно когда строки в одной таблице имеют отношение, такие как сотрудники и их менеджеры или продукты и их родительские продукты. Используются отдельные alias таблицы для различия между двумя экземплярами одной таблицы.

Пример: Сотрудники и их менеджеры

SELECT e.EmployeeName,
       m.EmployeeName AS Manager
FROM Employees e
LEFT JOIN Employees m ON e.ManagerID = m.EmployeeID;

-- Выход: каждый сотрудник с именем его менеджера
                
Другие примеры SELF JOIN:
  • Найти сотрудников, работающих в одном отделе
  • Найти родительский продукт для каждого продукта
  • Найти пары сотрудников с одинаковой зарплатой
Вопрос SQL 32
В чем заключается назначение клаузы GROUP BY?

Ответ: Клауза GROUP BY используется для организации одинаковых данных в группы. Обычно используется с агрегатными функциями (COUNT, SUM, AVG) для выполнения вычислений на каждой группе, а не на всем наборе данных.

Пример:

SELECT dept_id, COUNT(*) AS employee_count, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id;

-- Возвращает количество сотрудников и среднюю зарплату по каждому отделу
                
Правила GROUP BY:
  • Столбцы в SELECT должны быть либо в GROUP BY, либо быть аргументом агрегатной функции
  • WHERE фильтрует строки ДО группировки
  • HAVING фильтрует группы ПОСЛЕ группировки
Пример с HAVING:

SELECT dept_id, COUNT(*) AS emp_count
FROM employees
GROUP BY dept_id
HAVING COUNT(*) > 5;

-- Возвращает только отделы с более чем 5 сотрудниками
                
Вопрос SQL 33
Что такое агрегатные функции в SQL?

Ответ: Агрегатные функции выполняют вычисления на наборе значений и возвращают одно значение. Обычно используются с GROUP BY для выполнения расчетов на каждой группе.

Основные агрегатные функции:
  • COUNT(): Возвращает количество строк
    SELECT COUNT(*) FROM employees;
  • SUM(): Возвращает сумму значений
    SELECT SUM(salary) FROM employees;
  • AVG(): Возвращает среднее значение
    SELECT AVG(salary) FROM employees;
  • MIN(): Возвращает минимальное значение
    SELECT MIN(salary) FROM employees;
  • MAX(): Возвращает максимальное значение
    SELECT MAX(salary) FROM employees;
Дополнительные функции:
  • COUNT(DISTINCT): Считает уникальные значения
  • GROUP_CONCAT(): Объединяет значения в строку (MySQL)
  • STRING_AGG(): Объединяет значения (SQL Server, PostgreSQL)
Вопрос SQL 34
Что такое индексы и зачем они нужны?

Ответ: Индексы — это объекты БД, которые улучшают производительность запросов, позволяя быстрее получать строки. Работают как индекс в книге, позволяя быстро найти данные без сканирования всей таблицы. Однако индексы требуют дополнительную память и могут замедлить операции модификации данных.

Типы индексов:
  • Clustered Index: Сортирует и хранит строки таблицы в порядке ключа (только один на таблицу)
  • Non-Clustered Index: Отдельная структура со ссылками на строки (можно создать много)
  • Unique Index: Гарантирует уникальность значений
  • Composite Index: Индекс на несколько столбцов
  • Full-Text Index: Для текстового поиска
Создание индексов:

-- Простой индекс
CREATE INDEX idx_emp_name ON employees(emp_name);

-- Составной индекс
CREATE INDEX idx_dept_salary ON employees(dept_id, salary);

-- Уникальный индекс
CREATE UNIQUE INDEX idx_email ON users(email);

-- Удаление индекса
DROP INDEX idx_emp_name;
                
Когда использовать индексы:
  • На столбцы, используемые в WHERE клаузе
  • На столбцы в JOIN условиях
  • На столбцы в ORDER BY и GROUP BY
  • На столбцы с частыми поисками
Вопрос SQL 35
В чем разница между DELETE и TRUNCATE командами?
Сравнительная таблица:
DELETE TRUNCATE
Удаляет строки одну за одной, логирует каждое удаление Удаляет все строки сразу, минимальное логирование, быстрее
Это DML команда Это DDL команда
Поддерживает WHERE клаузу для выборочного удаления Не поддерживает WHERE клаузу - удаляет ВСЕ строки
Медленнее из-за логирования Намного быстрее
Поддерживает ROLLBACK Не поддерживает ROLLBACK
Не сбрасывает identity Сбрасывает identity (автоинкремент) на seed value
Примеры:

DELETE - Удалить выборочно:


-- Удалить сотрудников с зарплатой < 30000
DELETE FROM employees WHERE salary < 30000;

-- Отменить (ROLLBACK)
ROLLBACK;
                

TRUNCATE - Удалить все:


-- Удалить все строки (очень быстро!)
TRUNCATE TABLE employees;

-- Отменить не получится (в автокоммит режиме)
                
Когда использовать:
  • DELETE: Когда нужно удалить определенные строки или нужен ROLLBACK
  • TRUNCATE: Когда нужно очистить всю таблицу быстро
Вопрос SQL 36
В чем различия между SQL и NoSQL базами данных?
Сравнительная таблица:
SQL Databases NoSQL Databases
Используют структурированные таблицы с строками и столбцами Используют гибкие структуры без схемы, такие как key-value или документы
Следуют фиксированной схеме Не требуют фиксированной схемы
Поддерживают ACID свойства для надежных транзакций Часто приоритизируют производительность и масштабируемость над строгой консистентностью
Лучше для структурированных и стабильных данных Подходят для больших, быстро меняющихся и неструктурированных данных
Масштабируются вертикально (увеличение ресурсов) Масштабируются горизонтально (добавление новых серверов)
Примеры:
  • SQL: MySQL, PostgreSQL, SQL Server, Oracle
  • NoSQL: MongoDB, Cassandra, Redis, DynamoDB
Когда использовать:
  • SQL: Финансовые системы, ERP, управление кадрами (нужна целостность)
  • NoSQL: Социальные сети, IoT, big data аналитика (нужна масштабируемость)
Вопрос SQL 37
Какие типы constraints существуют в SQL?

Ответ: Constraints — это правила, применяемые к столбцам таблицы для гарантирования целостности и качества данных.

Типы constraints:
  • NOT NULL: Гарантирует, что столбец не может содержать NULL значения
    
    CREATE TABLE employees (
        emp_id INT NOT NULL,
        emp_name VARCHAR(100) NOT NULL
    );
                            
  • UNIQUE: Гарантирует, что все значения в столбце являются уникальными
    
    CREATE TABLE users (
        email VARCHAR(100) UNIQUE
    );
                            
  • PRIMARY KEY: Уникально идентифицирует каждую строку (UNIQUE + NOT NULL)
    
    CREATE TABLE products (
        product_id INT PRIMARY KEY
    );
                            
  • FOREIGN KEY: Гарантирует ссылочную целостность, связывая с первичным ключом другой таблицы
    
    CREATE TABLE orders (
        order_id INT PRIMARY KEY,
        customer_id INT,
        FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    );
                            
  • CHECK: Гарантирует, что все значения в столбце удовлетворяют определенному условию
    
    CREATE TABLE employees (
        salary DECIMAL(10,2) CHECK (salary > 0)
    );
                            
  • DEFAULT: Устанавливает значение по умолчанию для столбца
    
    CREATE TABLE orders (
        order_date DATE DEFAULT GETDATE(),
        status VARCHAR(20) DEFAULT 'Pending'
    );
                            
Вопрос SQL 38
Что такое cursor в SQL?

Ответ: Cursor — это объект БД, используемый для получения, манипулирования и прохождения через строки в результирующем наборе одну строку за раз. Cursors полезны для операций, которые должны обрабатываться последовательно, а не в set-based манере.

Типы Cursors (SQL Server):
  • STATIC: Снимок результирующего набора, не отражает изменения
  • DYNAMIC: Отражает все изменения, сделанные во время открытого cursor
  • FORWARD_ONLY: Может двигаться только вперед через результирующий набор
  • KEYSET: Использует ключ для получения строк; изменения не-ключевых столбцов видны
Синтаксис Cursor:

DECLARE @emp_name VARCHAR(100);
DECLARE emp_cursor CURSOR FOR
SELECT emp_name FROM employees WHERE salary > 50000;

OPEN emp_cursor;

FETCH NEXT FROM emp_cursor INTO @emp_name;
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @emp_name;
    FETCH NEXT FROM emp_cursor INTO @emp_name;
END

CLOSE emp_cursor;
DEALLOCATE emp_cursor;
                
Когда избегать Cursors:
  • Cursors медленнее чем set-based операции
  • Используйте JOIN, UPDATE, DELETE вместо cursors когда возможно
Вопрос SQL 39
Что такое trigger в SQL?

Ответ: Trigger — это набор SQL statements, которые автоматически выполняются в ответ на определенные события в таблице, такие как INSERT, UPDATE или DELETE. Triggers помогают поддерживать консистентность данных, обеспечивать бизнес-правила и реализовывать сложные constraints целостности.

Типы Triggers:
  • BEFORE Trigger: Выполняется ДО события (INSERT, UPDATE, DELETE)
  • AFTER Trigger: Выполняется ПОСЛЕ события
Примеры использования:
  • Обеспечение бизнес-правил
  • Поддержание audit logs
  • Проверка консистентности данных
  • Автоматическое обновление related таблиц
Пример Trigger:

-- AFTER INSERT Trigger - логирование при добавлении сотрудника
CREATE TRIGGER tr_log_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
    INSERT INTO employee_audit (emp_id, action, action_date)
    VALUES (NEW.emp_id, 'INSERT', GETDATE());
END;

-- BEFORE UPDATE Trigger - проверка перед обновлением зарплаты
CREATE TRIGGER tr_validate_salary_update
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
    IF NEW.salary < 0 THEN
        RAISE EXCEPTION 'Salary cannot be negative';
    END IF;
END;
                
Недостатки Triggers:
  • Усложняют логику БД
  • Может быть сложно отлаживать
  • Могут замедлить операции INSERT/UPDATE/DELETE
Вопрос SQL 40
В чем заключается назначение SELECT statement?

Ответ: SELECT statement используется для получения данных из одной или нескольких таблиц. Это наиболее часто используемая команда в SQL, позволяющая пользователям фильтровать, сортировать и отображать данные на основе определенных критериев.

Синтаксис SELECT:

SELECT [DISTINCT] column1, column2, ...
FROM table_name
[WHERE condition]
[GROUP BY column1, column2, ...]
[HAVING condition]
[ORDER BY column1 [ASC|DESC], ...]
[LIMIT/OFFSET rows];
                
Компоненты SELECT:
  • SELECT: Указывает какие столбцы вернуть
  • FROM: Указывает таблицу(ы) для получения данных
  • WHERE: Фильтрует строки на основе условия
  • GROUP BY: Группирует строки по одному или нескольким столбцам
  • HAVING: Фильтрует группы (используется с GROUP BY)
  • ORDER BY: Сортирует результаты
  • LIMIT/OFFSET: Ограничивает количество возвращенных строк
  • DISTINCT: Удаляет дублирующиеся строки
Примеры:

-- Простой SELECT
SELECT emp_name, salary FROM employees;

-- SELECT с условиями
SELECT emp_name, salary 
FROM employees 
WHERE salary > 50000 AND dept_id = 10;

-- SELECT с GROUP BY
SELECT dept_id, COUNT(*) as emp_count, AVG(salary)
FROM employees
GROUP BY dept_id;

-- SELECT с JOIN
SELECT e.emp_name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;

-- SELECT с ORDER BY и LIMIT
SELECT * FROM employees
ORDER BY salary DESC
LIMIT 10;