ホームページ >データベース >mysql チュートリアル >SQLにおけるExistsの使用例を詳しく解説

SQLにおけるExistsの使用例を詳しく解説

零下一度
零下一度オリジナル
2018-05-15 17:48:573091ブラウズ

この記事では主に 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。