Изучите следующий сценарий (источник: http://phpweby.com/tutorials/mysql/32):
mysql> SELECT * FROM products;
+----+--------------+--------------+
| id | product_name | manufacturer |
+----+--------------+--------------+
| 1 | Shoes | Company1 |
| 2 | Laptop | Company2 |
| 3 | Monitor | Company3 |
| 4 | DVD | Company4 |
+----+--------------+--------------+
mysql> SELECT * FROM buyers;
+----+------+------------+----------+
| id | pid | buyer_name | quantity |
+----+------+------------+----------+
| 1 | 1 | Steve | 2 |
| 2 | 2 | John | 1 |
| 3 | 3 | Larry | 1 |
| 4 | 3 | Michael | 5 |
| 5 | NULL | Steven | NULL |
+----+------+------------+----------+
Предположим, я хотел бы создать одну таблицу, в которой каждый покупатель указан в списке товаров, которые он купил. Я могу получить очень похожие результаты, используя два разных способа - один с использованием JOIN
, а другой с использованием WHERE
.
mysql> SELECT buyer_name, quantity, product_name
FROM buyers LEFT JOIN products
ON buyers.pid=products.id;
+------------+----------+--------------+
| buyer_name | quantity | product_name |
+------------+----------+--------------+
| Steve | 2 | Shoes |
| John | 1 | Laptop |
| Larry | 1 | Monitor |
| Michael | 5 | Monitor |
| Steven | NULL | NULL |
+------------+----------+--------------+
mysql> SELECT buyers.buyer_name, buyers.quantity, products.product_name
FROM buyers,products
WHERE buyers.pid=products.id;
+------------+----------+--------------+
| buyer_name | quantity | product_name |
+------------+----------+--------------+
| Steve | 2 | Shoes |
| John | 1 | Laptop |
| Larry | 1 | Monitor |
| Michael | 5 | Monitor |
+------------+----------+--------------+
Это пример с игрушкой, так что, думаю, не имеет значения, какой путь вы выберете (за исключением разницы между покупателями, которые фактически ничего не покупали, например, Стивен).
Но когда речь идет о больших таблицах, есть ли разница в эффективности между этими двумя запросами? Из некоторых испытаний, которые я сделал, я думаю, что есть.
Я был бы рад лучше понять, правильно ли это и в чем принципиальная разница между реализацией двух схем и когда мне следует отдавать предпочтение каждой из них.