MySQL: быстрая разбивка типов соединений - PullRequest
139 голосов
/ 09 июня 2011

Я хотел бы быстро разбить типы соединений MySQL. Я знаю об этом, остальные я не уверен, что они имеют в виду.

  • запятая (для чего точно это сокращение?): SELECT * FROM a, b WHERE b.id = a.beeId AND ...
  • показать информацию из a, даже если в b нет совпадений: SELECT * FROM a LEFT OUTER JOIN b ON b.id = a.beeId WHERE ...

Я видел другие объединения, но хочу знать, что отличает их, что такое INNER / OUTER, добавление LEFT меняет вещи.

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

Ответы [ 4 ]

427 голосов
/ 09 июня 2011
25 голосов
/ 09 июня 2011

На основе вашего комментария простые определения каждого лучше всего найти в W3Schools В первой строке каждого типа дается краткое объяснение типа соединения

  • JOIN: Возвращать строки, если в обеих таблицах есть хотя бы одно совпадение
  • LEFT JOIN: возвращать все строки из левой таблицы, даже если в правой таблице нет совпадений
  • RIGHT JOIN: Returnвсе строки из правой таблицы, даже если в левой таблице нет совпадений
  • FULL JOIN: возвращать строки, если в одной из таблиц есть совпадения

END EDIT

Вкратце, приведенный вами пример с разделителями-запятыми

SELECT * FROM a, b WHERE b.id = a.beeId AND ...

выбирает каждую запись из таблиц a и b с запятыми, разделяющими таблицы,это также может быть использовано в таких столбцах, как

SELECT a.beeName,b.* FROM a, b WHERE b.id = a.beeId AND ...

. Затем в указанном столбце указывается информация, в которой столбцы b.id и a.beeId имеют совпадение в вашем примере.Так что в вашем примере он получит всю информацию из таблиц a и b, где b.id равен a.beeId.В моем примере он получит всю информацию из таблицы b и только информацию из столбца a.beeName, когда b.id равен a.beeId.Обратите внимание, что есть также предложение AND, это поможет уточнить ваши результаты.

Некоторые простые учебные пособия и пояснения по соединениям mySQL и оставленным соединениям можно найти в учебниках Tizag по MySQL.Вы также можете проверить веб-сайт Кита Дж. Брауна для получения дополнительной информации о соединениях, что также неплохо.

Надеюсь, это поможет вам

11 голосов
/ 30 декабря 2015

Полное внешнее соединение не существует в mysql, вам может понадобиться комбинация левого и правого соединения.

9 голосов
/ 26 апреля 2018

У меня есть две такие таблицы:

> SELECT * FROM table_a;
+------+------+
| id   | name |
+------+------+
|    1 | row1 |
|    2 | row2 |
+------+------+

> SELECT * FROM table_b;
+------+------+------+
| id   | name | aid  |
+------+------+------+
|    3 | row3 |    1 |
|    4 | row4 |    1 |
|    5 | row5 | NULL |
+------+------+------+

INNER JOIN заботится об обеих таблицах

INNER JOIN заботится об обеих таблицах, поэтому вы получаете только строкуесли обе таблицы имеют одну.Если существует более одной совпадающей пары, вы получите несколько строк.

> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
+------+------+------+------+------+

Нет никакого различия для INNER JOIN, если вы измените порядок в обратном порядке, поскольку он заботится об обеих таблицах:

> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
+------+------+------+------+------+

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

LEFT JOIN касается только первой таблицы

LEFT JOIN заботится о первой таблице, которую вы даете, и не заботится о второй, поэтому вы всегда получаете строки из первой таблицы, даже если во второй нет соответствующей строки:

> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
|    2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+

Выше вы можете видеть все строки таблицы table_a, хотя некоторые из них не совпадают ни с чем в таблице b, но не со всеми строками таблицы table_b - только те, которые соответствуют чему-то в table_a.

Если мы обратимсяпорядок таблиц LEFT JOIN ведет себя по-разному:

> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
|    5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+

Теперь мы получаем все строки table_b, но только совпадающие строки table_a.

RIGHT JOIN заботится только о tВторая таблица

a RIGHT JOIN b возвращает вам те же строки, что и b LEFT JOIN a.Единственным отличием является порядок столбцов по умолчанию.

> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
| NULL | NULL |    5 | row5 | NULL |
+------+------+------+------+------+

Это те же строки, что и table_b LEFT JOIN table_a, который мы видели в разделе LEFT JOIN.

Аналогично:

> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
| NULL | NULL | NULL |    2 | row2 |
+------+------+------+------+------+

Это те же строки, что и table_a LEFT JOIN table_b.

Никакое объединение вообще не дает вам копий всего

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

> SELECT * FROM table_b b, table_a;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    3 | row3 | 1    |    2 | row2 |
|    4 | row4 | 1    |    1 | row1 |
|    4 | row4 | 1    |    2 | row2 |
|    5 | row5 | NULL |    1 | row1 |
|    5 | row5 | NULL |    2 | row2 |
+------+------+------+------+------+

(Это из моего сообщения в блоге Примеры типов соединений SQL )

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