Открыть сервис

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 →