SQLでワイルドカードを使用する方法
序章
多くのコンピュータ言語と同様に、SQLではさまざまなワイルドカード文字を使用できます。 ワイルドカードは、1つ以上の他の文字または値を表すことができる特別なプレースホルダー文字です。 これはSQLの便利な機能であり、データベース内に保持されている正確な値を知らなくても、データベースでデータを検索できます。
このガイドでは、SQLで指定されたワイルドカードを使用してデータをクエリする方法について説明します。
前提条件
このガイドに従うには、SQLを使用するある種のリレーショナルデータベース管理システム(RDBMS)を実行しているコンピューターが必要です。 このガイドの手順と例は、次の環境を使用して検証されています。
- Ubuntu 20.04 の初期サーバーセットアップガイドで説明されているように、管理者権限を持つ非rootユーザーとUFWで構成されたファイアウォールを備えたUbuntu20.04を実行しているサーバー。
- Ubuntu 20.04にMySQLをインストールする方法で概説されているように、MySQLがサーバーにインストールされて保護されています。 このガイドは、ステップ3で説明されているプロセスを使用して作成された非ルートMySQLユーザーで検証されました。
注:多くのRDBMSは、独自のSQL実装を使用していることに注意してください。 このチュートリアルで概説されているコマンドはほとんどのRDBMSで機能しますが、MySQL以外のシステムでテストした場合、正確な構文または出力が異なる場合があります。
また、ワイルドカードを使用して練習できるサンプルデータがロードされたデータベースとテーブルも必要です。 これがない場合は、次の MySQLへの接続とサンプルデータベースのセットアップセクションを読んで、このガイドで例全体で使用するデータベースとテーブルを作成する方法の詳細を確認してください。
このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルのサンプルクエリを試すこともできます。 次のLaunch an Interactive Terminal!
ボタンをクリックして開始します。
MySQLへの接続とサンプルデータベースの設定
SQLデータベースシステムがリモートサーバーで実行されている場合は、ローカルマシンからサーバーにSSHで接続します。
- ssh sammy@your_server_ip
次に、MySQLサーバープロンプトを開き、sammy
をMySQLユーザーアカウントの名前に置き換えます。 このページに埋め込まれたインタラクティブ端末を使用している場合、プロンプトが表示されたときに使用するパスワードはsecret
という単語であることに注意してください。
- mysql -u sammy -p
wildcardsDB
という名前のデータベースを作成します。
- CREATE DATABASE wildcardsDB;
データベースが正常に作成されると、次のような出力が表示されます。
OutputQuery OK, 1 row affected (0.01 sec)
wildcardsDB
データベースを選択するには、次のUSE
ステートメントを実行します。
- USE wildcardsDB;
OutputDatabase changed
データベースを選択したら、次のコマンドを使用してデータベース内にテーブルを作成できます。 例として、アプリケーションのユーザーのプロファイル情報を保持するuser_profiles
という名前のテーブルを作成するとします。 このテーブルには、次の5つの列が含まれます。
user_id
:この列は、int
データ型の値を保持します。 これはテーブルの主キーとしても機能し、各値はそれぞれの行の一意の識別子として機能しますname
:最大30文字のvarchar
データ型を使用して表された各ユーザーの名前email
:この列には、ユーザーのメールアドレスが保持されます。これもvarchar
データ型を使用して表現されますが、最大40文字です。birthdate
:date
データ型を使用して、この列には各ユーザーの生年月日が表示されますquote
:各ユーザーのお気に入りの引用。 引用符に適切な文字数を提供するために、この列もvarchar
データ型を使用しますが、最大300文字です。
次のコマンドを実行して、このサンプルテーブルを作成します。
- CREATE TABLE user_profiles (
- user_id int,
- name varchar(30),
- email varchar(40),
- birthdate date,
- quote varchar(300),
- PRIMARY KEY (user_id)
- );
OutputDatabase changed
次に、いくつかのサンプルデータを空のテーブルに挿入します。
- INSERT INTO user_profiles
- VALUES
- (1, 'Kim', '[email protected]', '1945-07-20', '"Never let the fear of striking out keep you from playing the game." -Babe Ruth'),
- (2, 'Ann', '[email protected]', '1947-04-27', '"The future belongs to those who believe in the beauty of their dreams." -Eleanor Roosevelt'),
- (3, 'Phoebe', '[email protected]', '1950-07-17', '"100% of the people who give 110% do not understand math." -Demitri Martin'),
- (4, 'Jim', '[email protected]', '1940-08-13', '"Whoever is happy will make others happy too." -Anne Frank'),
- (5, 'Timi', '[email protected]', '1940-08-04', '"It is better to fail in originality than to succeed in imitation." -Herman Melville'),
- (6, 'Taeko', '[email protected]', '1953-11-28', '"You miss 100% of the shots you don\'t take.
- " -Wayne Gretzky'),
(7, 'Irma', '[email protected]', '1941-02-18', '"
You have brains in your head. You have feet in your shoes. You can steer yourself any direction you choose.- " -Dr. Seuss'),
(8, 'Iris', '[email protected]', '1961-01-05', '"
You will face many defeats in life, but never let yourself be defeated." -Maya Angelou');
OutputQuery OK, 8 rows affected (0.00 sec)
Records: 8 Duplicates: 0 Warnings: 0
これで、ガイドの残りの部分に従い、ワイルドカードを使用してSQLでデータをクエリする方法について学習する準備が整いました。
ワイルドカードを使用したデータのクエリ
はじめにで述べたように、ワイルドカードは、1つ以上の他の文字または値を表すことができる特別なプレースホルダー文字です。
SQLでは、定義されているワイルドカード文字は2つだけです。
_
:ワイルドカードとして使用する場合、アンダースコアは1文字を表します。 たとえば、s_mmy
は、sammy
、sbmmy
、またはsxmmy
と一致します。%
:パーセント記号のワイルドカードは0文字以上を表します。 たとえば、s%mmy
は、sammy
、saaaaaammy
、またはsmmy
と一致します。
これらのワイルドカードは、LIKE
またはNOT LIKE
演算子を使用したクエリのWHERE
句でのみ使用されます。
前提条件セクションのサンプルデータの使用を説明するために、user_profiles
テーブルにリストされているユーザーの少なくとも1人が、3文字の長さで、「im」で終わる名前を持っていることを知っているとしましょう。彼らが誰であるかを確認してください。 これらのユーザーの名前の最初の文字がわからないため、_
ワイルドカードを使用して次のクエリを実行し、ユーザーが誰であるかを見つけることができます。
- SELECT * FROM user_profiles WHERE name LIKE '_im';
Output+---------+------+---------------------+------------+---------------------------------------------------------------------------------+
| user_id | name | email | birthdate | quote |
+---------+------+---------------------+------------+---------------------------------------------------------------------------------+
| 1 | Kim | [email protected] | 1945-07-20 | "Never let the fear of striking out keep you from playing the game." -Babe Ruth |
| 4 | Jim | [email protected] | 1940-08-13 | "Whoever is happy will make others happy too." -Anne Frank |
+---------+------+---------------------+------------+---------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
注:この例では、SELECT
の後にアスタリスク(*
)が続きます。 これはSQLの省略形であり、「すべての列」を表します。
特定のアプリケーションやプログラミング言語、およびSQLの一部の実装では、この例で使用されているパーセント記号のように、アスタリスクが0個以上の文字を表すワイルドカード文字として使用されます。 ただし、上記の例のアスタリスクは、1つ以上の不明な文字ではなく、特定の何か(つまり、user_profiles
テーブルのすべての列)を表すため、ワイルドカードではありません。
NOT LIKE
演算子には、LIKE
とは逆の効果があります。 ワイルドカードパターンに一致するすべてのレコードを返すのではなく、パターンに一致しないすべての行を返します。 説明のために、前のクエリを再度実行しますが、LIKE
をNOT LIKE
に置き換えます。
- SELECT * FROM user_profiles WHERE name NOT LIKE '_im';
今回は、name
列の値が_im
と一致するすべての行が結果セットから省略されます。
Output+---------+--------+----------------------------+------------+--------------------------------------------------------------------------------------------------------------------------+
| user_id | name | email | birthdate | quote |
+---------+--------+----------------------------+------------+--------------------------------------------------------------------------------------------------------------------------+
| 2 | Ann | [email protected] | 1947-04-27 | "The future belongs to those who believe in the beauty of their dreams." -Eleanor Roosevelt |
| 3 | Phoebe | [email protected] | 1950-07-17 | "100% of the people who give 110% do not understand math." -Demitri Martin |
| 5 | Timi | big_voice@example.com | 1940-08-04 | "It is better to fail in originality than to succeed in imitation." -Herman Melville |
| 6 | Taeko | [email protected] | 1953-11-28 | "You miss 100% of the shots you don't take." -Wayne Gretzky |
| 7 | Irma | [email protected] | 1941-02-18 | "You have brains in your head. You have feet in your shoes. You can steer yourself any direction you choose." -Dr. Seuss |
| 8 | Iris | [email protected] | 1961-01-05 | "You will face many defeats in life, but never let yourself be defeated." -Maya Angelou |
+---------+--------+----------------------------+------------+--------------------------------------------------------------------------------------------------------------------------+
6 rows in set (0.00 sec)
別の例として、データベースにリストされているユーザーの何人かが「I」で始まる名前を持っているが、すべてを覚えているわけではないことを知っているとします。 次のクエリに示すように、%
ワイルドカードを使用して、それらすべてを一覧表示できます。
- SELECT user_id, name, email FROM user_profiles WHERE name LIKE 'I%';
Output+---------+------+----------------------------+
| user_id | name | email |
+---------+------+----------------------------+
| 7 | Irma | [email protected] |
| 8 | Iris | [email protected] |
+---------+------+----------------------------+
2 rows in set (0.00 sec)
MySQLでは、デフォルトでは、LIKE
およびNOT LIKE
演算子は大文字と小文字を区別しないことに注意してください。 これは、ワイルドカードパターンで「I」を大文字にしない場合でも、前のクエリが同じ結果を返すことを意味します。
- SELECT user_id, name, email FROM user_profiles WHERE name LIKE 'i%';
Output+---------+------+----------------------------+
| user_id | name | email |
+---------+------+----------------------------+
| 7 | Irma | [email protected] |
| 8 | Iris | [email protected] |
+---------+------+----------------------------+
2 rows in set (0.00 sec)
ワイルドカードは正規表現とは異なることに注意してください。 一般に、ワイルドカードはグロブスタイルのパターンマッチングで使用される文字を指しますが、正規表現は正規言語に依存して文字列パターンをマッチングします。
ワイルドカード文字のエスケープ
SQLのワイルドカード文字の1つを含むデータエントリを検索したい場合があります。 このような場合、エスケープ文字を使用して、%
または_
のワイルドカード関数を無視し、代わりにプレーンテキストとして解釈するようにSQLに指示できます。
たとえば、データベースにリストされているユーザーの少なくとも2人が、パーセント記号を含むお気に入りの引用符を持っているが、彼らが誰であるかわからないとします。
次のクエリを実行してみてください。
- SELECT user_id, name, quote FROM user_profiles WHERE quote LIKE '%';
ただし、このクエリはあまり役に立ちません。 パーセント記号は、任意の長さの任意の文字列の代用として機能するため、テーブル内のすべての行を返します。
Output+---------+--------+--------------------------------------------------------------------------------------------------------------------------+
| user_id | name | quote |
+---------+--------+--------------------------------------------------------------------------------------------------------------------------+
| 1 | Kim | "Never let the fear of striking out keep you from playing the game." -Babe Ruth |
| 2 | Ann | "The future belongs to those who believe in the beauty of their dreams." -Eleanor Roosevelt |
| 3 | Phoebe | "100% of the people who give 110% do not understand math." -Demitri Martin |
| 4 | Jim | "Whoever is happy will make others happy too." -Anne Frank |
| 5 | Timi | "It is better to fail in originality than to succeed in imitation." -Herman Melville |
| 6 | Taeko | "You miss 100% of the shots you don't take." -Wayne Gretzky |
| 7 | Irma | "You have brains in your head. You have feet in your shoes. You can steer yourself any direction you choose." -Dr. Seuss |
| 8 | Iris | "You will face many defeats in life, but never let yourself be defeated." -Maya Angelou |
+---------+--------+--------------------------------------------------------------------------------------------------------------------------+
8 rows in set (0.00 sec)
パーセント記号をエスケープするには、MySQLのデフォルトのエスケープ文字であるバックスラッシュ(\
)を前に付けることができます。
- SELECT * FROM user_profiles WHERE quote LIKE '\%';
ただし、このクエリは、quote
列の内容がのみでパーセント記号で構成されている必要があることを指定しているため、役に立ちません。 したがって、結果セットは空になります。
OutputEmpty set (0.00 sec)
これを修正するには、LIKE
演算子に続く検索パターンの最初と最後に、パーセント記号のワイルドカードを含める必要があります。
- SELECT user_id, name, quote FROM user_profiles WHERE quote LIKE '%\%%';
Output+---------+--------+----------------------------------------------------------------------------+
| user_id | name | quote |
+---------+--------+----------------------------------------------------------------------------+
| 3 | Phoebe | "100% of the people who give 110% do not understand math." -Demitri Martin |
| 6 | Taeko | "You miss 100% of the shots you don't take." -Wayne Gretzky |
+---------+--------+----------------------------------------------------------------------------+
2 rows in set (0.00 sec)
このクエリでは、バックスラッシュは2番目のパーセント記号のみをエスケープしますが、1番目と3番目の記号は引き続きワイルドカードとして機能します。 したがって、このクエリは、quote
列に少なくとも1つのパーセント記号が含まれているすべての行を返します。
次の例のように、ESCAPE
句を使用してカスタムエスケープ文字を定義することもできることに注意してください。
- SELECT user_id, name, email FROM user_profiles WHERE email LIKE '%@_%' ESCAPE '@';
Output+---------+--------+----------------------------+
| user_id | name | email |
+---------+--------+----------------------------+
| 1 | Kim | [email protected] |
| 3 | Phoebe | [email protected] |
| 4 | Jim | [email protected] |
| 5 | Timi | [email protected] |
| 7 | Irma | [email protected] |
+---------+--------+----------------------------+
5 rows in set (0.00 sec)
このクエリは、@
記号をエスケープ文字として定義し、email
列に少なくとも1つのアンダースコアが含まれているすべての行を返します。 ESCAPE
句を削除すると、各行に少なくとも1つの@
記号が含まれているため、クエリはテーブルからすべての行を返します。
結論
このガイドを読むことで、ワイルドカードSQLベースのデータベースを使用およびエスケープする方法を学びました。 ここで概説するコマンドは、SQLを使用するすべてのデータベース管理システムで機能するはずです。 すべてのSQLデータベースは独自の言語実装を使用しているため、各コマンドとそのオプションの完全なセットの詳細については、DBMSの公式ドキュメントを参照してください。
SQLの操作について詳しく知りたい場合は、SQLの使用方法に関するこのシリーズの他のチュートリアルを確認することをお勧めします。