SELECT
и других запросов
EXPLAIN
(получение информации о SELECT
)SELECT
WHERE
DISTINCT
LEFT JOIN
и RIGHT JOIN
ORDER BY
LIMIT
INSERT
UPDATE
DELETE
Buy this Reference Manual in softcover from Barnes & Noble!
LEFT JOIN
и RIGHT JOIN
Выражение "A LEFT JOIN B
" в MySQL реализовано следующим образом:
LEFT JOIN
.LEFT JOIN
перемещаются в предложение WHERE
.WHERE
.WHERE
, но в таблице B ни одна строка не удовлетворяет условию LEFT JOIN
, генерируется дополнительная строка B, в которой все значения столбцов устанавливаются в NULL
.LEFT JOIN
используется для поиска тех строк, которые отсутствуют в некоторой таблице, и в предложении WHERE
выполняется следующая проверка: column_name IS NULL
, где column_name
- столбец, который объявлен как NOT NULL
, MySQL пререстанет искать строки (для отдельной комбинации ключа) после того, как найдет строку, соответствующую условию LEFT JOIN
.RIGHT JOIN
реализован аналогично LEFT JOIN
.
При указании жесткого порядка чтения таблиц в LEFT JOIN
и STRAIGHT JOIN
оптимизатор связей (который определяет, в каком порядке таблицы должны быть связаны) будет выполнять работу намного быстрее, так как ему потребуется проверять меньшее количество перестановок таблиц.
Обратите внимание: отсюда следует, что если выполняется запрос типа
SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
MySQL будет делать полный просмотр таблицы b
, поскольку LEFT JOIN
заставит его читать эту таблицу перед d
.
В этом случае, чтобы предотвратить полный просмотр таблицы b
, нужно изменить запрос таким образом:
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
Posted by on Friday January 24 2003, @10:18am | [Delete] [Edit] |
This gave me trouble for a while so I thought I'd
pass it on. If you want a left join with a
condition for the right table (the row that may
or may not be there) you have to put the
condition in the join clause, not the where
clause.
Here's an example:
SELECT
*
FROM
t1 LEFT JOIN t2 ON
(t1.id_t1 = t2.id_t1 AND t2.id_t2 = 345)
WHERE
t1.id_level=17;
I appologize if that's common knowledge but this
note would have saved me hours.
Thanks
Add your own comment.