Subquery tương quan · products
Truy vấn con tương quan chạy lại cho từng dòng
Subquery tương quan chạy theo từng dòng của products
Với mỗi dòng của products, truy vấn con AVG(price) được tính lại với category_id của dòng đó: ASUS ROG (danh mục 3, 32.990.000 > 28.323.333) được giữ, Acer Nitro V 15 (21.990.000 < 28.323.333) bị bỏ, iPhone 15 (danh mục 7, 19.990.000 > 11.140.000) được giữ; còn truy vấn con không tương quan chỉ tính một lần.
SELECT sku, price FROM products p WHERE p.price > (SELECT AVG(p2.price) FROM products p2 WHERE p2.category_id = p.category_id)
1 · DÒNG CỦA TRUY VẤN NGOÀI
2 · TRUY VẤN CON CHẠY LẠI VỚI GIÁ TRỊ CỦA DÒNG ĐÓ
3 · WHERE SO SÁNH
LAP-001 · ASUS ROG Strix G16
category_id = 3 · price 32.990.000
SELECT AVG(p2.price) … WHERE
p2.category_id = 3
→ 28.323.333
32.990.000 > 28.323.333
TRUE → giữ dòng
LAP-003 · Acer Nitro V 15
category_id = 3 · price 21.990.000
SELECT AVG(p2.price) … WHERE
p2.category_id = 3
→ 28.323.333
21.990.000 < 28.323.333
FALSE → bỏ dòng
PHN-001 · iPhone 15 128GB
category_id = 7 · price 19.990.000
SELECT AVG(p2.price) … WHERE
p2.category_id = 7
→ 11.140.000
19.990.000 > 11.140.000
TRUE → giữ dòng
… và cứ thế cho cả 24 dòng của products: mỗi dòng ngoài, truy vấn con được tính lại một lần (về mặt logic).
So sánh: WHERE price > (SELECT AVG(price) FROM products) không nhắc tới cột nào của dòng ngoài,
nên chỉ cần tính một lần (10.832.875) rồi dùng cho mọi dòng.
© tiennhm