MySQL Eğiticiye KATILIR: İÇ, DIŞ, SOL, SAĞ, ÇAPRAZ

Anonim

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

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

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