Bunun gibi 2 tablo var:
> 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 her iki tabloya da önem veriyor
INNER JOIN her iki tabloya da önem verir, bu nedenle yalnızca her iki tabloda bir tane varsa bir satır alırsınız. Birden fazla eşleşen çift varsa, birden çok satır alırsınız.
> 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 |
+------+------+------+------+------+
Her iki tabloyu önemsediğinden, siparişi tersine çevirirseniz INNER JOIN ile hiçbir fark yaratmaz:
> 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 |
+------+------+------+------+------+
Aynı satırları alırsınız, ancak tabloları farklı bir sırayla belirttiğimiz için sütunlar farklı bir sıradadır.
LEFT JOIN sadece ilk masayı önemsiyor
LEFT JOIN, verdiğiniz ilk tabloyu önemsiyor ve ikincisini fazla önemsemiyor, bu nedenle ikinci tabloda karşılık gelen bir satır olmasa bile, her zaman ilk tablodaki satırları alırsınız:
> 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 |
+------+------+------+------+------+
Yukarıda, bazıları tablo b'deki herhangi bir şeyle eşleşmese de tüm table_a satırlarını görebilirsiniz, ancak tüm table_b satırlarını değil - yalnızca table_a'daki bir şeyle eşleşen satırları görebilirsiniz.
Tabloların sırasını tersine çevirirsek, LEFT JOIN farklı davranır:
> 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 |
+------+------+------+------+------+
Şimdi tüm table_b satırlarını alıyoruz, ancak yalnızca eşleşen table_a satırlarını alıyoruz.
RIGHT JOIN sadece ikinci masayı önemsiyor
a RIGHT JOIN b
tam olarak aynı satırları alır b LEFT JOIN a
. Tek fark, sütunların varsayılan sırasıdır.
> 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 |
+------+------+------+------+------+
Bu, table_b LEFT JOIN table_a
SOL GİRİŞ bölümünde gördüğümüz satırlarla aynı .
Benzer şekilde:
> 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 |
+------+------+------+------+------+
İle aynı satırlardır table_a LEFT JOIN table_b
.
Hiçbir katılma size her şeyin kopyalarını verir
Tablolarınızı virgülle ayrılmış olarak hiçbir JOIN yan tümcesi olmadan yazarsanız, ikinci tablonun her satırının yanına yazılan ilk tablonun her satırını her olası kombinasyonda alırsınız:
> 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 |
+------+------+------+------+------+
(Bu benim blog yazımdan SQL birleştirme türleri örnekleri )