MySQL, функциональная разница между ON и WHERE в конкретном утверждении - PullRequest
0 голосов
/ 11 мая 2019

Я изучаю запросы на выборку для функций соединения MySQL.

Я немного запутался в приведенном ниже запросе.Я понимаю нижеприведенное утверждение, чтобы объединить атрибуты из нескольких таблиц с предложением ON, а затем отфильтровать набор результатов с предложением WHERE.

Это правильно?Какие еще функции это обеспечивает?Есть ли лучшие альтернативы?

Таблицы, атрибуты и схемы не имеют отношения к этому вопросу, в частности, только взаимодействие ON и WHERE.Спасибо заранее за любые идеи, которые вы можете предоставить, ценится.

SELECT DISTINCT Movies.title  
FROM Rentals  
    INNER JOIN Customers 
    INNER JOIN Copies 
    INNER JOIN Movies ON Rentals.customerNum=Customers.customerNum  
        AND Rentals.barcode=Copies.barcode  
        AND Copies.movieNum=Movies.movieNum  
WHERE Customers.givenName='Chad'  
AND Customers.familyName='Black';

Ответы [ 2 ]

1 голос
/ 11 мая 2019

INNER JOIN (и внешние объединения) - это двоичные операторы, за которыми должно следовать предложение ON.Ваш конкретный синтаксис работает в MySQL, но не будет работать ни в одной другой базе данных (поскольку в нем отсутствуют два предложения ON).

Я бы порекомендовал написать запрос следующим образом:

SELECT DISTINCT m.title  
FROM Movies m JOIN
     Copies co
     ON co.movieNum = m.movieNum JOIN
     Rentals r
     ON r.barcode = co.barcode JOIN
     Customers c
     ON c.customerNum = r.customerNum
WHERE c.givenName = 'Chad' AND
      c.familyName = 'Black';

Вы должны всегда указывать условия JOIN в предложении ON, с одним ON на JOIN.Это также вводит псевдонимы таблиц, которые облегчают написание и чтение запроса.

Предложение WHERE имеет дополнительные условия фильтрации.Они также могут быть в предложениях ON, но я думаю, что запрос читается лучше с ними в предложении WHERE.Вы можете взглянуть на запрос и увидеть: «Мы что-то получаем из набора таблиц для Чада Блэка».

0 голосов
/ 11 мая 2019

Обычные внутренние JOIN операции генерируют только строки результата для строк таблицы, соответствующих их условию ON. Они подавляют любые строки, которые не совпадают. Это означает, что вы можете переместить содержимое предложений ON в ваше предложение WHERE и получить тот же набор результатов. Тем не менее, не делай этого; СОЕДИНЕНИЯ легче понять, если в них есть ON предложения.

Если вы используете LEFT JOIN, своего рода внешнее соединение, вы получите строки из первой упомянутой вами таблицы, которые не соответствуют ни одной строке во второй таблице в соответствии с предложением ON.

SELECT a.name, b.name
FROM a
LEFT JOIN b ON a.a_id = b.a_id

дает вам набор результатов, содержащий все строки a со значениями NULL в b.name, указывающими, что условие ON не соответствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...