【SQL Server】論理演算子 EXISTS の使い方
「EXISTS」は英語で『存在する』という意味です。クエリで使う場合は、WHERE句の中で使用し、以下条件が存在するならば=TRUEになるならばっという意味です。
基本形
SELECT [表示要素名] FROM [テーブル名] WHERE EXISTS (サブクエリ)
SELECT [表示要素名] FROM [テーブル名] WHERE NOT EXISTS (サブクエリ)
事前準備
--テーブル1作成 CREATE TABLE [dbo].[T1]( [Id] INT , [Name] NVARCHAR(20) , ) -- テーブル1データ登録 INSERT INTO T1 SELECT 1,N'荒川太郎'; INSERT INTO T1 SELECT 2,N'荒川次郎'; INSERT INTO T1 SELECT 3,N'佐藤花子'; --テーブル2作成 CREATE TABLE [dbo].[T2]( [Id] INT, [Age] INT, ) -- テーブル2登録 INSERT INTO T2 SELECT 1,18; INSERT INTO T2 SELECT 3,17;
テーブルを2個用意します。
EXISTSクエリ
SELECT * FROM T1 WHERE EXISTS ( SELECT 1 FROM T2 WHERE T1.Id= T2.Id )
意味は、『T1とT2の同じIdを持つT1のデータを取得せよ』です。
サブクエリの結果取得を「1」にしているのは、サブクエリの取得データを使用しないためです。サブクエリの結果が『TRUE』なのか『FALSE』なのかが重要です。別に「*」でもかまいません。
NOT EXISTSクエリ
SELECT * FROM T1 WHERE NOT EXISTS ( SELECT 1 FROM T2 WHERE T1.Id= T2.Id )
「NOT」なので意味は、『T1とT2の同じIdを持たないT1のデータを取得せよ』です。
SELECT * FROM T1 WHERE EXISTS ( SELECT 1 FROM T2 HAVING T1.Id= MAX(T2.id) ) SELECT * FROM T1 WHERE NOT EXISTS ( SELECT 1 FROM T2 HAVING T1.Id= MAX(T2.id) )
サブクエリの中で集計関数とHAVING句を使うこともできます。
テーブル同士の紐づけをしない場合
SELECT * FROM T1 WHERE EXISTS ( SELECT 1 FROM T2 ) SELECT * FROM T1 WHERE EXISTS ( SELECT 1 FROM T2 WHERE 1 = 2 )
あたりまえですが、必ず全レコード「TRUE」または「FALSE」になります。
コメント