Коротко: функция 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(данные; запрос; [заголовки])
данные— диапазон, напримерA1:E500или ссылка на другой лист'Продажи'!A:E.запрос— строка с SQL-подобным кодом. Столбцы адресуются буквами:A,B,C.заголовки— сколько строк сверху считать шапкой (обычно 1, можно опустить).
Зачем это аналитику, который и так знает SQL? Во-первых, не всегда есть доступ к базе — данные часто прилетают выгрузкой в таблицу, и QUERY даёт по ним запросы без единой строчки кода. Во-вторых, это идеальный первый шаг для тех, кто только идёт в профессию: логика фильтрации и агрегации осваивается на знакомом инструменте. Если вы пока выбираете, SQL или Python учить первым, QUERY снимает страх перед синтаксисом запросов вообще.
Возьмём для примера таблицу заказов, на ней разберём все конструкции:
| Столбец | Буква | Пример |
|---|---|---|
| Дата | A | 2026-06-01 |
| Город | B | Москва |
| Категория | C | Электроника |
| Статус | D | paid |
| Сумма | E | 15400 |
Как устроен синтаксис 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 000 | 410 000 | 180 000 |
| Одежда | 380 000 | 290 000 | 140 000 |
| Книги | 240 000 | 170 000 | 90 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 почти всегда однотипны, и после десятка запросов вы будете ловить их на глаз. Самые распространённые:
- Столбцы адресуются буквами, а не именами. Написали
select Городвместоselect B— получите ошибку. QUERY не знает о ваших заголовках, для неё столбцы — этоA,B,C. Исключение: если данные приходят с другого запроса или API, тогда работают имена в обратных кавычках. - Смешанные типы в столбце. Если в колонке с числами затесался текст (например, «н/д» вместо пустой ячейки), QUERY выберет доминирующий тип и молча выбросит остальные значения. Итог — «недостача» строк, которую трудно заметить.
- Формат даты. Только
date 'yyyy-mm-dd'. Любой другой формат (01.06.2026,June 1) вызовет ошибку или пустой результат. - Локаль и разделитель аргументов. В русской локали Google Sheets аргументы функции разделяются точкой с запятой (
;), а не запятой. Внутри строки-запроса — запятые. Легко перепутать. - Кавычки. Весь запрос — в двойных кавычках, текстовые значения внутри — в одинарных. Двойные внутри двойных ломают формулу.
- Каждый неагрегированный столбец обязан быть в group by. Забыли — получите
Cannot use aggregation ... without group by.
Хорошая новость: ровно эти же грабли (типы данных, 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. Логика идентична.
План перехода, который работает:
- Освойте select-from-where на настоящих таблицах — начните с учебника SQL с нуля или структурированного курса по SQL.
- Добавьте то, чего нет в QUERY — JOIN, подзапросы, CTE, HAVING, оконные функции.
- Решайте задачи руками. Теория без практики не закрепляется. В SQL-тренажёре задачи исполняются на настоящем PostgreSQL прямо в браузере — можно проверить каждый запрос на реальных данных. Первые 5 задач открыты бесплатно, дальше — по подписке.
- Держите под рукой шпаргалку — SQL-шпаргалка для аналитика с синтаксисом всех основных конструкций.
- Проверьте себя на собеседовании. Когда база усвоится, прогоните топ-50 SQL-вопросов или мок-интервью с AI, которое разберёт ваши ответы.
Если после SQL захочется автоматизировать выгрузки и анализ данных кодом — следующая ступень Python и pandas: метод .query() в pandas даже называется так же, как функция в Sheets, и работает по схожей логике. Потренировать Python можно в Python-тренажёре, а закрепить общую подготовку — на реальных вопросах с собеседований.
QUERY отлично решает быстрые задачи прямо в таблице, но у него есть стеклянный потолок. Как только данных становится много, а вопросы — сложнее «сгруппируй и посчитай», единственный честный путь вперёд — настоящий SQL. И начинать его учить проще всего именно сейчас, пока логика запросов ещё свежа в голове после QUERY.