有两个表:
A:
| id | name | ---id主键
B:
| id | a_id | item_id | item_name | desc | ----id主键,a_id 与 A中的id关联
查询-包含item_id的所有的A记录
SELECT DISTINCT A.* FROM A JOIN B ON A.id = B.a_id WHERE item_id = 123;
SELECT A.* FROM A JOIN B ON A.id = B.a_id WHERE B.item_id =123 GROUP BY A.id;
SELECT A.* FROM A WHERE EXISTS (SELECT 1 FROM B WHERE B.a_id = A.id and B.item_id = 123);
这三种查询那种最好?
データの量が多い場合、2 番目または 3 番目の方法を使用することはお勧めできません。最初のものを使用することをお勧めします。私たちがプロジェクトに取り組んでいるとき、DBA が SQL をレビューするたび、サブクエリがあるとき、または SQL で
GROUP BY
が使用されているときは必ず、データのサイズとテーブルがどうなったのかを尋ねます。GROUP BY
とサブクエリを使用しないようにアドバイスされます。効率が遅いといつも言われます...私は初心者なので、なぜ遅いのか正確にはわかりません意味的に要件を最もよく満たし、最も効率的である 3 番目のオプションを使用することをお勧めします。
最初の記述方法は、テーブル リンクを使用することです。テーブル A とテーブル B に 1 対多の関係がある場合、B のレコードをスキャンする必要がありません (要件は 1 つだけを見つけることであり、JOIN メソッドは次のとおりです)。さらに、個別の使用により、データベース内でソート操作が必要になる場合があり、効率がある程度影響を受けます。
2 番目の記述方法は標準 SQL ではありません。Group by にはフィールドが 1 つしかありません。理論的には、SELECT で A.* を記述する方法はサポートされていません。効率は最初の方法と同様です。
3 番目の記述方法では、exists ステートメントはデータベースによって半結合に最適化されます (これは Oracle の場合で、MySQL は実行計画が適切かどうかを確認する必要があります)。そのため、これが最も効率的です。 。