序章

特定の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以外のシステムでテストすると、正確な構文や出力が異なる場合があります。

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

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

  1. ssh sammy@your_server_ip

次に、MySQLサーバープロンプトを開き、置き換えます sammy with the name of your MySQL user account:

  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:友達の名前をそれぞれ使用して表現 varchar 最大15文字のデータ型
  • goal:過去1か月間に何マイル走ることを望んでいたかについての各友人の目標。 int データ・タイプ
  • result:各友人がその月の間に最終的に走ったマイル数。 int

次を実行します CREATE TABLE 名前の付いたテーブルを作成するステートメント running_goals 次の3つの列があります。

  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

これらの行のうちの3つに注意してください。 result 値は NULL. この例では、これらの友人が過去1か月に走行したマイル数を報告していないため、 result 値は次のように入力されました NULL.

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

理解 WHERE 節述語

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

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

を含むSQLクエリを実行する場合 WHERE 句を指定すると、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でのBETWEEN演算子と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 テーブルの namegoal 列。 どのように注意してください 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)

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

The <> 演算子は、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)

The < 演算子は、最初の値の式が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)

The > 演算子は、最初の値の式が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)

The <= オペレーターは、最初の値が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)

The >= 演算子は、最初の値が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)

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

  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番目の文字列の後にアルファベット順に来るかどうかをテストしています。

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

  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」と評価され、結果セットに含まれます。

説明のために、次のクエリを実行して、 nameresult 列:

  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つの行に対して「真」と評価されるため、結果セットに含まれるのはこれらの行だけです。

結論

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

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