#2 MySQL構文再検索--サブクエリ


2.サブクエリ
2.1. 概要
  • サブクエリの種類の概要
  • where型サブクエリ:内部クエリの結果を外層クエリの比較条件とする.
  • from型サブクエリ:内層のクエリ結果を一時テーブルとして、外層sqlが再びクエリするために使用します.
  • inサブクエリ:内層クエリ文は1つのデータ列のみを返し、このデータ列の値は外層クエリ文と比較されます.
  • existsサブクエリ:外層のクエリ結果を内層に取得し、内層が成立しているかどうかを確認します.簡単に言えば、後の戻りtrueは、外層(つまり前の文)が実行されます.そうしないと実行されません.
  • anyサブクエリ:内層サブクエリのいずれかの比較条件を満たす限り、結果は外層クエリ条件として返されます.
  • allサブクエリ:内層サブクエリが返す結果は、すべての内層クエリ条件を同時に満たす必要があります.
  • 比較演算子サブクエリ:サブクエリで使用できる比較演算子(>)
  • サブクエリ基本構文
    # from
       select * from (select cat_id,good_id,good_name from goods
                   order by cat_id asc, good_id desc) as tep group by cat_id;
    # in
       select * from department where did in(SELECT did from employee where age=20);
    # exists
       select * from department where EXISTS (SELECT did from employee where age>21);
    # any
       select * from department where did> any (SELECT did from employee );
    # all
       select * from department where did> all(SELECT did from employee );
    #   
       select * from department where did= all(SELECT did from employee
                                              where name='  ');
    
  • 参照先:
  • mysql-サブクエリ(7種類)
  • 2.2. EXISTS & IN
    2.2.1. exists
  • 作用
  • EXISTSは、サブクエリが少なくとも1行のデータを返すかどうかをチェックするために使用され、このサブクエリは実際にはデータを返すのではなく、値TrueまたはFalse
  • を返す.
  • EXISTSはサブクエリを指定し、ローの存在を検出します.
  • 外部クエリテーブルの各ローは、内部クエリを検証として代入し、内部クエリが返す結果がNULL値でない場合、EXISTS句はTRUEを返し、このローは外部クエリの結果ローとすることができ、そうでなければ結果としてはならない.
  • 構文
        SELECT *
        FROM class AS c1
        WHERE EXISTS(SELECT
                   class_id
                 FROM class AS c2
                 WHERE c1.class_id = 10);
    
  • 効率は通常existsを採用するのはinより効率が高い.INはインデックスを歩かないからだが、実際の状況を見て具体的に使用する.INは外見が大きく、内表が小さい場合に適している.EXISTSは、見た目が小さくて中身が大きい場合に適しています.

  • 2.2.2. in、not in、existsとnot existsの違い:
  • の概要
  • inとexistsがクエリー効率を比較すると、inクエリーの効率はexistsのクエリー効率よりも速い.
  • exists(xxxx)の後のサブクエリは関連サブクエリと呼ばれ、リストの値を返さない.
  • は、1つのtureまたはfalseの結果を返すだけです(これも、サブクエリにselect'xが含まれている理由です.もちろん、selectは何でも構いません).
  • つまり、カッコ内のデータが検索できるかどうか、このような記録があるかどうかを気にします.



  • 2.2.2.1. exists & in
  • exists
  • 実行ロジック:
  • は、まず外部クエリーを実行する.
  • 外部クエリの各ローに対して、サブクエリが実行されるたびに、外部クエリの現在のローの値が参照されます.
  • サブクエリの結果を使用して、外部クエリの結果セットを決定します.

  • 外部クエリーが100行を返すと、SQLは101回のクエリーを実行し、外部クエリーを1回実行し、外部クエリーが返す各ローに対してサブクエリーを実行します.
  • in
  • 構文
                  
    select * from stu where sex=' ' and age in(select age from stu where sex=' ')
    
  • 実行ロジック
  • in()の後のサブクエリは結果セットを返し、
  • サブクエリはまず結果セットを生成し、その後、メインクエリは結果セットに行って要求に合致するフィールドリストを探す.要求に合う出力は、逆に出力されない.



  • 2.2.2.2. not inとnot existsの違い:
  • not in
  • の概要
  • not inサブクエリでselectキーワードの後のフィールドにnot null制約がある場合、またはこのような暗示がある場合にのみnot in,
  • を使用します.
  • また、プライマリ・クエリのテーブルが大きく、サブクエリのテーブルが小さいが記録が多い場合はnot inを使用する必要があります.
  •   :            ,
    select * from class where cid not in(select distinct cid from stu);
    
       cid  nullnot in         ;
      :
    select * from class
    where cid not in
    (select distinct cid from stu where cid is not null)
    
  • not inの実行順序は、テーブルに1つのレコードを記録したクエリー(各レコードをクエリー)が要求に合致した場合に結果セットを返し、一致しない場合は次のレコードをクエリーし続け、テーブルのレコードをクエリーし終わるまでクエリーします.つまり、証明が見つからないためには、すべてのレコードを問い合わせるしか証明できません.インデックスは使用されませんでした.

  • not exists
  • not exists:プライマリ・クエリー・テーブルにレコードが少ない場合、サブクエリー・テーブルにレコードが多く、インデックスがあります.
      :            ,
    select * from class2
    where not exists
    (select * from stu1 where stu1.cid =class2.cid)
    
  • not existsの実行順序は、テーブル内のクエリーであり、インデックスクエリーに基づいており、存在する場合はtrueを返し、存在しない場合はfalseを返し、各レコードがクエリーされることはありません.

  • は、not inを用いずにnot existsを多く使用する理由、すなわちnot existsクエリの効率がnot inクエリと比較してはるかに高い理由をまとめた.

  • 参照先:
  • MySQLにおけるEXISTSの使い方
  • MySQL existsの使い方紹介
  • 2.3. any & all
    2.3.1. 概要
  • any:サブクエリ条件は単一で一致すればよい.
  • all:サブクエリ条件はすべて一致する必要があります.

  • 2.3.2. 構文
    
    

    2.4. その他
    2.4.1. whereとonの違い
  • whereとONの違い:外部カラムがある場合、ONはフィルタされた関連テーブルに対して、メインテーブル(保留テーブル)はすべてのカラムを返します.外部カラムが追加されていない場合、両者の効果は同じです.
  • 応用:主表に対する濾過はWHEREに置くべきである;関連表については、先条件照会後接続はON、先接続後条件照会はWHEREとする.