English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、部分一致に基づいてデータを検索する方法を学びます。
今まで、特定の文字列を識別する条件、例えばWHERE name='Lois Lane'のようなものを見てきましたが、SQLではLIKE演算子を使用して、部分またはパターンマッチングを実行することもできます。
LIKE演算子は、1つまたは複数の文字にワイルドカードを指定して、パターンマッチングの基準を提供することができます。以下の2つのワイルドカードを使用できます:
パーセント記号(%) - 任意数の文字、またはゼロ文字を一致させる。
下線(_) - 完全に一致する文字
LIKE演算子とワイルドカードを一緒に使用する方法を示すいくつかの例です。
宣言 | 意味 | 返り値 |
---|---|---|
WHERE name LIKE 'Da%' | で始まる名前を検索します | David, Davidson |
WHERE name LIKE '%th' | で始まる名前を検索しますthで終わる名前を検索します | Elizabeth, Smith |
WHERE name LIKE '%on%' | onを含む名前を検索します | Davidson, Toni |
WHERE name LIKE 'Sa_' | Saで始まり、1文字以内を含む名前を検索します | Sa |
WHERE name LIKE '_oy' | oyで終わり、1文字以内を含む名前を検索します | Joy, Roy |
WHERE name LIKE '_an_' | を含む名前を検索しますanの名前は、1文字で始まり、終わります | Dana, Hans |
WHERE name LIKE '%ar_' | を含む名前を検索しますarの名前は、任意の文字数で始まり、1文字以内で終わります | Richard, Karl |
WHERE name LIKE '_ar%' | を含む名前を検索しますarの名前は、1文字以内で始まり、任意の文字数で終わります | Karl, Mariya |
いくつかの記録を検索することで、先ほど議論した文を実際のアプリケーションに投入してみましょう。
私たちのemployeesデータベースには以下の記録を含むテーブルがあります:
+--------+------------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+------------------+------------+--------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 5000 | 4 | | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 5 | Martin Blank | 2008-06-24 | 5600 | NULL | | 6 | simons bistro | 2009-04-01 | 6000 | 1 | +--------+------------------+------------+--------+---------+
今度は、S文字で始まるすべての従業員を探したいと仮定します。
SELECT * FROM employees WHERE emp_name LIKE 'S%';
クエリを実行した後、以下のような出力を取得します:
+--------+------------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+------------------+------------+--------+---------+ | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 6 | simons bistro | 2009-04-01 | 6000 | 1 | +--------+------------------+------------+--------+---------+
MySQLでは、非二進位文字列(CHAR、VARCHAR、TEXT)の比較はデフォルトで大文字と小文字を区別しませんが、二進位文字列(BINARY、VARBINARY、BLOB)の比較は大文字と小文字を区別します。
これは、検索WHERE name LIKE 'S%'を使用すると、Sまたはsで始まるすべての列値を取得することを意味します(ご覧の通り、「Sarah」と「simons」の両方を持っています)。しかし、この検索を大文字と小文字で区別するには、BINARY演算子を使用して以下のように使用することができます:
-- MySQLデータベースの構文 SELECT * FROM employees WHERE BINARY emp_name LIKE 'S%';
今、このクエリは名前が大文字のSで始まる従業員のみを返します:
+--------+------------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+------------------+------------+--------+---------+ | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | +--------+------------------+------------+--------+---------+
注意:列を常に大文字小文字を区別して扱いたい場合は、区別大小文字またはバイナリソートルールを使用して宣言し、性能問題を避けるためにしてください。
ヒント:検索する文字列の正確な形式がわからない場合、部分一致が非常に有用です。部分一致を使用して、列に似た文字列を含む複数の行を検索することもできます。