「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
行指向 vs 列指向: OLAPで age 列の平均を取るとき、行指向は全列読む必要があるが列指向はage列だけ読めばいい
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、初級→中級→上級の学習ロードマップを提示します。

理解度チェック

問題 0 / 50%
Q1

各DBの標準的なLIMIT構文として正しくない組み合わせはどれですか?

キーボード: 1〜4 で選択、Enter で回答