При выборе из соединенных таблиц в MySQL выполняются ли операции объединения перед выбором? - PullRequest
0 голосов
/ 01 марта 2019

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

Вот пример запроса:

select name, title from instructor natural join teaches, course 
  where teaches.course_id = course.course_id;

Присоединение происходит ДО выбора, верно?Поэтому, если я когда-либо захочу сгенерировать запрос из атрибутов, которые существуют в разных таблицах, я могу просто выбрать те, которые мне нужны, без необходимости указывать, что они находятся в разных таблицах, потому что, как только они объединены, команда select работает с этим объединенным отношениема не два отдельных отношения?

1 Ответ

0 голосов
/ 01 марта 2019

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

Предположим, у вас есть таблицы:

mysql> create table A (c1 int, c2 int, c3 int);
mysql> create table B (c4 int, c5 int, c6 int);
mysql> insert into A values (1,2,3); 
mysql> insert into B values (4,5,6);

Вы можете запросить FROM A JOIN B ON ...condition..., и теперь ваши предложения WHERE и SELECT применяются к набору строк с шестью столбцами.

mysql> select * from a join b;
+------+------+------+------+------+------+
| c1   | c2   | c3   | c4   | c5   | c6   |
+------+------+------+------+------+------+
|    1 |    2 |    3 |    4 |    5 |    6 |
+------+------+------+------+------+------+

Таким образом, вы можете делать такие вещи, как:

WHERE c1 = 123 AND c4 = 456

И он проверяет каждую объединенную строку, поэтому вы можете ссылаться на любой столбец из любой таблицы, как если быони в одном ряду.Фактически, они являются в той же строке в результате объединения.

Аналогично, вы можете ссылаться на любой из этих столбцов в списке SELECT.

SELECT c2, c6 FROM ...

Что если в обеих таблицах существует столбец с одинаковым именем?Именно тогда вы должны квалифицировать имена столбцов с помощью синтаксиса table.column, чтобы не было неоднозначно, какой вы имеете в виду.

PS: вы должны привыкнуть использовать синтаксис JOIN для всех ваших таблиц.Не используйте старый синтаксис в стиле запятой.Смешивание двух стилей синтаксиса доставит вам неожиданные проблемы из-за порядка приоритета.Прочитайте https://dev.mysql.com/doc/refman/8.0/en/join.html в разделе, где вы найдете "JOIN имеет более высокий приоритет, чем оператор запятой (,) ..."

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