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.

Birleştirme türleri

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.

INNER JOIN

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.

Dış JOIN'ler

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
Note: Null is returned for non-matching rows on right

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

DOĞRU BİRLEŞTİR

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
Note: Null is returned for non-matching rows on left

“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.