SQLが書けなくても大丈夫!BigQueryの生成AIでデータ分析の強い味方
対象読者
- SQLは苦手だけど、自分でデータを分析してみたいビジネスパーソン(企画、マーケターなど)
- データ分析の生産性を上げたいデータアナリスト、エンジニア
- Google Cloudの生成AI機能に興味がある方
TL;DR
BigQueryに搭載された生成AI「Gemini in BigQuery」がすごい。①日本語の指示(プロンプト)でSQLを自動生成したり、②SQL関数(ML.GENERATE_TEXT)でテキストの要約や分類をしたりと、データ分析のハードルを劇的に下げてくれます。この記事では、その具体的な使い方を実践形式で解説します!
1. BigQueryと強力な助っ人「Gemini in BigQuery」
まず、今回利用する技術について簡単に見ていきましょう。
BigQueryとは?
BigQueryは、Google Cloudが提供するフルマネージドでサーバーレスなデータウェアハウスです。ペタバイト級の巨大なデータに対しても、数秒から数十秒という驚異的な速さで分析処理を実行できるのが特徴です。
Googleの公式ドキュメントでは、以下のように説明されています。
BigQuery は、超並列クエリ処理と高帯域幅のネットワーク接続を使用して、ペタバイト規模のデータを数秒で、ギガバイト規模のデータをミリ秒単位で処理します。(中略)使い慣れた SQL 言語を使用して、データをクエリできます。
(BigQuery の概要 | Google Cloud)
膨大なデータを蓄積し、高速に分析するための強力な基盤と言えます。
Gemini in BigQueryとは?
Gemini in BigQueryは、そのBigQueryにGoogleの高性能な生成AIモデル「Gemini」を統合した機能群の総称です。これにより、これまでSQLの専門知識が必要だったデータ分析作業を、自然言語(日本語)で行えるようになります。
Gemini in BigQuery は、データチームが生産性を高め、費用を最適化し、ビジネス価値を高めるのに役立つ AI 活用支援機能を提供します。(中略)SQL と Python のコード生成、コード補完、コードの説明、BigQuery のデータ検出とデータ準備を支援します。
(Gemini in BigQuery の概要 | Google Cloud)
今回は、このGemini in BigQueryが持つ2つの強力な機能、「自然言語からのSQL生成」と「SQL関数によるテキスト生成」を試していきます。
2. 実践①:日本語の指示でSQLを自動生成する
ここからは、実際の機能を使って試していきます。今回は、BigQueryで一般公開されているeコマースのデモデータセットthelook_ecommerceを使って、様々なレベルのSQLを生成させてみます。
Step 0: 前提
- Google Cloudアカウント、プロジェクトが作成済みであること。
- 分析を行いたいGoogle Cloudプロジェクトで Cloud AI Companion API が有効になっていること。
Step 1: BigQuery Studioへのアクセス
まず、Google Cloudコンソールにログインします。
画面上部の検索窓から BigQuery を検索し、BigQuery Studioに遷移します。
BigQuery Studioを開き、「クエリを新規作成」をクリックします。
Step 2: 日本語で指示を入力し、SQLを生成する
クエリエディタが開いたら、SQLで行いたい処理を**コメント形式(#から始める)**で記述します。入力後、エディタの下に表示される「生成」ボタンをクリックします。
【レベル1:初級】単一テーブルからの基本的な集計
まずは小手調べ。ユーザーテーブルから特定の州のユーザー数を数えてもらいます。
▼ 鉛筆ボタンをクリックし、ポップアップにプロンプトを入力し生成ボタンをクリックすると、SQLが生成される

入力した日本語の指示:
# 「bigquery-public-data.thelook_ecommerce.users」テーブルから、「state」列が「California」のユーザー数をカウントして
生成想定のSQL:
SELECT
count(*) as California_count
FROM
`bigquery-public-data.thelook_ecommerce.users` AS t
WHERE t.state = 'California'
想定結果:
| 行 | California_count |
|---|---|
| 1 | 3701 |
すると、Geminiがコメントを解釈し、即座に対応するSQLを生成してくれます。
生成されたSQL:
-- # 「bigquery-public-data.thelook_ecommerce.users」テーブルから、「state」列が「California」のユーザー数をカウントして
SELECT
COUNT(DISTINCT users.id) AS count_of_users
FROM
`bigquery-public-data`.`thelook_ecommerce`.`users` AS users
WHERE
users.state = 'California';
生成されたSQLに問題がなければ、「実行」ボタンを押して結果を確認します。
【レベル2:中級】複数テーブルの結合
次は、2つのテーブルを結合して、カテゴリごとの売上を集計させてみます。
入力した日本語の指示:
# 「bigquery-public-data.thelook_ecommerce.products」テーブルと「bigquery-public-data.thelook_ecommerce.order_items」テーブルを結合して、各商品カテゴリ(products.category)ごとの総売上(order_items.sale_price)を計算し、売上が高い順に並べて
生成想定のSQL:
SELECT
p.category,
SUM(oi.sale_price) AS total_revenue
FROM
`bigquery-public-data.thelook_ecommerce.order_items` AS oi
INNER JOIN `bigquery-public-data.thelook_ecommerce.products` AS p ON oi.product_id = p.id
GROUP BY
p.category
ORDER BY
total_revenue DESC
想定結果:
| 行 | category | total_revenue |
|---|---|---|
| 1 | Outerwear & Coats | 1328738.2389774323 |
| 2 | Jeans | 1254118.5016040802 |
| 3 | Sweaters | 837602.110159874 |
| 4 | Swim | 654086.87071990967 |
| 5 | Suits & Sport Coats | 639064.94005298615 |
生成されたSQL:
-- # 「bigquery-public-data.thelook_ecommerce.products」テーブルと「bigquery-public-data.thelook_ecommerce.order_items」テーブルを結合して、各商品カテゴリ(products.category)ごとの総売上(order_items.sale_price)を計算し、売上が高い順に並べて
SELECT
t1.category,
SUM(t2.sale_price) AS total_sales
FROM
`bigquery-public-data`.`thelook_ecommerce`.`products` AS t1
INNER JOIN
`bigquery-public-data`.`thelook_ecommerce`.`order_items` AS t2
ON
t1.id = t2.product_id
GROUP BY
t1.category
ORDER BY
SUM(t2.sale_price) DESC;
JOINやGROUP BY、ORDER BYといった句も適切に使いこなしてくれていることがわかります。
【レベル3:上級】ウィンドウ関数を含む複雑な分析
最後に、少し複雑な時系列分析に挑戦します。日々の売上に加え、その日までの累積売上を計算するよう指示してみます。
入力した日本語の指示:
# 2024年1月における日毎の売上と、その日までの累積売上を計算して。
# 日付(created_at)は「bigquery-public-data.thelook_ecommerce.order_items」テーブルから取得して。
生成想定のSQL:
SELECT
sale_date,
daily_sales,
SUM(daily_sales) OVER (ORDER BY sale_date) AS cumulative_sales
FROM (
SELECT
EXTRACT(DATE FROM created_at) AS sale_date,
SUM(sale_price) AS daily_sales
FROM
`bigquery-public-data.thelook_ecommerce.order_items`
WHERE
EXTRACT(YEAR FROM created_at) = 2024
AND EXTRACT(MONTH FROM created_at) = 1
GROUP BY
sale_date
)
ORDER BY
sale_date
想定結果:
| 行 | sale_date | daily_sales | cumulative_sales |
|---|---|---|---|
| 1 | 2024-01-01 | 6773.0800094604492 | 6773.0800094604492 |
| 2 | 2024-01-02 | 4162.1500182151794 | 10935.230027675629 |
| 3 | 2024-01-03 | 5862.2700090408325 | 16797.500036716461 |
| 4 | 2024-01-04 | 6344.9100141525269 | 23142.410050868988 |
| 5 | 2024-01-05 | 7543.7899961471558 | 30686.200047016144 |
生成されたSQL:
-- # 2024年1月における日毎の売上と、その日までの累積売上を計算して。
-- # 日付(created_at)は「bigquery-public-data.thelook_ecommerce.order_items」テーブルから取得して。
SELECT
sale_date,
daily_sales,
SUM(daily_sales) OVER (ORDER BY sale_date) AS cumulative_sales
FROM
(SELECT
DATE(order_items.created_at) AS sale_date,
SUM(order_items.sale_price) AS daily_sales
FROM
`bigquery-public-data.thelook_ecommerce.order_items` AS order_items
WHERE
DATE_TRUNC(DATE(order_items.created_at), MONTH) = DATE '2024-01-01'
GROUP BY
sale_date
)
ORDER BY
sale_date
サブクエリ(WITH句)やウィンドウ関数 OVER() を使った高度なSQLも見事に生成できました。SQLに不慣れな人にとっては、このようなクエリをゼロから書くのは大変ですが、Geminiを使えば一瞬です。
※ちなみに、私が実践した際には何度かそもそも実行できないSQLが生成されることがありました。
やはりSQL生成に特化しているからといってもやりたいことを明確にし、表現を工夫すること、そして、何度か生成は試してみることが必要です。
生成された失敗SQL:
-- Window ORDER BY expression references order_items.created_at which is neither grouped nor aggregated at [4:56]
-- # 2024年1月における日毎の売上と、その日までの累積売上を計算して。
-- # 日付(created_at)は「bigquery-public-data.thelook_ecommerce.order_items」テーブルから取得して。
SELECT
DATE(order_items.created_at) AS sale_date,
SUM(order_items.sale_price) AS daily_sales,
SUM(SUM(order_items.sale_price)) OVER (ORDER BY DATE(order_items.created_at)) AS cumulative_sales
FROM
`bigquery-public-data`.`thelook_ecommerce`.`order_items` AS order_items
WHERE
DATE_TRUNC(DATE(order_items.created_at), MONTH) = DATE '2024-01-01'
GROUP BY
sale_date
ORDER BY
sale_date
3. 実践②:SQL関数でテキストを生成・要約する ML.GENERATE_TEXT
BigQueryの生成AI機能はこれだけではありません。ML.GENERATE_TEXT というSQL関数を使うと、クエリ内で直接、テキスト生成AIモデルを呼び出すことができます。
ML.GENERATE_TEXT 関数を使用すると、BigQuery に保存されているデータに対して、Google Cloud でホストされている大規模言語モデル(LLM)で推論を実行できます。
(ML.GENERATE_TEXT 関数 | Google Cloud)
これにより、データの要約、分類、感情分析、さらには新しい文章の作成といった高度な処理をSQLだけで完結できます。
ユースケース例:商品名からキャッチコピーを生成する
thelook_ecommerce.productsテーブルにある商品名とカテゴリを元に、AIに魅力的なキャッチコピーを考えてもらいましょう。
実行するSQL:
SELECT
name,
category,
ml_generate_text_result['predictions'][0]['content'] AS catch_copy
FROM
ML.GENERATE_TEXT(
MODEL `bqml_llm_model`,
(
SELECT
CONCAT('商品名:「', name, '」、カテゴリ:「', category, '」 この商品の魅力が伝わる30文字程度のキャッチコピーを考えてください。') AS prompt,
name,
category
FROM
`bigquery-public-data.thelook_ecommerce.products`
WHERE category = 'Tops & Tees' -- カテゴリを絞って試す
LIMIT 5
),
STRUCT(
0.8 AS temperature,
256 AS max_output_tokens
)
);
(※注: このクエリを実行するには、事前にLLMを参照するBigQuery MLモデルを作成しておく必要があります)
このクエリは、Tops & Teesカテゴリの商品5つについて、prompt列に「キャッチコピーを考えて」という指示を作成し、それをML.GENERATE_TEXT関数に渡しています。結果として、各商品の横にAIが生成したキャッチコピーが新しい列として追加されます。
このように、SQLの処理結果を動的にプロンプトに組み込めるため、大量のデータに対して一括でテキスト生成タスクを実行できるのが大きな魅力です。
4. まとめ
- BigQueryの「Gemini in BigQuery」は、データ分析の強力なサポーターとなります。
- 日本語のコメントを書くだけで、初心者には難しい複雑なSQLも自動で生成してくれます。
-
ML.GENERATE_TEXT関数を使えば、SQL内でデータの要約や分類、文章作成といった高度なテキスト処理が可能になります。 - これらの機能により、SQLの専門家でなくてもデータからインサイトを引き出しやすくなり、まさにデータ分析の民主化が進むと言えるでしょう。
この記事が、皆さんのデータ分析ライフの新たな一歩となれば幸いです!




