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

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

Вопрос SQL 41
В чем заключается назначение клаузы ORDER BY?

Ответ: ORDER BY сортирует результирующий набор запроса в возрастающем или убывающем порядке на основе одного или нескольких столбцов.

Синтаксис:

SELECT columns
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
                
Примеры:

-- Сортировка по одному столбцу (возрастание)
SELECT * FROM employees ORDER BY emp_name;

-- Сортировка по одному столбцу (убывание)
SELECT * FROM employees ORDER BY salary DESC;

-- Сортировка по нескольким столбцам
SELECT * FROM employees 
ORDER BY dept_id ASC, salary DESC;

-- Сортировка по позиции столбца
SELECT emp_name, salary FROM employees 
ORDER BY 2 DESC;  -- 2 = salary
                
Параметры:
  • ASC: Возрастающий порядок (по умолчанию)
  • DESC: Убывающий порядок
Вопрос SQL 42
Что такое таблица в SQL?

Ответ: Таблица — это структурированная коллекция связанных данных, организованная в строки и столбцы. Столбцы определяют тип хранящихся данных, в то время как строки содержат отдельные записи.

Структура таблицы:
emp_id emp_name salary dept_id
1 John 50000 10
2 Jane 60000 10
3 Bob 55000 20
Компоненты таблицы:
  • Столбцы (Columns): Определяют тип и свойства данных
  • Строки (Rows): Содержат отдельные записи данных
  • Ячейки (Cells): Пересечение строки и столбца
  • Ключи: PRIMARY KEY (уникальный идентификатор строки)
Пример создания таблицы:

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(100) NOT NULL,
    salary DECIMAL(10,2),
    dept_id INT,
    hire_date DATE
);
                
Вопрос SQL 43
Что такое NULL значения в SQL?

Ответ: NULL представляет отсутствующее или неизвестное значение. Это отличается от нуля или пустой строки. NULL значения указывают, что данные недоступны или неприменимы.

Сравнение NULL, 0, и пустой строки:
NULL 0 (Zero) '' (Пустая строка)
Отсутствующее/неизвестное значение Числовое значение Текстовое значение
Занимает память зависит от СУБД Занимает память как число Занимает небольшую память
SELECT * WHERE col = NULL (не работает!) SELECT * WHERE col = 0 SELECT * WHERE col = ''
Работа с NULL:

-- Проверка на NULL (правильно)
SELECT * FROM employees WHERE commission IS NULL;

-- Проверка на не NULL
SELECT * FROM employees WHERE commission IS NOT NULL;

-- NULL в условиях
SELECT * FROM employees 
WHERE commission IS NULL OR commission > 0;

-- Обработка NULL
SELECT emp_name, COALESCE(commission, 0) AS comm
FROM employees;
                
Функции для работы с NULL:
  • IS NULL - проверка на NULL
  • IS NOT NULL - проверка на не NULL
  • ISNULL() - замена NULL на значение (SQL Server)
  • COALESCE() - возвращает первое не-NULL значение
  • IFNULL() - замена NULL на значение (MySQL)
Вопрос SQL 44
Что такое stored procedure?

Ответ: Stored procedure — это предкомпилированный набор SQL statements, сохраненный в БД. Может принимать входные параметры, выполнять логику, запросы и возвращать выходные значения или результирующие наборы. Stored procedures улучшают производительность и поддерживаемость, централизуя бизнес-логику.

Преимущества Stored Procedures:
  • Улучшенная производительность (предкомпилированы)
  • Централизованная бизнес-логика
  • Снижение трафика между клиентом и сервером
  • Лучшая безопасность
  • Переиспользуемость кода
Синтаксис создания:

-- SQL Server
CREATE PROCEDURE sp_GetEmployeesByDept
    @DeptID INT
AS
BEGIN
    SELECT emp_id, emp_name, salary
    FROM employees
    WHERE dept_id = @DeptID
    ORDER BY salary DESC;
END;

-- Вызов процедуры
EXEC sp_GetEmployeesByDept @DeptID = 10;
                
Процедура с выходным параметром:

CREATE PROCEDURE sp_GetEmpCount
    @DeptID INT,
    @EmpCount INT OUTPUT
AS
BEGIN
    SELECT @EmpCount = COUNT(*)
    FROM employees
    WHERE dept_id = @DeptID;
END;

-- Вызов
DECLARE @Count INT;
EXEC sp_GetEmpCount @DeptID = 10, @EmpCount = @Count OUTPUT;
PRINT 'Employee Count: ' + CAST(@Count AS VARCHAR);
                
Вопрос SQL 45
В чем разница между DDL и DML командами?
Сравнительная таблица:
DDL (Data Definition Language) DML (Data Manipulation Language)
Используется для определения и модификации структуры БД Используется для управления и манипулирования данными внутри БД
Работает на таблицах, схемах и объектах БД Работает на строках, хранящихся в таблицах
Включает команды: CREATE, ALTER, DROP, TRUNCATE Включает команды: INSERT, UPDATE, DELETE, SELECT
Изменяет общую структуру БД Изменяет фактические данные в БД
Автоматически фиксирует изменения (COMMIT) Требует COMMIT для сохранения (если явно в транзакции)
Примеры DDL:

-- CREATE - создание таблицы
CREATE TABLE employees (emp_id INT, emp_name VARCHAR(100));

-- ALTER - изменение структуры
ALTER TABLE employees ADD salary DECIMAL(10,2);

-- DROP - удаление таблицы
DROP TABLE employees;

-- TRUNCATE - удаление всех данных
TRUNCATE TABLE employees;
                
Примеры DML:

-- INSERT - добавление данных
INSERT INTO employees VALUES (1, 'John', 50000);

-- SELECT - получение данных
SELECT * FROM employees;

-- UPDATE - обновление данных
UPDATE employees SET salary = 55000 WHERE emp_id = 1;

-- DELETE - удаление данных
DELETE FROM employees WHERE emp_id = 1;
                
Вопрос SQL 46
В чем заключается назначение ALTER команды в SQL?

Ответ: Команда ALTER используется для модификации структуры существующего объекта БД. Эта команда критична для адаптации схемы БД по мере изменения требований.

Основные операции ALTER:
  • Добавить или удалить столбец в таблице
  • Изменить тип данных столбца
  • Добавить или удалить constraints
  • Переименовать столбцы или таблицы
  • Настроить индексирование или параметры хранения
Примеры ALTER:

-- Добавить новый столбец
ALTER TABLE employees
ADD email VARCHAR(100);

-- Удалить столбец
ALTER TABLE employees
DROP COLUMN email;

-- Изменить тип данных
ALTER TABLE employees
MODIFY salary DECIMAL(12,2);

-- Добавить constraint
ALTER TABLE employees
ADD CONSTRAINT chk_salary CHECK (salary > 0);

-- Удалить constraint
ALTER TABLE employees
DROP CONSTRAINT chk_salary;

-- Переименовать столбец
ALTER TABLE employees
RENAME COLUMN emp_name TO employee_name;

-- Переименовать таблицу
ALTER TABLE employees RENAME TO staff;
                
Вопрос SQL 47
Как поддерживается целостность данных в SQL базах?

Ответ: Data integrity относится к точности, консистентности и надежности данных, хранящихся в БД. SQL базы поддерживают целостность данных через несколько механизмов:

Механизмы обеспечения целостности данных:
  • Constraints: Гарантируют, что определенные условия всегда соблюдаются. Например:
    • NOT NULL - столбец не может быть пустым
    • FOREIGN KEY - ссылка на существующий первичный ключ
    • UNIQUE - нет дублирующихся значений
    • CHECK - значения должны удовлетворять условию
  • Transactions: Гарантируют, что серия операций либо все выполнятся, либо все откатятся, сохраняя консистентность
  • Triggers: Автоматически применяют правила или валидации перед/после изменения данных
  • Normalization: Организует данные в многие связанные таблицы для минимизации избыточности и аномалий
  • Cascading Actions: Foreign keys могут применять ON DELETE CASCADE и ON UPDATE CASCADE для автоматического обновления или удаления related данных
Пример сохранения целостности:

-- Constraints гарантируют целостность
CREATE TABLE employees (
    emp_id INT PRIMARY KEY NOT NULL,
    emp_name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    salary DECIMAL(10,2) CHECK (salary > 0),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

-- Таблица departments
CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100) NOT NULL
);

-- Cascading actions
ALTER TABLE employees
ADD CONSTRAINT fk_dept
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
ON DELETE CASCADE
ON UPDATE CASCADE;
                
Типы целостности данных:
  • Entity Integrity: Каждая таблица имеет PRIMARY KEY
  • Referential Integrity: FOREIGN KEY ссылаются на существующие первичные ключи
  • Domain Integrity: Столбцы принимают только допустимые значения
  • User-Defined Integrity: Пользовательские правила через triggers и stored procedures
Вопрос SQL 48
Как работает CASE statement в SQL?

Ответ: CASE statement — это способ SQL реализовать условную логику в запросах. Он вычисляет условия и возвращает значение на основе первого условия, которое выполняется как истинное. Если ни одно условие не выполнено, он может вернуть значение по умолчанию используя ELSE клаузу.

Синтаксис CASE:

SELECT column1,
    CASE
        WHEN condition1 THEN value1
        WHEN condition2 THEN value2
        WHEN condition3 THEN value3
        ELSE default_value
    END AS result_column
FROM table_name;
                
Пример: Классификация зарплаты:

SELECT ID,
    CASE
        WHEN Salary > 100000 THEN 'High'
        WHEN Salary BETWEEN 50000 AND 100000 THEN 'Medium'
        ELSE 'Low'
    END AS SalaryLevel
FROM Employees;
                
Пример 2: CASE с простым выражением:

SELECT emp_name,
    CASE dept_id
        WHEN 10 THEN 'Sales'
        WHEN 20 THEN 'Marketing'
        WHEN 30 THEN 'Engineering'
        ELSE 'Unknown'
    END AS Department
FROM employees;
                
Использование в GROUP BY:

SELECT
    CASE
        WHEN salary > 100000 THEN 'High'
        WHEN salary > 50000 THEN 'Medium'
        ELSE 'Low'
    END AS salary_group,
    COUNT(*) AS emp_count
FROM employees
GROUP BY CASE
    WHEN salary > 100000 THEN 'High'
    WHEN salary > 50000 THEN 'Medium'
    ELSE 'Low'
END;
                
Вопрос SQL 49
В чем заключается назначение функции COALESCE?

Ответ: Функция COALESCE возвращает первое не-NULL значение из списка выражений. Обычно используется для предоставления значений по умолчанию или обработки отсутствующих данных элегантно.

Синтаксис:

COALESCE(expression1, expression2, expression3, ..., default_value)
                
Примеры:

-- Простой пример
SELECT COALESCE(NULL, NULL, 'Default Value');
-- Результат: 'Default Value'

-- Обработка отсутствующих данных
SELECT emp_name, COALESCE(commission, 0) AS commission
FROM employees;
-- Если commission NULL, вернет 0

-- Несколько столбцов
SELECT emp_name, COALESCE(mobile, home_phone, work_phone, 'No phone') AS phone
FROM employees;
-- Возвращает первый доступный номер телефона

-- С вычислениями
SELECT emp_name, 
    salary + COALESCE(bonus, 0) + COALESCE(commission, 0) AS total_comp
FROM employees;
                
COALESCE vs ISNULL:
  • COALESCE: Стандартный SQL, может принять несколько аргументов
  • ISNULL (SQL Server): Специфичен для SQL Server, только два аргумента
  • IFNULL (MySQL): Специфичен для MySQL, только два аргумента
Пример сравнения:

-- COALESCE (универсальный)
SELECT COALESCE(phone, email, 'No contact info') FROM contacts;

-- ISNULL (SQL Server)
SELECT ISNULL(phone, 'No phone') FROM contacts;

-- IFNULL (MySQL)
SELECT IFNULL(phone, 'No phone') FROM contacts;
                
Вопрос SQL 50
В чем различие между COUNT() и SUM() функциями?
Сравнительная таблица:
COUNT() SUM()
Считает количество строк или не-NULL значений Складывает все числовые значения в столбце
Возвращает целое число (количество) Возвращает сумму (обычно числовое значение)
Пример: SELECT COUNT(*) FROM Orders; Пример: SELECT SUM(TotalAmount) FROM Orders;
Примеры COUNT():

-- Считает все строки
SELECT COUNT(*) AS total_orders FROM orders;

-- Считает не-NULL значения в столбце
SELECT COUNT(customer_id) AS orders_with_customer FROM orders;

-- Считает уникальные значения
SELECT COUNT(DISTINCT customer_id) AS unique_customers FROM orders;

-- С GROUP BY
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id;
                
Примеры SUM():

-- Сумма всех значений
SELECT SUM(amount) AS total_sales FROM orders;

-- Сумма с условием
SELECT SUM(amount) AS high_value_sales
FROM orders
WHERE amount > 1000;

-- С GROUP BY
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id;

-- Сумма с CASE
SELECT
    CASE WHEN status = 'Completed' THEN SUM(amount) END AS completed_sales,
    CASE WHEN status = 'Pending' THEN SUM(amount) END AS pending_sales
FROM orders;
                
Важные примечания:
  • COUNT(*) считает все строки включая NULL
  • COUNT(column) считает только не-NULL значения
  • SUM() игнорирует NULL значения
  • Обе функции могут использоваться с DISTINCT
  • Обе функции игнорируют дублирующиеся значения (если не указан DISTINCT)
Комбинированный пример:

SELECT
    COUNT(*) AS total_orders,
    COUNT(DISTINCT customer_id) AS unique_customers,
    SUM(amount) AS total_revenue,
    AVG(amount) AS average_order_value,
    MIN(amount) AS min_order_value,
    MAX(amount) AS max_order_value
FROM orders;