#2 MySQL構文再検索--サブクエリ
2.サブクエリ
2.1. 概要サブクエリの種類の概要 where型サブクエリ:内部クエリの結果を外層クエリの比較条件とする. from型サブクエリ:内層のクエリ結果を一時テーブルとして、外層sqlが再びクエリするために使用します. inサブクエリ:内層クエリ文は1つのデータ列のみを返し、このデータ列の値は外層クエリ文と比較されます. existsサブクエリ:外層のクエリ結果を内層に取得し、内層が成立しているかどうかを確認します.簡単に言えば、後の戻りtrueは、外層(つまり前の文)が実行されます.そうしないと実行されません. anyサブクエリ:内層サブクエリのいずれかの比較条件を満たす限り、結果は外層クエリ条件として返されます. allサブクエリ:内層サブクエリが返す結果は、すべての内層クエリ条件を同時に満たす必要があります. 比較演算子サブクエリ:サブクエリで使用できる比較演算子(>)
サブクエリ基本構文 参照先: mysql-サブクエリ(7種類) 2.2. EXISTS & IN
2.2.1. exists作用 EXISTSは、サブクエリが少なくとも1行のデータを返すかどうかをチェックするために使用され、このサブクエリは実際にはデータを返すのではなく、値TrueまたはFalse を返す. EXISTSはサブクエリを指定し、ローの存在を検出します. 外部クエリテーブルの各ローは、内部クエリを検証として代入し、内部クエリが返す結果がNULL値でない場合、EXISTS句はTRUEを返し、このローは外部クエリの結果ローとすることができ、そうでなければ結果としてはならない. 構文 効率は通常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 構文 実行ロジック in()の後のサブクエリは結果セットを返し、 サブクエリはまず結果セットを生成し、その後、メインクエリは結果セットに行って要求に合致するフィールドリストを探す.要求に合う出力は、逆に出力されない.
2.2.2.2. not inとnot existsの違い: not in の概要 not inサブクエリでselectキーワードの後のフィールドにnot null制約がある場合、またはこのような暗示がある場合にのみnot in, を使用します.また、プライマリ・クエリのテーブルが大きく、サブクエリのテーブルが小さいが記録が多い場合はnot inを使用する必要があります. not inの実行順序は、テーブルに1つのレコードを記録したクエリー(各レコードをクエリー)が要求に合致した場合に結果セットを返し、一致しない場合は次のレコードをクエリーし続け、テーブルのレコードをクエリーし終わるまでクエリーします.つまり、証明が見つからないためには、すべてのレコードを問い合わせるしか証明できません.インデックスは使用されませんでした.
not exists not exists:プライマリ・クエリー・テーブルにレコードが少ない場合、サブクエリー・テーブルにレコードが多く、インデックスがあります. 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とする.
2.1. 概要
# 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=' ');
2.2.1. exists
SELECT *
FROM class AS c1
WHERE EXISTS(SELECT
class_id
FROM class AS c2
WHERE c1.class_id = 10);
2.2.2. in、not in、existsとnot existsの違い:
2.2.2.1. exists & in
外部クエリーが100行を返すと、SQLは101回のクエリーを実行し、外部クエリーを1回実行し、外部クエリーが返す各ローに対してサブクエリーを実行します.
select * from stu where sex=' ' and age in(select age from stu where sex=' ')
2.2.2.2. not inとnot existsの違い:
: ,
select * from class where cid not in(select distinct cid from stu);
cid null ,not in ;
:
select * from class
where cid not in
(select distinct cid from stu where cid is not null)
: ,
select * from class2
where not exists
(select * from stu1 where stu1.cid =class2.cid)
参照先:
2.3.1. 概要
2.3.2. 構文
2.4. その他
2.4.1. whereとonの違い