Работа с реляционными базами данных (РСУБД) невозможна без владения языком SQL (Structured Query Language). Как отмечается в официальной документации и учебных материалах (актуально на )‚ SQL является стандартом де-факто для хранения‚ манипулирования и извлечения данных в таких системах‚ как MS SQL Server‚ IBM DB2‚ Oracle‚ MySQL и других. Несмотря на наличие стандарта ANSI SQL-92‚ производители СУБД часто вносят свои расширения (T-SQL‚ PL/SQL‚ PL/pgSQL)‚ что требует внимания к синтаксису конкретной платформы.
В этой статье мы разберем основные паттерны написания запросов к одной заданной таблице‚ от простой выборки до сложных агрегаций и модификации данных.
Подготовка контекста: Схема таблицы
Для примеров предположим‚ что у нас есть таблица Employees (Сотрудники) со следующей структурой:
| Имя колонки | Тип данных | Описание |
|---|---|---|
id | INT PRIMARY KEY | Уникальный идентификатор |
first_name | VARCHAR(50) | Имя |
last_name | VARCHAR(50) | Фамилия (в реальных задачах маскируется как *) |
department | VARCHAR(50) | Отдел |
salary | DECIMAL(10‚ 2) | Зарплата |
hire_date | DATE | Дата найма |
phone | VARCHAR(20) | Телефон (маскируется: +7—-) |
Базовые операции выборки (DQL ౼ Data Query Language)
Полная выборка всех данных
Самый простой запрос. Не рекомендуется использовать в продакшене на больших таблицах без LIMIT / TOP.
SELECT * FROM Employees; Выборка конкретных колонок (Проекция)
Лучшая практика, явно перечислять нужные поля.
SELECT id‚ first_name‚ last_name‚ department
FROM Employees; Фильтрация строк (Селекция) — WHERE
Использование предикатов для отбора данных.
- Точное совпадение:
WHERE department = 'IT' - Диапазоны:
WHERE salary BETWEEN 50000 AND 100000 - Список значений:
WHERE department IN ('IT'‚ 'HR'‚ 'Finance') - Поиск по шаблону:
WHERE last_name LIKE 'Ива%'(найдет Иванов‚ Иванова и т.д.) - NULL проверка:
WHERE phone IS NULLилиIS NOT NULL - Сложные условия:
WHERE (department = 'IT' AND salary > 80000) OR hire_date > '2023-01-01'
Сортировка — ORDER BY
По умолчанию ASC (по возрастанию). DESC — по убыванию.
SELECT first_name‚ last_name‚ salary
FROM Employees
ORDER BY salary DESC‚ last_name ASC; Ограничение результата — LIMIT / TOP / FETCH
Важно: Синтаксис зависит от СУБД (различия‚ о которых говорилось в справке по версиям SQL Server‚ MySQL‚ Oracle).
- MySQL / PostgreSQL / SQLite:
LIMIT 10 OFFSET 5(пропустить 5‚ взять 10) - SQL Server (T-SQL):
SELECT TOP 10 * FROM Employees ORDER BY id OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY; - Oracle (12c+):
OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY
Агрегация и группировка
Агрегатные функции вычисляют единое значение из набора строк: COUNT‚ SUM‚ AVG‚ MIN‚ MAX.
Простая агрегация по всей таблице
SELECT
COUNT(*) AS total_employees‚
AVG(salary) AS avg_salary‚
MAX(salary) AS max_salary‚
MIN(hire_date) AS first_hire
FROM Employees; Группировка — GROUP BY
Позволяет считать агрегаты по категориям. Правило: В SELECT могут быть только колонки из GROUP BY или агрегатные функции.
SELECT
department‚
COUNT(*) AS headcount‚
ROUND(AVG(salary)‚ 2) AS avg_salary
FROM Employees
GROUP BY department
ORDER BY headcount DESC; Фильтрация групп — HAVING
WHERE фильтрует строки до группировки‚ HAVING — группы после агрегации.
SELECT department‚ AVG(salary) AS avg_sal
FROM Employees
GROUP BY department
HAVING AVG(salary) > 75000; Модификация данных (DML ౼ Data Manipulation Language)
Операции изменения данных требуют осторожности. Всегда тестируйте WHERE в SELECT перед запуском UPDATE/DELETE.
Вставка данных — INSERT
-- Явное указание колонок (Best Practice)
INSERT INTO Employees (first_name‚ last_name‚ department‚ salary‚ hire_date‚ phone)
VALUES ('Иван'‚ 'Петров'‚ 'IT'‚ 95000.00‚ '2024-03-15'‚ '+7----'); Обновление данных — UPDATE
-- Повышение зарплаты в IT отделе на 10%
UPDATE Employees
SET salary = salary * 1.10
WHERE department = 'IT'; Удаление данных — DELETE
-- Удаление уволенных сотрудников (пример логики)
DELETE FROM Employees
WHERE hire_date < '2010-01-01' AND department = 'Archive'; Продвинутые конструкции
Условная логика, CASE WHEN
Аналог if/else внутри запроса.
SELECT
first_name‚
last_name‚
salary‚
CASE
WHEN salary > 100000 THEN 'Senior'
WHEN salary > 60000 THEN 'Middle'
ELSE 'Junior'
END AS grade
FROM Employees; Общие табличные выражения (CTE) — WITH
Упрощают чтение сложных запросов‚ заменяя подзапросы.
WITH HighEarners AS (
SELECT id‚ first_name‚ last_name‚ salary
FROM Employees
WHERE salary > 90000
)
SELECT department‚ COUNT(*) as cnt
FROM Employees e
JOIN HighEarners he ON e.id = he.id
GROUP BY department; Оконные функции (Window Functions)
Выполняют вычисления над набором строк‚ связанных с текущей строкой‚ не сворачивая результат в одну строку (в отличие от GROUP BY).
SELECT
first_name‚
last_name‚
department‚
salary‚
ROW_NUMBER OVER (PARTITION BY department ORDER BY salary DESC) as rn_dept‚
AVG(salary) OVER (PARTITION BY department) as avg_dept_salary
FROM Employees; Типичные ошибки и лучшие практики (Best Practices)
- SELECT * в продакшн-коде. Всегда перечисляйте колонки явно — это защищает от ошибок при изменении схемы БД и снижает нагрузку на сеть/диск.
- Отсутствие индексов по полям в
WHERE‚JOIN‚ORDER BY. На больших таблицах это приведет к Full Table Scan. - Использование функций над колонками в
WHERE(например‚WHERE YEAR(hire_date) = 2024). Это делает индекс непригодным. Лучше:WHERE hire_date >= '2024-01-01' AND hire_date < '2025-01-01'. - Игнорирование транзакций при множественных
UPDATE/INSERT/DELETE. ИспользуйтеBEGIN TRANSACTION ... COMMIT/ROLLBACK. - Хранение чувствительных данных (телефоны‚ паспорта) в открытом виде. Используйте маскирование (*)‚ шифрование или хеширование.
Инструментарий и среда разработки
Для эффективной работы с SQL (написания‚ отладки‚ профилирования) рекомендуется использовать профессиональные инструменты. Согласно актуальной информации от Microsoft (свежие релизы от 22 июн. 2025 г. и 22 янв. 2026 г.)‚ основными средами являются:
- Azure Data Studio — кроссплатформенный‚ легкий‚ с поддержкой ноутбуков.
- SQL Server Management Studio (SSMS) — классический мощный инструмент для Windows.
- Visual Studio Code с расширением mssql — популярный выбор разработчиков.
- DBeaver / DataGrip, универсальные клиенты для работы с разными СУБД (MySQL‚ PostgreSQL‚ Oracle‚ SQL Server).
Выбор инструмента зависит от ОС‚ привычек и конкретных задач (администрирование vs разработка).
Написание эффективных и правильных SQL-запросов, ключевой навык для разработчика‚ аналитика и администратора БД. Начните с понимания реляционной модели‚ освоьте базовый синтаксис SELECT ... FROM ... WHERE ... GROUP BY ... ORDER BY‚ затем переходите к оконным функциям‚ CTE и оптимизации планов выполнения (Execution Plans). Помните‚ что стандарт SQL единый‚ но диалекты (T-SQL‚ PL/pgSQL‚ PL/SQL) имеют критические различия в функциях дат‚ строк‚ ограничении выборки и процедурных расширениях.
Статья подготовлена на основе актуальных данных по состоянию на .