Перейти к содержанию
Business MetricБизнес-Метрика
Назад в блог

Практика аналитики

Запросы BigQuery SQL

9 мин чтения

В данной статье будут рассмотрены популярные SQL запросы Google BigQuery Язык Data Manipulation Language представляет из себя набор следующих команд: SELECT – выборка данных INSERT – вставка новых данных UPDATE – обновление данных DELETE – удаление данных MERGE – слияние данных Рассмотрим их далее, но начнем мы с создания таблицы через SQL запрос. CREATE TABLE Подробнее о создании таблиц читайте в нашей статье. Чтобы приступить к работе нужно создать базу или загрузить ее. Напишем небольшой SQL запрос, который создаст таблицу:

Создаем таблицу (если такой нету) с названием "имя проекта.имя дата сета.название таблицы". Дальше столбцы нашей будущей таблицы с указанием формата поля. Пример:

SQL
CREATE TABLE IF NOT EXISTS `project.dataset.table_name`
(
  someName STRING, 
  dateTime TIMESTAMP NOT NULL, -- REQUIRED or non-null column
  index INT64, -- INT64 for INTEGER column
  longitude FLOAT64 -- FLOAT64 for FLOAT column
);
SQL
CREATE TABLE IF NOT EXISTS `united-strategy-279207.Example.proverka_02`
 ( 
ADDRESS_ID STRING, 
INDIVIDUAL_ID STRING, 
FIRST_NAME STRING, 
LAST_NAME STRING, 
sum_purchase INT64 
);
Иллюстрация: Запросы BigQuery SQL
Иллюстрация: Запросы BigQuery SQL
Иллюстрация: Запросы BigQuery SQL
SQL
INSERT в Google Big Query SQL Команда INSERT INTO в SQL отвечает за добавление данных в таблицу:
SQL
INSERT INTO `united-strategy-279207.Example.proverka_02` 
   (ADDRESS_ID,INDIVIDUAL_ID,FIRST_NAME,LAST_NAME,sum_purchase) 
   VALUES 
      ('1','1','Petya','Sssss',1000),
      ('2','2','Ivan','Qqqqqq',2000),
      ('3','3','Pasha','Rrrrrr',5000),
      ('4','4','Dima','Vvvvvv',777)
Иллюстрация: Запросы BigQuery SQL

При добавлении данных в каждый столбец таблицы не требуется указывать названия столбцов.

SQL
INSERT INTO `united-strategy-279207.Example.proverka_02` 
   VALUES 
   ('5','5','Sliva','Ddddd',300),
   ('6','6','Darya','OOoooo',5000)
Иллюстрация: Запросы BigQuery SQL

Старый вид таблицы:

SQL
UPDATE в Google Big Query SQL SQL-команда для обновления данных таблицы UPDATE SET:
SQL
UPDATE `united-strategy-279207.Example.proverka_02` 
  SET ADDRESS_ID = 'bbbbbbb', INDIVIDUAL_ID = '222222', FIRST_NAME = 'Kapustka', LAST_NAME = 'jirniy', sum_purchase = 202002
  WHERE ADDRESS_ID = 'f43j231';
Иллюстрация: Запросы BigQuery SQL

В SQL запросе изменяем строку с ADDRESS_ID которая имеет значение 'f43j231' на:

Иллюстрация: Запросы BigQuery SQL
SQL
DELETE в Google Big Query SQL SQL-команда DELETE FROM table_name используется для удаления данных из таблицы.
SQL
DELETE FROM  `united-strategy-279207.Example.proverka_02` 
  WHERE ADDRESS_ID = 'fghj231';
Иллюстрация: Запросы BigQuery SQL

MERGE в Google Big Query SQL С помощью MERGE можно осуществить слияние двух таблиц, т.е. синхронизировать их. Для теста SQL запроса создаём таблицу:

Иллюстрация: Запросы BigQuery SQL

И еще одну:

Иллюстрация: Запросы BigQuery SQL

Что мы хотим сделать:

Иллюстрация: Запросы BigQuery SQL

Из таблицы SOURCE (manager_1) добавить 3 и 4 менеджера в таблицу TARGET (manager_2), обновить 1 и 2 менеджера (их продажи) и удалить 5 менеджера.

SQL
MERGE `united-strategy-279207.Example.manager_2` as target
USING `united-strategy-279207.Example.manager_1` as source 
ON target.managerID = source.managerID
   WHEN MATCHED 
       THEN UPDATE SET managerID = source.managerID
   WHEN NOT MATCHED 
       THEN INSERT 
          VALUES ( source.managerID, source.manager_name, source.sum_sales)
   WHEN NOT MATCHED BY SOURCE
       THEN 
           DELETE
Иллюстрация: Запросы BigQuery SQL

Target table — целевая таблица, именно в ней данные будут добавлены, изменены или удалены в результате запуска SQL запроса. Source table — исходная таблица или таблица-источник данных, с которой будет сравниваться целевая таблица, это может быть любой набор данных.

Оператор USING похож на FROM из оператора SELECT, тут можно указать таблицу, подзапрос, табличное выражение или функцию, возвращающую таблицу. Далее ON — условие соединения двух таблиц (а точнее, наборов данных), такое же как ON в JOIN. When Matched — описывает действие, которое срабатывает для строк, которые нашлись и в Source, и в Target по условию, которое описано в ON.

В этой части чаще всего встречается оператор UPDATE, хотя возможно использование оператора DELETE. When Not Matched — описывает действие для строк, которые есть в таблице Source, но отсутствуют в таблице Target; далее используется оператор INSERT, и указанные строки добавляются в таблицу Target.

When Not Matched by source — описывает действие для строк, которые отсутствуют в таблице Source, но найдены в таблице Target, чаще всего встречается оператор DELETE, чтобы удалить строки и привести 2 набора в соответствие, но возможно использование оператора Update.

Иллюстрация: Запросы BigQuery SQL

Использование SELECT в Google Big Query SQL

SELECT – оператор выборки данных. Любой Big Query SQL запрос состоит из: SELECT (обязательно): определяет столбцы, которые будут включены в запрос. FROM (обязательно): таблица, содержащая столбцы, откуда мы хотим взять данные, которые мы указали в операторе SELECT WHERE: условие фильтрации записей. Какие именно данные мы хотим вывести, например, за определенный промежуток времени ORDER BY: используется для сортировки результата в порядке возрастания или убывания (desc & ask) GROUP BY: как агрегировать данные в результирующем наборе. Как объединить данные, по каким столбцам, например, город или категория устройства (mob) В словах это: SELECT (ВЫБЕРИ) - список_столбцов или * (все столбцы, которые есть в таблице) FROM (ОТКУДА) - путь к таблице, из которой мы забираем эти данные WHERE (ГДЕ) (не обязательно) - конкретизация того, что мы хотим получить в результате ORDER BY ( ОТСОРТИРОВАТЬ ПО) (не обязательно) - по какому принципу отсортировать данные, в порядке убывания или возрастания.

SQL
SELECT + FROM Например, возьмем нашу созданную ранее таблицу с манагерами:
SQL
select * from `united-strategy-279207.Example.manager_2`
Иллюстрация: Запросы BigQuery SQL

ORDER BY в Google BigQuery SQL Отсортируем по возрастанию ИД менеджеров asc или по убыванию desc

SQL
select * from `united-strategy-279207.Example.manager_2` 
  order by managerID asc
Иллюстрация: Запросы BigQuery SQL

WHERE в Google BigQuery SQL Можно использовать ключевое слово WHERE в SELECT для указания условий в Big Query SQL запросе. Пример: С помощью оператора WHERE можем указать каких менеджеров мы хотим вывести в результате, например, с продажами меньше 2000

SQL
select * from `united-strategy-279207.Example.manager_2` 
  where sum_sales
Иллюстрация: Запросы BigQuery SQL
SQL
SELECT DISTINCT в Google BigQuery SQL В столбцах таблицы могут содержаться повторяющиеся данные, для получения только неповторяющихся данных используем SELECT DISTINCT
Иллюстрация: Запросы BigQuery SQL

Например, у нас есть повторяющиеся записи, которые мы не увидим в результате Google Big Query SQL запроса

SQL
select distinct * from `united-strategy-279207.Example.manager_2` 
  order by managerID asc
Иллюстрация: Запросы BigQuery SQL

GROUP BY в Google BigQuery SQL Оператор GROUP BY часто используется с агрегатными функциями, такими как COUNT, MAX, MIN, SUM и AVG, для группировки выходных значений.

Посчитаем сумму всех продаж каждого менеджера

SQL
select sum (sum_sales) as count_sales, manager_name  
   from `united-strategy-279207.Example.manager_2` 
   group by manager_name
Иллюстрация: Запросы BigQuery SQL

HAVING в Google BigQuery SQL Ключевое слово HAVING было добавлено в Google Big Query SQL по той причине, что WHERE не может использоваться для работы с агрегатными функциями.

Хотим отфильтровать менеджеров по сумму продаж, которая превышает 2000

SQL
select sum (sum_sales) as count_sales, manager_name  
from `united-strategy-279207.Example.manager_2` 
  group by manager_name
  having sum (sum_sales) > 2000
Иллюстрация: Запросы BigQuery SQL

BETWEEN в Google BigQuery SQL BETWEEN используется для выбора значений из определённого промежутка. Могут быть использованы числовые и текстовые значения, а также даты. Таблица с полными данными.

Иллюстрация: Запросы BigQuery SQL

Хотим увидеть менеджеров с суммой продаж от 1000 до 2000

SQL
select manager_name, sum_sales  from `united-strategy-279207.Example.manager_2` 
 where sum_sales between 1000 and 3000
Иллюстрация: Запросы BigQuery SQL

LIKE в Google BigQuery SQL Оператор LIKE используется в WHERE, чтобы задать шаблон поиска похожего значения. Есть два оператора, которые используются в LIKE: «%» - ни одного, один или несколько символов «_» - один символ Пример: Выведем имена менеджеров, у которых есть буква «А»

SQL
select manager_name, sum_sales  from `united-strategy-279207.Example.manager_2` 
 where manager_name like '%A%'
Иллюстрация: Запросы BigQuery SQL

Выведем имена менеджеров, у которых есть маленькая буква «а»

SQL
select manager_name, sum_sales  from `united-strategy-279207.Example.manager_2` 
 where manager_name like '%a%'
Иллюстрация: Запросы BigQuery SQL

Выведем тех, у кого в имени четыре буквы и две буквы в инициале

SQL
select manager_name, sum_sales  from `united-strategy-279207.Example.manager_2` 
 where manager_name like '____ __'
Иллюстрация: Запросы BigQuery SQL

IN С помощью IN можно указать несколько значений для оператора WHERE: Хотим узнать имена менеджеров, у которых сумма продаж 1000 и 2000

SQL
select manager_name, sum_sales  from `united-strategy-279207.Example.manager_2` 
 where sum_sales in (1000,2000)
Иллюстрация: Запросы BigQuery SQL

Агрегатные функции в Google Big Query SQL Такие функции используются для получения совокупного результата, относящегося к рассматриваемым данным:

COUNT (название_столбца) — возвращает количество строк;

SUM (название_столбца) — возвращает сумму значений в данном столбце;

AVG (название_столбца) — возвращает среднее значение данного столбца;

MIN (название_столбца) — возвращает наименьшее значение данного столбца;

MAX (название_столбца) — возвращает наибольшее значение данного столбца.

COUNT ( DISTINCT (название_столбца)) - возвращает количество уникальных строк в столбце название_столбца

SQL
select count(sum_sales) as count_sales,
        sum(sum_sales) as sum_sum_sales,
        avg(sum_sales) as avg_sales,
        min (sum_sales) as min_sales,
        max (sum_sales) as max_sales,
        count (distinct sum_sales) as distinct_count_sum_sales
  from `united-strategy-279207.Example.manager_2`
Иллюстрация: Запросы BigQuery SQL

Подзапросы (subqueries) в Google Big Query SQL Вложенные запросы (подзапросы) — это BigQuery SQL-запросы, которые включают выражения SELECT, FROM и WHERE, вложенные в другой запрос. Подзапрос может использоваться: В инструкции SELECT; В инструкции FROM; В условии WHERE. Внутренний SQL запрос выполняется перед общим запросом, чтобы результаты его работы могли быть переданы внешнему. Основной запрос использует результат выполнения подзапроса. Подзапросы не могут обрабатывать свои результаты Подзапрос можно использовать в инструкциях SELECT для выполнения следующих задач: Сравнения выражения с результатом запроса; Определения того, включено ли выражение в результаты SQL запроса; Синтаксис: SELECT необходимые столбцы FROM путь до таблицы WHERE условие выборки данных ( SELECT необходимые столбцы FROM путь до таблицы);

Пример: Полная таблица

Иллюстрация: Запросы BigQuery SQL

Выбрать имена менеджеров с продажами выше средней. Разобьем на подзадачи. 1. Сначала нам нужно найти среднее из всех продаж:

SQL
select avg(sum_sales) as avg_sales  from `united-strategy-279207.Example.manager_2`
Иллюстрация: Запросы BigQuery SQL

2. Теперь просто подставить в основной запрос, в котором мы выбираем всех менеджеров, у которых сумма продаж больше средней

SQL
select * from `united-strategy-279207.Example.manager_2` 
  where sum_sales > 
  (select avg(sum_sales) from `united-strategy-279207.Example.manager_2`
  )
Иллюстрация: Запросы BigQuery SQL
SQL
JOIN в Google BigQuery SQL BigQuery JOIN используется для связи двух или более таблиц с помощью общих атрибутов внутри них. Синтаксис: SELECT `название столбца`… FROM `путь до таблицы 1 (название таблицы) ` JOIN `путь до таблицы 2` ON 'путь до таблицы 1.название столбца' = 'путь до таблицы 2.название столбца' CROSS JOIN – это JOIN без указания соединения, то есть все на все умноженное и выведено как попало (крест на крест). SELECT * FROM users CROSS JOIN city тоже самое что и просто: SELECT * FROM users JOIN city INNER JOIN (внутреннее объединение) – это JOIN с указанием что конкретно мы хотим вывести в результате. То есть условие объединения данных из разных таблиц.
Иллюстрация: Запросы BigQuery SQL
SQL
SELECT user.name, city.name FROM users INNER JOIN city ON users.id = city.id тоже самое что и просто: SELECT * FROM users JOIN city ON users.id = city.id Результатом запроса будет таблица:
Иллюстрация: Запросы BigQuery SQL

Так как в таблице пользователей есть ID «4», но нет в таблице городов, а в таблице городов есть ID «5», но нету в таблице пользователей, то в объединенных данных их не будет. LEFT JOIN в Google BigQuery SQL (внешнее объединениe) – объединение таблицы которая стоит слева от джоина. На примере будет понятнее. Есть две таблицы:

Иллюстрация: Запросы BigQuery SQL

Результатом такого запроса будет таблица:

SQL
SELECT p.product, p.price, m.model FROM price AS p
LEFT JOIN model AS m ON p.id = m.id
Иллюстрация: Запросы BigQuery SQL

В которой у продукта «headphones» нет модели, так как в таблице «Model» данных о модели наушников нет. Будет просто пустое поле. И модель с ID «5» не попадет в результирующую таблицу RIGHT JOIN в Google BigQuery SQL (внешнее объединениe) – объединение таблицы которая стоит справа от джоина. Для примера возьмем те же таблицы price & model

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

SQL
SELECT p.product, p.price, m.model FROM price AS p
RIGHT JOIN model AS m ON p.id = m.id
SQL
SELECT p.product, p.price, m.model FROM price AS p
RIGHT JOIN model AS m ON p.id = m.id
Иллюстрация: Запросы BigQuery SQL

Правое и левое объединение можно легко переделать друг в друга, нужно просто изменить место таблицы слева от джоина или справа. На практике правое объединение используют редко, так как все можно сделать в левом - изменив расположение таблиц. FULL JOIN в Google BigQuery SQL (внешнее объединениe) – полное объединение, в него включаются строки из обеих таблиц даже те, у которых нет соответствующих строк в других таблицах.

SQL
SELECT p.product, p.price, m.model FROM price AS p
FULL JOIN model AS m ON p.id = m.id
Иллюстрация: Запросы BigQuery SQL

VIEW в Google BigQuery SQL Представление (VIEW) – это объект (виртуальная таблица) базы данных, которая хранит в себе запрос SELECT. При обращении к данному объекту будет возвращен результирующий набор данных (результат выполнения запроса). В представлении всегда находятся свежие данные. В Google BigQuery мы можем создать view и без запроса, то есть сохранить запрос в качестве view

Иллюстрация: Запросы BigQuery SQL

Синтаксис: CREATE VIEW название виртуальной таблицы AS SELECT столбцы FROM путь (имя таблицы) Для обновления представления: CREATE OR REPLACE VIEW название виртуальной таблицы AS SELECT столбцы FROM путь (имя таблицы) Для удаления представления: DROP VIEW название виртуальной таблицы; Для

примера создадим три таблицы: 1 – id, имя менеджера 2 – id, имя проекта, имя заказчика 3 – id менеджера и id проекта и имени заказчика

Иллюстрация: Запросы BigQuery SQL

Хотим узнать какой менеджер отвечает за какой проект и сколько их у него. Создадим представление:

Как это выглядит в BigQuery SQL

SQL
CREATE VIEW all_managers_projects AS
SELECT m.name, p.name AS projects_name
FROM managers AS m JOIN managers_projects AS mp
ON m.id = mpmanager_id JOIN projects AS p 
ON p.id = mp.project_id
Иллюстрация: Запросы BigQuery SQL

Результат работы запроса:

SQL
SELECT * from `united-strategy-279207.Example.all_managers_projects`
Иллюстрация: Запросы BigQuery SQL

Теперь мы можем без усложнений и кучи кода обращаться к этой таблице. Например, какое количество проектов ведет каждый менеджер, цифра:

SQL
SELECT name, count(projects_name) as count_projects from `united-strategy-279207.Example.all_managers_projects`
group by name
Иллюстрация: Запросы BigQuery SQL

Пример простого запроса: WITH table_1 (название подзапроса) AS ( SELECT внутренний подзапрос …) SELECT нужные поля из table_1 FROM table_1 (обращение к внутреннему запросу)

Пример сложного более сложного запроса: WITH table_1 (название подзапроса) AS ( SELECT внутренний подзапрос …), table_2(название подзапроса) AS ( SELECT внутренний подзапрос …) и так далее SELECT * FROM table_1, table_2 WHERE table_1.id = table_2.id (обращение к внутреннему запросу) Пример возьмем из задачи, которую мы делали в VIEW

SQL
WITH в Google BigQuery SQL Common Table Expression (CTE) — результаты запроса, которые можно использовать множество раз в других запросах. То есть, запросом мы достаем данные, и они помещаются в пространство памяти, аналогично временному представлению, которое физически не сохраняется в виде объектов. Далее мы работаем с получившейся конструкцией как с таблицей, используя такие конструкции как select, update, insert и delete. Для этого мы используем конструкцию WITH Способы использования: - для улучшения читаемости запроса при использовании сложных запросов (намного уменьшается размер кода); - когда нужно много раз обращаться к одним и тем же таблицам/выборкам из таблиц; - для создания представлений/виртуальных таблиц (VIEW) - для написания рекурсивных запросов
Иллюстрация: Запросы BigQuery SQL

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

Результат, тот же что и в предыдущем примере с VIEW

SQL
WITH  all_managers_projects  AS (
SELECT m.name, p.name as projects_name
FROM `united-strategy-279207.Example.managers` AS m JOIN `united-strategy-279207.Example.managers_projects` AS mp
ON m.id = mp.manager_id JOIN `united-strategy-279207.Example.projects` AS p 
ON p.id = mp.project_id
)
SELECT name, count(projects_name) as count_projects from all_managers_projects
group by name
Иллюстрация: Запросы BigQuery SQL

UNION & UNION ALL в Google BigQuery SQL Объединение данных UNION – это оператор SQL для объединения результирующего набора данных нескольких запросов, и данный оператор выводит только уникальные строки в запросах. UNION ALL – это оператор SQL для объединения результирующего набора данных нескольких запросов, но он выведет все строки, дубли в том числе. Необходимые условия для использования union и union all - Набор полей должен быть одинаковый во всех запросах, т.е. количество полей в каждом запросе, который будет объединяться должно быть одинаковое - Типы данных полей также должны совпадать в каждом запросе - В случае сортировки оператор order by можно указать только после последнего запроса. Например, у нас есть две базы данных (таблицы) в которых записаны менеджеры, их зарплата, и телефон.

Иллюстрация: Запросы BigQuery SQL

Пишем запрос: SELECT id, name, salary, phone FROM branch_1 UNION SELECT id, name, salary, phone FROM branch_2 Результатом запроса будет таблица, в которой будут все записи, но запись «Наталья И.В.» будет в одном экземпляре.

Иллюстрация: Запросы BigQuery SQL
SQL
SELECT id, name, salary, phone FROM branch_1 UNION ALL SELECT id, name, salary, phone FROM branch_2 Результатом будет объединение таблиц без удаления дублей:
Иллюстрация: Запросы BigQuery SQL

Читайте также

Обсудить внедрение аналитики

Оставьте заявку — эксперт Business Metric свяжется с вами

+7

Нажимая на кнопку, вы соглашаетесь с политикой конфиденциальности и офертой на услуги.