副問合せ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/09/27 04:10 UTC 版)
「SELECT (SQL)」の記事における「副問合せ」の解説
副問合せは値が一定でない値に対して問合わせが可能であり、必ず( )で囲む必要がある。FROM句、WHERE句、HAVING句で使用可能。FROM句で指定されていない別表を参照することも可能であり、また、ネストにも制限はない(但し、パフォーマンスは低下するおそれがある)。 副問合せに対して単一行を選択したい場合は比較演算子を用いる。この場合、複数行が検索されればエラーとなる。もし、複数行を選択したい場合は、一般にIN、他にANY(SOME)+比較演算子、ALL+比較演算子、またはEXISTSを用いる。いずれの式も頭にNOTを付記すれば、否定表現となる。この比較条件の記述はDBMSの環境に依存していることが多い。 IN INは、括弧内にいずれかの値が入っている場合に限り、真を返す演算子である。たとえば商品(商品番号,商品名,…)という表から、商品番号が3と8の商品名を抽出するとする。この場合はSELECT 商品名 FROM 商品 WHERE 商品番号 = 3 OR 商品番号 = 8と記述してもよいが、INを用いることで SELECT 商品名 FROM 商品 WHERE 商品番号 IN (3,8) と簡潔に表すことができる。これを副問合せに応用することも可能で、たとえば納品(伝票番号,行番号,商品番号,納品日,個数,…)という表から一度でも納品された商品を表したい場合は SELECT 商品名 FROM 商品 WHERE 商品番号 IN (SELECT 商品番号 FROM 納品) とすれば、一度でも納品された商品が抽出される。逆に、NOT INとすると納品表に一度も納品されていない商品が抽出される。 EXISTS EXISTSはその値が存在するかを探索する演算子であり、存在する場合は真を返す。前述の例をEXISTSで記述する場合はこのようになる。 SELECT 商品名 FROM 商品 WHERE EXISTS (SELECT * FROM 納品 WHERE 商品.商品番号 = 納品.商品番号) 結果的に、INで記述した場合と同じ結果を示すことになるが、前述の例とは実行順序が異なっている。通常、副問合せを先に実行しその結果を使って主問合せを実行するが、後述の例の場合、副問合せ内で副問合せ内にない表(商品表)を参照しているので副問合せを先に実行できない。このように、そのFROM句にない表の列を参照する副問合せを「相関副問合せ」と言い、その場合は、主問合せの表の行ごとに副問合せが繰り返し実行される。ただし、その分パフォーマンスは低下してしまうため、実用上は前述の例のように記述した方がよい。
※この「副問合せ」の解説は、「SELECT (SQL)」の解説の一部です。
「副問合せ」を含む「SELECT (SQL)」の記事については、「SELECT (SQL)」の概要を参照ください。
- 副問合せのページへのリンク