QUERYGoogle SheetsSQLаналитикатаблицы

Функция QUERY в Google Sheets: SQL в таблицах

2026-07-10 11 мин

Коротко: функция QUERY в Google Sheets позволяет писать SQL-подобные запросы прямо в ячейке: =QUERY(A1:D100; "select A, sum(D) where B = 'active' group by A order by sum(D) desc"). Она понимает select, where, group by, order by, limit, pivot и агрегаты. Это самый прямой способ познакомиться с логикой SQL, не поднимая базу данных, — а потом перейти к настоящим запросам с JOIN и оконными функциями.

Если вы уже фильтруете данные вручную, копируете диапазоны и строите сводные таблицы кликами, то QUERY заменит половину этой рутины одной формулой. А заодно приучит мозг мыслить категориями «выбери столбцы — отфильтруй строки — сгруппируй — отсортируй», то есть ровно так, как устроен язык запросов к базам данных.

Что такое функция QUERY и зачем она аналитику?

QUERY — встроенная функция Google Sheets, которая применяет к диапазону язык запросов Google Visualization API. Синтаксис намеренно похож на SQL: те же ключевые слова, тот же порядок мышления. На вход она берёт диапазон данных и строку-запрос, на выход отдаёт готовую таблицу результата.

Базовая сигнатура выглядит так:

=QUERY(данные; запрос; [заголовки])

Зачем это аналитику, который и так знает SQL? Во-первых, не всегда есть доступ к базе — данные часто прилетают выгрузкой в таблицу, и QUERY даёт по ним запросы без единой строчки кода. Во-вторых, это идеальный первый шаг для тех, кто только идёт в профессию: логика фильтрации и агрегации осваивается на знакомом инструменте. Если вы пока выбираете, SQL или Python учить первым, QUERY снимает страх перед синтаксисом запросов вообще.

Возьмём для примера таблицу заказов, на ней разберём все конструкции:

СтолбецБукваПример
ДатаA2026-06-01
ГородBМосква
КатегорияCЭлектроника
СтатусDpaid
СуммаE15400

Как устроен синтаксис select, where и group by?

Порядок разделов в QUERY фиксирован и повторяет SQL почти один в один. Полный скелет запроса:

select ... where ... group by ... pivot ... order by ... limit ... label ...

Самый простой запрос — выбрать все столбцы:

=QUERY(A1:E500; "select *")

Выбрать конкретные столбцы и переименовать заголовок через label:

=QUERY(A1:E500; "select B, C, E label B 'Город', E 'Выручка'")

Ключевое отличие от SQL: столбцы называются буквами колонок листа, а не именами полей. select B, E значит «взять второй и пятый столбцы». Это одновременно и удобно (не надо помнить имена), и хрупко (вставили столбец в середину — запрос поехал).

Разделы читаются в том же логическом порядке, что и в настоящем SQL. Если хотите закрепить, как СУБД реально выполняет запрос — сначала from, потом where, затем group by и только в конце select и order by — почитайте про порядок выполнения group by и having. В QUERY эта же машинерия спрятана под капотом.

Как фильтровать данные через where в QUERY?

Раздел where отбирает строки по условию — точно как в SQL. Поддерживаются сравнения (=, !=, <, >, <=, >=), логические and / or / not, а также текстовые операторы contains, starts with, ends with, matches (регулярка).

Все заказы дороже 10 000:

=QUERY(A1:E500; "select B, C, E where E > 10000")

Оплаченные заказы из Москвы:

=QUERY(A1:E500; "select * where D = 'paid' and B = 'Москва'")

Текстовые значения — в одинарных кавычках. Поскольку весь запрос уже в двойных кавычках формулы, для строк внутри используются именно одинарные. Числа кавычек не требуют.

Фильтр по датам — частая боль новичков. Дату нужно оборачивать в ключевое слово date и писать строго в формате yyyy-mm-dd:

=QUERY(A1:E500; "select * where A >= date '2026-06-01' and A < date '2026-07-01'")

Текстовый поиск по подстроке — оператор contains (регистрозависимый):

=QUERY(A1:E500; "select B, C where C contains 'Электро'")

Эта логика один в один переносится на WHERE в SQL. Когда дойдёте до тренажёра, фильтрация строк будет уже родной — потренировать чистый SELECT-FROM-WHERE можно в разделе SQL с нуля: первый запрос.

Как группировать и агрегировать данные в QUERY?

group by схлопывает строки в группы, а агрегатные функции считают по ним итог. Доступны sum, avg, count, max, min. Правило то же, что и в SQL: каждый столбец в select должен быть либо в group by, либо под агрегатом.

Выручка по городам:

=QUERY(A1:E500; "select B, sum(E) where D = 'paid' group by B order by sum(E) desc")

Количество заказов и средний чек по категориям:

=QUERY(A1:E500; "select C, count(E), avg(E) group by C label count(E) 'Заказов', avg(E) 'Средний чек'")

Результат первого запроса на нашем примере мог бы выглядеть так:

ГородВыручка
Москва1 240 000
Санкт-Петербург870 000
Казань410 000

Средний чек, который считает avg(E), — это, по сути, метрика AOV (средний чек). Group by + агрегат — фундамент почти любого аналитического отчёта: выручка по каналам, заказы по дням, конверсия по сегментам. Разобрать все агрегаты подробно можно в статье про count, sum, avg и group by.

Одно ограничение стоит запомнить сразу: аналога HAVING в QUERY нет. Отфильтровать группы по агрегированному значению (например, «города с выручкой больше миллиона») напрямую нельзя — придётся оборачивать первый QUERY во второй или фильтровать результат вручную. В настоящем SQL это решается одной строкой HAVING.

Как развернуть данные через pivot и упорядочить order by?

pivot разворачивает уникальные значения столбца в отдельные колонки — то самое, ради чего обычно строят сводные таблицы. Синтаксис лаконичный: агрегат в select, разрезающий столбец в pivot.

Выручка по категориям, где города стали столбцами:

=QUERY(A1:E500; "select C, sum(E) group by C pivot B")

Результат превратит длинную таблицу в широкую:

КатегорияМоскваСПбКазань
Электроника620 000410 000180 000
Одежда380 000290 000140 000
Книги240 000170 00090 000
order by сортирует результат — по одному или нескольким столбцам, с asc (по умолчанию) или desc:
=QUERY(A1:E500; "select B, C, E order by E desc limit 10")

Этот запрос — топ-10 самых крупных заказов. limit обрезает вывод, offset пропускает первые N строк (полезно для постраничного просмотра). Задача «топ-N в каждой группе» в QUERY решается неуклюже, а вот в SQL это классика оконных функций — разбор есть в статье про топ-N в группе. А для самих сводных pivot в чистом SQL посмотрите как развернуть строки в столбцы.

Какие частые ошибки возникают при написании QUERY?

Ошибки QUERY почти всегда однотипны, и после десятка запросов вы будете ловить их на глаз. Самые распространённые:

Хорошая новость: ровно эти же грабли (типы данных, NULL/пустые значения, порядок разделов) ждут и в настоящем SQL. Освоив их на QUERY, вы придёте в базу подготовленными. Кстати, обработка пустых значений — отдельная большая тема; в SQL для этого есть COALESCE и CASE, разобранные в статье про NULL и типы данных.

Чем QUERY отличается от настоящего SQL?

QUERY — это упрощённый диалект, а не полноценный SQL. Он покрывает базу, но многого не умеет. Сравним честно:

ВозможностьQUERYНастоящий SQL
select / where / group by / order byДаДа
Агрегаты sum/avg/count/min/maxДаДа
pivotДаЧерез CASE или PIVOT
JOIN нескольких таблицНетДа
Подзапросы и CTEНетДа
HAVING (фильтр групп)НетДа
Оконные функцииНетДа
Именованные столбцыНет (буквы)Да
Работа с большими даннымиДо ~десятков тыс. строкМиллионы+

Главные потолки QUERY — отсутствие JOIN и оконных функций. Как только задача требует соединить заказы с клиентами или посчитать нарастающий итог, накопительный ранг, разницу с предыдущей строкой — QUERY бессилен. А именно эти операции составляют ежедневную работу аналитика: оконные функции для когорт и JOIN всех типов для связывания сущностей.

Ещё одно различие — производительность. QUERY считает в браузере на клиенте и начинает тормозить на десятках тысяч строк. Настоящая СУБД спокойно обрабатывает миллионы записей и оптимизирует запрос под индексы. Если QUERY — это калькулятор, то SQL — полноценная вычислительная машина.

Как перейти от QUERY к полноценным SQL-запросам?

Переход мягче, чем кажется: 70% синтаксиса вы уже знаете. Ниже — тот же запрос «выручка по городам среди оплаченных заказов» на обоих языках.

QUERY в Google Sheets:

=QUERY(A1:E500; "select B, sum(E) where D = 'paid' group by B order by sum(E) desc")

Тот же смысл на настоящем SQL:

SELECT city, SUM(amount) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY city
ORDER BY revenue DESC;

Отличия минимальны: столбцы получили нормальные имена, появилось FROM orders (в QUERY источник — это диапазон-аргумент), а sum(E) стал SUM(amount) с псевдонимом через AS. Логика идентична.

План перехода, который работает:

Если после SQL захочется автоматизировать выгрузки и анализ данных кодом — следующая ступень Python и pandas: метод .query() в pandas даже называется так же, как функция в Sheets, и работает по схожей логике. Потренировать Python можно в Python-тренажёре, а закрепить общую подготовку — на реальных вопросах с собеседований.

QUERY отлично решает быстрые задачи прямо в таблице, но у него есть стеклянный потолок. Как только данных становится много, а вопросы — сложнее «сгруппируй и посчитай», единственный честный путь вперёд — настоящий SQL. И начинать его учить проще всего именно сейчас, пока логика запросов ещё свежа в голове после QUERY.

Готов писать настоящий SQL?
QUERY — это тренажёрные колёсики. Настоящий SQL начинается там, где есть JOIN, оконные функции и живая база. Первые 5 задач бесплатно, дальше — Pro.
Открыть SQL-тренажёр →