Location via proxy:   
[Report a bug]   [Manage cookies]                

MySQLでREPLACEを使った置換

MySQLでREPLACEを使った置換

MySQLでの置換は、REPLACE関数やREPLACE INTO文を使用することで可能です。
これらは、テキストデータやデータベース内の値を置き換える際に役立ちます。

REPLACE関数

REPLACE関数は、指定した文字列中の一部の文字列を別の文字列に置き換えるために使用されます。
一般的な構文は以下の通りです。

REPLACE(対象文字列, 検索文字列, 置換文字列)
  • 対象文字列: 置換を行いたい文字列を指定します。
  • 検索文字列: 置換対象となる文字列を指定します。
  • 置換文字列: 検索文字列に置き換える文字列を指定します。

具体的な例を見てみます。
例えば、ある列に含まれる文字列 "apple" を "orange" に置き換えたい場合、次のようなクエリを実行します。

SELECT REPLACE('I like apple', 'apple', 'orange');

このクエリは、I like apple という文字列の中の "apple" を "orange" に置き換え、結果として I like orange を返します。
REPLACE関数は文字列のすべての出現箇所で置き換えを行うため、複数箇所に対象の文字列が存在する場合でも問題なく処理できます。

テーブルのデータに対する置換

テーブルのデータを置換する場合も、REPLACE関数を利用できます。
たとえば、テーブル内の特定の列の値に含まれる文字列を一括で置き換えるには、以下のようにUPDATE文と組み合わせて使用します。

UPDATE テーブル名
SET 列名 = REPLACE(列名, '検索文字列', '置換文字列')
WHERE 条件;

次の例では、productsテーブルのdescription列に含まれるすべての "outdated" という文字列を "updated" に置き換えます。

UPDATE products
SET description = REPLACE(description, 'outdated', 'updated')
WHERE description LIKE '%outdated%';

このクエリは、description列に"outdated"という文字列が含まれる行のみを対象に、その部分を"updated"に置き換えます。

REPLACE INTO文

あまり見慣れない構文ですが、REPLACE INTO文は既存の行を新しいデータで置き換えるか、存在しない場合は新しい行を挿入するために使用されます。
REPLACE INTOはINSERT INTOに似ていますが、主キーまたは一意のインデックスが衝突した場合、既存の行を削除して新しいデータで置き換えます。
基本構文は次の通りです。

REPLACE INTO テーブル名 (列名1, 列名2, ...)
VALUES (値1, 値2, ...);

例えば、usersテーブルのid列が主キーである場合、次のクエリを実行すると、idが1の行が既に存在する場合はその行が削除され、新しいデータが挿入されます。
存在しない場合は、新しい行が挿入されます。

REPLACE INTO users (id, name, email)
VALUES (1, 'John Doe', 'john@example.com');

REPLACE INTOは、特定の状況でデータの整合性を維持しながら行を更新または挿入するために便利です。
ただし、慎重に使用する必要があります。
既存の行が削除され、新しい行が挿入されるため、トリガーや関連する制約が再評価される可能性があります。
また、削除と挿入が行われるため、自動インクリメントのカラムも更新される可能性があります。

REPLACEの注意点

REPLACEを使用する際に考慮すべきいくつかの点があります。

1. ケースセンシティブ
REPLACE関数はデフォルトではケースセンシティブ(大文字と小文字の区別がされる)です。
例えば、REPLACE('apple', 'APPLE', 'orange')の結果はそのままappleが返されます。
大文字小文字を区別しない置換を行いたい場合、事前に文字列を小文字に変換するLOWER関数や、大文字に変換するUPPER関数と組み合わせて使用する方法があります。

2. 部分一致の置換
REPLACEは指定された部分文字列に一致するすべての箇所で置換を行いますが、部分一致の範囲に関しては注意が必要です。
例えば、REPLACE('foobarfoo', 'foo', 'bar')の結果はbarbarbarになります。
置換前の文字列に類似した部分が複数存在する場合、そのすべてが置き換わります。

3. NULL値への対応
REPLACE関数はNULL値に対しては何も操作しません。
もし対象の列にNULL値が含まれている場合、それらは置換の対象にはなりません。

まとめ

MySQLのREPLACE関数とREPLACE INTO文は、それぞれ異なる用途で文字列やデータの置換に使われます。
REPLACE関数は文字列の一部を他の文字列に置き換える際に有用で、REPLACE INTOはテーブルにデータを挿入しつつ、既存のデータがあれば置き換えるという動作をします。
どちらも適切に使用すれば、効率的にデータを操作できますが、特にREPLACE INTOはデータを置き換えてしまうので慎重に使用する必要があります。

MySQLで正規表現の使い方

MySQLで正規表現の使い方

MySQLで正規表現を使うことで、テキスト検索をより柔軟に行うことが可能です。
特に複雑なパターンマッチングをしたい場合に便利です。
MySQLではREGEXPキーワードを使用して正規表現による検索を行います。
また、バージョン8.0以降ではREGEXP_LIKE、REGEXP_INSTR、REGEXP_REPLACE、REGEXP_SUBSTRといった追加の正規表現関数も利用できます。

基本的なREGEXPの使い方

REGEXPは特定のパターンにマッチするかどうかを判定するために使用します。
例えば、以下のように使います。

SELECT * FROM users WHERE name REGEXP '^[A-Za-z]+$';

この例では、nameカラムの値がアルファベットの文字列だけで構成されているレコードを検索しています。
^は文字列の開始、$は文字列の終了を示し、[A-Za-z]は英字の範囲を示しています。
よくある正規表現の書き方ですね。

複数のパターンを使用する

例えば、nameカラムが数字で始まるか、example.comドメインのメールアドレスを持つユーザーを検索したい場合は次のようにします。

SELECT * FROM users WHERE name REGEXP '^[0-9]' OR email REGEXP 'example\\.com$';

この例では、1つ目のREGEXPはnameカラムが数字で始まるユーザーを検索し、2つ目のREGEXPはemailカラムがexample.comで終わるユーザーを検索しています。
\\.は.をエスケープしてピリオドそのものにマッチさせています。

REGEXP_LIKE

MySQL 8.0以降では、REGEXP_LIKE関数も使用可能です。
この関数はREGEXPと同様に文字列が正規表現にマッチするかどうかを判定しますが、他にオプションも提供されています。

SELECT * FROM users WHERE REGEXP_LIKE(name, '^[A-Za-z]+$', 'c');

この例では、REGEXP_LIKEを使って名前が英字のみで構成されているユーザーを検索しています。
第三引数の'c'は大文字・小文字を区別するかどうかのオプションで、省略すると大文字小文字は区別されません。

REGEXP_REPLACE

REGEXP_REPLACE関数は、正規表現を使用して文字列の一部を置き換えるために使われます。
例えば、電話番号からすべてのハイフンを削除する場合は次のようにします。

SELECT REGEXP_REPLACE(phone, '-', '') AS formatted_phone FROM users;

この例では、phoneカラムの中にあるハイフンを空文字に置き換えて、ハイフンなしの電話番号を返します。

REGEXP_INSTR

REGEXP_INSTRは、文字列内で正規表現にマッチする部分の開始位置を返す関数です。
例えば、メールアドレスのドメイン部分がどこから始まるかを知りたい場合に使います。

SELECT REGEXP_INSTR(email, '@') AS domain_start FROM users;

このクエリは、emailカラム内の@マークがどこにあるかを返します。

REGEXP_SUBSTR

REGEXP_SUBSTRは、正規表現にマッチする部分文字列を返す関数です。
例えば、メールアドレスからドメイン部分だけを抽出する場合に使用します。

SELECT REGEXP_SUBSTR(email, '@[^ ]+') AS domain FROM users;

この例では、emailカラム内の@から始まるドメイン部分を抽出しています。
@[^ ]+は、@の後に続く空白以外の文字列にマッチします。

注意点

MySQLの正規表現はPerl互換の正規表現(PCRE)をベースにしていますが、一部の機能が制限されています。
例えば、(?i)のような大文字・小文字を区別しないオプションはサポートされていません。
その代わりに、REGEXP_LIKE関数のオプションを使用して大文字小文字の区別を制御することができます。

正規表現を使用する際には、パフォーマンスにも注意が必要です。
特に大規模なデータセットに対して複雑な正規表現を使用すると、クエリの実行速度が遅くなる可能性があります。
そのため、可能な限りインデックスを活用するなどの対策を講じると良いです。

MySQLでの正規表現を効果的に使用することで、柔軟なテキスト検索や文字列操作が可能になります。

MySQLのPrimary key(主キー)について

MySQLのPrimary key(主キー)について

MySQLにおけるPrimary Key(主キー)は、テーブルの各行を一意に識別するために使用される重要な概念です。
主キーはデータベースの整合性を保ち、重複したデータが存在しないことを保証します。
ここでは、MySQLの主キーについて説明します。

1. 主キーの基本概念

主キーは、テーブル内の各レコード(行)を一意に識別するための列、または複数列で構成されます。
主キーに設定された列は、次の特徴を持ちます。

  • 一意性

主キーに設定された列は、全てのレコードで一意でなければなりません。
同じ値が重複して保存されることはできません。

  • NULL値不可

主キーにはNULL値を設定することはできません。
すべての行に対して必ず値が設定されている必要があります。

例えば、社員テーブルでは、社員IDが主キーとして使われることが一般的です。
この社員IDは、それぞれの社員を一意に識別し、他のレコードと重複しないようにします。

2. 主キーの作成方法

主キーを設定する際には、テーブルの作成時に PRIMARY KEY キーワードを使用します。
以下は、主キーを設定する基本的な方法です。

CREATE TABLE employees (
  employee_id INT NOT NULL,
  first_name VARCHAR(50),
  last_name VARCHAR(50),
  PRIMARY KEY (employee_id)
);

この例では、employee_id 列が主キーとして設定されています。
この列には一意のIDが入力され、各レコードを一意に識別します。

また、既存のテーブルに対して主キーを追加することもできます。

ALTER TABLE employees
ADD PRIMARY KEY (employee_id);

このコマンドは、すでに作成された employees テーブルに対して、employee_id 列を主キーとして追加します。

3. 複合主キー

複数の列を組み合わせて主キーを構成することもできます。
これを「複合主キー」と呼びます。
例えば、社員が複数のプロジェクトに参加している場合、employee_id と project_id の2つの列を組み合わせて主キーとすることで、特定の社員が特定のプロジェクトに対して一意のエントリを持つようにすることが可能です。

CREATE TABLE employee_projects (
  employee_id INT NOT NULL,
  project_id INT NOT NULL,
  PRIMARY KEY (employee_id, project_id)
);

この例では、employee_id と project_id の2つの列が複合主キーとなり、それぞれの組み合わせが一意であることを保証します。

4. 自動インクリメントと主キー

多くの場合、主キーは一意の識別子として自動的に番号が付けられることが望まれます。
MySQLでは、AUTO_INCREMENT 属性を使用して、数値型の主キー列に自動的にインクリメントされた値を設定することができます。

CREATE TABLE orders (
  order_id INT NOT NULL AUTO_INCREMENT,
  order_date DATE,
  PRIMARY KEY (order_id)
);

この例では、order_id 列が AUTO_INCREMENT 属性を持っているため、新しいレコードが挿入されるたびに自動的に一意の値が割り当てられます。

5. 主キーの制約とパフォーマンス

主キーはデータベースのパフォーマンスにも影響を与えます。
主キーに設定された列には、自動的にインデックスが作成されます。
これが重要で、インデックスはデータの検索やソートを高速化するために使用されます。
そのため、主キーが適切に設定されていれば、データベースクエリのパフォーマンスが向上します。

ただし、主キーのサイズが大きくなりすぎたり、複合主キーで多くの列を組み合わせたりすると、インデックスのパフォーマンスに悪影響を及ぼす可能性があるため注意が必要です。

6. 主キーの変更と削除

既存のテーブルの主キーを変更したり、削除したりすることもできます。
まず、主キーを削除するには次のようにします。

ALTER TABLE employees
DROP PRIMARY KEY;

主キーを削除した後、新しい主キーを追加する場合には次のコマンドを使用します。

ALTER TABLE employees
ADD PRIMARY KEY (new_column);

まとめ

MySQLにおける主キーは、データの一意性と整合性を保つために欠かせない要素です。
テーブル設計時には、どの列を主キーに設定するかを慎重に検討し、適切な列を選びましょう。
主キーの適切な使用により、データベースのパフォーマンスや管理が大幅に向上します。
また、主キーにはNULL値が許可されないため、常に値が存在する列を選ぶ必要があります。

MySQLでORDER BYに指定するカラムが複数ある場合の書き方

MySQLでORDER BYに指定するカラムが複数ある場合の書き方

MySQLでORDER BY句を使用して、複数のカラムを基準にソートを行うことができます。
複数のカラムでソートする場合、ORDER BY句の後にソートしたいカラムをコンマで区切って指定します。
それぞれのカラムに対して昇順(ASC)や降順(DESC)を個別に指定することも可能です。
基本的な構文は以下のようになります。

SELECT カラム1, カラム2, ...
FROM テーブル名
ORDER BY カラムA [ASC|DESC], カラムB [ASC|DESC], ...;

この構文では、最初に指定したカラムカラムAでソートを行い、同じ値の行については次に指定したカラムBでソートが行われます。
それ以降も同様に、複数のカラムでソートを続けることができます。

複数のカラムでソートする例

次に、employeesという従業員データを持つテーブルがあり、そのテーブルに以下のようなデータが格納されているとします。

id last_name first_name salary
----- ----------- ------------ --------
1 Smith John 5000
2 Doe Jane 4500
3 Smith Anna 5500
4 Brown Charlie 5000

このテーブルから従業員を「last_name(姓)」でソートし、同じ姓の従業員については「salary(給与)」でソートしたいと考えた場合、次のようにORDER BY句を使います。

SELECT id, last_name, first_name, salary
FROM employees
ORDER BY last_name ASC, salary DESC;

このクエリの結果は次のようになります。

id last_name first_name salary
----- ----------- ------------ --------
4 Brown Charlie 5000
2 Doe Jane 4500
3 Smith Anna 5500
1 Smith John 5000

この場合、まずlast_nameの昇順(ASC)で並び替えられています。
Smithという同じ姓の従業員が2名いるため、その中でsalary(給与)の降順(DESC)でさらに並び替えが行われています。
Anna Smithの給与がJohn Smithよりも高いため、Annaが先に表示されています。

昇順と降順の組み合わせ

ORDER BY句では、各カラムに対して昇順(ASC)や降順(DESC)を個別に指定することができます。
例えば、last_nameでは昇順、salaryでは降順のように、カラムごとに異なる並び順を指定することが可能です。
上記の例ではlast_nameはASCで、salaryはDESCに設定していますが、これを逆にして、last_nameを降順、salaryを昇順に設定することもできます。

SELECT id, last_name, first_name, salary
FROM employees
ORDER BY last_name DESC, salary ASC;

このクエリの結果は次のようになります。

id last_name first_name salary
----- ----------- ------------ --------
3 Smith Anna 5500
1 Smith John 5000
2 Doe Jane 4500
4 Brown Charlie 5000

今度はlast_nameが降順(DESC)で並び替えられ、Smithが最初に来ています。
同じSmith姓の中では、salaryの昇順(ASC)でさらに並び替えられ、給与の低いJohnが後に表示されています。

NULL値の扱い

MySQLでは、ORDER BY句を使ってソートを行う際に、NULL値が含まれている場合、NULL値は通常、昇順では先頭に、降順では末尾に配置されます。
しかし、MySQL 8.0以降では、ORDER BY句にNULLS FIRSTやNULLS LASTを明示的に指定して、NULL値の扱いを変更することができます。

SELECT id, last_name, first_name, salary
FROM employees
ORDER BY salary ASC NULLS LAST;

このクエリでは、salaryがNULLの従業員はリストの最後に配置されます。

パフォーマンスの注意点

ORDER BY句を使用するとき、特に複数のカラムでソートする場合は、インデックスの設定が重要になるケースがあります。
適切なインデックスがない場合、ソートに時間がかかることがあります。
例えば、last_nameとsalaryに対してインデックスを作成することで、ソートのパフォーマンスが向上する可能性があります。

CREATE INDEX idx_lastname_salary ON employees (last_name, salary);

これにより、last_nameとsalaryを基準としたソートが効率的に行えるようになります。

複数カラムのソートは、データベースクエリの結果を整理するために便利な機能です。
適切にORDER BY句を使うことで、ユーザーにとって見やすく、かつ効率的なデータ取得が可能になります。

MySQLのOPTIMIZE TABLEでパフォーマンスを改善

MySQLでOPTIMIZE TABLEについて

MySQLでOPTIMIZE TABLEは、テーブルのパフォーマンスを改善するために使用されるコマンドです。
特に、頻繁な更新や削除が行われるテーブルでは、データの断片化が発生し、クエリの速度が低下する可能性があります。
この断片化を解消し、テーブルを再構築することで効率的なデータアクセスを可能にするのがOPTIMIZE TABLEの役割です。

OPTIMIZE TABLEの使用方法

OPTIMIZE TABLEコマンドは以下のように使用します

OPTIMIZE TABLE table名;

ここで、table名には最適化したいテーブルの名前を指定します。
複数のテーブルを指定することも可能で、その場合はカンマで区切ってテーブル名を列挙します。

OPTIMIZE TABLE table名1, table名2;

このコマンドは主に以下の3つの操作を行います

1. データファイルの再編成
テーブルのデータファイルを再編成し、断片化を解消します。
これは、データの挿入、更新、削除によってできた空白領域を埋め、効率的なストレージ利用を促進します。

2. インデックスの再構築
OPTIMIZE TABLEはインデックスも再構築します。
これにより、検索速度が改善されることが期待できます。
特にインデックスが多いテーブルでは、この再構築によってクエリの実行時間が短縮されることがあります。

3. 統計情報の更新
MySQLはクエリを最適化する際に、テーブルやインデックスに関する統計情報を使用します。
OPTIMIZE TABLEを実行すると、これらの統計情報が更新され、より効率的なクエリプランが生成される可能性があります。

使用する場面

OPTIMIZE TABLEは、主に以下のような状況で使用されます

  • テーブルに対して大量のデータの削除または更新を行った後、パフォーマンスが低下した場合。
  • テーブルが頻繁に更新されているが、検索や集計処理の速度が遅くなっていると感じた場合。
  • MyISAMまたはInnoDBテーブルに断片化が発生している場合。

ただし、MySQL 5.7以降では、InnoDBストレージエンジンに対して自動的にデータの最適化が行われるため、手動でOPTIMIZE TABLEを実行する必要が少なくなっています。
それでも大量のデータが移動した場合など、明示的に最適化を行う場面があります。

テーブルの種類とOPTIMIZE TABLE

OPTIMIZE TABLEは、テーブルのストレージエンジンによって動作が異なります。
代表的なストレージエンジンごとの動作は以下の通りです

  • MyISAM

テーブルのデータファイルを再編成し、インデックスを再構築します。
実行後にストレージサイズが縮小する場合があります。

  • InnoDB

OPTIMIZE TABLEは内部的にALTER TABLE... FORCEと同等の操作を行い、データとインデックスの断片化を解消します。
また、InnoDBでは自動的に行われるバックグラウンドの最適化があるため、頻繁に実行する必要はありません。

  • ARCHIVE

OPTIMIZE TABLEはサポートされていますが、通常の操作で大きな効果を得ることは少ないです。

パフォーマンスへの影響

OPTIMIZE TABLEは、特に大規模なテーブルに対して実行するときに、サーバーのパフォーマンスに影響を与えることがあります。
テーブルがロックされるため、その間他のクエリがブロックされる可能性があるためです。
従って、運用環境では、通常の業務時間外や負荷の少ない時間帯に実行することが推奨されます。
また、OPTIMIZE TABLEの実行にはテーブル全体を再構築するための十分なディスク容量が必要です。
ディスク容量が不足していると、最適化プロセスが失敗する可能性があるため注意が必要です。

結果の確認

OPTIMIZE TABLEを実行すると、以下のような結果が返されます

+-----------------+----------+----------+----------+
| Table           | Op       | Msg_type | Msg_text |
+-----------------+----------+----------+----------+
| dbname.table1   | optimize | status   | OK       |
+-----------------+----------+----------+----------+

Msg_textがOKと表示されれば最適化が正常に完了したことを示します。

MySQLでON DUPLICATE KEY UPDATEというエラーが発生した場合の対応方法

MySQLでON DUPLICATE KEY UPDATEというエラーが発生する場合

MySQLでON DUPLICATE KEY UPDATEを使用する際にエラーが発生する場合、いくつかの原因が考えられます。
この構文は、INSERT操作でデータが既に存在する場合に、指定されたカラムの値を更新するために使用されます。
特にユニークキーやプライマリキーの制約に関連する問題が発生しやすいです。
ここでは、よく見られるエラーの原因とその対処方法について解説します。

1. ユニークキーやプライマリキーの重複

ON DUPLICATE KEY UPDATEは、プライマリキーまたはユニークキーの違反がある場合に発動します。
そのため、挿入しようとするデータが既存のレコードと重複している場合にエラーが発生する可能性があります。
この構文は、キーの重複が検出されると、指定された列の値を更新しますが、例えばユニーク制約のあるカラムに同じデータを挿入しようとするとエラーが発生することがあります。

対処方法

このエラーを回避するには、まずテーブルに定義されているユニークキーやプライマリキーを確認し、重複が発生しないようにデータを処理する必要があります。
また、ユニークなカラムに挿入するデータが、既存のレコードと異なることを確認することも重要です。

INSERT INTO your_table (id, name, value) 
VALUES (1, 'sample', 100) 
ON DUPLICATE KEY UPDATE value = VALUES(value);

この例では、idがプライマリキーであり、id=1のレコードが既に存在している場合、value列の値が100に更新されます。

2. 不適切なインデックスの設定

ON DUPLICATE KEY UPDATE構文を使用する場合、対象となるカラムに適切なインデックスが設定されている必要があります。
インデックスが適切に設定されていない場合、MySQLはどのキーが重複しているのかを特定できず、エラーが発生することがあります。

対処方法

この問題を解決するには、まずインデックスの設定を確認します。
特に、プライマリキーやユニークキーが正しく定義されているか確認し、必要に応じてインデックスを追加または修正します。

ALTER TABLE your_table ADD UNIQUE (id);

この例では、idカラムに対してユニークインデックスを追加することで、重複チェックが正しく行われるようにします。

3. NULL値が原因のエラー

ユニークキー制約のあるカラムにNULLを挿入しようとすると、エラーが発生することがあります。
MySQLでは、複数のNULL値は許容されますが、ユニークキーに対してNULLが存在する場合、ON DUPLICATE KEY UPDATEは期待通りに動作しないことがあります。

対処方法

この問題を解決するには、NULL値を避けるか、デフォルト値を設定することが考えられます。
また、NULLを挿入しないロジックを組み込むことで、このエラーを防ぐことができます。

INSERT INTO your_table (id, name, value) 
VALUES (1, 'sample', NULL) 
ON DUPLICATE KEY UPDATE value = COALESCE(VALUES(value), your_table.value);

この例では、COALESCE関数を使用して、NULLの場合は既存の値を保持するようにしています。

まとめ

以上のように、ON DUPLICATE KEY UPDATEに関連するエラーは、キーの重複やインデックスの問題、データ型の不一致、NULL値の処理など、さまざまな要因によって発生します。
それぞれの原因に応じた対処方法を適切に実施することで、エラーを解消し、スムーズにデータの挿入や更新を行うことが可能です。

MySQLではNVLの代わりにCOALESCEを使用

MySQLのCOALESCE

MySQLでは、Oracleで使用されるNVL関数に相当するものとしてCOALESCE関数が使用されます。
NVLは特定の列や式の値がNULLである場合に、別の値を返すために使われる関数ですが、MySQLにはNVL関数が存在しないため、COALESCEを利用して同様の動作を実現できます。

COALESCE関数は、引数の中で最初にNULLでない値を返すという仕組みです。
複数の引数を指定でき、最初にNULLでない値が見つかるまで引数を評価します。
もしすべての引数がNULLの場合、結果としてNULLを返します。
この機能を利用することで、NVLの代わりとして役立てることができます。

基本的なCOALESCEの構文は以下の通りです。

COALESCE(expression1, expression2, ..., expressionN)

ここで、expression1からexpressionNまでの任意の数の引数を指定することができます。
COALESCEはこれらの引数の中で最初にNULLでないものを返します。

NVLが1つの列や式を評価してNULLの場合に代替値を返すのに対して、COALESCEは複数の引数をサポートしており、その柔軟性が高い点が特徴です。

具体的な例として、顧客テーブルの中でphone_numberがNULLの場合に、default_phoneを返すSQLを考えます。
OracleのNVLを使った場合のSQLは以下のようになります。

SELECT NVL(phone_number, default_phone) AS contact_number
FROM customers;

このSQLをMySQLで同様に書き換えると、COALESCEを使って次のようになります:

SELECT COALESCE(phone_number, default_phone) AS contact_number
FROM customers;

COALESCE関数は2つ以上の引数をサポートしているため、例えばphone_number、mobile_number、そしてdefault_phoneの順にチェックし、最初にNULLでない値を返すことも可能です:

SELECT COALESCE(phone_number, mobile_number, default_phone) AS contact_number
FROM customers;

このように、MySQLのCOALESCE関数は複数の列を柔軟に扱うことができ、代替値を返す場合に便利です。

COALESCEは複数の引数に対応しているため、値が見つかるまで次の式を評価していく点で、OracleのNVLよりも強力です。
例えば、次のような状況を考えます。

  • phone_numberがNULLであれば、mobile_numberを返す。
  • mobile_numberもNULLであれば、default_phoneを返す。

このような複数の列を評価していくロジックを、1行のSQLで簡潔に書くことができます。

また、COALESCE関数を使うことで、SQLの中でNULL処理を効率よく行うことができ、クリーンで読みやすいコードを書くことが可能です。
特にデータベースでNULL値が頻繁に発生するシステムにおいては、COALESCEを効果的に使うことで処理の簡素化やバグの回避が期待できます。

さらに、MySQLのIFNULL関数も同様の目的で使用できますが、こちらはCOALESCEとは異なり、2つの引数しか受け付けません。
IFNULLは、特定の列や式がNULLである場合に代替値を返すための簡易な方法です。
IFNULLの構文は以下の通りです。

IFNULL(expression1, expression2)

expression1がNULLであればexpression2を返し、そうでなければexpression1を返します。
NVLの代替としてシンプルなケースで使いたい場合にはIFNULLが便利ですが、複数の引数を評価する必要がある場合には、COALESCEの方が適しています。

例えば、phone_numberがNULLの場合にdefault_phoneを返すケースは、次のようにIFNULLを使って書けます:

SELECT IFNULL(phone_number, default_phone) AS contact_number
FROM customers;

まとめると、MySQLでNVLに相当する機能を実現するためには、基本的にはCOALESCEを使用するのが推奨されます。
COALESCEは複数の引数をサポートし、NULL値に対する柔軟な処理が可能であり、NVLよりも汎用性が高いです。
また、シンプルなNULLチェックにはIFNULLも有効です。