🔎

Pipe syntaxはSQLの未来を変えるのか

2024/12/19に公開

Google Cloud Japan Advent Calendar 2024 通常版 の19日目の記事です。

本日のテーマは、BigQuery の Pipe syntaxです。

tl;dr

  • Pipe syntaxを使うと、標準SQLよりもシンプルに直感的にSQLが書けます
  • Pipe syntaxはSQLにパイプ構文を取り込むことでSQLの改善を目指しています
  • SQLのテストもしやすくなります

Pipe syntaxとは

2024年に以下の題名の論文が発表されました。

SQL Has Problems. We Can Fix Them: Pipe Syntax In SQL
この論文の中ではSQLは長く使われてきていて素晴らしい言語だが、書き方が非効率だよね?
こうやればもっと効率よくSQL書けると思うのだけど?

ということが書かれています。せっかくなので、論文の中身をGeminiに要約してもらいましょう。

Geminiによる要約


この論文は、SQLにパイプライン演算子を導入することで、SQLをより使いやすく、拡張しやすく、読みやすくすることを提案しています。

SQLはデータベースの標準言語として広く使われていますが、学習や使用が難しいという問題があります。これは、SQLの構文が複雑で、データの流れを直感的に理解しにくいことが原因です。

パイプライン演算子は、UnixやKQLなどの言語で採用されている構文で、データの流れを明確に表現できます。これをSQLに導入することで、クエリをより簡潔に記述し、複雑な処理を容易に表現できます。

GoogleSQLでは、このパイプライン構文を導入し、標準的なSQL構文との完全な互換性を維持しながら、より柔軟で拡張性の高いSQLを実現しています。

論文では、パイプライン構文の具体的な設計、既存のSQLとの相互運用性、Googleでの使用例などが詳細に解説されています。さらに、パイプライン構文がSQLの将来的な進化、特にAIとの連携において重要な役割を果たす可能性についても論じています。


SQLの書き方が非効率なんて思ったことなかった!って皆さん、安心してください。僕もそんなこと思ったことなかったです。
ではPipe syntaxを使うとどのように効率的にSQLが書けるのか例を見てみましょう。

論文の中に例が載っています。

こちらは従来のSQLです。よく見慣れた形ですよね。ただここにあるように、処理が実行される順番とSQLを書く順番が違うことが指摘されています。

たしかにSQLを書くときって、頭のなかではどのテーブルからデータを取得するか(From句)を一番最初に考えている気がします。

なので、こういう風に書けたら効率的じゃないか?と論文のなかでは言っています。

まず、From句から(データ的に一番大きな場所)クエリを書き始め、パイプを使ってデータを次の処理に渡し、どんどん処理をすすめていく(データを絞っていく)書き方で書かれています。

この書き方だと、自分の頭のなかで考える処理の仕方と同じ順番に書けますし、Group by句した値に対してもHaving句を使わずWhere句を使って直感的に書けている気がします。

早速試してみる

論文で発表されたPipe syntaxなのですが、すでにBigQueryで使えるようになっています!

公式Doc

注:2024/12/19現在、使用するためにはSign-up Formへの申し込みが必要となっています。

では、早速試してみましょう。
BigQueryでPipe syntaxを使うための特別な設定は(Formに申し込みをする以外)特にありません。

普通のSQLと同じように書けます。

Publicデータから検索してみましょう

Select句がなくてもFrom句だけで実行出来ていますね! Limit句もつけてみましょう。

パイプ構文を使って、データをLimit句にわたす事が出来ました。

ちなみにパイプ構文を使っていないと、きちんと使うようにエラーも出ます。

もう少し複雑なSQLにも挑戦してみましょう

従来のSQL

# 球団毎の平均観客数を算出
SELECT
 homeTeamName,
 AVG(attendance) AS avg_attendance
FROM
 `bigquery-public-data.baseball.schedules`
GROUP BY
 homeTeamName
ORDER BY
 avg_attendance DESC ;

Pipe syntaxを使ったSQLだとこのようになります。

FROM  `bigquery-public-data.baseball.schedules`
|> AGGREGATE  AVG(attendance) AS avg_attendance GROUP BY homeTeamName
|> ORDER BY avg_attendance DESC

だいぶシンプルにかけているかなと思います。

従来ですと、Select句とGroup by句の両方にhomeTeamNameを書かないといけなかったのですが、Pipe syntaxの場合だと1箇所のみですんでいます。

Gemini in BigQueryで使ってみる

Pipe syntaxは効率的に書けますが、Gemini in BigQueryにも対応しているか確認してみましょう。

Code補完

Pipe syntax形式のSQLを補完してくれました!

SQL作成


残念ながらまだPipe syntax形式のSQLは作れないようです。ここは今後に期待しましょう!

まとめ

Pipe syntaxの紹介をさせてもらいました。Pipe syntaxを使ってもらうと、SQLの途中でもクエリを実行をすることが可能なので、SQLを書きながらのデータの確認(デバッグ)が非常にやりやすくなるというメリットもあります。

SQLはテストはしにくいという問題があったと思うのですが、この問題を解決出来るのは大きいかなと思います。(IDEが対応してくれればデバッグ出来るようになるかも!?)

また、今後生成AIを使ってSQLを書く場面が多くなると予想されますが、Pipe syntaxですとSemantic な順番でSQLが書けるため生成AIが作るSQLの精度があがることも予測されています。
現在のSQLに一石を投じたPipe syntax。今後の動向に注目したいと思います!

Google Cloud Japan

Discussion