Вопросы 41-50 для разработчиков
Ответ: 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
Ответ: Таблица — это структурированная коллекция связанных данных, организованная в строки и столбцы. Столбцы определяют тип хранящихся данных, в то время как строки содержат отдельные записи.
| emp_id | emp_name | salary | dept_id |
|---|---|---|---|
| 1 | John | 50000 | 10 |
| 2 | Jane | 60000 | 10 |
| 3 | Bob | 55000 | 20 |
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(100) NOT NULL,
salary DECIMAL(10,2),
dept_id INT,
hire_date DATE
);
Ответ: NULL представляет отсутствующее или неизвестное значение. Это отличается от нуля или пустой строки. NULL значения указывают, что данные недоступны или неприменимы.
| NULL | 0 (Zero) | '' (Пустая строка) |
|---|---|---|
| Отсутствующее/неизвестное значение | Числовое значение | Текстовое значение |
| Занимает память зависит от СУБД | Занимает память как число | Занимает небольшую память |
| SELECT * WHERE col = NULL (не работает!) | SELECT * WHERE col = 0 | SELECT * WHERE col = '' |
-- Проверка на 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;
IS NULL - проверка на NULLIS NOT NULL - проверка на не NULLISNULL() - замена NULL на значение (SQL Server)COALESCE() - возвращает первое не-NULL значениеIFNULL() - замена NULL на значение (MySQL)Ответ: Stored procedure — это предкомпилированный набор SQL statements, сохраненный в БД. Может принимать входные параметры, выполнять логику, запросы и возвращать выходные значения или результирующие наборы. 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);
| DDL (Data Definition Language) | DML (Data Manipulation Language) |
|---|---|
| Используется для определения и модификации структуры БД | Используется для управления и манипулирования данными внутри БД |
| Работает на таблицах, схемах и объектах БД | Работает на строках, хранящихся в таблицах |
| Включает команды: CREATE, ALTER, DROP, TRUNCATE | Включает команды: INSERT, UPDATE, DELETE, SELECT |
| Изменяет общую структуру БД | Изменяет фактические данные в БД |
| Автоматически фиксирует изменения (COMMIT) | Требует COMMIT для сохранения (если явно в транзакции) |
-- 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;
-- 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;
Ответ: Команда 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;
Ответ: Data integrity относится к точности, консистентности и надежности данных, хранящихся в БД. SQL базы поддерживают целостность данных через несколько механизмов:
-- 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;
Ответ: CASE statement — это способ SQL реализовать условную логику в запросах. Он вычисляет условия и возвращает значение на основе первого условия, которое выполняется как истинное. Если ни одно условие не выполнено, он может вернуть значение по умолчанию используя ELSE клаузу.
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;
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;
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;
Ответ: Функция 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 (универсальный)
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;
| COUNT() | SUM() |
|---|---|
| Считает количество строк или не-NULL значений | Складывает все числовые значения в столбце |
| Возвращает целое число (количество) | Возвращает сумму (обычно числовое значение) |
| Пример: SELECT COUNT(*) FROM Orders; | Пример: SELECT SUM(TotalAmount) FROM Orders; |
-- Считает все строки
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;
-- Сумма всех значений
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;
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;