序章

特定のStructuredQuery Language(SQL)ステートメントでは、 WHERE句を使用して、特定の操作が影響する行を制限できます。 これは、検索条件と呼ばれる、影響を受けるために各行が満たさなければならない特定の基準を定義することによって行われます。 検索条件は、1つ以上の述語で構成されます。これは、「true」、「false」、または「unknown」のいずれかに評価される特殊な式であり、操作は、 WHERE句は「true」と評価されます。

SQLを使用すると、ユーザーはさまざまなタイプの述語を含む検索条件を記述できます。各述語は、特定の演算子を使用して行を評価します。 このガイドでは、2種類の述語とそれらが使用する演算子の概要を説明します。比較演算子IS NULL演算子です。

このガイドでは、例で SELECTステートメントのみを使用しますが、ここで説明する概念は、多くのSQL操作で使用できます。 特に、WHERE句とその検索条件は、UPDATEおよびDELETE操作の重要なコンポーネントです。

前提条件

このガイドに従うには、SQLを使用するある種のリレーショナルデータベース管理システム(RDBMS)を実行しているコンピューターが必要です。 このガイドの手順と例は、次の環境を使用して検証されています。

  • Ubuntu 20.04 初期サーバーセットアップガイドで説明されているように、管理者権限を持つ非rootユーザーとUFWで構成されたファイアウォールを備えたUbuntu20.04を実行しているサーバー。
  • Ubuntu 20.04にMySQLをインストールする方法で概説されているように、MySQLがサーバーにインストールされて保護されています。 このガイドは、ステップ3 で説明されているように、新しく作成されたユーザーによって検証されました。
  • また、比較演算子とIS NULL演算子を使用して練習するために使用できる、サンプルデータがロードされたいくつかのテーブルを含むデータベースも必要です。 MySQLサーバーに接続し、このガイド全体の例で使用されるテストデータベースを作成する方法の詳細については、次のMySQLへの接続とサンプルデータベースのセットアップセクションを実行することをお勧めします。

:多くのRDBMSは、独自のSQL実装を使用していることに注意してください。 このチュートリアルで概説されているコマンドは、PostgreSQLやSQLiteを含むほとんどのRDBMSで機能しますが、MySQL以外のシステムでテストすると、正確な構文や出力が異なる場合があります。

このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルのサンプルクエリを試すこともできます。 次のLaunch an Interactive Terminal!ボタンをクリックして開始します。

MySQLへの接続とサンプルデータベースの設定

SQLデータベースシステムがリモートサーバーで実行されている場合は、ローカルマシンからサーバーにSSHで接続します。

  1. ssh sammy@your_server_ip

次に、MySQLサーバープロンプトを開き、sammyをMySQLユーザーアカウントの名前に置き換えます。 このページに埋め込まれたインタラクティブ端末を使用している場合、プロンプトが表示されたときに使用するパスワードはsecretという単語であることに注意してください。

  1. mysql -u sammy -p

プロンプトから、comparison_null_dbという名前のデータベースを作成します。

  1. CREATE DATABASE comparison_null_db;

データベースが正常に作成されると、次のような出力が表示されます。

Output
Query OK, 1 row affected (0.01 sec)

comparison_null_dbデータベースを選択するには、次のUSEステートメントを実行します。

  1. USE comparison_null_db;
Output
Database changed

comparison_null_dbを選択した後、その中にテーブルを作成します。

このガイドで使用されている例に従うために、あなたとあなたの友人のグループがすべて、より身体的に活発になり、運動として走ることを始めることを決定したと想像してください。 この目的のために、あなたの友人は皆、来月に何マイル走りたいかという個人的な目標を設定しました。 次の3つの列を持つSQLテーブルで、友達のマイレージ目標と実際に走ったマイル数を追跡することにしました。

  • name:最大15文字のvarcharデータ型を使用して表現された各友達の名前
  • goalintデータ型を使用して整数で表された、過去1か月間に何マイル走ることを望んでいたかについての各友人の目標
  • result:各友人がその月の間に最終的に走ったマイル数。これもintとして表されます。

次のCREATE TABLEステートメントを実行して、次の3つの列を持つrunning_goalsという名前のテーブルを作成します。

  1. CREATE TABLE running_goals (
  2. name varchar(15),
  3. goal int,
  4. result int
  5. );
Output
Query OK, 0 rows affected (0.012 sec)

次に、running_goalsテーブルにサンプルデータをロードします。 次のINSERT INTO操作を実行して、7人の友達、その実行目標、およびその結果を表す7行のデータを追加します。

  1. INSERT INTO running_goals
  2. VALUES
  3. ('Michelle', 55, 48),
  4. ('Jerry', 25, NULL),
  5. ('Milton', 45, 52),
  6. ('Bridget', 40, NULL),
  7. ('Wanda', 30, 38),
  8. ('Stewart', 35, NULL),
  9. ('Leslie', 40, 44);
Output
Query OK, 7 rows affected (0.004 sec) Records: 7 Duplicates: 0 Warnings: 0

これらの行のresult値の3つはNULLであることに注意してください。 この例では、これらの友達が過去1か月の走行マイル数を報告していないため、resultの値がNULLとして入力されたと仮定します。

これで、ガイドの残りの部分に従い、SQLで比較演算子とIS NULL演算子を使用する方法を学習する準備が整いました。

WHERE句の述語を理解する

既存のテーブルからデータを読み取るSQL操作では、FROM句の後にWHERE句を続けて、操作が影響するデータを制限できます。 WHERE句は、検索条件を定義することによってこれを行います。 検索条件を満たさない行は操作から除外されますが、満たす行は含まれます。

検索条件は、1つ以上の述語、または1つ以上の値式を評価し、「true」、「false」、または「unknown」の結果を返すことができる式で構成されます。 SQLでは、値式スカラー式とも呼ばれる)は、単一の値を返す任意の式です。 値の式は、文字列や数値などのリテラル値、数式、または列名にすることができます。 ほとんどの場合、WHERE句の述語の少なくとも1つの値式が、操作のFROM句で参照されるテーブルの列の名前であることに注意してください。

WHERE句を含むSQLクエリを実行すると、DBMSはFROM句で定義された論理テーブルのすべての行に検索条件を適用します。 次に、検索条件のすべての述部が「true」と評価された行のみを返します。

SQL標準では18種類の述語が定義されていますが、すべてのRDBMSがSQLの実装にそれぞれを含むわけではありません。 以下に、最も一般的に使用される5つの述語タイプと、それぞれの述語タイプとそれらが使用する演算子の簡単な説明を示します。

Compareson :比較述語は、ある値の式を別の式と比較します。 クエリでは、ほとんどの場合、これらの値の式の少なくとも1つが列の名前である場合があります。 6つの比較演算子は次のとおりです。

  • =:2つの値が等しいかどうかをテストします
  • <>:2つの値が同等でないかどうかをテストします
  • <:最初の値が2番目の値よりも小さいかどうかをテストします
  • >:最初の値が2番目の値より大きいかどうかをテストします
  • <=:最初の値が2番目の値以下かどうかをテストします
  • >=:最初の値が2番目の値以上かどうかをテストします

Null IS NULL演算子を使用する述語は、特定の列の値がNullであるかどうかをテストします Range :範囲述語は、BETWEEN演算子を使用して1つの値式が他の2つの間にあるMembership:このタイプの述語は、IN演算子を使用して、値が特定のセットのメンバーであるかどうかをテストしますパターンマッチ:パターン一致する述語は、LIKE演算子を使用して、値が文字列パターンと一致するかどうかをテストします

はじめに述べたように、このガイドでは、SQLの比較演算子とIS NULL演算子を使用してデータをフィルター処理する方法に焦点を当てています。 BETWEENまたはIN演算子をそれぞれ範囲述語とメンバーシップ述語で使用する方法を学びたい場合は、使用方法に関するこのガイドを確認することをお勧めします。およびSQLのIN演算子。 または、LIKE演算子を使用して、ワイルドカード文字を含む文字列パターンに基づいてデータをフィルタリングする方法を知りたい場合は、SQLでワイルドカードを使用する方法に関するガイドに従ってください。 最後に、WHERE句の概要について詳しく知りたい場合は、SQLでWHERE句を使用する方法に関するチュートリアルに興味があるかもしれません。

比較述語

WHERE句の比較述語は、6つの比較演算子の1つを使用して、ある値の式を別の式と比較します。 これらは通常、次のような構文に従います。

  1. SELECT column_list
  2. FROM table_name
  3. WHERE column_name OPERATOR value_expression;

WHEREキーワードの後には値式があり、ほとんどのSQL操作では列の名前です。 検索条件の値式として列名を指定すると、RDBMSは、その列の各行の値を、その行の検索条件の反復の値式として使用するように指示されます。 データベースシステムは各行に順番に検索条件を適用するため、比較演算子は、指定された列の値に対して検索条件が真であるかどうかに基づいて、行を含めるか、フィルターで除外します。

説明のために、running_goalsテーブルのname列とgoal列から値を返す次のクエリを実行します。 WHERE句が比較述語を使用して、クエリがgoal値が40と等しい行のみを返すようにする方法に注意してください。

  1. SELECT name, goal
  2. FROM running_goals
  3. WHERE goal = 40;

友達の目標のうち、過去1か月で正確に40マイルを走ることは、2つだけだったので、クエリは次の2つの行だけを返します。

Output
+---------+------+ | name | goal | +---------+------+ | Bridget | 40 | | Leslie | 40 | +---------+------+ 2 rows in set (0.00 sec)

他の比較演算子がどのように機能するかを説明するために、それぞれが異なる比較演算子を使用することを除いて、前の例と同じ次のクエリを実行します。

<>演算子は、2つの値が同等ではないかどうかをテストするため、このクエリは、goal値が40と等しくないすべての行を返します。

  1. SELECT name, goal
  2. FROM running_goals
  3. WHERE goal <> 40;
Output
+----------+------+ | name | goal | +----------+------+ | Michelle | 55 | | Jerry | 25 | | Milton | 45 | | Wanda | 30 | | Stewart | 35 | +----------+------+ 5 rows in set (0.00 sec)

<演算子は、最初の値の式が2番目の値の式よりも小さいかどうかをテストします。

  1. SELECT name, goal
  2. FROM running_goals
  3. WHERE goal < 40;
Output
+---------+------+ | name | goal | +---------+------+ | Jerry | 25 | | Wanda | 30 | | Stewart | 35 | +---------+------+ 3 rows in set (0.00 sec)

>演算子は、最初の値の式が2番目の値の式より大きいかどうかをテストします。

  1. SELECT name, goal
  2. FROM running_goals
  3. WHERE goal > 40;
Output
+----------+------+ | name | goal | +----------+------+ | Michelle | 55 | | Milton | 45 | +----------+------+ 2 rows in set (0.00 sec)

<=オペレーターは、最初の値が2番目の値以下であるかどうかをテストします。

  1. SELECT name, goal
  2. FROM running_goals
  3. WHERE goal <= 40;
Output
+---------+------+ | name | goal | +---------+------+ | Jerry | 25 | | Bridget | 40 | | Wanda | 30 | | Stewart | 35 | | Leslie | 40 | +---------+------+ 5 rows in set (0.00 sec)

>=演算子は、最初の値が2番目の値以上であるかどうかをテストします。

  1. SELECT name, goal
  2. FROM running_goals
  3. WHERE goal >= 40;
Output
+----------+------+ | name | goal | +----------+------+ | Michelle | 55 | | Milton | 45 | | Bridget | 40 | | Leslie | 40 | +----------+------+ 4 rows in set (0.00 sec)

等価(=)および非等価(<>)演算子は、予想どおりに文字列値を処理します。 次のクエリは、'Leslie'と等しいすべての行のname値を返します。

  1. SELECT name
  2. FROM running_goals
  3. WHERE name = 'Leslie';

テーブルには「Leslie」という名前の友達が1人しかいないため、クエリはその行を返すだけです。

Output
+--------+ | name | +--------+ | Leslie | +--------+ 1 row in set (0.00 sec)

文字列値を比較する場合、<><=、および>=演算子はすべて、文字列がアルファベット順にどのように関連しているかを評価します。 言い換えると、ある文字列が別の文字列より「小さい」かどうかをテストする述語を作成する場合、最初の文字列がアルファベット順に2番目の文字列の前に来るかどうかをテストします。 同様に、述語が1つの文字列が別の文字列より「大きい」かどうかをテストする場合、最初の文字列が2番目の文字列の後にアルファベット順に来るかどうかをテストしています。

説明のために、次のクエリを実行します。 これにより、nameの値が文字'M'より「小さい」すべての行のnameおよびgoalの値が返されます。 つまり、検索条件は、nameの値がアルファベット順にMの前にあるすべての行に対して「true」と評価されます。

  1. SELECT name
  2. FROM running_goals
  3. WHERE name < 'M';
Output
+---------+ | name | +---------+ | Jerry | | Bridget | | Leslie | +---------+ 3 rows in set (0.00 sec)

この結果セットにはMichelleまたはMiltonが含まれていないことに注意してください。 これは、アルファベット順に、1文字の「M」が文字「M」で始まり複数の文字を持つ文字列の前にあるため、これら2人の友人はこの結果セットから除外されるためです。

ヌル述語

SQLでは、NULLは、欠落している値または不明な値を表すために使用される予約済みのキーワードです。 Null は、実際の値ではなく状態です。 はゼロまたは空の文字列を表しません

IS NULL演算子を使用して、指定された値の式がNullであるかどうかをテストできます。

  1. . . .
  2. WHERE column_name IS NULL
  3. . . .

このタイプの述語を使用すると、データベースシステムは、指定された列のすべての行の値を調べて、各行がNullであるかどうかを評価します。 列の値が実際にNullの場合、検索条件はそれらの行に対して「true」と評価され、結果セットに含まれます。

説明のために、name列とresult列を返す次のクエリを実行します。

  1. SELECT name, result
  2. FROM running_goals
  3. WHERE result IS NULL;

このクエリのWHERE句の検索条件は、各行のresult値がNullであるかどうかをテストします。 その場合、述語は「true」と評価され、行は結果セットに含まれます。

Output
+---------+--------+ | name | result | +---------+--------+ | Jerry | NULL | | Bridget | NULL | | Stewart | NULL | +---------+--------+ 3 rows in set (0.00 sec)

友達の3人は、過去1か月間に最終的に走行したマイル数をまだ報告していないため、テーブルにデータを読み込んだときに、これらの値はNULLとして記録されました。 したがって、クエリの検索条件は、これら3つの行に対して「真」と評価されるため、結果セットに含まれるのはこれらの行だけです。

結論

このガイドに従うことで、WHERE句でSQLの比較演算子とIS NULL演算子を使用して、操作が影響する行を制限する方法を学びました。 ここに示すコマンドはほとんどのリレーショナルデータベースで機能するはずですが、すべてのSQLデータベースが独自のSQL標準の実装を使用していることに注意してください。 各コマンドとそのオプションの完全なセットの詳細については、DBMSの公式ドキュメントを参照してください。

SQLの操作について詳しく知りたい場合は、SQLの使用方法に関するこのシリーズの他のチュートリアルを確認することをお勧めします。