CROSS JOIN = (INNER) JOIN = кома (",")
TL; DR Єдина відмінність між SQL CROSS JOIN, (INNER) JOIN і комою (",") (окрім коми, що мають нижчий пріоритет для порядку оцінювання), полягає в тому, що (INNER) JOIN має значення ON, а CROSS JOIN та кома -.
Повторні проміжні продукти
Усі три виробляють проміжний концептуальний реляційний продукт «декартовий» у стилі SQL, який також називають перехресним з'єднанням, усіх можливих комбінацій рядків із кожної таблиці. Саме ON та / або де зменшується кількість рядків. SQL Fiddle
Стандарт SQL визначає <comma> через продукт (7.5 1.b.ii), <перехресне з'єднання> через <comma> (7.7 1.a) та ПРИЄДНУЙТЕСЬ ВКЛ <умова пошуку> через <comma> плюс WHERE (7.7 1.b ).
Як говорить Вікіпедія:
Хрест з'єднати
CROSS JOIN повертає декартовий добуток рядків із таблиць у з'єднанні. Іншими словами, він створить рядки, які поєднують кожен рядок з першої таблиці з кожним рядком з другої таблиці.
Внутрішнє з'єднання
[...] Результат з'єднання можна визначити як результат першого внесення декартового продукту (або перехресного з'єднання) всіх записів у таблицях (поєднання кожного запису в таблиці А з кожним записом у таблиці В), а потім повернення всі записи, які задовольняють присудок приєднання.
"Неявна нотація приєднання" просто перераховує таблиці для приєднання, у пункті FROM оператора SELECT, використовуючи коми для їх розділення. Таким чином, він визначає перехресне з'єднання
Re OUTER JOIN і і використання ON проти WHERE в них бачать умови в LEFT JOIN (OUTER JOIN) проти INNER JOIN .
Навіщо порівнювати стовпці між таблицями?
Коли немає повторюваних рядків:
Кожна таблиця містить рядки, які складають справжню заяву з певного шаблону оператора заповнення [ім'я]. (Це робить справжнє Пропозиція із-- задовольняє --a певного (характерний) предикат .)
Базова таблиця містить рядки, які складають справжнє твердження з деякого шаблону операторів, заданих DBA:
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
Проміжний продукт приєднання містить рядки, які складають справжнє твердження з І шаблонів його операндів:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
*/
FROM Customers C CROSS JOIN Movies M
УВІДКЛЮЧАЙ ТА КОЛИ, де передбачено умови для подання подальшого шаблону. Значення знову - це рядки, що задовольняють шаблону:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
AND C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
AND C.Age = 18
*/
FROM Customers C INNER JOIN Movies M
ON C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
WHERE C.Age = 18
Зокрема, порівняння стовпців для (SQL) рівності між таблицями означає, що рядки, збережені у продукту з частин шаблону об'єднаних таблиць, мають однакове (не-NULL) значення для цих стовпців. Це просто збіг випадків, коли багато рядків зазвичай видаляються порівнянням рівності між таблицями - що необхідно і достатньо, щоб охарактеризувати потрібні рядки.
Просто напишіть SQL для шаблону для потрібних рядків!
Про значення запитів (та таблиць проти умов) див .:
Як отримати відповідні дані з іншої таблиці SQL для двох різних стовпців: Внутрішнє приєднання та / або Союз?
Чи є якесь правило для побудови SQL-запиту з людського читаного опису?
Перевантаження "перехресне з'єднання"
На жаль, термін "перехресне з'єднання" використовується для:
- Проміжний продукт.
- КРОВИЙ ПРИЄДНАЙТЕСЬ.
- (INNER) ПРИЄДНАЙТЕСЬ із ON або WHERE, які не порівнюють жодних стовпців з однієї таблиці з жодними стовпцями іншої. (Оскільки це, як правило, повертає стільки рядів проміжних продуктів.)
Ці різні значення збиваються з пантелику. (Наприклад, в інших відповідях та коментарях тут.)
Використання CROSS JOIN vs (INNER) JOIN проти коми
Загальна конвенція:
- Використовуйте CROSS JOIN тоді і лише тоді, коли ви не порівнюєте стовпці між таблицями. Тобто показати, що відсутність порівнянь була навмисною.
- Використовуйте (INNER) ПРИЄДНАЙТЕСЬ з УВІМКНЕНО, коли і тільки при порівнянні стовпців між таблицями. (Плюс можливо інші умови.)
- Не використовуйте коми.
Зазвичай умови, які не містяться на парах таблиць, зберігаються для WHERE. Але їх, можливо, доведеться поставити в (n INNER) ПРИЄДНУЙТЕСЬ УВІМКНЕНО, щоб отримати відповідні рядки для аргументу ПРИЄДНАЙТЕСЯ ВПРАВО, ВЛІВО або ПОВНО (ВІД).
Повторно "Не використовувати кому" Змішування кома з явним JOIN може ввести в оману, оскільки кома має нижчий пріоритет. Але, враховуючи роль проміжного продукту в значенні CROSS JOIN, (INNER) JOIN та кома, аргументи для вищезгаданої конвенції про те, що він взагалі не використовує, є хиткими. КРІШЕ ПРИЄДНАННЯ або кома подібно до (ВНУТРІШНЬОГО ПРИЄДНАННЯ). Проміжний продукт ON і WHERE всі вводять AND у відповідному предикаті. Однак інше INNER JOIN ON можна думати - скажімо, генеруючи вихідний рядок лише при знаходженні пари вхідних рядків, що задовольняє умові ON - вона, тим не менш, повертає міжрядкові рядки, що задовольняють умові. Єдиною причиною ON довелося доповнювати кому в SQL - писати OUTERПРИЄДНАЄТЬСЯ Звичайно, вираз повинен дати зрозуміти його значення; але те, що зрозуміло, залежить від того, що означають речі.
Діаграми Re Venn Діаграма Венна з двома пересічними колами може ілюструвати різницю між вихідними рядками для ВНУТРІШНЬОГО, ЛІВОГО, ПРАВА та ПОВНОГО ПРИЄДНАННЯ для одного входу. А коли ON безумовно ПРАВИЛЬНИЙ, результат ВНУТРІШНЬОГО ПРИЄДНАННЯ такий же, як CROSS JOIN. Крім того, він може ілюструвати вхідні та вихідні рядки для INTERSECT, UNION & EXCEPT. І коли обидва входи мають однакові стовпці, результат INTERSECT такий же, як і для стандартного SQL NATURAL JOIN, а результат EXCEPT такий же, як для певних ідіом, що включають лівий та правий з'єднання. Але це не ілюструє, як (INNER) JOIN працює в цілому. Це просто здається правдоподібним на перший погляд . Він може ідентифікувати частини вводу та / або виходу дляособливі випадки ON, PK (первинні ключі), FK (зовнішні ключі) та / або SELECT. Все, що вам потрібно зробити, - це визначити, які саме елементи є множинами, представленими колами . (Які заплутані презентації ніколи не стають зрозумілими.) (Пам'ятайте, що загалом для об'єднання вихідні рядки мають різні заголовки від вхідних рядків . А таблиці SQL - мішки, а не набори рядків з NULL .)
CROSS JOIN
приведе до всіх можливих комбінацій таблиць. наприклад Таблиця1 зі 100 рядками та Таблиця2 зі 100 рядками призведе до 10000 записів.