MySQL KATILMA Öğretici: İÇ, DIŞ, SOL, SAĞ, ÇAPRAZ
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, SQL öğrenenler arasında en yanlış anlaşılan konudur. Basitlik ve anlaşılırlık adına, örnek alıştırma yapmak için yeni bir Veritabanı kullanacağız. Aşağıda gösterildiği gibi
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 |
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 |
Birleştirme türleri
Ç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
İç 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, kiraladıkları filmlerin adlarıyla birlikte almak istiyorsunuz. Bunun için, her iki tablodan da verilen koşulları karşılayan satırları döndüren INNER JOIN'i 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
MySQL Dış JOIN'ler her iki tablodan 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 Workbench veriyor. Kiralanmayan filmler için aşağıda listelenen dönen sonuçta üye adı alanlarının NULL değerde olduğunu görebilirsiniz. Bu, söz konusu film için hiçbir eşleşen üyenin üye tablosunu bulamadığı 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
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 ve JOIN'lerle KULLANIM diğer birçok şeyi kullanabilirsiniz MySQL gibi hükümler GRUPLAMAYA GÖRE, NEREYE GÖRE ve hatta gibi işlevler SUM, AVG, vb.
Neden birleştirme kullanmalıyız?
Ş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ı.
ÖZET
- JOINS, birden fazla tablodaki verileri tek bir sonuç kümesinde birleştirmemize olanak tanır.
- JOINS, alt sorgularla karşılaştırıldığında daha iyi performansa sahiptir
- INNER JOINS yalnızca verilen kriterleri karşılayan satırları döndürür.
- OUTER JOINS ayrıca hiçbir eşleşmenin bulunmadığı satırları da döndürebilir. Eşleşmeyen satırlar NULL anahtar sözcüğüyle döndürülür.
- Başlıca JOIN türleri arasında İç, Sol Dış, Sağ Dış, Çapraz JOINS vb. bulunur.
- JOIN işlemlerinde sıklıkla kullanılan cümle “ON”dur. “USING” cümlesi eşleşen sütunların aynı isimde olmasını gerektirir.
- JOINS aynı zamanda GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS vb. gibi diğer maddelerde de kullanılabilir.