# R2 SQL がテーブルの壁を突破！JOIN もサブクエリも書けるようになったよ

やっほー、しぃちゃんだよ！今日は R2 SQL がぐっと強くなったニュースを見つけちゃった。データ分析がはかどりそうで、わくわくしてるの。

## なにが発表されたの？

Cloudflare の Changelog で、[R2 SQL](https://developers.cloudflare.com/r2-sql/) が JOIN・サブクエリ・複数テーブルのクエリに対応したって発表があったよ（2026 年 5 月 15 日）。R2 SQL は、[R2 Data Catalog](https://developers.cloudflare.com/r2/data-catalog/) に置いた Apache Iceberg テーブルを、サーバーレスで問い合わせできる分散 SQL エンジンなの。Cloudflare のグローバルネットワーク上で直接動くから、管理するインフラもいらないし、外部のデータウェアハウスに書き出さなくても R2 の中のデータをそのまま分析できるんだよ。

## 今までどうだったの？

これまでの R2 SQL は、1 つのテーブルに対する問い合わせが中心だったの。でも実際のデータ分析だと、「リクエストのテーブル」と「ゾーンのテーブル」をくっつけて見たい、みたいに複数のテーブルをまたいで集計したい場面がたくさんあるよね。今回のアップデートで、その「テーブルをまたぐ」やり方が一気に増えたの。

## これで何が変わるの？

複数の Iceberg テーブルを 1 つのクエリで結合できるようになったよ。JOIN でテーブルをつなぎ、サブクエリで絞り込み、複数テーブルをまたぐ CTE で複雑な分析クエリを組み立てられるの。外部のウェアハウスに移さなくても、R2 の中だけで多テーブル分析が完結するのがうれしいところ。

## 深く潜ってみよう

今回そろった機能はこんな感じ。

- **JOIN**: INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN、CROSS JOIN に加えて、FROM をカンマ区切りにして WHERE で条件を書く暗黙結合もいけるよ。
- **サブクエリ**: IN / NOT IN、EXISTS / NOT EXISTS、SELECT / WHERE / HAVING の中で使うスカラーサブクエリ、それに FROM の中に書く派生テーブルにも対応。
- **複数テーブルの CTE**: WITH 句で別々のテーブルを参照したり、その中で JOIN を書いたりできるの。
- **自己結合**: 別名を付けて、同じテーブル同士を結合できるよ。
- **多テーブル結合**: 3 つ以上のテーブルを 1 つのクエリで一気に結合できるの。

たとえば 2 つのテーブルを INNER JOIN して集計する、こんなクエリが書けるよ。

```sql
SELECT z.domain, z.plan, COUNT(*) AS request_count
FROM my_namespace.zones z
INNER JOIN my_namespace.http_requests h ON z.zone_id = h.zone_id
WHERE z.plan = 'enterprise'
GROUP BY z.domain, z.plan
ORDER BY request_count DESC
LIMIT 20
```

構文の詳しいところは [SQL リファレンス](https://developers.cloudflare.com/r2-sql/sql-reference/)、JOIN を使うときのパフォーマンスのコツは [制限とベストプラクティス](https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/) を見てね。

## まとめ

- R2 SQL が JOIN・サブクエリ・複数テーブルのクエリに対応したよ。
- JOIN は INNER / LEFT / RIGHT / FULL OUTER / CROSS と暗黙結合、自己結合・多テーブル結合までカバー。
- サブクエリは IN / EXISTS / スカラー / 派生テーブル、CTE は複数テーブルをまたげるの。
- 外部ウェアハウスに書き出さず、R2 の中だけで多テーブル分析が完結。

R2 Data Catalog にデータを貯めていて「もっと踏み込んだ分析がしたい！」って人にぴったりのアップデートだね。
