こんにちはヤク学長です。
データサイエンティスト兼ファーマシストで、アルゴリズムやBI開発を行っています。
本記事の目的は、「SQLの基本操作を知る」ことを目的としています。
【本記事のもくじ】
まず、「SQL」に真剣に取り組むための概要を解説します。
下記の方法で、簡単に概要を抑えることができます。
- 11.EXISTSでの絞り込み
それでは、上から順番に見ていきます。
なお、本上記の方法を順番に抑えれば成果が出ます。
記事の内容は「転載 & 引用OK」問題ありません。
11. EXISTSでの絞り込み
EXISTSの基本的な使い方
EXISTSは、MySQLのSELECT文で使用されるクエリの一つで、指定された条件を満たす行が存在するかどうかを判定するために使用されます。EXISTSは、サブクエリの中で使用されることが多く、サブクエリによって返されたデータに対して、親クエリで条件を指定することができます。
例えば、以下のようなクエリがあります。
SELECT * FROM sales WHERE EXISTS (SELECT * FROM customers WHERE sales.customer_id = customers.customer_id);
このクエリは、salesテーブルとcustomersテーブルを結合し、salesテーブルのcustomer_id列とcustomersテーブルのcustomer_id列が一致する行を取得します。ただし、EXISTS句を使用して、customersテーブルにsalesテーブルのcustomer_id列と一致するcustomer_idが存在するかどうかを判定しています。すなわち、salesテーブルとcustomersテーブルが存在し、かつ、salesテーブルのcustomer_id列とcustomersテーブルのcustomer_id列が一致する行が存在する場合に、salesテーブルからデータが取得されます。
EXISTS句は、サブクエリによって返されたデータに対して、親クエリで条件を指定することができるため、サブクエリの実行結果が大量のデータを返す場合でも、効率的に条件を判定することができます。
EXISTS句とNULL
EXISTS句とNULLは、MySQLのSELECT文で使用されるクエリの条件式に関連する概念ですが、異なる意味を持ちます。
EXISTS句は、指定された条件を満たす行が存在するかどうかを判定するために使用されます。つまり、EXISTS句は、条件が真であるかどうかを判定するために使用されます。
一方、NULLは、データが欠損していることを示すために使用される特殊な値です。NULLは、データが存在しないことを示すために使用されます。NULLは、データ型の一部として定義されており、比較演算子や算術演算子とともに使用されることがあります。
EXISTS句とNULLは、条件式の中で一緒に使用されることがありますが、異なる意味を持ちます。例えば、以下のようなクエリがあるとします。
SELECT * FROM sales WHERE EXISTS (SELECT * FROM customers WHERE sales.customer_id = customers.customer_id) AND sales.price IS NULL;
このクエリは、salesテーブルとcustomersテーブルを結合し、salesテーブルのcustomer_id列とcustomersテーブルのcustomer_id列が一致する行を取得します。ただし、EXISTS句を使用して、customersテーブルにsalesテーブルのcustomer_id列と一致するcustomer_idが存在するかどうかを判定しています。さらに、salesテーブルのprice列がNULLである行のみが取得されます。
つまり、このクエリは、salesテーブルとcustomersテーブルが存在し、かつ、salesテーブルのcustomer_id列とcustomersテーブルのcustomer_id列が一致する行が存在し、かつ、salesテーブルのprice列がNULLである行が存在する場合に、salesテーブルからデータが取得されます。
NOT EXIST句, NOT IN句
NOT EXISTS句とNOT IN句は、MySQLのSELECT文で使用されるクエリの条件式に関連する概念ですが、異なる意味を持ちます。
NOT EXISTS句は、指定された条件を満たす行が存在しないことを判定するために使用されます。つまり、NOT EXISTS句は、条件が偽であるかどうかを判定するために使用されます。NOT EXISTS句は、EXISTS句と同様に、サブクエリの中で使用されることが多く、サブクエリによって返されたデータに対して、親クエリで条件を指定することができます。
一方、NOT IN句は、指定されたリストに含まれない値を持つ行を取得するために使用されます。つまり、NOT IN句は、指定されたリストに含まれない値を持つ行を取得するために使用されます。NOT IN句では、リストの要素を直接指定することができます。
以下に、NOT EXISTS句とNOT IN句の使用例を示します。
NOT EXISTS句を使用した例:
SELECT * FROM sales WHERE NOT EXISTS (SELECT * FROM customers WHERE sales.customer_id = customers.customer_id);
このクエリは、salesテーブルとcustomersテーブルを結合し、salesテーブルのcustomer_id列とcustomersテーブルのcustomer_id列が一致する行を取得します。ただし、NOT EXISTS句を使用して、customersテーブルにsalesテーブルのcustomer_id列と一致するcustomer_idが存在しない場合に、salesテーブルからデータが取得されます。
NOT IN句を使用した例:
SELECT * FROM sales WHERE sales.customer_id NOT IN (SELECT customer_id FROM customers);
このクエリは、salesテーブルとcustomersテーブルを結合し、salesテーブルのcustomer_id列とcustomersテーブルのcustomer_id列が一致する行を取得します。ただし、NOT IN句を使用して、customersテーブルのcustomer_id列に含まれないsalesテーブルのcustomer_id列の値を持つ行が取得されます。
EXCEPT(MINUS)
EXCEPTとMINUSは、2つのSELECT文の結果セットの差集合を取得するための演算子であり、ほとんど同じ機能を持っています。ただし、EXCEPT演算子は、MySQLでは使用できず、MINUS演算子がMySQLで使用されます。
MINUS演算子は、2つのSELECT文の結果セットから、左側のSELECT文の結果セットにのみ存在する行を取得するために使用されます。つまり、MINUS演算子は、2つのSELECT文の結果セットの差集合を取得するために使用されます。
以下に、MINUS演算子の使用例を示します。
例1: salesテーブルとcustomersテーブルのcustomer_id列の差集合を取得する場合
SELECT customer_id FROM sales MINUS SELECT customer_id FROM customers;
このクエリは、salesテーブルとcustomersテーブルのcustomer_id列を比較し、salesテーブルのcustomer_id列にのみ存在する行を取得します。
例2: salesテーブルとordersテーブルのcustomer_id列の差集合を取得する場合
SELECT customer_id FROM sales MINUS SELECT customer_id FROM orders;
このクエリは、salesテーブルとordersテーブルのcustomer_id列を比較し、salesテーブルのcustomer_id列にのみ存在する行を取得します。
なお、MINUS演算子は、MySQLではサポートされていないため、同じ効果を得るには、LEFT JOINまたはNOT IN演算子を使用する必要があります。
というわけで、今回は以上です。大変大変お疲れ様でした。
引き続きで、徐々に発信していきます。
コメントや感想を受け付けています。ちょっとした感想でもいいので嬉しいです。
それでは、以上です。