「SQL」はひとつではない — 方言の現実

「SQL標準」を謳いつつも、実際のRDBMSが100%標準準拠の例はありません。 PostgreSQLが最も標準準拠度が高いとされ、MySQLが最もゆるく、Oracleは独自拡張が多いのが伝統的な傾向です。 実務での移植性は「方言差を知っているかどうか」で決まります。

機能PostgreSQLMySQLOracleSQL ServerSQLite
文字列連結a || bCONCAT(a, b)a || ba + ba || b
LIMITLIMIT 10LIMIT 10FETCH FIRST 10 ROWS ONLY(12c+)TOP 10LIMIT 10
UPSERTON CONFLICT DO UPDATEON DUPLICATE KEY UPDATEMERGEMERGEON CONFLICT DO UPDATE
自動採番SERIAL / GENERATED IDENTITYAUTO_INCREMENTIDENTITY / SEQUENCEIDENTITYAUTOINCREMENT
Boolean型BOOLEANTINYINT(1) で代用CHAR(1) or NUMBER(1)BITINTEGER (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, OracleMongoDB, Cassandra, DynamoDB, Redis
典型用途トランザクション/整合性重視ログ/IoT/セッション/キャッシュ

NewSQL / 分散SQL — SQLが勝ち戻った

2012年以降、「ACIDと水平スケールの両立」を目指すNewSQLが本格化しました。 火付け役はGoogle Spanner(2012年論文、原子時計とTrueTime APIで分散一貫性を実現)。 その後、オープンソース系が続きます。

製品初版特徴SQL互換性
Google Spanner2012 (内部), 2017 Cloud GATrueTime APIで外部整合性。世界横断で ACID独自 SQL (準PostgreSQL)
CockroachDB2015 β, 2017 1.0Spannerの論文に触発されたオープンソース実装PostgreSQL wire互換
TiDB2015 β, 2017 1.0PingCAP製、HTAP(OLTP+OLAP両立)MySQL互換
YugabyteDB2017PostgreSQLソースコードをフォークPostgreSQL高互換
Amazon Aurora DSQL2024 Preview, 2025 GAリージョン間Active-Active、分離されたストレージ層PostgreSQL互換

OLAP / カラムナ / Lakehouse — 分析系SQLの独立世界

ここまでの文脈は主にOLTP(Online Transaction Processing、オンライントランザクション処理)の世界でした。 一方、分析系のOLAP(Online Analytical Processing)は別のアーキテクチャで進化してきました。 大量の行を集計して少数の数値を出す用途では、列指向(カラムナ)ストレージが圧倒的に有利だからです。

観点OLTPOLAP
典型操作INSERT/UPDATE 少量行SELECT 大量行を集約
ストレージ行指向(row-store)列指向(column-store)
代表製品PostgreSQL/MySQL/OracleDuckDB/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
ClickHouseYandex発、超高速Aggregation、MergeTreeエンジンリアルタイム分析、ログ分析
Snowflakeクラウド専用、ストレージとコンピュート分離、マルチクラスタエンタープライズデータウェアハウス
BigQueryGoogle 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 で回答