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' |
MySQL | CONCAT('str1', 'str2') |
PostgreSQL | `'str1' |
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/