Birden Çok Tabloyu Birleştirme

0
Share

Verilerden anlamlı bir şey elde etmek istiyorsanız, neredeyse her zaman birden çok tabloyu birleştirmeniz gerekir. Bu makalede, farklı tür birleştirmeler kullanarak bunun nasıl yapılacağını göstereceğiz. Bunu başarmak için INNER JOIN’leri ve LEFT JOIN’leri birleştireceğiz. Haydi başlayalım.

Model

Aşağıdaki resimde mevcut modeli görebilirsiniz. 6 tablodan oluşuyor ve biz bunu daha önceki makalelerde aşağı yukarı açıklamıştık.

veri örneği

Yine de, açıklama yapılmasa bile, veritabanı iyi bir şekilde modellenmiş ve sunulmuşsa (isimleri akıllıca seçmek, adlandırma kurallarını kullanmak, tüm model boyunca aynı kuralları takip etmek, şemadaki çizgiler / ilişkiler gereğinden fazla örtüşmez), İhtiyaç duyduğunuz verileri nerede bulabileceğinize karar verebilirsiniz. Bu çok önemlidir çünkü birden fazla tabloyu birleştirmeden önce bu tabloları tanımlamanız gerekir.

Bu dizinin ilerleyen bölümlerinde, adlandırma kuralı ve SQL sorguları yazarken nasıl düşüneceğinizle ilgili tavsiyeler hakkında konuşacağız. Şimdiye kadar, bu modelin oldukça basit olduğu ve bunu oldukça kolay bir şekilde yapabildiğimiz gerçeğiyle yaşayalım.

Şimdiye kadar ne biliyoruz?

Bu seride şunları ele aldık:

  • SQL SELECT deyimiyle ilgili temel bilgiler ve
  • Karşılaştırıldığında INNER JOIN ve LEFT JOIN

Bu iki makaleden elde edilen bilgileri kullanacağız ve bunları birden çok tabloyu birleştirecek daha karmaşık SELECT ifadeleri yazmak için birleştireceğiz.

INNER JOIN kullanarak birden fazla tabloyu birleştirin

Analiz edeceğimiz ilk örnek, yalnızca INNER JOIN’leri kullanarak birden çok tablodan verilerin nasıl alınacağıdır. Her örnek için, çözmemiz gereken sorunun tanımı ve işi yapan sorguyla gideceğiz. Öyleyse ilk problemle başlayalım.

# 1 Tüm çağrıları başlangıç ​​ve bitiş saatleriyle listelemeliyiz. Her arama için, sonucun ne olduğunu ve bu aramayı yapan çalışanın adını ve soyadını göstermek istiyoruz. Çağrılarımızı artan başlangıç ​​zamanına göre sıralayacağız.

Sorguyu yazmadan önce kullanmamız gereken tabloları belirleyeceğiz. Bunu yapmak için ihtiyacımız olan verileri hangi tabloların içerdiğini belirlememiz ve bunları dahil etmemiz gerekir. Ayrıca, bu tablolar arasındaki yol boyunca tüm tabloları dahil etmeliyiz – gerekli verileri içermeyen ancak bunu yapan tablolar arasında bir ilişki görevi gören tablolar (burada durum böyle değildir).

birden çok masayı birleştirin - tablo gerekli

İşi yapan sorgu aşağıda verilmiştir:

SELECT employee.first_name, employee.last_name, call.start_time, call.end_time, call_outcome.outcome_textFROM employeeINNER JOIN call ON call.employee_id = employee.idINNER JOIN call_outcome ON call.call_outcome_id = call_outcome.idORDER BY call.start_time ASC;

Sorgu sonucu aşağıda verilmiştir:

İÇ BİRLEŞİM

Burada belirtmek istediğim birkaç şey var:

  • Katıldığımız tablolar burada çünkü ihtiyacımız olan veriler bu 3 tabloda yer alıyor
  • Herhangi bir tablodaki herhangi bir öznitelikten bahsettiğimde, tablo_adı . öznitelik_adı biçimini kullanıyorum (örneğin, çalışanın.first_name ). Bu gerekli olmasa da, iyi bir uygulamadır, çünkü bazen aynı sorgudaki 2 veya daha fazla tablo aynı öznitelik adlarını kullanabilir ve bu bir hataya neden olabilir
  • 3 masayı birleştirmek için INNER JOIN’i 2 kez kullandık. Bu, yalnızca başka bir tablodaki çiftleri olan satırların döndürülmesiyle sonuçlanacaktır.
  • Birden çok tabloyu birleştirmek için yalnızca INNER JOIN’leri kullandığınızda, bu tabloların birleşimlerdeki sırası önemli değildir. Tek önemli şey, “AÇIK” dan sonra uygun birleştirme koşullarını kullanmanızdır (yabancı anahtarları kullanarak birleştirin)

Tüm aramalarda ilgili çalışan ve arama sonucu olduğundan, INNER JOIN yerine LEFT JOIN kullansaydık aynı sonucu alırdık.

LEFT JOIN kullanarak birden çok tabloyu birleştirin

LEFT JOIN kullanan sorgular yazmak, INNER JOIN’leri kullanarak sorgu yazmaya kıyasla çok farklı değildir. Elbette sonuç farklı olacaktır (en azından bazı kayıtların diğer tablolarda bir çifti olmadığı durumlarda).

Çözmek istediğimiz sorun bu.

# 2 Bu ülkelerle ilgili tüm ilçeleri ve müşterileri listeleyin. Her ülke adını İngilizce olarak gösterir, şehirdeki müşterinin adı ve o müşterinin adı bulunur. İlgili şehirleri ve müşterileri olmayan ülkeleri bile geri getirin.

İhtiyacımız olan verileri içeren tablolar aşağıdaki resimde yer almaktadır:

ülke şehir müşterisi

Öncelikle bu 3 tablonun içeriğini hızlıca kontrol edelim.

tablo verilerini kontrol et

İki önemli şeyi fark edebiliriz:

  • Her şehrin ilişkili bir ülkesi olsa da , tüm ülkelerin ilişkili şehirleri yoktur (İspanya ve Rusya’da bu şehirler yoktur)
  • Aynı müşteriler için geçerli. Her müşterinin tanımlı city_id değeri vardır , ancak yalnızca 3 şehir kullanılmaktadır (Berlin, Zagreb ve New York)

Önce INNER JOIN kullanarak sorguyu yazalım:

SELECT country.country_name_eng, city.city_name, customer.customer_nameFROM countryINNER JOIN city ON city.country_id = country.idINNER JOIN customer ON customer.city_id = city.id;

Sorgu sonucu aşağıdaki resimde gösterilmektedir:

İÇ BİRLEŞİM

Veritabanımızda 7 ilçe ve 6 şehir var, ancak sorgumuz yalnızca 4 satır döndürüyor. Bu, veritabanımızda yalnızca 4 müşterimizin olduğu gerçeğinin bir sonucudur. Bu 4’ünün her biri kendi şehri ile ilgilidir ve şehir, ülke ile ilgilidir. Böylece, INNER JOIN müşterisiz tüm bu ülkeleri ve şehirleri ortadan kaldırdı. Ama bunları sonuca nasıl dahil edebilirim?

Bunu yapmak için LEFT JOIN kullanacağız. Tüm “İÇ” i “LEFT” ile değiştireceğiz, böylece sorgumuz şu şekildedir:

SELECT country.country_name_eng, city.city_name, customer.customer_nameFROM countryLEFT JOIN city ON city.country_id = country.idLEFT JOIN customer ON customer.city_id = city.id;

Sonuç aşağıdaki resimde gösterilmektedir:

SOL YÖNDEN KATILIM

Artık tüm ülkeleri, hatta ilgili şehirleri olmayanlar (Rusya ve İspanya) ve müşterisi olmayanlar (Varşova, Belgrad ve Los Angeles) dahil tüm şehirlere sahip olduğumuzu kolayca fark edebilirsiniz. Kalan 4 satır, INNER JOIN kullanan sorgudakiyle aynıdır.

LEFT JOIN – Tablo sırası önemlidir

INNER JOIN’deki JOIN’lerin sırası önemli olmasa da, aynı durum LEFT JOIN için geçerli değildir. Birden çok tabloyu birleştirmek için LEFT JOIN kullandığımızda, bu birleştirmenin JOIN’in LEFT tarafındaki tablodaki tüm satırları içereceğini hatırlamak önemlidir. Önceki sorguyu yeniden düzenleyelim:

SELECT country.country_name_eng, city.city_name, customer.customer_nameFROM customerLEFT JOIN city ON customer.city_id = city.idLEFT JOIN country ON city.country_id = country.id;

İlk başta, bu ve öncekinin aynı olduğunu kolayca söyleyebilirsiniz (INNER JOIN kullanırken bu doğrudur). Aynı tabloları, LEFT JOIN’leri ve aynı birleştirme koşullarını kullandık. Önce çıktıya bir göz atalım:

SOL YÖNDEN KATILIM

Peki burada ne oldu? Neden 4 satırımız var (INNER JOIN kullandığımızda sahip olduğumuz 4 satırın aynısı)?

Cevap basit ve LEFT JOIN’in nasıl çalıştığıyla ilgili. İlk tabloyu ( müşteri ) alır ve tüm satırlarını (4 tane) sonraki tabloya ( şehir ) birleştirir. Bunun sonucu 4 satırdır çünkü müşteri sadece 1 şehre ait olabilir. Sonra bu 4 sırayı bir sonraki tabloya ( ülke ) katıyoruz ve yine 4 sıramız var çünkü şehir sadece 1 ülkeye ait olabilir.

Bu 3 tabloyu bu şekilde birleştirmememizin nedeni 2 numaralı örnek metninde verilmiştir. Sorgu, 4 satır döndürecek şekilde yazılır, aşağıdakilere cevap olacaktır: Tüm müşterilerin adlarını ve bulundukları şehir ve ülkeleri döndür. İlgili şehirler ve ülkeler olmadan müşterileri bile geri dön.

  • Not: LEFT JOIN kullanırken, bu ifadedeki tabloların sırası önemlidir ve bu sırayı değiştirirseniz sorgu farklı bir sonuç döndürür. Sipariş aslında sonuç olarak ne iade etmek istediğinize bağlıdır.

Her ikisini de kullanarak birden çok tabloyu birleştirin – INNER JOIN & LEFT JOIN

Bu da mümkündür. Yine bir örnekle gidelim.

# 3 Çifti olan tüm ülke ve şehirlerin listesini döndürün (herhangi bir şehir tarafından referans verilmeyen ülkeleri hariç tutun). Bu tür çiftler için tüm müşterileri iade edin. Tek bir müşterisi olmayan çiftleri döndür.

İşi yapan sorgu şudur:

12345SELECT country.country_name_eng, city.city_name, customer.customer_nameFROM countryINNER JOIN city ON city.country_id = country.idLEFT JOIN customer ON customer.city_id = city.id; 

Sorgunun sonucu aşağıdaki resimde verilmiştir:

birden çok masayı birleştir - İÇ BİRLEŞTİR ve SOL BİRLEŞTİR

Herhangi bir ilintili şehir olmayan ülkemiz olmadığını kolayca fark edebilirsiniz (bunlar İspanya ve Rusya idi). INNER JOIN bu satırları ortadan kaldırdı. Yine de müşterimiz olmayan alıntılarımız var (Belgrad, Los Angeles ve Varşova). Bu, tablolar şehir ve müşteri arasında LEFT JOIN kullandığımız gerçeğinin sonucudur .

Sonuç

Birden fazla masaya katılmanız gerektiğinde , emrinizde INNER & LEFT JOIN var (RIGHT JOIN nadiren kullanılır ve kolayca LEFT JOIN ile değiştirilebilir). Hangi katılımı kullanacağınız, doğrudan çözmeniz gereken göreve bağlıdır ve bu duyguyu yol boyunca alırsınız. Gelecek makalelerde, daha karmaşık sorgular yazmanız gerektiğinde kendinizi nasıl düşüneceğinizi ve organize edeceğinizi tartışacağız.

(Visited 2.388 times, 1 visits today)