💽

AIが発展しても今だにお世話になるSQL大先生に思いを馳せる

に公開

私はDataに関わる仕事をする傍ら、DXやデータ民主化的な文脈に触れてくる機会が多くありました。
それゆえにどうやったら非エンジニアと呼ばれる方々がデータを簡単に用いて活用できるか日々考えています。
まずはBIツールがあるでしょう。csvからだってある程度データ集計できますし、Excelが得意な人でもとっつきやすいです。他にもGUIベースのデータ加工ツールもあります。例えばData Robotやdataikuなどです。これもプログラムの学習コストを下げて、わかりやすいビジュアルから操作できるようになる人もいるでしょう。
しかし私は、コードが好きですし、特に最近、改めて、SQLが好きなのです。

SQLは数年形を変えていない?

私が新卒の頃、6年ほど前ですが、まだPythonしか書けない時に、先輩方にどんな言語を学んでおけばいいか尋ねたことがありました。
キャリアや嗜好に合わせてみんないろんなことを言ってくださいましたが、中でも記憶にあるのが
SQLは形を変えない
というセリフでした。みんなが同意していました。

そしてそれから6年、SQLはほとんど形を変えていません。Bigqueryを筆頭?に、集計関数や統計的な関数が増えたものの本質は決して変わっていないのです。

学習コストはあっても、一度学習したら一生使えるとすら感じます。
なんて素敵なのでしょう。

SQLはAI時代においても必須の知識?

私の大好きなサービスにDatabricksというものがあるのですが、その中のGenieというものを紹介したいと思います。
https://docs.databricks.com/aws/genie/
Genieはわかりやすくいうと Dataと繋がった LLM interfaceで自然言語による問い合わせに対してデータにもアクセスし、回答を用意してくれます。

これは実際にdemoを自身で操作した画面です。
複雑なクエリを悠々とこなし、可視化まで一気通貫で行ってくれます。

若干ここまであっさりやられると話の腰が折られてしまいかねないですが、続けます。
私がフォーカスしたいのは一番右側 SQL Queriesという項目です。
ここには自作のSQLを"関数"としてstockして、質問の回答に対して呼び出すことができます。
なんかRAGともMCPとも違いますが、AIがコスト削減やハルシネーション防止という観点で何かツールを呼び出すという点で共通しています。

私はSQLが自動生成されること自体については、とても良い技術の発展だと思っています。
一方でファジーに取り扱うことができない領域・タスクが多い特徴もあると考えており、その際にはSQLはやはり活躍すると考えています。
確実に定義され、宣言的であり、属人的なコードなりにくいSQLという言語は、AI時代においてもデータの質を担保する上で重要な役割を(しばらくは?)果たしてくれると思います。

まじでシンプルすぎて美しい

私はpandasもpolarsも書きますし、sparkも書きますし、RPAっぽいデータ加工ツールも使いますが、結局SQLが一番シンプルです。
もちろん iteration的な処理は苦手ですし(ていうかそうなるように仕組まれていると考えているのでデメリットですら全然ないのですが)、正直一発で実現できない加工が無いわけではないですが、
それでもやっぱり美しいと思います。
このあたりの「デメリットですら全然ないのですが」っていうのが気になる人は下記の2冊を読んでみてください。特にある程度集計やSQLに慣れてきた初学者〜中級者が次のstepに行くときに非常に面白い読み物だと思います。
達人に学ぶSQL徹底指南書:
https://www.amazon.co.jp/dp/B07GB4CNKP/
SQL実践入門:
https://www.amazon.co.jp/dp/4774173010/

まずjoin

joinは基本結合したい「二つのテーブル」があって「それを結ぶキー」があって、「どう結合するか」決めればいいのです。

select * from table1 as t1 inner join table2 as t2 on t1.key = t2.key

これだけです。これ以上もこれ以下もないのです。

次にgroup by

集計も「集計するためのキー」があって、「集計したい対象」があって、「集計方法」があるだけです。

select category, sum(price) from sales group by category

これだけです。これ以上もこれ以下もないのです。

where

where category = 'food' and price > 100

これ以上もこれ以下もないのです。

ちょっと初級ではないですが CASE

CASE
    WHEN year > '2019-05-01' THEN '令和'
    WHEN .....
    ELSE ...
END

これを覚えるだけで、表現の幅が広がります。
そしてぶっちゃけ上記+いくつか覚えれば80%くらいの集計作業はできる。
ここも素晴らしいことだと思います。シンプル is power。
(上記の4種類は学習ロードマップではなく僕が美しいと思う選抜をしています)

実行計画で脳死最高

SQLは実行計画を自分で立ててくれます。もちろん完璧ではないですが、下手な人が書く手続型言語の処理に委ねるより100倍いいです。
僕はこの道6,7年なので、ある程度は集計においてパフォーマンスを考えて書くことができます。た、、多分(震え声)
しかし今までDXやデータ民主化の名の下、いろんな人といろんな経験をしてきましたが、非機能要件的な集計処理の速さやコストについて気を配って書くことは難しいです。
また、AIに頼ったコードだと特に上記のようなパフォーマンスにおけるアンチパターンは散見されます。
ここまで酷いのはないですが、pandas使っているのに不要なfor文を書いて標準methodが搭載されているにも関わらず一からapplyを実装するみたいな・・・
なんでもできる言語はなんでもできるがゆえに悲しいクソコードを生み出します
しかしSQL先生はそんなことありません。
全ての愚かな人類のために、細かい集計順など考えることなくSQL側が全てそれをいい感じに設計してくれます。
(SQLも書き方によってパフォーマンス変わるのでかなり誇張しています(白目))

SQL最高

SQLというか表題にある通り、「分析」・集計作業であったりそう言ったものにフォーカスした記事でした。それにフォーカスしないと愛情が溢れて5万文字になってしまいそうです。
SQLはデータを扱う言語において始祖であり基礎であり、これからもほぼ中心に位置すると考えています。学んで損はないと同時に改めてこの重要性が、数年の間かもしれませんが、フォーカスされたら嬉しいなと思います。
いいねいただけると励みになります。お読みいただきありがとうございました。

Discussion