Язык запросов SQL
SQL (Structured Query Language, структурированный язык запросов) — декларативный язык программирования, предназначенный для управления данными в реляционных базах данных (РБД). SQL используется для создания, модификации, извлечения и администрирования данных, а также для управления структурами баз данных (таблицами, индексами, представлениями). Стандарт языка разрабатывается и поддерживается комитетами ISO и ANSI, однако большинство СУБД (систем управления базами данных) реализуют собственные диалекты с расширениями.
История
Разработка SQL началась в начале 1970-х годов в исследовательском центре IBM в Сан-Хосе (Калифорния) под руководством Дональда Чемберлина и Рэймонда Бойса. Первоначально язык назывался SEQUEL (Structured English Query Language), но из-за торговых споров был переименован в SQL. Первая коммерческая реализация появилась в 1979 году в СУБД Oracle (тогда Relational Software, Inc.). В 1986 году ANSI принял первый стандарт SQL-86, за которым последовали SQL-89, SQL-92 (SQL2) и SQL:1999 (SQL3), добавивший поддержку объектно-реляционных расширений, рекурсивных запросов и триггеров. Последующие версии (SQL:2003, SQL:2008, SQL:2011, SQL:2016, SQL:2023) вводили оконные функции, JSON, поддержку графов и другие возможности.
Основные компоненты языка
SQL делится на несколько подмножеств по функциональному назначению:
DDL (Data Definition Language)
Язык определения данных — набор команд для создания, изменения и удаления объектов базы данных (таблиц, индексов, схем). Основные операторы:
CREATE— создание таблицы, индекса, представления, базы данных.ALTER— изменение структуры существующего объекта (добавление/удаление столбцов, изменение типов данных).DROP— полное удаление объекта.TRUNCATE— удаление всех строк таблицы без сохранения структуры.
DML (Data Manipulation Language)
Язык манипулирования данными — команды для работы с содержимым таблиц:
SELECT— выборка данных.INSERT— вставка новых строк.UPDATE— изменение существующих строк.DELETE— удаление строк.
DCL (Data Control Language)
Язык управления доступом — команды для разграничения прав пользователей:
GRANT— предоставление привилегий.REVOKE— отзыв привилегий.
TCL (Transaction Control Language)
Язык управления транзакциями — команды для группировки операций в атомарные блоки:
BEGIN TRANSACTION/START TRANSACTION— начало транзакции.COMMIT— фиксация изменений.ROLLBACK— отмена изменений.SAVEPOINT— установка точки сохранения внутри транзакции.
Структура запроса SELECT
Основная команда SQL — SELECT, которая имеет следующую синтаксическую структуру (в упрощённом виде):
``sql SELECT [DISTINCT] список_столбцов FROM таблица [WHERE условие] [GROUP BY столбцы] [HAVING условие_группы] [ORDER BY столбцы [ASC|DESC]] [LIMIT количество [OFFSET смещение]] ``
- WHERE — фильтрация строк по предикату.
- GROUP BY — группировка строк по одному или нескольким столбцам с последующим применением агрегатных функций (SUM, COUNT, AVG, MIN, MAX).
- HAVING — фильтрация групп после группировки (аналог WHERE для групп).
- ORDER BY — сортировка результата.
- LIMIT — ограничение количества возвращаемых строк (в некоторых СУБД — TOP, FETCH FIRST).
Типы данных
SQL поддерживает стандартные типы данных, которые могут различаться в реализациях:
- Числовые: INTEGER, SMALLINT, BIGINT, DECIMAL/NUMERIC, FLOAT, REAL, DOUBLE PRECISION.
- Строковые: CHAR (фиксированная длина), VARCHAR (переменная длина), TEXT (длинные строки).
- Дата и время: DATE, TIME, TIMESTAMP, INTERVAL.
- Бинарные: BLOB, BINARY, VARBINARY.
- Логический: BOOLEAN (TRUE/FALSE/UNKNOWN).
- Специальные: JSON, XML, массивы, геометрические типы (в расширениях).
Ограничения целостности
Для обеспечения корректности данных в SQL используются ограничения (constraints):
PRIMARY KEY— уникальный идентификатор строки (не может содержать NULL).FOREIGN KEY— ссылка на первичный ключ другой таблицы, обеспечивающая ссылочную целостность.UNIQUE— гарантирует уникальность значений в столбце или наборе столбцов.NOT NULL— запрещает пустые значения.CHECK— проверка произвольного логического условия.DEFAULT— значение по умолчанию.
Соединения таблиц (JOIN)
Для объединения данных из нескольких таблиц используются операторы соединения:
- INNER JOIN — возвращает строки, удовлетворяющие условию соединения.
- LEFT JOIN (LEFT OUTER JOIN) — все строки левой таблицы, даже если нет соответствия в правой.
- RIGHT JOIN (RIGHT OUTER JOIN) — все строки правой таблицы.
- FULL JOIN (FULL OUTER JOIN) — все строки обеих таблиц.
- CROSS JOIN — декартово произведение (каждая строка одной таблицы соединяется с каждой строкой другой).
Подзапросы и общие табличные выражения
Подзапросы (вложенные запросы) позволяют использовать результат одного SELECT внутри другого. Они могут быть:
- Скалярными (возвращают одно значение).
- Строковыми (возвращают одну строку).
- Табличными (возвращают множество строк и столбцов).
Общие табличные выражения (CTE, Common Table Expressions) — именованные временные наборы данных, определяемые с помощью WITH. Они упрощают написание рекурсивных запросов и сложных многоступенчатых выборок.
Индексы
Индексы — объекты базы данных, ускоряющие выполнение запросов SELECT и WHERE за счёт создания дополнительной структуры данных (чаще всего B-дерева или хеш-таблицы). Основные типы:
- B-tree — универсальный, поддерживает операции сравнения и сортировки.
- Hash — эффективен для точного поиска по равенству.
- GiST, GIN, SP-GiST — специализированные индексы для полнотекстового поиска, геоданных, JSON.
- Clustered — определяет физический порядок строк на диске.
Транзакции и уровни изоляции
Транзакция — логическая единица работы, обладающая свойствами ACID (атомарность, согласованность, изолированность, долговечность). SQL-стандарт определяет четыре уровня изоляции транзакций (по возрастанию строгости):
- READ UNCOMMITTED — допускает «грязное» чтение (видны незафиксированные изменения других транзакций).
- READ COMMITTED — «грязное» чтение исключено, но возможны неповторяющееся чтение и фантомы.
- REPEATABLE READ — гарантирует одинаковое чтение строк в рамках одной транзакции, но возможны фантомные строки.
- SERIALIZABLE — полная изоляция, транзакции выполняются так, как если бы они шли последовательно.
Хранимые процедуры, функции и триггеры
Большинство СУБД поддерживают расширения SQL для написания логики на стороне сервера:
- Хранимые процедуры — именованные блоки кода, принимающие параметры и выполняющие последовательность операторов.
- Функции — возвращают скалярное значение или таблицу; могут использоваться в запросах.
- Триггеры — автоматически выполняются при наступлении события (INSERT, UPDATE, DELETE) на таблице. Могут быть срабатывающими до (BEFORE) или после (AFTER) операции, а также вместо (INSTEAD OF) неё.
Диалекты и реализации
Хотя SQL стандартизирован, каждая СУБД имеет собственные расширения и особенности:
- MySQL / MariaDB — популярны в веб-разработке, поддерживают хранимые процедуры, триггеры, полнотекстовый поиск.
- PostgreSQL — продвинутая объектно-реляционная СУБД с поддержкой JSON, оконных функций, индексов GiST, наследования таблиц.
- Microsoft SQL Server — использует диалект T-SQL с расширениями для бизнес-аналитики, временных таблиц, оконных функций.
- Oracle Database — диалект PL/SQL, поддерживает материализованные представления, иерархические запросы (CONNECT BY), Flashback.
- SQLite — встраиваемая СУБД, реализует подмножество SQL без хранимых процедур и полноценных прав доступа.
- IBM Db2 — поддерживает рекурсивные запросы, XML, модульные расширения.
Критика и ограничения
- Отсутствие полноты по Тьюрингу — SQL является декларативным языком, не предназначенным для написания сложных алгоритмов. Для этого используются расширения (PL/SQL, T-SQL) или внешние языки.
- Сложность оптимизации — неэффективно написанный запрос может привести к значительному замедлению работы базы данных. Планировщик запросов не всегда выбирает оптимальный план.
- Ограниченная поддержка иерархических и графовых структур — реляционная модель плохо подходит для таких данных, хотя в SQL:2023 добавлены свойства графов.
- Различия в диалектах — перенос приложения между СУБД часто требует переписывания запросов из-за несовместимости синтаксиса и функций.
Применение
SQL является основным инструментом для работы с реляционными базами данных в самых разных областях: корпоративные информационные системы, веб-приложения, банковские системы, аналитика данных, научные исследования. Знание SQL входит в обязательный набор навыков для разработчиков, аналитиков данных, администраторов баз данных и специалистов по тестированию.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →