Mysql Использование JOINs и WHERE statment. В чем эта разница? - PullRequest
0 голосов
/ 22 октября 2009

Какая разница между

SELECT a.AccountId FROM Accounts AS a JOIN domain as d;

и

SELECT a.AccountId
FROM Accounts AS a JOIN domain as d WHERE a.AccountId=d.AccountId;

Я думал, что JOIN - это внутреннее соединение, которое соответствует только тогда, когда левый AccountId равен == правому AccountId. Разве вышеупомянутое не было бы точно таким же? Я получил разные результаты при вводе его в MySQL (командная строка).

Ответы [ 6 ]

4 голосов
/ 22 октября 2009

В вашем первом утверждении вообще не указаны критерии объединения, чтобы сделать его эквивалентным, вам необходимо изменить его на:

SELECT a.AccountId FROM Accounts AS a 
JOIN domain as d on a.accountid = d.accountid;

Я думаю, что вы спрашиваете, но не уверены, в чем разница между старыми стилями

 SELECT a.AccountId FROM Accounts AS a, domain as d 
 where  a.accountid = d.accountid;

И ANSI присоединяется, что

  SELECT a.AccountId FROM Accounts AS a 
  JOIN domain as d on a.accountid = d.accountid;

И это эквивалентно

2 голосов
/ 22 октября 2009

Первый запрос без какого-либо условия JOIN вернет те же результаты, что и CROSS JOIN. Это означает, что он присоединится к каждой строке таблицы Accounts с каждой строкой таблицы Domain. Таким образом, если у вас есть 4 строки в первой таблице и 8 в другой, у вас будет 32 результата. Если вы хотите взять только a.AccountId, оно будет продублировано столько раз, сколько строк в таблице domain. На самом деле я не вижу смысла первого запроса. Вы должны просто сделать это:

SELECT a.AccountId FROM Accounts

Второй запрос ведет себя как первый с той разницей, что он возвращает только те строки, которые соответствуют условию a.AccountId=d.AccountId. Но вы действительно должны переписать этот запрос:

SELECT a.AccountId 
FROM Accounts AS a 
JOIN domain as d 
ON a.AccountId=d.AccountId;

После ON вы указываете условия JOIN.

1 голос
/ 22 октября 2009

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

В SQL Server вы должны использовать квалификатор "on" ...

Select a.AccountID from Accounts a join Domain d on a.AccountID = d.AccountID

Это ограничивает объединение и делает запрос намного лучше. У MySql должно быть что-то очень похожее.

1 голос
/ 22 октября 2009

В первом примере в соединении нет критериев, поэтому все строки в A будут ассоциироваться со всеми строками в D, образуя строки «A x D» - так называемое « декартово объединение ».

Во втором примере будут перечислены только строки в A и D с одинаковым AccountId.

0 голосов
/ 23 октября 2009

"Я думал, что JOIN - это внутреннее соединение, которое совпадает только в том случае, если левый AccountId равен == правому AccountId. Разве вышеприведенное не будет точно таким же?"

АЛГЕБРАИЧЕСКИЙ ОПЕРАТОР, называемый "ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ", ведет себя таким образом.

К сожалению, SQL - это не то же самое, что реляционная алгебра.

К сожалению, вам нужно сделать дополнительную запись («ON A.Column = B.column»), прежде чем любая система SQL захочет принять ужасную идею о том, что естественное объединение действительно то, что вам нужно.

0 голосов
/ 22 октября 2009

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Не имейте под рукой MySQL, поэтому я просто продолжаю то, что помню.

Поскольку вы не указываете условие соединения в первом случае, я считаю, что ваша первая строка эквивалентна

SELECT a.AccountID FROM Accounts a, Domain d;

, который вернет a * d строк как декартово произведение.

Ваша вторая строка указывает, что строки в таблице Accounts должны соответствовать соответствующей строке в Домене, чтобы запрос возвращал меньше строк.

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