Oracleと他のDBのSQL記法の違いまとめ

# Oracleと他のDBのSQL記法の違いまとめ

業務でOracleを使っていると、MySQLやPostgreSQL、SQL Serverなど他のDBMSとSQL文の書き方に違いがあることに気づくことがあります。  
本記事では、Oracleと主要なRDBMSのSQL記法の違いをわかりやすくまとめました。

---

## 1. DUAL テーブルの必要性

Oracleでは `FROM` 句が必須で、単純な値や式の選択時にも `DUAL` という特殊なダミーテーブルを指定します。  
他のDBMSでは `FROM` 句なしで `SELECT` が可能です。

| DB          | 例                        |
|-------------|---------------------------|
| Oracle      | `SELECT 1 FROM DUAL;`     |
| MySQL等     | `SELECT 1;`               |

---

## 2. 行制限（LIMIT vs ROWNUM vs FETCH FIRST）

行数制限の構文もDBごとに異なります。Oracleの旧式では `ROWNUM` を使い、12c以降は標準SQL準拠の `FETCH FIRST` も利用可能です。

| DB         | 行数制限例                       |
|------------|---------------------------------|
| Oracle     | `WHERE ROWNUM <= 10`             |
| Oracle 12c | `FETCH FIRST 10 ROWS ONLY`       |
| MySQL      | `LIMIT 10`                      |
| PostgreSQL | `LIMIT 10`                      |
| SQL Server | `TOP 10`                       |

---

## 3. シーケンスと自動採番の違い

Oracleはシーケンスを使い、他DBは `AUTO_INCREMENT` や `SERIAL` といった自動採番機能を使います。

| DB         | 自動採番方法                    |
|------------|--------------------------------|
| Oracle     | `SEQUENCE_NAME.NEXTVAL`         |
| MySQL      | `AUTO_INCREMENT`                |
| PostgreSQL | `SERIAL` / `SEQUENCE`           |

---

## 4. 日付関数の違い

日時取得や日付計算の関数も異なります。

| 処理       | Oracle                         | MySQL                          | PostgreSQL                     |
|------------|--------------------------------|--------------------------------|--------------------------------|
| 現在日時   | `SYSDATE` / `SYSTIMESTAMP`    | `NOW()`                        | `CURRENT_TIMESTAMP`            |
| 日付書式化 | `TO_CHAR(date, 'YYYY-MM-DD')` | `DATE_FORMAT(date, '%Y-%m-%d')` | `TO_CHAR(date, 'YYYY-MM-DD')`  |
| 日付差     | `date2 - date1`（日数）        | `DATEDIFF(date2, date1)`       | `age(date2, date1)`            |

---

## 5. 文字列連結の違い

OracleやPostgreSQLは `||` 演算子で文字列連結を行いますが、MySQLは `CONCAT()` 関数を使用します。

| DB         | 文字列連結例                 |
|------------|------------------------------|
| Oracle     | `'str1' || 'str2'`           |
| MySQL      | `CONCAT('str1', 'str2')`     |
| PostgreSQL | `'str1' || 'str2'`           |

---

## 6. サブクエリと FROM 句の書き方

Oracleではサブクエリを `FROM` に書く際に必ず別名が必要です。

SELECT * FROM (SELECT * FROM users) u; -- OK  
SELECT * FROM (SELECT * FROM users);   -- NG（エラー）

MySQLやPostgreSQLでも別名は推奨されますが、厳密ではありません。

---

## 7. NULL の扱いと比較

`NULL` の扱いや関数もDBごとに異なります。

- `NULL = NULL` はどのDBでも `FALSE` となります。
- Oracleの `NVL()`、MySQLの `IFNULL()`、PostgreSQLの `COALESCE()` は似た機能です。
- Oracleの `DECODE()` はCASE文の代替として使われます。

---

## 8. 別名（エイリアス）の付け方と挙動

Oracleでは `AS` は省略可能で、ダブルクォートで囲うと大文字小文字を区別します。  
PostgreSQLはエイリアスの大文字小文字を小文字に変換するので注意が必要です。

---

## 9. 複数行INSERT文の違い

Oracle 12c以降はMySQLやPostgreSQLと同様に複数行の `VALUES` を指定できます。

INSERT INTO users (id, name) VALUES (1, 'A'), (2, 'B');

---

## 10. トランザクションと自動コミットの違い

Oracleは明示的にコミットしないと変更が確定しませんが、MySQLの多くは自動コミットが有効です。

| DB         | 自動コミットのデフォルト     |
|------------|-----------------------------|
| Oracle     | OFF（明示的にCOMMIT必要）    |
| MySQL      | ON                          |
| PostgreSQL | OFF                         |

---

## 11. 文字列のエスケープ

Oracleではシングルクオートを2つ連続で書くことでエスケープします。

SELECT 'O''Reilly' FROM dual;

MySQLやPostgreSQLではバックスラッシュや2重シングルクオートでエスケープ可能です。

---

## 12. UPDATE文のFROM句対応

Oracleは `UPDATE` 文での `JOIN` をサポートしていないため、サブクエリで代替しますが、PostgreSQLやMySQLは `FROM` 句で結合可能です。

UPDATE t1 SET col = t2.col  
FROM t2  
WHERE t1.id = t2.id;

---

## 13. 正規表現関数

| DB         | 正規表現検索          | 正規表現置換       |
|------------|----------------------|--------------------|
| Oracle     | REGEXP_LIKE          | REGEXP_REPLACE     |
| PostgreSQL | `~` 演算子           | REGEXP_REPLACE     |
| MySQL      | REGEXP / RLIKE       | REGEXP_REPLACE     |

---

## 14. トランザクション分離レベルの指定

ほとんどのDBで標準SQLの文法で分離レベルを指定可能です。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

---

# まとめ

Oracleと他の主要DBMSでは、SQL文法や機能に多くの違いがあります。  
業務やプロジェクトで複数DBを扱う場合は、これらの違いを理解しておくことが重要です。  

ぜひ日々の開発で役立ててください！


## **採用拡大中！**

アシストエンジニアリングでは一緒に働くフロントエンド、バックエンドのエンジニアを募集しています！  
少しでも興味ある方は、カジュアル面談からでもぜひお気軽にお話ししましょう！

お問い合わせはこちらから↓  
[https://official.assisteng.co.jp/contact/](https://official.assisteng.co.jp/contact/)