SQL-запросы
SQL-запросы — это команды на языке структурированных запросов (Structured Query Language, SQL), предназначенные для взаимодействия с реляционными базами данных. С их помощью выполняются операции создания, чтения, обновления и удаления данных (CRUD — Create, Read, Update, Delete), а также управление структурой базы данных и доступом к ней. SQL-запросы являются основным средством работы с данными в большинстве современных информационных систем, от веб-приложений до корпоративных хранилищ.
История и стандартизация
Язык SQL был разработан в начале 1970-х годов в исследовательской лаборатории IBM для системы управления базами данных (СУБД) System R. Первый коммерческий продукт на основе SQL — Oracle — появился в 1979 году. В 1986 году Американский национальный институт стандартов (ANSI) принял первый стандарт SQL-86, а в 1987 году — Международная организация по стандартизации (ISO). Последующие версии стандарта (SQL-89, SQL-92, SQL:1999, SQL:2003, SQL:2008, SQL:2011, SQL:2016, SQL:2023) расширяли функциональность языка, добавляя поддержку рекурсивных запросов, оконных функций, JSON, полиморфных табличных функций и других возможностей.
Несмотря на стандартизацию, различные СУБД (MySQL, PostgreSQL, Microsoft SQL Server, Oracle Database, SQLite) реализуют собственные диалекты SQL с расширениями и отличиями в синтаксисе.
Классификация SQL-запросов
SQL-запросы делятся на несколько категорий в зависимости от выполняемой функции:
DDL (Data Definition Language) — язык определения данных
Запросы для создания, изменения и удаления объектов базы данных (таблиц, индексов, представлений, схем):
CREATE TABLE— создание новой таблицы;ALTER TABLE— изменение структуры существующей таблицы;DROP TABLE— удаление таблицы;CREATE INDEX— создание индекса.
DML (Data Manipulation Language) — язык манипуляции данными
Запросы для работы с содержимым таблиц:
SELECT— выборка данных;INSERT— вставка новых строк;UPDATE— обновление существующих данных;DELETE— удаление строк.
DCL (Data Control Language) — язык управления доступом
Запросы для управления правами пользователей:
GRANT— предоставление привилегий;REVOKE— отзыв привилегий.
TCL (Transaction Control Language) — язык управления транзакциями
Запросы для управления транзакциями:
BEGIN TRANSACTION— начало транзакции;COMMIT— фиксация изменений;ROLLBACK— откат изменений;SAVEPOINT— установка точки сохранения.
Структура и синтаксис SELECT-запроса
Наиболее часто используемый тип запроса — SELECT. Его базовая структура:
``sql SELECT [DISTINCT] список_столбцов FROM таблица [WHERE условие] [GROUP BY столбцы] [HAVING условие_группы] [ORDER BY столбцы [ASC | DESC]] [LIMIT число] [OFFSET число] ``
Основные элементы:
- SELECT — определяет, какие столбцы включать в результат.
SELECT *возвращает все столбцы. - FROM — указывает таблицу или представление, из которых берутся данные.
- WHERE — фильтрует строки по заданному условию.
- GROUP BY — группирует строки с одинаковыми значениями в указанных столбцах для агрегации.
- HAVING — фильтрует группы после группировки.
- ORDER BY — сортирует результат по одному или нескольким столбцам.
- LIMIT — ограничивает количество возвращаемых строк.
- OFFSET — пропускает указанное количество строк перед началом вывода.
Примеры SQL-запросов
Простая выборка
``sql SELECT name, age FROM users WHERE age > 18 ORDER BY age DESC; ``
Вставка данных
``sql INSERT INTO users (name, email, age) VALUES ('Иван Петров', 'ivan@example.com', 25); ``
Обновление
``sql UPDATE users SET age = 26 WHERE name = 'Иван Петров'; ``
Удаление
``sql DELETE FROM users WHERE age < 18; ``
Агрегация с группировкой
``sql SELECT department, COUNT() AS employee_count, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING COUNT() > 5; ``
Типы соединений (JOIN)
Для объединения данных из нескольких таблиц используются операторы соединения:
- INNER JOIN — возвращает строки, имеющие совпадения в обеих таблицах.
- LEFT JOIN (или LEFT OUTER JOIN) — возвращает все строки из левой таблицы и совпадающие строки из правой; если совпадения нет, поля правой таблицы заполняются NULL.
- RIGHT JOIN — аналогично LEFT JOIN, но с правой таблицей в качестве основной.
- FULL JOIN (или FULL OUTER JOIN) — возвращает строки при совпадении в любой из таблиц.
- CROSS JOIN — декартово произведение всех строк обеих таблиц.
Пример INNER JOIN: ``sql SELECT orders.id, customers.name, orders.total FROM orders INNER JOIN customers ON orders.customer_id = customers.id; ``
Подзапросы и общие табличные выражения
Подзапрос (вложенный запрос) — это запрос, вложенный в другой запрос, обычно в части WHERE, FROM или HAVING. Пример: ``sql SELECT name FROM users WHERE id IN (SELECT user_id FROM orders WHERE total > 1000); ``
Общие табличные выражения (CTE, Common Table Expressions) с оператором WITH позволяют создавать временные именованные наборы результатов, которые могут использоваться в основном запросе. Это улучшает читаемость и позволяет выполнять рекурсивные запросы: ``sql WITH high_value_orders AS ( SELECT user_id, SUM(total) AS total_spent FROM orders GROUP BY user_id HAVING SUM(total) > 5000 ) SELECT users.name, high_value_orders.total_spent FROM users INNER JOIN high_value_orders ON users.id = high_value_orders.user_id; ``
Индексы и производительность
Индексы — это структуры данных, ускоряющие выполнение запросов за счёт быстрого поиска строк. Наиболее распространённые типы индексов:
- B-дерево (B-tree) — универсальный индекс для равенства и диапазонов;
- хеш-индекс — для точного сравнения;
- GiST, GIN, SP-GiST — для полнотекстового поиска и геоданных (в PostgreSQL);
- полнотекстовый индекс — для поиска по тексту.
Создание индекса: ``sql CREATE INDEX idx_users_email ON users(email); ``
Однако избыточное количество индексов замедляет операции вставки, обновления и удаления.
Безопасность и SQL-инъекции
SQL-инъекция — это атака, при которой злоумышленник вставляет вредоносный SQL-код в запрос через пользовательский ввод. Для защиты используются:
- параметризованные запросы (prepared statements) — передача значений отдельно от кода запроса;
- экранирование специальных символов;
- ограничение прав доступа к базе данных;
- валидация и фильтрация входных данных.
Пример уязвимого кода (на PHP): ``php $query = "SELECT FROM users WHERE name = '" . $_GET['name'] . "'"; ` Параметризованный запрос (на PHP с PDO): `php $stmt = $pdo->prepare("SELECT FROM users WHERE name = :name"); $stmt->execute(['name' => $_GET['name']]); ``
Применение SQL-запросов
SQL-запросы используются в:
- веб-разработке (бэкенд сайтов и приложений);
- аналитике данных и бизнес-отчётности;
- управлении корпоративными базами данных;
- ETL-процессах (извлечение, преобразование, загрузка);
- автоматизации тестирования;
- администрировании баз данных.
Интересные факты
- Название SQL официально произносится как «эс-кью-эл» (по буквам), но распространённое произношение «сиквел» также допустимо.
- Самый длинный SQL-запрос в истории, по неподтверждённым данным, содержал более 10 000 строк.
- Стандарт SQL:2023 включает поддержку свойств графовых баз данных.
- В 2023 году SQL остаётся одним из самых востребованных языков программирования по версии рейтинга TIOBE.
Источники
- ISO/IEC 9075:2023 — стандарт SQL.
- C. J. Date, «An Introduction to Database Systems» (8th edition).
- Документация PostgreSQL, MySQL, Microsoft SQL Server, SQLite.
- Статья «SQL injection» на сайте OWASP.
- Рейтинг TIOBE за 2023 год.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


