Языки запросов - SQL и его аналоги
Языки запросов
Что такое язык запросов?
Языки запросов (Query Languages) - это языки, предназначенные для извлечения и манипуляции данными в различных системах, чаще всего в базах данных.
Запросом называют инструкцию или команду, которая направлена системе (обычно системе управления базами данных) с целью извлечь или модифицировать данные. Запрос имеет:
- декларативный характер (вы указываете что хотите получить, а не как это сделать);
- структурированность (запросы следуют строгому синтаксису языка);
- исполняемость (запрос передаётся системе, которая его интерпретирует и выполняет);
- результат (может быть набором данных, сообщением об успешном выполнении или ошибкой).
Запросы используются в базах данных, поисковых системах, семантических базах. В основном, когда речь идёт о "языках запросов", то говорят именно о SQL/NoSQL, однако даже файловые системы или API могут иметь свои языки запросов, например, GraphQL для API.
Чтобы материал читался проще, полезно сразу разделять два уровня:
- уровень данных — где и как хранятся данные (таблицы, документы, графы, RDF-тройки);
- уровень запроса: каким языком вы формулируете выборку, обновление или анализ;
- уровень исполнения: как движок оптимизирует и выполняет запрос.
Такой взгляд снимает путаницу "какой язык лучше". На практике язык выбирают под модель данных и под задачу бизнеса.
Если хотите закрепить связь "язык запросов + основной язык проекта", посмотрите Java
C# и JavaScript.


SQL
SQL (Structured Query Language) – стандартный язык запросов к реляционным базам данных. Дата создания — 1974 год (SEQUEL), современный вид получил в 1986 году. Основными особенностями являются декларативность, работа с таблицами, поддержка агрегаций, фильтров, соединений. Выполняется через SQL-движок СУБД. Применяется в управлении и анализе данных в реляционных БД. Один из самых популярных языков в мире, основа всех систем хранения структурированных данных.
Когда вы пишете SQL, вы описываете результат, а оптимизатор СУБД сам строит план выполнения. Из-за этого качество схемы, индексов и статистики по таблицам напрямую влияет на скорость запроса.
Минимальный практический набор для старта:
SELECTиWHEREдля выборки;JOINдля объединения таблиц;GROUP BYи агрегаты (COUNT,SUM,AVG) для аналитики;INSERT,UPDATE,DELETEдля изменений данных.
SELECT name, age
FROM users
WHERE age > 18
ORDER BY age;
PL/pgSQL
PL/pgSQL – процедурный язык расширения SQL в PostgreSQL. Дата появления — 1998 год. Основными особенностями являются поддержка функций, циклов, переменных, триггеров. Работает внутри PostgreSQL. Применяется для написания бизнес-логики прямо в базе данных. Важен в продвинутых PostgreSQL-проектах.
DO $$
BEGIN
IF (SELECT SUM(salary) FROM employees) > 100000 THEN
INSERT INTO logs (message, timestamp)
VALUES ('High payroll detected', NOW());
END IF;
END $$;
T-SQL
T-SQL (Transact-SQL) – диалект SQL от Microsoft, используемый в SQL Server и Azure SQL. Дата появления — 1989 год. Основными особенностями являются дополнительные конструкции (например, IF-ELSE, WHILE), поддержка хранимых процедур. Работает в экосистеме Microsoft. Применяется в корпоративных и enterprise-системах на основе SQL Server.
DECLARE @count INT = 0;
WHILE @count < 5
BEGIN
PRINT 'Attempt ' + CAST(@count AS VARCHAR);
SET @count = @count + 1;
END
PL/SQL
PL/SQL – процедурный язык расширения SQL от Oracle. Дата появления — 1988 год. Основными особенностями являются богатые возможности для написания процедур, функций, пакетов, курсоров. Работает в Oracle Database. Применяется в крупных корпоративных системах, где используется Oracle. Один из ключевых инструментов в Oracle-экосистеме.
DECLARE
CURSOR emp_cursor IS SELECT name, salary FROM employees WHERE dept = 'IT';
emp_name employees.name%TYPE;
emp_salary employees.salary%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_name, emp_salary;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(emp_name || ': ' || emp_salary);
END LOOP;
CLOSE emp_cursor;
END;
MongoDB
MongoDB Query Language – язык запросов к MongoDB, документоориентированной NoSQL базе данных. Дата появления — 2009 год. Основными особенностями являются работа с BSON-документами, гибкий синтаксис, поддержка агрегационных операций. Работает через MongoDB Shell и драйверы. Применяется в проектах с неструктурированными данными, микросервисами, big data.
db.users.find(
{ age: { $gt: 18 }, status: "active" },
{ name: 1, email: 1, _id: 0 }
);
Cypher
Cypher – язык запросов к графовой базе данных Neo4j. Дата появления — 2010 год. Основными особенностями являются визуальная ориентация синтаксиса на графы, мощные возможности анализа связей. Работает в Neo4j. Применяется в социальных сетях, рекомендательных системах, анализе зависимостей. Один из ключевых языков в области graph databases.
MATCH (a:User)-[:FRIEND]->(b:User)-[:LIVES_IN]->(c:City {name: "Moscow"})
RETURN a.name, c.name;
Gremlin
Gremlin – язык запросов для работы с графовыми базами данных, часть Apache TinkerPop. Дата появления — 2009 год. Основными особенностями являются поддержка транзакций, движение по графу, гибкость в реализации. Работает в различных графовых БД, поддерживающих TinkerPop. Применяется в системах, где важны связи между объектами.
g.V().has('label', 'User')
.out('FRIEND')
.has('age', gt(25))
.values('name');
SPARQL
SPARQL – язык запросов к RDF-данным, используемый в семантической паутине. Дата появления — 2008 год. Основными особенностями являются работа с тройками (subject-predicate-object), поддержка OWL и RDFS. Работает в RDF-хранилищах. Применяется в научных проектах, Linked Данные, семантическом поиске.
SELECT ?person ?email
WHERE {
?person a <http://schema.org/Person> ;
<http://schema.org/email> ?email .
}
XQuery
XQuery – язык запросов к XML-документам, позволяющий извлекать и преобразовывать данные. Дата появления — 2001 год. Основными особенностями являются работа с деревьями XML, поддержка XPath, функциональный стиль. Работает в XML-базах данных. Применяется в системах обработки XML, legacy-веб-приложениях.
for $book in doc("library.xml")//book
where $book/price > 30
return $book/title
GraphQL
GraphQL – язык запросов к API, позволяющий клиентам точно указывать, какие данные им нужны. Дата создания — 2012 год (Facebook), открыт в 2015 году. Основными особенностями являются типизация, одно вызов — много данных, гибкость в выборке. Работает через HTTP как надстройка над REST. Применяется в клиент-серверных взаимодействиях, особенно в SPA и мобильных приложениях. Активно развивается, поддерживается многими компаниями.
GraphQL полезен, когда у клиента много экранов с разными наборами полей, и важно забирать данные одним запросом. Ключевой компромисс — серверу нужен хороший контроль сложности запросов, кэширования и авторизации на уровне полей.
query {
user(id: "123") {
name
email
posts(limit: 5) {
title
comments { author { name } }
}
}
}
Как выбирать язык запросов под задачу
Ориентир для быстрых решений:
- реляционная бизнес-система с отчётами и транзакциями — SQL;
- сложные связи между сущностями ("друзья друзей", маршруты, граф зависимостей) — Cypher или Gremlin;
- API для веба и мобильных клиентов с разными представлениями данных — GraphQL;
- работа с XML-документами и интеграциями старых enterprise-систем — XQuery;
- семантические графы знаний и онтологии — SPARQL.
Полезно оценивать язык по трём критериям: выразительность для вашей модели данных, зрелость инструментов и экспертиза команды.
Практический минимум для старта с запросами
Если вы только начинаете, полезно двигаться по шагам:
- Освоить базовый SQL (
SELECT,WHERE,JOIN,GROUP BY). - Понять, как работают индексы и почему один запрос может быть быстрым, а другой медленным.
- Научиться читать план выполнения запроса (
EXPLAIN). - Разобраться с транзакциями и изоляцией (
COMMIT,ROLLBACK). - Перейти к прикладным задачам проекта — отчёты, фильтры, пагинация, агрегаты.
Любой нетривиальный запрос сначала проверяйте на тестовом наборе данных и только потом запускайте в production-среде.
Типичные ошибки новичков в языках запросов
- попытка решить всё одним огромным запросом без промежуточной проверки;
- отсутствие индексов на часто фильтруемых полях;
SELECT *в местах, где нужны только 2-3 поля;- смешение бизнес-логики приложения и логики хранилища без явных границ;
- использование сложных возможностей СУБД без мониторинга и понимания стоимости запроса.
Чем раньше появляется привычка профилировать запросы и смотреть планы, тем устойчивее становится система.