MySQL Birleştirme: İç, Dış, Sol, Sağ, Çapraz
⚡ Akıllı Özet
MySQL JOIN işlemleri, iki veya daha fazla ilişkili tablodan gelen satırları tek bir sonuç kümesinde birleştirir. Bu kaynak, pratik veritabanı çalışmaları için çalıştırılabilir sorgular, örnek veriler ve açık çıktı tablolarıyla CROSS, INNER, LEFT, RIGHT ve OUTER JOIN işlemlerini açıklamaktadır.

JOINS nedir?
Birleştirmeler, iki veya daha fazla veritabanı tablosundan veri alınmasına yardımcı olur.
Tablolar, birincil ve yabancı anahtarlar kullanılarak karşılıklı olarak ilişkilendirilir.
Not: JOIN işlemi, SQL öğrenenler arasında en çok yanlış anlaşılan konulardan biridir. Basitlik ve kolay anlaşılabilirlik adına, örnek uygulama için yeni bir veritabanı kullanacağız. Aşağıda gösterildiği gibi.
Aşağıdaki örneklerin her birinde bu iki tablo kullanılmıştır. film_id sütun üyeler işaret ediyor id sütun filmler — her bir JOIN işleminin eşleştiği ilişki.
üyeler
| id | İsim | soyadı | film_id |
|---|---|---|---|
| 1 | Adem | Demirci | 1 |
| 2 | Ravi | Kumar | 2 |
| 3 | Susan | Davidson | 5 |
| 4 | Jenny | Adrianna | 8 |
| 5 | Rüzgâraltı | Gürültü | 10 |
filmler
| id | başlık | kategori |
|---|---|---|
| 1 | ASSASSIN'S CREED: KÖRLER | animasyonlar |
| 2 | Gerçek Çelik(2012) | animasyonlar |
| 3 | Alvin ve Sincaplar | animasyonlar |
| 4 | Tintin'in Maceraları | animasyonlar |
| 5 | Güvenli (2012) | Action |
| 6 | Güvenli Ev(2012) | Action |
| 7 | GIA | 18+ |
| 8 | Son tarih 2009 | 18+ |
| 9 | Kirli Resim | 18+ |
| 10 | marley ve ben | Romantizm |
JOIN işlemlerini neden kullanmalıyız?
Her bir JOIN türüne bakmadan önce, neden birden fazla sorgu çalıştırmak yerine JOIN işleminin tercih edildiğini bilmekte fayda var.
Şimdi aynı görevi sorgu çalıştırarak yapabiliyorken neden JOIN'leri kullandığımızı düşünebilirsiniz. Özellikle veritabanı programlama konusunda biraz deneyiminiz varsa, sorguları tek tek çalıştırabileceğimizi biliyorsanız, her birinin çıktısını ardışık sorgularda kullanın. Elbette bu mümkün. Ancak JOIN'leri kullanarak herhangi bir arama parametresiyle yalnızca tek bir sorgu kullanarak işi halledebilirsiniz. Diğer taraftan MySQL daha iyi performans elde edebilir İndekslemeyi kullanabildiği için JOIN'lerle. Birden fazla sorgu çalıştırmak yerine tek bir JOIN sorgusunun kullanılması sunucu yükünü azaltır. Bunun yerine birden fazla sorgu kullanmak, bu durum arasında daha fazla veri aktarımına yol açar MySQL ve uygulamalar (yazılım). Ayrıca uygulama sonunda daha fazla veri manipülasyonu gerektirir.
Daha iyiye ulaşabileceğimiz açık MySQL ve JOIN'lerin kullanımıyla uygulama performansları.
Birleştirme Türleri
MySQL Bu, aynı iki tablo hakkında farklı soruları yanıtlayan çeşitli JOIN türlerini destekler. Aşağıdaki tabloda bunlar karşılaştırılmıştır; her tür daha sonra bir sorgu ve çıktısıyla gösterilmiştir.
| BİRLEŞTİRME türü | Satırlar döndürüldü | Sonuçta NULL değerler mi var? | Tipik kullanım |
|---|---|---|---|
| ÇAPRAZ KATIL | A tablosunun her satırı, B tablosunun her satırıyla eşleştirildi. | Yok hayır | Tüm olası kombinasyonları oluşturma |
| INNER JOIN | Yalnızca her iki tabloda da koşulu sağlayan satırlar | Yok hayır | Film kiralayan üyeler |
| SOL KATILIN | Soldaki tablodaki tüm satırlar, artı sağdaki tablodaki eşleşmeler. | Evet, sağ tarafta | Tüm filmler, hatta hiç kiralanmamış olanlar bile. |
| DOĞRU BİRLEŞTİR | Sağdaki tablodaki tüm satırlar, artı soldaki tablodaki eşleşmeler. | Evet, sol tarafta | Üye olmasa bile tüm filmler |
ÇAPRAZ KATIL
Çapraz JOIN, bir veritabanı tablosundaki her satırı diğerinin tüm satırlarıyla eşleştiren en basit JOIN biçimidir.
Başka bir deyişle, bize ilk tablonun her satırının ikinci tablodaki tüm kayıtlarla kombinasyonlarını verir.
Diyelim ki tüm üye kayıtlarını tüm film kayıtlarına karşı elde etmek istiyoruz, istediğimiz sonuçları elde etmek için aşağıda gösterilen komut dosyasını kullanabiliriz.
SELECT * FROM `movies` CROSS JOIN `members`
Yukarıdaki betiğin çalıştırılması MySQL tezgâh bize şu sonuçları verir.
| id | title | id | first_name | last_name | movie_id | |
|---|---|---|---|---|---|---|
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
| 2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
| 2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
| 2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
| 2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
| 2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
| 3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
| 3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
| 3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
| 3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
| 3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
| 4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
| 4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
| 4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
| 4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
| 4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
| 5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
| 5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
| 5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
| 5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
| 5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
| 6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
| 6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
| 6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
| 6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
| 6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
| 7 | GIA | 18+ | 1 | Adam | Smith | 1 |
| 7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
| 7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
| 7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
| 7 | GIA | 18+ | 6 | Lee | Pong | 10 |
| 8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
| 8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
| 8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
| 8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
| 8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
| 9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
| 9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
| 9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
| 9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
| 9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
| 10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
| 10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
| 10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
| 10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
| 10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
INNER JOIN
Çapraz birleştirme (CROSS JOIN) her olası eşleşmeyi döndürür ki bu nadiren istediğiniz şeydir. İç birleştirme (INNER JOIN) ise sonucu gerçekten ilişkili olan eşleşmelere indirger.
İç JOIN, her iki tablodan da verilen koşulu karşılayan satırları döndürmek için kullanılır.
Diyelim ki, film kiralayan üyelerin listesini ve kiraladıkları filmlerin başlıklarını almak istiyorsunuz. Bunun için, verilen koşulları sağlayan her iki tablodan da satırları döndüren bir INNER JOIN kullanabilirsiniz.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
Yukarıdaki betiği çalıştırmak, ver
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
Aynı sonuçları elde etmek için yukarıdaki sonuç komut dosyasının aşağıdaki şekilde de yazılabileceğini unutmayın.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members` AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
Dış JOIN'ler
INNER JOIN, eşleşmesi olmayan satırları sessizce atar. Eşleşmeyen satırlar önemliyse, OUTER JOIN doğru seçimdir.
MySQL Dış birleştirmeler (outer JOIN), her iki tablodan da eşleşen tüm kayıtları döndürür.
Birleştirilmiş tabloda eşleşmeyen kayıtları tespit edebilir. Geri dönüyor NULL Eşleşme bulunmazsa birleştirilmiş tablonun kayıtlarına ilişkin değerler.
Kafa karıştırıcı mı geliyor? Bir örneğe bakalım –
SOL KATILIN
Şimdi tüm filmlerin adlarını, onları kiralayan üyelerin adlarıyla birlikte almak istediğinizi varsayalım. Bazı filmlerin hiç kimse tarafından kiralanmadığı açıktır. Basitçe kullanabiliriz SOL KATILIN amacıyla.
LEFT JOIN, sağdaki tabloda eşleşen satır bulunmasa bile soldaki tablodaki tüm satırları döndürür. Sağdaki tabloda hiçbir eşleşme bulunmadığında NULL döndürülür.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B ON B.`movie_id` = A.`id`
Yukarıdaki betiğin çalıştırılması MySQL Çalışma tezgahı bunu sağlıyor. Aşağıda listelenen sonuçta, kiralanmamış filmler için üye adı alanlarının NULL değerlere sahip olduğunu görebilirsiniz. Bu, söz konusu film için üye tablosunda eşleşen bir üye bulunamadığı anlamına gelir.
| title | first_name | last_name |
|---|---|---|
| ASSASSIN'S CREED: EMBERS | Adam | Smith |
| Real Steel(2012) | Ravi | Kumar |
| Safe (2012) | Susan | Davidson |
| Deadline(2009) | Jenny | Adrianna |
| Marley and me | Lee | Pong |
| Alvin and the Chipmunks | NULL | NULL |
| The Adventures of Tin Tin | NULL | NULL |
| Safe House(2012) | NULL | NULL |
| GIA | NULL | NULL |
| The Dirty Picture | NULL | NULL |
DOĞRU BİRLEŞTİR
RIGHT JOIN açıkça LEFT JOIN'in tam tersidir. RIGHT JOIN, soldaki tabloda eşleşen satır bulunmasa bile sağdaki tablonun tüm sütunlarını döndürür. Soldaki tabloda hiçbir eşleşme bulunmadığında NULL döndürülür.
Örneğimizde üyelerin isimlerini ve onlar tarafından kiralanan filmleri almanız gerektiğini varsayalım. Artık henüz film kiralamamış yeni bir üyemiz var
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Yukarıdaki betiğin çalıştırılması MySQL workbench aşağıdaki sonuçları veriyor.
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
| NULL | NULL | Alvin and the Chipmunks |
| NULL | NULL | The Adventures of Tin Tin |
| NULL | NULL | Safe House(2012) |
| NULL | NULL | GIA |
| NULL | NULL | The Dirty Picture |
“ON” ve “USING” cümleleri
Şu ana kadar yapılan tüm sorgular, ON koşulu içeren satırlarla eşleşti. MySQL Eşleşen sütunlar aynı adı paylaştığında daha kısa bir alternatif sunar.
Yukarıdaki JOIN sorgu örneklerinde, tablo arasındaki kayıtları eşleştirmek için ON cümlesini kullandık.
USING cümlesi de aynı amaç için kullanılabilir. Farkı KULLANMA öyle her iki tablodaki eşleşen sütunlar için aynı adlara sahip olması gerekir.
Şu ana kadar “movies” tablosunda birincil anahtarını “id” adıyla kullandık. Aynısını “üyeler” tablosunda “movie_id” adıyla anmıştık.
“movies” tablolarının “id” alanını “movie_id” ismine sahip olacak şekilde yeniden adlandıralım. Bunu aynı eşleşen alan adlarına sahip olmak için yapıyoruz.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Daha sonra yukarıdaki LEFT JOIN örneğiyle USING'i kullanalım.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B USING ( `movie_id` )
Kullanmanın dışında ON hem de JOIN'lerle KULLANIM diğer birçok şeyi kullanabilirsiniz MySQL gibi hükümler GROUP BY, NEREDE ve hatta gibi işlevler SUM, AVG, vb.




