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şkilidir.Not: JOIN, SQL hakkında bilgi sahibi olanlar arasında en yanlış anlaşılan konudur. Basitlik ve anlaşılma kolaylığı adına, örnek alıştırma yapmak için yeni bir Veritabanı kullanacağız. Aşağıda gösterildiği gibi
İD | İsim | Soyadı | movie_id |
---|---|---|---|
1 | Adam | Smith | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
6 | Lee | Pong | 10 |
İD | Başlık | kategori |
---|---|---|
1 | ASSASSIN'İN YARATILDI: EMBERS | Animasyonlar |
2 | Gerçek Çelik (2012) | Animasyonlar |
3 | Alvin ve Sincaplar | Animasyonlar |
4 | Tintin'in Maceraları | Animasyonlar |
5 | Güvenli (2012) | Aksiyon |
6 | Güvenli Ev (2012) | Aksiyon |
7 | GIA | 18+ |
8 | Son tarih 2009 | 18+ |
9 | Kirli Resim | 18+ |
10 | Marley ve ben | Romantik |
Birleştirme türleri
Çapraz KATIL
Cross JOIN, bir veritabanı tablosundaki her satırı diğerinin tüm satırlarıyla eşleştiren en basit bir JOIN biçimidir.
Başka bir deyişle, bize ilk tablonun her satırının ikinci tablodaki tüm kayıtların kombinasyonunu verir.
Tüm üye kayıtlarını tüm film kayıtlarına karşı almak istediğimizi varsayalım, istediğimiz sonuçları almak için aşağıda gösterilen komut dosyasını kullanabiliriz.
SELECT * FROM `movies` CROSS JOIN `members`
Yukarıdaki betiği MySQL çalışma tezgahında çalıştırmak bize aşağıdaki 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 |
İÇ BİRLEŞİM
İçteki JOIN, her iki tablodan verilen koşulu sağlayan satırları döndürmek için kullanılır.
Diyelim ki, film kiralayan üyelerin listesini, kiraladıkları filmlerin başlıklarıyla birlikte almak istiyorsunuz. Bunun için, her iki tablodan verilen koşulları sağlayan satırları döndüren bir INNER JOIN kullanabilirsiniz.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
Yukarıdaki betiği çalıştırmak
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 gibi yazılabileceğini unutmayın.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Dış BİRLEŞTİRMELER
MySQL Outer 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. Eşleşme bulunmazsa, birleştirilen tablonun kayıtları için NULL değerleri döndürür .
Kafa karıştırıcı Sesler? Bir örneğe bakalım -
SOL YÖNDEN KATILIM
Şimdi, tüm filmlerin başlıklarını, onları kiralayan üyelerin adlarıyla birlikte almak istediğinizi varsayalım. Bazı filmlerin hiç kimse tarafından kiralanmadığı açık. Bu amaçla sadece LEFT JOIN kullanabiliriz .
LEFT JOIN, sağdaki tabloda eşleşen satır bulunmasa bile soldaki tablodan tüm satırları döndürür. Sağdaki tabloda herhangi bir eşleşme bulunamadığında, NULL döndürülür.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Yukarıdaki scripti MySQL tezgahında çalıştırmak size verir.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 eşleşen üye bulunmadığı 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çası LEFT JOIN'in tersidir. SAĞ BİRLEŞTİRME, soldaki tabloda eşleşen satır bulunmasa bile sağdaki tablodan tüm sütunları döndürür. Soldaki tabloda herhangi bir eşleşme bulunamadığında, NULL döndürülür.
Örneğimizde, üyelerin ve kiraladıkları filmlerin adlarını almanız gerektiğini varsayalım. Şimdi henüz film kiralamamış yeni bir üyemiz var
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
Yukarıdaki betiği MySQL çalışma tezgahında çalıştırmak aşağıdaki sonuçları verir.
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" maddeleri
Yukarıdaki JOIN sorgu örneklerinde, tablo arasındaki kayıtları eşleştirmek için ON cümlesini kullandık.
USING maddesi de aynı amaç için kullanılabilir. İle farkı KULLANMA öyle her iki tabloda eşleşen sütunlar için aynı isimleri olması gerekir.
Şimdiye kadar "filmler" tablosunda birincil anahtarını "id" adıyla kullandık. Aynı "üyeler" tablosunda "movie_id" adıyla bahsettik.
"Movies" tablolarının "id" alanını "movie_id" adını alacak ş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;
Sonra yukarıdaki LEFT JOIN örneğiyle KULLANIMI kullanalım.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
ON kullanmanın ve JOIN'lerle KULLANIMIN dışında GROUP BY, WHERE gibi diğer birçok MySQL cümlesini ve hatta SUM , AVG , vb. Gibi işlevleri kullanabilirsiniz .
Neden birleştirme kullanmalıyız?
Şimdi, sorguları çalıştırarak aynı görevi yapabildiğimizde neden JOIN kullandığımızı düşünebilirsiniz. Özellikle veritabanı programlama konusunda biraz tecrübeniz varsa, sorguları tek tek çalıştırabileceğimizi biliyorsunuz, 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. Öte yandan MySQL, Endekslemeyi kullanabildiği için JOIN'ler ile daha iyi performans elde edebilir. Birden çok sorgu çalıştırmak yerine tek bir JOIN sorgusu kullanmak, sunucu ek yükünü azaltır. Bunun yerine, MySQL ve uygulamalar (yazılım) arasında daha fazla veri aktarımına yol açan birden çok sorgu kullanmak. Dahası, uygulama tarafında da daha fazla veri manipülasyonu gerektirir.
JOIN'leri kullanarak daha iyi MySQL ve uygulama performansları elde edebileceğimiz açıktır.
Özet
- BİRLEŞTİRMELER, birden fazla tablodaki verileri tek bir sonuç kümesinde birleştirmemize izin verir.
- JOINS, alt sorgulara kıyasla daha iyi performansa sahiptir
- INNER JOINS yalnızca verilen kriterleri karşılayan satırları döndürür.
- OUTER JOINS, hiçbir eşleşme bulunmayan 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 BİRLEŞİMLER vb. Bulunur.
- JOIN işlemlerinde sık kullanılan cümle "ON" dur. "USING" yan tümcesi, eşleşen sütunların aynı ada sahip olmasını gerektirir.
- JOINS, GROUP BY, WHERE, SUB SORGULAR, TOPLAMA İŞLEVLERİ vb. Gibi diğer maddelerde de kullanılabilir.