Перейти к основному содержимому

Языки запросов - SQL и его аналоги

Разработчику Аналитику Архитектору

Языки запросов

Что такое язык запросов?

Языки запросов (Query Languages) - это языки, предназначенные для извлечения и манипуляции данными в различных системах, чаще всего в базах данных.

Запросом называют инструкцию или команду, которая направлена системе (обычно системе управления базами данных) с целью извлечь или модифицировать данные. Запрос имеет:

  • декларативный характер (вы указываете что хотите получить, а не как это сделать);
  • структурированность (запросы следуют строгому синтаксису языка);
  • исполняемость (запрос передаётся системе, которая его интерпретирует и выполняет);
  • результат (может быть набором данных, сообщением об успешном выполнении или ошибкой).

Запросы используются в базах данных, поисковых системах, семантических базах. В основном, когда речь идёт о "языках запросов", то говорят именно о SQL/NoSQL, однако даже файловые системы или API могут иметь свои языки запросов, например, GraphQL для API.

Чтобы материал читался проще, полезно сразу разделять два уровня:

  • уровень данных — где и как хранятся данные (таблицы, документы, графы, RDF-тройки);
  • уровень запроса: каким языком вы формулируете выборку, обновление или анализ;
  • уровень исполнения: как движок оптимизирует и выполняет запрос.

Такой взгляд снимает путаницу "какой язык лучше". На практике язык выбирают под модель данных и под задачу бизнеса.

Маршрут по энциклопедии

Если хотите закрепить связь "язык запросов + основной язык проекта", посмотрите Java

Python

C# и JavaScript.

image-1.png

image-2.png


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.

Полезно оценивать язык по трём критериям: выразительность для вашей модели данных, зрелость инструментов и экспертиза команды.


Практический минимум для старта с запросами

Если вы только начинаете, полезно двигаться по шагам:

  1. Освоить базовый SQL (SELECT, WHERE, JOIN, GROUP BY).
  2. Понять, как работают индексы и почему один запрос может быть быстрым, а другой медленным.
  3. Научиться читать план выполнения запроса (EXPLAIN).
  4. Разобраться с транзакциями и изоляцией (COMMIT, ROLLBACK).
  5. Перейти к прикладным задачам проекта — отчёты, фильтры, пагинация, агрегаты.
Рабочая привычка

Любой нетривиальный запрос сначала проверяйте на тестовом наборе данных и только потом запускайте в production-среде.


Типичные ошибки новичков в языках запросов

  • попытка решить всё одним огромным запросом без промежуточной проверки;
  • отсутствие индексов на часто фильтруемых полях;
  • SELECT * в местах, где нужны только 2-3 поля;
  • смешение бизнес-логики приложения и логики хранилища без явных границ;
  • использование сложных возможностей СУБД без мониторинга и понимания стоимости запроса.

Чем раньше появляется привычка профилировать запросы и смотреть планы, тем устойчивее становится система.


Связанные статьи энциклопедии