Когда использовать LEFT JOIN, а когда использовать INNER JOIN?

Не совсем ..

цитата из docs

Псевдокласс класса :nth-child соответствует элементу с + b -1 братья и сестры перед ним в дереве документов, для данного положительного или нулевого значения для n и имеет родительский элемент.

blockquote>

Он является селектором и не сочетается с классами , В вашем правиле он просто должен удовлетворять обоим селекторам одновременно, поэтому он отображает строки таблицы :nth-child(even), если они также имеют класс .row.

29
задан Interrobang 21 March 2012 в 03:17
поделиться

5 ответов

Есть ли подвох? Да, есть - левые соединения являются формой внешнего соединения, в то время как внутренние соединения являются формой, ну, в общем, внутреннего соединения.

Вот примеры, которые показывают разницу. Начнем с базовых данных:

mysql> select * from j1;
+----+------------+
| id | thing      |
+----+------------+
|  1 | hi         |
|  2 | hello      |
|  3 | guten tag  |
|  4 | ciao       |
|  5 | buongiorno |
+----+------------+

mysql> select * from j2;
+----+-----------+
| id | thing     |
+----+-----------+
|  1 | bye       |
|  3 | tschau    |
|  4 | au revoir |
|  6 | so long   |
|  7 | tschuessi |
+----+-----------+

И здесь мы увидим разницу между внутренним соединением и левым соединением:

mysql> select * from j1 inner join j2 on j1.id = j2.id;
+----+-----------+----+-----------+
| id | thing     | id | thing     |
+----+-----------+----+-----------+
|  1 | hi        |  1 | bye       |
|  3 | guten tag |  3 | tschau    |
|  4 | ciao      |  4 | au revoir |
+----+-----------+----+-----------+

Хмм, 3 строки. 117]

mysql> select * from j1 left join j2 on j1.id = j2.id;
+----+------------+------+-----------+
| id | thing      | id   | thing     |
+----+------------+------+-----------+
|  1 | hi         |    1 | bye       |
|  2 | hello      | NULL | NULL      |
|  3 | guten tag  |    3 | tschau    |
|  4 | ciao       |    4 | au revoir |
|  5 | buongiorno | NULL | NULL      |
+----+------------+------+-----------+

Ух ты, 5 рядов! Что произошло?

Внешние объединения, такие как left join, сохраняют строки, которые не совпадают, поэтому строки с идентификаторами 2 и 5 сохраняются в запросе левого соединения. Остальные столбцы заполнены NULL.

Другими словами, левые и внутренние соединения не являются взаимозаменяемыми.

98
ответ дан Matt Fenwick 21 March 2012 в 03:17
поделиться

Вот грубый ответ, вот как я думаю об объединениях. Надеясь, что это будет более полезным, чем очень точный ответ из-за вышеупомянутых математических вопросов ...; -)

Внутренние объединения сужают набор возвращаемых строк. Внешние объединения (левые или правые) не изменяют количество возвращаемых строк, а просто «подбирают» дополнительные столбцы, если это возможно.

В вашем первом примере результатом будут строки из AECounts, которые соответствуют условиям, указанным в таблице 1_low_level_term. Затем для этих строк он пытается соединиться с 1_pref_term и 1_soc_term. Но если совпадений нет, строки остаются, а объединенные столбцы равны нулю.

12
ответ дан Leigh 21 March 2012 в 03:17
поделиться

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

Используйте левое соединение, когда вам нужны все результаты из таблицы A, но если в таблице B есть данные, относящиеся к некоторым записям таблицы A, то вы также хотите использовать эти данные в том же запросе.

Используйте полное объединение, когда хотите получить все результаты из обеих таблиц.

1
ответ дан Seung Bae Im 21 March 2012 в 03:17
поделиться

Для новичков, потому что это помогло мне, когда я был один: INNER JOIN всегда является подмножеством LEFT или RIGHT JOIN, и все они всегда являются подмножествами FULL JOIN. Это помогло мне понять основную идею.

0
ответ дан Scott 21 March 2012 в 03:17
поделиться

INNER JOIN вернет только те строки, в которых есть совпадающие значения в обеих таблицах, тогда как LEFT JOIN вернет ВСЕ строки из таблицы LEFT, даже если в таблице RIGHT нет подходящей строки

Быстрый пример

TableA
ID   Value
1    TableA.Value1
2    TableA.Value2
3    TableA.Value3

TableB
ID   Value
2    TableB.ValueB
3    TableB.ValueC

ВНУТРЕННЕЕ СОЕДИНЕНИЕ производит:

SELECT a.ID,a.Value,b.ID,b.Value 
FROM TableA a INNER JOIN TableB b ON b.ID = a.ID

a.ID    a.Value            b.ID    b.Value
2       TableA.Value2      2       TableB.ValueB
3       TableA.Value3      3       TableB.ValueC

СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ производит:

SELECT a.ID,a.Value,b.ID,b.Value 
FROM TableA a LEFT JOIN TableB b ON b.ID = a.ID

a.ID    a.Value            b.ID    b.Value
1       TableA.Value1      NULL    NULL
2       TableA.Value2      2       TableB.ValueB
3       TableA.Value3      3       TableB.ValueC

Как вы можете видеть, СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ включает строка из TableA, где ID = 1, даже если в TableB нет совпадающей строки, где ID = 1, тогда как INNER JOIN исключает эту строку именно потому, что в TableB нет соответствующей строки

HTH

5
ответ дан philf2b 21 March 2012 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: