ホームページ >データベース >mysql チュートリアル >SQLにおけるExistsの使用例を詳しく解説
この記事では主に SQL での Exists の使用法を紹介します。非常に優れており、参考になります。
たとえば、Northwind データベースには
SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID)
How do EXISTS work here というクエリがあります。 ?サブクエリは OrderId フィールドを返しますが、外部クエリは CustomerID フィールドと CompanyName フィールドを探しています。これらの 2 つのフィールドは、どのように一致するのでしょうか。
EXISTS は、サブクエリが少なくとも 1 行のデータを返すかどうかを確認するために使用されます。サブクエリは実際にはデータを返しませんが、行の存在を検出するために True または False を返します。
構文: EXISTS サブクエリ
パラメータ: サブクエリは制限された SELECT ステートメントです (COMPUTE 句と INTO キーワードは許可されません)。
結果の型: ブール型 サブクエリに行が含まれる場合は TRUE を返し、それ以外の場合は FLASE を返します。
テーブル A の例: TableIn テーブル B の例: TableEx
(1)。サブクエリで NULL を使用しても、結果セットが返されます
select * from TableIn where exists(select null)
は、 select * from TableIn
と同等です。 ( 2). EXISTS と IN を使用してクエリを比較します。両方のクエリが同じ結果を返すことに注意してください。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME) select * from TableIn where ANAME in(select BNAME from TableEx)
(3) EXISTS と = ANY を使用してクエリを比較します。両方のクエリが同じ結果を返すことに注意してください。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME) select * from TableIn where ANAME=ANY(select BNAME from TableEx)
NOT EXISTS は EXISTS の正反対のことを行います。サブクエリが行を返さない場合、NOT EXISTS の WHERE 句は満たされます。
結論: EXISTS (NOT EXISTS を含む) 句の戻り値は BOOL 値です。 EXISTS 内にサブクエリ ステートメント (SELECT ... FROM...) があり、これを EXIST の内部クエリ ステートメントと呼びます。その中のクエリ ステートメントは結果セットを返します。 EXISTS 句は、その中のクエリ ステートメントの結果セットが空か空ではないかに基づいてブール値を返します。
これを理解する一般的な方法は次のとおりです。テストとして、外部クエリ テーブルの各行を内部クエリに代入します。内部クエリから返された結果が null 以外の値を取る場合、EXISTS 句は TRUE を返し、この行は返されます。外部クエリの結果行として使用できます。それ以外の場合は結果として使用できません。
アナライザーはまずステートメントの最初の単語を調べ、最初の単語が SELECT キーワードであることを検出すると、FROM キーワードにジャンプし、FROM キーワードを通じてテーブル名を検索し、テーブルをメモリにロードします。 。次のステップでは、WHERE キーワードが見つからない場合は SELECT に戻り、WHERE が見つかった場合はその中の条件を分析します。フィールドを分析します。最後に、仮想テーブルが形成される。
WHEREキーワードに続くのは条件式です。条件式が計算されると、非ゼロまたは 0 の戻り値が返されます。非ゼロは真 (真) を意味し、0 は偽 (偽) を意味します。同様に、WHERE の後の条件にも戻り値 (true または false) があり、次に SELECT を実行するかどうかを決定します。
アナライザーは最初にキーワード SELECT を見つけ、次に FROM キーワードにジャンプして STUDENT テーブルをメモリにインポートし、ポインターを介して最初のレコードを見つけて、次に WHERE キーワードを見つけて、それが true である場合にその条件式を計算します。レコードが仮想テーブルにロードされ、ポインタが次のレコードを指します。 false の場合、ポインタは他の操作を実行せずに次のレコードを直接指します。常にテーブル全体を取得し、取得した仮想テーブルをユーザーに返します。 EXISTS は条件式の一部であり、戻り値 (true または false) も持ちます。
レコードを挿入する前に、レコードが既に存在するかどうかを確認する必要があります。レコードが存在しない場合にのみ挿入操作が実行されます。EXISTS 条件ステートメントを使用すると、重複レコードの挿入を防ぐことができます。
INSERT INTO TableIn (ANAME,ASEX) SELECT top 1 '张三', '男' FROM TableIn WHERE not exists (select * from TableIn where TableIn.AID = 7)
EXISTS と IN の使用効率に関しては、IN はインデックスを使用しないため、通常は in よりもexisting を使用する方が効率的ですが、具体的な使用方法は実際の状況によって異なります。
IN は、外部のtable が大きく、inner table が小さい場合、EXISTS は外面は小さいが内面は大きい場合に適しています。
以上がSQLにおけるExistsの使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。