SQL
SQL (Structured Query Language, язык структурированных запросов) — это декларативный язык программирования, предназначенный для управления данными в реляционных системах управления базами данных (СУБД). SQL позволяет выполнять операции по определению, манипулированию, контролю доступа и администрированию данных, хранящихся в виде взаимосвязанных таблиц. Стандартизирован международными организациями ISO и ANSI.
История
Истоки SQL восходят к реляционной модели данных, предложенной Эдгаром Коддом в 1970 году в работе «A Relational Model of Data for Large Shared Data Banks». Первая реализация языка, получившая название SEQUEL (Structured English Query Language), была разработана в исследовательской лаборатории IBM (Сан-Хосе) в рамках проекта System R в начале 1970-х годов.
В 1979 году компания Relational Software, Inc. (позже переименованная в Oracle) выпустила первую коммерческую реализацию SQL — Oracle V2. Это стало поворотным моментом, так как IBM выпустила свои первые коммерческие продукты с поддержкой SQL (SQL/DS и DB2) только в начале 1980-х годов.
В 1986 году Американский национальный институт стандартов (ANSI) принял первый стандарт SQL-86. За ним последовали:
- SQL-89 (небольшое обновление)
- SQL-92 (значительное расширение, добавившее многие современные возможности)
- SQL:1999 (регулярные выражения, рекурсивные запросы, триггеры)
- SQL:2003 (OLAP-функции, XML-поддержка)
- SQL:2006, SQL:2008, SQL:2011, SQL:2016 (JSON-поддержка, полиморфные табличные функции)
- SQL:2023 (SQL/Property Graph Queries — поддержка графовых запросов, улучшенная работа с JSON)
Несмотря на стандартизацию, все основные СУБД (Oracle Database, Microsoft SQL Server, PostgreSQL, MySQL, SQLite) имеют собственные диалекты и расширения SQL, что создаёт проблемы с переносимостью кода между системами.
Архитектура и основные компоненты
SQL представляет собой не процедурный, а декларативный язык: пользователь описывает, какие данные необходимо получить или изменить, не указывая алгоритм их обработки. СУБД самостоятельно строит оптимальный план выполнения запроса.
Подъязыки SQL
Стандарт 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(илиSTART TRANSACTION) — начало транзакцииCOMMIT— фиксация транзакцииROLLBACK— откат транзакцииSAVEPOINT— установка точки сохранения внутри транзакции
Классификация и диалекты
Основное различие между реализациями SQL касается:
- набора типов данных (например, PostgreSQL поддерживает массивы и JSONB, в то время как SQLite — динамическую типизацию)
- синтаксиса некоторых функций (функции работы со строками, датами)
- возможностей по оптимизации запросов (например, подсказки (hints) в Oracle)
- поддержки процедурных расширений (PL/SQL в Oracle, T-SQL в Microsoft SQL Server, PL/pgSQL в PostgreSQL)
По степени соответствия стандарту можно условно выделить:
- Продукты с высокой степенью соответствия (PostgreSQL, IBM Db2)
- Продукты с собственным расширенным диалектом (Oracle Database, Microsoft SQL Server)
- Продукты, реализующие урезанное подмножество (SQLite, некоторые встраиваемые СУБД)
Основные конструкции и синтаксис
Команда SELECT
Ключевая конструкция SQL — запрос на выборку. Базовая структура:
``sql SELECT [DISTINCT] список_столбцов FROM источник_данных (таблица, представление, подзапрос) [WHERE условие_фильтрации] [GROUP BY столбцы_для_группировки] [HAVING условие_для_групп] [ORDER BY столбцы_для_сортировки [ASC|DESC]] [LIMIT количество_строк] [OFFSET смещение]; ``
- WHERE — фильтрация строк по условию (сравнение, логические операторы,
IN,BETWEEN,LIKE,IS NULL) - GROUP BY — группировка строк, после которой могут применяться агрегатные функции (
COUNT,SUM,AVG,MIN,MAX) - HAVING — фильтрация после группировки (аналог WHERE для групп)
- ORDER BY — сортировка результата
- JOIN — соединение таблиц. Основные типы:
INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL OUTER JOIN,CROSS JOIN
Подзапросы и общие табличные выражения (CTE)
Подзапрос (вложенный запрос) — SELECT внутри другого запроса. Может использоваться в WHERE, FROM, HAVING и даже как вычисляемое поле.
Общие табличные выражения (Common Table Expressions) — временный именованный набор результатов, определяемый с помощью WITH:
``sql WITH SalesCTE AS ( SELECT ProductID, SUM(Quantity) AS TotalSales FROM Sales GROUP BY ProductID ) SELECT p.ProductName, c.TotalSales FROM Products p JOIN SalesCTE c ON p.ProductID = c.ProductID; ``
CTE особенно полезны для рекурсивных запросов (например, для иерархических структур данных, таких как дерево категорий или организационная структура).
Индексы
Индекс — структура, создаваемая для ускорения поиска данных. Основные типы:
- B-tree (сбалансированное дерево) — универсальный тип, наиболее распространённый
- Hash (хеш-индекс) — для точного сравнения (равенство)
- GiST и GIN (в PostgreSQL) — для полнотекстового поиска и работы с массивами
- Columnstore (в SQL Server) — для сжатия и ускорения аналитических запросов
Применение
SQL является основным инструментом для работы с реляционными базами данных практически во всех сферах:
- Веб-разработка: практически все современные веб-сайты и веб-приложения (от блогов до интернет-магазинов) используют SQL для хранения контента, пользовательских данных, заказов.
- Корпоративные информационные системы: ERP (SAP, 1С), CRM (Salesforce), системы управления складом — все построены на СУБД с SQL-интерфейсом.
- Анализ данных и бизнес-отчётность: SQL позволяет быстро извлекать и агрегировать данные из больших объемов записей (OLAP-запросы, оконные функции).
- Финансовый сектор: банковские системы, биржевые платформы — для обработки транзакций и ведения счетов.
- Наука и исследования: хранение результатов экспериментов, геномных данных, климатической статистики.
Распространение в России и СНГ
На российском рынке корпоративных баз данных до 2022 года доминировали Oracle Database и Microsoft SQL Server. После ухода западных вендоров активно развиваются отечественные решения, совместимые с SQL:
- PostgreSQL — наиболее популярная открытая СУБД, широко используется и поддерживается (Postgres Professional — российский разработчик расширений и дистрибутивов)
- CУБД «Яндекс Кит» — основана на PostgreSQL
- Arenadata DB — корпоративная аналитическая СУБД на основе Greenplum
- Red Database (СУБД «Ред База Данных») — сертифицированный продукт для госсектора
- Линтер — отечественная СУБД, используемая в оборонной и государственной сферах
Критика и ограничения
Несмотря на широкое распространение, SQL имеет ряд исторически сложившихся недостатков:
- Сложность работы с иерархическими данными — до появления рекурсивных CTE в SQL:1999 для представления деревьев требовалось либо хранить путь в виде строки, либо использовать вложенные множества, что усложняло запросы.
- Неэффективность для графовых структур — для связей «многие ко многим» в социальных сетях или рекомендательных системах реляционная модель может требовать множества соединений, снижая производительность.
- Отсутствие встроенной поддержки неструктурированных данных — современные реализации через JSON/JSONB частично решают эту проблему, но нативно NoSQL-системы (MongoDB, Cassandra) с этим справляются эффективнее.
- Диалектные различия — миграция между СУБД требует переписывания значительной части кода SQL из-за разных синтаксисов функций, типов данных и расширений.
- Необходимость проектирования схемы — в отличие от документоориентированных баз, SQL требует заранее определять структуру таблиц, что может замедлять разработку в быстро меняющихся проектах.
Интересные факты
- Исходное название SEQUEL было изменено на SQL из-за торговой марки авиакомпании British Airways.
- 9 октября 2016 года было объявлено, что SQL — третий по популярности язык программирования в мире по данным опроса Stack Overflow, уступая только JavaScript и Java.
- В 2021 году для стандарта SQL был предложен синтаксис для работы с графовыми данными (SQL/Property Graph Queries), включённый в стандарт SQL:2023.
- Самый длинный запрос SQL, когда-либо выполненный в промышленной среде, может содержать десятки тысяч строк и объединять сотни таблиц.
Источники
- ISO/IEC 9075-1:2023 Information technology — Database languages — SQL — Part 1: Framework (SQL/Framework)
- C. J. Date. An Introduction to Database Systems. — 8th ed. — Addison-Wesley, 2003.
- Грофф, Дж., Вайнберг, П. SQL: Полное руководство. — 3-е изд. — Вильямс, 2015.
- Документация PostgreSQL 16 (https://www.postgresql.org/docs/16/index.html)
- Материалы компании Oracle по SQL*Plus и PL/SQL
- Статья «A Relational Model of Data for Large Shared Data Banks» (E. F. Codd, 1970)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →