В чем разница между
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 (командной строки).
В вашем первом утверждении вообще не указаны критерии соединения, чтобы сделать его эквивалентным, вам нужно будет изменить его на:
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;
И это эквивалентно
Первый запрос без какого-либо условия 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.
В первом примере нет критериев в соединении, поэтому все строки в будут ассоциированы со всеми строками в D, образующими строки "A x D" - так называемый " Декартовое соединение.
Во втором примере будут перечислены только строки из A и D с тем же именем AccountId.
Я не совсем уверен, как MySql обрабатывает неквалифицированные объединения, но я присоединяюсь, чтобы предположить, что это просто внешнее соединение, дающее вам тонны результатов для первого. Второй квалифицировал соединение и дал вам то, что вы хотели.
В SQL Server вы должны использовать квалификатор "on"...
Select a.AccountID from Accounts a join Domain d on a.AccountID = d.AccountID
Это ограничивает соединение и делает намного лучший запрос. MySql должен иметь что-то очень похожее.
"Я думал, что JOIN - это внутреннее соединение, которое соответствует только тогда, когда левый AccountId равен == в списке AccountId. Не было бы то же самое?"
АЛГЕБРАИЧЕСКИЙ ОПЕРАТОР, называемый "NATURAL JOIN", ведет себя таким образом.
К сожалению, SQL - это не то же самое, что реляционная алгебра.
К сожалению, вам нужно сделать дополнительную запись ( "ON A.Column = B.column" ), прежде чем любая система SQL захочет принять ужасную идею о том, что естественное соединение действительно то, что вам нужно.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: У меня нет MySQL, поэтому я просто понимаю, что я помню.
Поскольку вы не указываете условие соединения в первом случае, я считаю, что ваша первая строка эквивалентна
SELECT a.AccountID FROM Accounts a, Domain d;
который вернет строки a * d
в виде декартова произведения.
Вторая строка указывает, что строки в таблице Учетные записи должны соответствовать соответствующей строке в домене, так что запрос будет возвращать меньшее количество строк.
JOIN
без предложенияON
.