Mysql Использование JOINs и WHERE statment. В чем эта разница?

0

В чем разница между

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 (командной строки).

  • 0
    MySQL - одна из немногих баз данных, которая не жалуется на вас, когда вы используете JOIN без предложения ON .
Теги:
join

6 ответов

4
Лучший ответ

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

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;

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

  • 0
    @txyoji эта ссылка, чтобы показать мне что?
  • 0
    упс, я знал, что что-то забыл. Я имел в виду использовать a.accountid = d.accountid в исходном примере программы.
2

Первый запрос без какого-либо условия 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.

  • 0
    Я полностью забыл о. Я думал, что у меня есть это. Не удивительно, почему мои результаты были странными!
1

В первом примере нет критериев в соединении, поэтому все строки в будут ассоциированы со всеми строками в D, образующими строки "A x D" - так называемый " Декартовое соединение.

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

1

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

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

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

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

0

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

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

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

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

0

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

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

SELECT a.AccountID FROM Accounts a, Domain d;

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню