「SQL」はひとつではない — 方言の現実
「SQL標準」を謳いつつも、実際のRDBMSが100%標準準拠の例はありません。 PostgreSQLが最も標準準拠度が高いとされ、MySQLが最もゆるく、Oracleは独自拡張が多いのが伝統的な傾向です。 実務での移植性は「方言差を知っているかどうか」で決まります。
| 機能 | PostgreSQL | MySQL | Oracle | SQL Server | SQLite |
|---|---|---|---|---|---|
| 文字列連結 | a || b | CONCAT(a, b) | a || b | a + b | a || b |
| LIMIT | LIMIT 10 | LIMIT 10 | FETCH FIRST 10 ROWS ONLY(12c+) | TOP 10 | LIMIT 10 |
| UPSERT | ON CONFLICT DO UPDATE | ON DUPLICATE KEY UPDATE | MERGE | MERGE | ON CONFLICT DO UPDATE |
| 自動採番 | SERIAL / GENERATED IDENTITY | AUTO_INCREMENT | IDENTITY / SEQUENCE | IDENTITY | AUTOINCREMENT |
| Boolean型 | BOOLEAN | TINYINT(1) で代用 | CHAR(1) or NUMBER(1) | BIT | INTEGER (0/1) |
| NULLソート既定 | ASC時は最後 | ASC時は最初 | ASC時は最後 | ASC時は最初 | ASC時は最初 |
| 大小文字区別 | デフォルト区別(identifier小文字化) | OS依存 | デフォルト区別 | COLLATION依存 | 区別しない |
| FULL OUTER JOIN | ○ | ✗(8.0でも未対応、UNIONで代替) | ○ | ○ | ○(3.39+) |
| ウィンドウ関数 | SQL:2003, 2011準拠 | 8.0+ | ○ | ○ | 3.25+ |
SQL vs NoSQL — 2010年代の闘いとその後
2009年頃、「NoSQL」(Not Only SQL)ムーブメントがWebスケール需要と共に急成長。 MongoDB、Cassandra、DynamoDB、Redisなどが登場し、「SQLは古い」と言われた時代がありました。 しかし2020年代にはSQLが再び主戦場に戻ってきています。
| 観点 | SQL (RDBMS) | NoSQL |
|---|---|---|
| スキーマ | 固定スキーマ (DDL) | スキーマレス or 柔軟スキーマ |
| 結合 | JOINで複数テーブル結合 | 基本的に非対応(アプリ側で結合) |
| トランザクション | ACID | 多くはEventual Consistency(最近はACIDもあり) |
| スケーラビリティ | 垂直スケール中心(分散は難しい) | 水平スケール中心 |
| 代表プロダクト | PostgreSQL, MySQL, Oracle | MongoDB, Cassandra, DynamoDB, Redis |
| 典型用途 | トランザクション/整合性重視 | ログ/IoT/セッション/キャッシュ |
NewSQL / 分散SQL — SQLが勝ち戻った
2012年以降、「ACIDと水平スケールの両立」を目指すNewSQLが本格化しました。 火付け役はGoogle Spanner(2012年論文、原子時計とTrueTime APIで分散一貫性を実現)。 その後、オープンソース系が続きます。
| 製品 | 初版 | 特徴 | SQL互換性 |
|---|---|---|---|
| Google Spanner | 2012 (内部), 2017 Cloud GA | TrueTime APIで外部整合性。世界横断で ACID | 独自 SQL (準PostgreSQL) |
| CockroachDB | 2015 β, 2017 1.0 | Spannerの論文に触発されたオープンソース実装 | PostgreSQL wire互換 |
| TiDB | 2015 β, 2017 1.0 | PingCAP製、HTAP(OLTP+OLAP両立) | MySQL互換 |
| YugabyteDB | 2017 | PostgreSQLソースコードをフォーク | PostgreSQL高互換 |
| Amazon Aurora DSQL | 2024 Preview, 2025 GA | リージョン間Active-Active、分離されたストレージ層 | PostgreSQL互換 |
OLAP / カラムナ / Lakehouse — 分析系SQLの独立世界
ここまでの文脈は主にOLTP(Online Transaction Processing、オンライントランザクション処理)の世界でした。 一方、分析系のOLAP(Online Analytical Processing)は別のアーキテクチャで進化してきました。 大量の行を集計して少数の数値を出す用途では、列指向(カラムナ)ストレージが圧倒的に有利だからです。
| 観点 | OLTP | OLAP |
|---|---|---|
| 典型操作 | INSERT/UPDATE 少量行 | SELECT 大量行を集約 |
| ストレージ | 行指向(row-store) | 列指向(column-store) |
| 代表製品 | PostgreSQL/MySQL/Oracle | DuckDB/ClickHouse/Snowflake/BigQuery |
| 典型QPS | 数千〜数万(多数の小トランザクション) | 低QPS、大クエリ |
| 圧縮 | 効きにくい | 同じ列の値は似ているので極めて効く |
| 典型レイテンシ | ミリ秒 | 秒〜分(対象データが大きい) |
flowchart LR
subgraph ROW[行指向ストレージ - OLTP]
R1["Row1: id=1, name=Alice, age=30, dept=Eng"]
R2["Row2: id=2, name=Bob, age=25, dept=Sales"]
R3["Row3: id=3, name=Carol, age=35, dept=Eng"]
end
subgraph COL[列指向ストレージ - OLAP]
C1["id列: [1, 2, 3]"]
C2["name列: [Alice, Bob, Carol]"]
C3["age列: [30, 25, 35]"]
C4["dept列: [Eng, Sales, Eng]"]
end
style R1 fill:#3b82f6,color:#fff
style C3 fill:#10b981,color:#fff| OLAPエンジン | 特徴 | 典型用途 |
|---|---|---|
| DuckDB | 組み込み型、SQLite風API、超高速 | ノートPCでのデータ分析、CSVに直接SQL |
| ClickHouse | Yandex発、超高速Aggregation、MergeTreeエンジン | リアルタイム分析、ログ分析 |
| Snowflake | クラウド専用、ストレージとコンピュート分離、マルチクラスタ | エンタープライズデータウェアハウス |
| BigQuery | Google Cloud、サーバーレス、ペタバイト級 | Googleエコシステム |
| Apache Iceberg / DuckLake | オープンテーブルフォーマット、データレイク上にSQL | データレイクハウス |
ORM論争 — 生SQL派 vs ORM派
アプリ開発におけるSQL利用方法は大きく生SQL派とORM派に分かれ、 しばしば激しい議論の対象になります。
| 観点 | 生SQL派 | ORM派 |
|---|---|---|
| 型安全性 | テンプレート文字列ベース(危険) | コンパイル時チェック可 |
| 学習曲線 | SQLそのもの | ORM独自APIを別途覚える |
| N+1問題 | 書く人次第 | Eager/Lazy設定を誤るとN+1頻発 |
| パフォーマンスチューニング | 直接制御可 | ORM任せ→性能出ないことも |
| 複数DBサポート | 方言ごとに書き分け | ORMが吸収 |
| 代表ツール | psycopg2, jdbc直 | SQLAlchemy, Prisma, Hibernate, TypeORM, ActiveRecord |
第9章のまとめ
- SQL方言は実務で避けられない。文字列連結、LIMIT vs TOP、UPSERT、自動採番、Boolean型、NULLソートなどDBごとに異なる
- 2010年代のNoSQLブームは落ち着き、2020年代はNewSQL / 分散SQL(Spanner, CockroachDB, TiDB, YugabyteDB, Aurora DSQL)でACIDと水平スケールが両立する時代
- OLTPとOLAPは別物。OLAPは列指向ストレージで集計を高速化。DuckDB, ClickHouse, Snowflake, BigQueryが代表
- DuckDBは「OLAPに対するSQLite」として急成長中。組み込み・依存なしでCSVに直接SQL
- ORM論争は決着がつかないが、型安全SQLビルダー(jOOQ/sqlc/Drizzle/Kysely)が中道路線として台頭
次章はシリーズ最終章。AI時代を迎えたSQLの現在地と未来、 Vector型の標準搭載、Text-to-SQL、初級→中級→上級の学習ロードマップを提示します。
理解度チェック
各DBの標準的なLIMIT構文として正しくない組み合わせはどれですか?
キーボード: 1〜4 で選択、Enter で回答