Дана таблица написать запросы

Учимся писать крутые SQL-запросы для любой таблицы за минуты. Простые примеры, лайфхаки и ноль скучной теории — только практика!

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Работа с реляционными базами данных (РСУБД) невозможна без владения языком 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)

  1. SELECT * в продакшн-коде. Всегда перечисляйте колонки явно — это защищает от ошибок при изменении схемы БД и снижает нагрузку на сеть/диск.
  2. Отсутствие индексов по полям в WHERE‚ JOIN‚ ORDER BY. На больших таблицах это приведет к Full Table Scan.
  3. Использование функций над колонками в WHERE (например‚ WHERE YEAR(hire_date) = 2024). Это делает индекс непригодным. Лучше: WHERE hire_date >= '2024-01-01' AND hire_date < '2025-01-01'.
  4. Игнорирование транзакций при множественных UPDATE/INSERT/DELETE. Используйте BEGIN TRANSACTION ... COMMIT/ROLLBACK.
  5. Хранение чувствительных данных (телефоны‚ паспорта) в открытом виде. Используйте маскирование (*)‚ шифрование или хеширование.

Инструментарий и среда разработки

Для эффективной работы с 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) имеют критические различия в функциях дат‚ строк‚ ограничении выборки и процедурных расширениях.

Статья подготовлена на основе актуальных данных по состоянию на .