サブクエリ 述語のTrue/False

このQ&Aのポイント
  • サブクエリの勉強をしていますが、「TRUE」と「FALSE」の評価について理解できません。例えば、「EXISTS」はサブクエリの結果が1行でもあれば「TRUE」となるのでしょうか?詳しい説明をお願いします。
  • サブクエリにおいて、述語の「TRUE」と「FALSE」の評価について理解できません。例えば、「EXISTS」はサブクエリの結果が1行でもあれば「TRUE」となるのでしょうか?詳しい説明をお願いします。
  • サブクエリについて勉強していますが、「TRUE」と「FALSE」の評価について理解できません。例えば、「EXISTS」はサブクエリの結果が1行でもあれば「TRUE」となるのでしょうか?詳しい説明をお願いします。
回答を見る
  • ベストアンサー

サブクエリ 述語のTrue/False

こんにちは。 サブクエリの勉強をしています。下のURLのサイトを見ていますがわからないことがあります。 http://www.techscore.com/tech/sql/SQL7/07_02.html/#sql76 EXISTS, ANY, ALL はサブクエリが返す値に対して、「TRUE」または「FALSE」の評価を行い、メインクエリの WHERE 句で使用されます。っとあります。 /* EXISTS */ SELECT * FROM 商品表 WHERE EXISTS (SELECT * FROM 商品表 WHERE 商品名 = 'BEER'); 上記のSQLが走り、サブクエリの商品表の中にある、商品名がBEERのモノを抽出しなさいというのは理解できます。理解できないのは、「TRUE」、「FALSE」です。これは1行でも結果が帰ってきたら、それはTRUEとみなされて、EXISITSはサブクエリをTRUEと評価するということでしょうか? つまり、どんな述語でもサブクエリで評価された結果が1行でもあれば、それはTRUEという意味になるのでしょうか?いまいち何がTRUEでFALSEなのかがわかりません・・・宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jicchi2
  • ベストアンサー率27% (5/18)
回答No.1

この場合の SELECT * FROM 商品表 AS 商品表A WHERE EXISTS (SELECT * FROM 商品表 AS 商品表B WHERE 商品名 = 'BEER'); は、サブクエリの商品表Bに商品名がBEERのレコードがあれば、商品表Aのすべての行を抽出しなさい。 なので、このSQLでは商品表にBEERがあれば、BEERも含めてすべてのレコードが抽出されるし、BEERがなければ、1行も抽出されません。 > これは1行でも結果が帰ってきたら、それはTRUEとみなされて、EXISITSはサブクエリをTRUEと評価するということでしょうか? 正しいです。1行でも見つかったらTRUEです。 EXISTS (SELECT * FROM 商品表 WHERE 商品名 = 'BEER') は (SELECT COUNT(*) FROM 商品表 WHERE 商品名 = 'BEER') > 0 と同じ結果が得られます。結果は同じですが、実行計画は異なりますので、応答時間とかは違ってくると思いますが。

mellow91
質問者

お礼

なんと!とてもよく理解できました!ご回答ありがとうございます!

関連するQ&A

  • サブクエリの複数項目

    いつもお世話になっております。 サブクエリで複数項目を取得する方法をご教授下さい。 [既存] select 商品, 価格, (select user_id from user_master where user_id = 1 ) from products where 商品ID = 1 上記のようなSQLがあり、 user_masterから取得する項目をもうひとつ追加したいと思っています。(user_name) select 商品, 価格, (select user_id, user_name from user_master where user_id = 1 ) as user from products where 商品ID = 1 と修正したいのですが、当然エラーになってしまいます。 この場合は別にサブクエリを指定して取得した方がいいのでしょうか。 宜しくお願い致します。

  • あるサイトの相関サブクエリの説明について

    いつもお世話になります。 相関サブクエリについて、教えて頂きたいことがあります。 以下のサイトに相関サブクエリについての説明がされています。 http://gihyo.jp/dev/serial/01/sql_academy2/000902 このサイトによると、 ----------------------------------------------------------------- 「行われている動作 リスト2の2つ目のSELECT文においても,最初に評価,実行されるのがサブクエリであるという点は変わりません。・・・」 ※リスト2  相関サブクエリ(性別による集合カット) SELECT * FROM Employees E1 WHERE age = (SELECT MAX(age) FROM Employees E2 WHERE E1.sex = E2.sex); ----------------------------------------------------------------- と説明があります。 理解できないのが、「最初に評価,実行されるのがサブクエリ」という内容です。 私の理解では、相関サブクエリは、内側のクエリが外側のクエリを参照するクエリのことで、まず外側のクエリが実行される。 その後、その結果の各レコードに対してサブクエリを実行していく、というように理解しています。 しかし、上記サイトでは先にサブクエリが実行されるという説明がされており、ちょっと混乱しています。 相関サブクエリは正しくはどういう挙動をするものなのでしょうか、また正しい説明がされているサイトなども教えて頂けないでしょうか。 宜しくお願いします。

  • サブクエリ

    サブクエリで、t2テーブルに列が無いか、t2テーブルの中でuflgの値が1である列がヒットする場合に真を返すなら、 where ... and 0=(select count(*) from t2) or 0<(select count(*) from t2 where uflg=1) のようにサブクエリに2つのselectを書かないと無理ですか?

  • EXSIST述語を使った副問合わせについて

    SELECT HINMOKU_NAME FROM HINMOKU WHERE HINMOKU_CODE IN (SELECT HINMOKU_CODE FROM URIAGE WHERE URIAGE_DATE = '2004-11-10'); 上記をSQL文をEXISTS述語を使って書き換えると エラーが出てしまい、うまく書き換えがすることが できません。下記にエラーがでるSQL文を記載いたします。 SELECT HINMOKU_NAME FROM HINMOKU WHERE EXISTS (SELECT HINMOKU_CODE FROM URIAGE WHERE URIAGE_DATE ='2004-11-10' WHERE HINMOKU.HINMOKU_CODE=URIAGE.HINMOKU_CODE); 上記SQL文についてどこに問題があるのか、ご教授お願い致します。

  • MySQLのサブクエリ

    おせわになっております。 MySQLを愛用していますが、気になる疑問にぶつかりましたので、質問させてください。 ★MySQLの4.1系のサブクエリは、性能が悪いのですか? たとえば select * from t1 where key in ( select key from t2 where key2 in ( select key2 from t3 where col = 1)) のようなことをしようとしたとき、ものすごく遅いことがあります。 あきらめて、クエリを分けて、小分けに実行すれば、速いです。 サブクエリなどを高速に実行させる方法などありますでしょうか?MySQL5では違うものなのでしょうか? よろしくお願いします

  • サブクエリについて教えてください。

    すみませんが、教えてください。 下のようなテーブルhogeから、 各dateIDにつき、deliIDが最大の、priceを取得 しようとしています。 SELECT dateID, price FROM hoge ORDER BY deliID DESC を使って、同じdateIDをはじけば、実現できるのですが、 サブクエリを使うと、一発で実現できそうな気がするのですが、サブクエリを使ったことがないので、よくわかりません。 サブクエリで上記の抽出ができるのか? できるならば、そのSQLを教えてください。 テーブル:hoge dateID,deliID,price 1,1,1000 1,2,1500 1,3,1200 2,1,900 2,2,1100 2,3,2000 3,2,1800 3,3,1300 3,4,800 ...

  • サブクエリを使わずに実現したのですが。。。

    現在、Mysql 4.0xを利用してDBを構築しています。 しかしながら、サブクエリが使えないため以下のようなクエリが実現できず困っております。 EX: select mg.*,sumlg.* from mg left join (select id,uid from lg where uid = '00001') as sumlg on mg.id = sumlg.id where sumlg.id is null; 上記SQLは特定のユーザーIDの、テーブルBに存在しないテーブルAのIDをユーザー単位で切り分け抽出するSQL文です。 (テーブルBにはIDとUIDでユニークになるレコードが格納されています。) 上記を実現するためのSQLをどなたかアドバイスください。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL EXISTS演算子について

    ------------------------------------------------------- SELECT DISTINCT 商社.商社名 FROM 商社 WHERE NOT EXISTS (SELECT * FROM 商品 WHERE NOT EXISTS (SELECT * FROM 納品 WHERE 納品.商品番号 = 商品.商品番号 AND 納品.商社番号 = 商社.商社番号)) 各テーブルレイアウト 納品([商品番号]、[商社番号]、納品数量) 商品([商品番号]、商品名) 商社([商社番号]、商社名) []は主キー 条件:納品表に行が存在することは、その商品を商社が納品することを意味する。 --------------------------------------------------------- 上記SQLは、「全ての商品を納入する商社の商社名を求める」ものだそうですが、なぜそうなるのか理解できません。 具体的にどういう判定でそうなるのか教えていただけないでしょうか。

  • 相関サブクエリの中で、グループ化はできない?

    いつもお世話になっています。 オラクルではないのですが、SQLの質問が多く感じたため、質問させていただきました。 タイトルの通り、相関サブクエリはグループ化した状態で行えるのか教えていただきたいんです。 課題は、売上表(Sales)から、売上数量(Quantity)の平均の10倍よりも売上数量(Quantity)の最大の方が大きい商品IDを見つけ出す。というものです。 考えたSQLは SELECT __S1.ProductID FROM __Sales AS S1 GROUP BY __ProductID HAVING __AVG(Quantity) * 10 < (SELECT    __MAX(Quantity)    FROM    __Sales AS S2    GROUP BY    __ProductID    HAVING    __S1.ProductID = S2.ProductID) です。考え方として 相関サブクエリで、現在の商品ID(HAVING S1.ProductID = S2.ProductIDのところ)の商品数量の最大値を比較として返そうと思いましたが、どうもうまくいきません。 こういった相関サブクエリは作れないのでしょうか?

  • 同じサブクエリが複数出てくるのでまとめたい

    SELECT a.num b.num FROM   サブクエリA(いろんな処理 WHERE a_id=ANY(サブクエリC(いろんな処理)) ) AS a,   サブクエリB(いろいろ処理 WHERE b_id=ANY(サブクエリD(いろんな処理)) ) AS b このような処理をしているのですが、サブクエリCとサブクエリDは一字一句違わない全く同じ処理をしています。 2回全く同じ処理をするのは処理コストが無駄にかかりますし、同じ内容を示す表記が2度出てくるのは保守性も悪くします。 サブクエリCとDを共通化して一つにまとめる方法はありますでしょうか。

    • ベストアンサー
    • MySQL