1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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_INCREMENTSERIAL といった自動採番機能を使います。

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/

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?