SQLite, INNER JOIN, LEFT OUTER JOIN ve CROSS JOIN gibi farklı SQL Joins türlerini destekler. Bu eğitimde göreceğimiz gibi, her bir JOIN türü farklı bir durum için kullanılır.
Bu eğitimde öğreneceksiniz-
- SQLite JOIN Maddesine Giriş
- İÇ BİRLEŞİM
- KATIL… KULLANILARAK
- DOĞAL BİRLEŞİM
- SOL DIŞ KATILMA
- ÇAPRAZ BİRLEŞTİR
SQLite JOIN Maddesine Giriş
Birden çok tablo içeren bir veritabanı üzerinde çalışırken, genellikle bu birden çok tablodan veri almanız gerekir.
JOIN yan tümcesi ile, onları birleştirerek iki veya daha fazla tabloyu veya alt sorguyu birbirine bağlayabilirsiniz. Ayrıca, tabloları hangi sütuna ve hangi koşullara göre bağlamanız gerektiğini de tanımlayabilirsiniz.
Herhangi bir JOIN cümlesi aşağıdaki sözdizimine sahip olmalıdır:
Her bir birleştirme maddesi şunları içerir:
- Soldaki tablo olan bir tablo veya alt sorgu; birleştirme cümlesinden önceki tablo veya alt sorgu (solunda).
- JOIN operatörü - birleştirme türünü belirtin (INNER JOIN, LEFT OUTER JOIN veya CROSS JOIN).
- JOIN-kısıtlama - birleştirilecek tabloları veya alt sorguları belirledikten sonra, birleştirme türüne bağlı olarak bu koşulla eşleşen satırların seçileceği bir koşul olacak bir birleştirme kısıtlaması belirtmeniz gerekir.
Aşağıdaki tüm örnekler için, sqlite3.exe dosyasını çalıştırmanız ve akan örnek veritabanına bir bağlantı açmanız gerektiğini unutmayın:
Adım 1) Bu adımda,
- Bilgisayarım'ı açın ve aşağıdaki " C: \ sqlite " dizinine gidin ve
- Ardından " sqlite3.exe " dosyasını açın :
Adım 2) Aşağıdaki komutla " TutorialsSampleDB.db " veritabanını açın :
Artık veritabanında her tür sorguyu çalıştırmaya hazırsınız.
SQLite İÇ BİRLEŞTİRME
INNER JOIN, yalnızca birleştirme koşuluyla eşleşen satırları döndürür ve birleştirme koşuluyla eşleşmeyen diğer tüm satırları ortadan kaldırır.
Misal
Aşağıdaki örnekte, her öğrencinin bölüm adını aşağıdaki gibi almak için " Öğrenciler " ve " Bölümler " adlı iki tabloyu DepartmentId ile birleştireceğiz:
SEÇÖğrenciler.ÖğrenciAdı,Bölümler Bölüm AdıÖğrencilerdenINNER JOIN Bölümler AÇIK Öğrenci Bölüm Kimliği = Bölüm Kimliği = Bölüm Kimliği;
Kod açıklaması:
INNER JOIN şu şekilde çalışır:
- Select yan tümcesinde, başvurulan iki tablodan seçmek istediğiniz sütunları seçebilirsiniz.
- INNER JOIN yan tümcesi, "From" yan tümcesi ile başvurulan ilk tablodan sonra yazılır.
- Daha sonra birleştirme koşulu ON ile belirtilir.
- Referans verilen tablolar için takma adlar belirtilebilir.
- INNER kelimesi isteğe bağlıdır, sadece JOIN yazabilirsiniz.
Çıktı:
- INNER JOIN, hem öğrencilerden hem de bölümün " S tudents.DepartmentId = Departments.DepartmentId " koşulu ile eşleşen kayıtlarını üretir . Eşleşmeyen satırlar göz ardı edilecek ve sonuca dahil edilmeyecektir.
- Bu nedenle BT, matematik ve fizik bölümleri ile bu sorgudan 10 öğrenciden sadece 8 öğrenci geri döndü. Oysa "Jena" ve "George" öğrencileri, bölümler tablosundaki bölüm kimliği sütunuyla eşleşmeyen boş bir bölüm kimliğine sahip oldukları için dahil edilmemiştir. Aşağıdaki gibi:
SQLite JOIN… KULLANILIYOR
INNER JOIN, fazlalıktan kaçınmak için "USING" cümlesi kullanılarak yazılabilir, bu nedenle "ON Students.DepartmentId = Departments.DepartmentId" yazmak yerine "USING (DepartmentID)" yazabilirsiniz.
Birleştirme koşulunda karşılaştıracağınız sütunlar aynı ada sahip olduğunda "KATIL… KULLANARAK" seçeneğini kullanabilirsiniz. Bu gibi durumlarda, onları on koşulunu kullanarak tekrar etmeye gerek yoktur ve sadece sütun adlarını belirtin ve SQLite bunu algılayacaktır.
INNER JOIN ve JOIN… KULLANARAK arasındaki fark:
"JOIN
… KULLANARAK "bir birleştirme koşulu yazmazsanız, yalnızca table1" INNER JOIN table2 ON table1.cola = table2.cola "yazmak yerine, iki birleştirilmiş tablo arasında ortak olan birleştirme sütununu yazın" table1 (kola) KULLANARAK tablo2'ye KATILIN ".Misal
Aşağıdaki örnekte, her öğrencinin bölüm adını aşağıdaki gibi almak için " Öğrenciler " ve " Bölümler " adlı iki tabloyu DepartmentId ile birleştireceğiz:
SEÇÖğrenciler.ÖğrenciAdı,Bölümler Bölüm AdıÖğrencilerdenINNER JOIN Departmanlar KULLANARAK (DepartmentId);
Açıklama
- Önceki örnekten farklı olarak, " ON Students.DepartmentId = Departments.DepartmentId " yazmadık . " USING (DepartmentId) " yazdık .
- SQLite, birleştirme koşulunu otomatik olarak belirler ve DepartmentId'yi her iki tablodan - Öğrenciler ve Bölümler - karşılaştırır.
- Karşılaştırmakta olduğunuz iki sütun aynı ada sahip olduğunda bu sözdizimini kullanabilirsiniz.
Çıktı
- Bu size önceki örnekle aynı sonucu verecektir:
SQLite DOĞAL BİRLEŞTİRME
DOĞAL BİRLEŞTİRME, BİRLEŞTİRME'ye benzer… KULLANIM, fark, her iki tabloda bulunan her sütunun değerleri arasındaki eşitliği otomatik olarak test etmesidir.
INNER JOIN ve NATURAL JOIN arasındaki fark:
- Ben n İÇ bir iç kullanımları iki tabloyu birleştirmek katılmak birleşim koşulu belirtmek zorunda JOIN. Oysa doğal birleştirmede, bir birleştirme koşulu yazmazsınız. Sadece iki tablonun adını koşulsuz yazarsınız. Daha sonra doğal birleştirme, her iki tabloda da bulunan her sütun için değerler arasındaki eşitliği otomatik olarak test edecektir. Doğal birleştirme, birleştirme koşulunu otomatik olarak belirler.
- NATURAL JOIN'de, her iki tablodaki aynı ada sahip tüm sütunlar birbiriyle eşleşecektir. Örneğin, iki sütun adına sahip iki tablonuz varsa (iki tabloda aynı ada sahip iki sütun varsa), o zaman doğal birleştirme, iki tabloyu yalnızca bir sütunun değerlerini değil, her iki sütunun değerlerini karşılaştırarak birleştirir. sütun.
Misal
SEÇÖğrenciler.ÖğrenciAdı,Bölümler Bölüm AdıÖğrencilerdenNatural JOIN Bölümleri;
Açıklama
- Sütun adlarıyla bir birleştirme koşulu yazmamız gerekmez (INNER JOIN'de yaptığımız gibi). Sütun adını bir kez bile yazmamıza gerek yoktu (JOIN USING'de yaptığımız gibi).
- Doğal birleştirme, iki tablodan her iki sütunu tarayacaktır. Koşulun, hem Öğrenci hem de Bölümlerden iki tablodan DepartmentId'yi karşılaştırmaktan oluşması gerektiğini tespit edecektir.
Çıktı
- Natural JOIN, size INNER JOIN ve JOIN USING örneklerinden aldığımız çıktıyla aynı çıktıyı verecektir. Çünkü örneğimizde her üç sorgu da eşdeğerdir. Ancak bazı durumlarda, çıktı doğal birleşimden sonra iç birleşimden farklı olacaktır. Örneğin, aynı ada sahip daha fazla tablo varsa, doğal birleştirme tüm sütunları birbiriyle eşleştirecektir. Ancak, iç birleşim, yalnızca birleştirme koşulundaki sütunlarla eşleşir (sonraki bölümde daha fazla ayrıntı; iç birleşim ve doğal birleştirme arasındaki fark).
SQLite DIŞ BİRLEŞTİRMEYİ KALDIR
SQL standardı üç tip OUTER JOIN tanımlar: LEFT, RIGHT ve FULL, ancak SQLite yalnızca LEFT OUTER JOIN'i destekler.
LEFT OUTER JOIN'de, soldaki tablodan seçtiğiniz sütunların tüm değerleri sorgunun sonucuna dahil edilecek, bu nedenle değerin birleşim koşuluyla eşleşip eşleşmediğine bakılmaksızın sonuca dahil edilecektir.
Dolayısıyla, soldaki tabloda "n" satır varsa, sorgunun sonuçlarında "n" satır olur. Bununla birlikte, sağ tablodan gelen sütunların değerleri için, birleştirme koşuluna uymayan herhangi bir değer varsa, bir "boş" değer içerecektir.
Böylece, sol birleşimdeki satır sayısına eşit sayıda satır elde edersiniz. Böylece her iki tablodan (INNER JOIN sonuçları gibi) eşleşen satırları ve ayrıca soldaki tablodan eşleşmeyen satırları alacaksınız.
Misal
Aşağıdaki örnekte, "Öğrenciler" ve "Bölümler" adlı iki tabloya katılmak için "SOL BİRLEŞTİRME" yi deneyeceğiz:
SEÇÖğrenciler.ÖğrenciAdı,Bölümler Bölüm AdıÖğrencilerden - bu soldaki tablodurLEFT JOIN Bölümler AÇIK Öğrenci Bölüm Kimliği = Bölüm Kimliği; Bölüm Kimliği;
Açıklama
- LEFT JOIN sözdizimi INNER JOIN ile aynıdır; iki tablo arasına LEFT JOIN yazarsınız ve daha sonra birleştirme koşulu ON cümlesinden sonra gelir.
- From cümlesinden sonraki ilk tablo soldaki tablodur. Sol birleşimden sonra belirtilen ikinci tablo ise sağ tablodur.
- OUTER yan tümcesi isteğe bağlıdır; LEFT OUTER JOIN, LEFT JOIN ile aynıdır.
Çıktı
- Gördüğünüz gibi öğrenci tablosundan toplamda 10 öğrenci olan tüm satırlar dahil edilmiştir. Dördüncü ve son öğrenci olan Jena ve George bölüm kimlikleri Bölümler tablosunda yer almasa bile bunlar da dahil edilmiştir.
- Ve bu durumlarda, hem Jena hem de George için departmanAdı değeri "boş" olacaktır çünkü departments tablosunda, departmanId değeriyle eşleşen bir departmanAdı yoktur.
Sol taraftaki önceki sorguyu Van diyagramlarını kullanarak daha derin bir açıklamaya katalım:
LEFT JOIN, öğrencinin bölümler tablosunda olmayan bir bölüm kimliğine sahip olsa bile öğrenciler tablosundaki tüm öğrencilere adlarını verecektir. Bu nedenle, sorgu size INNER JOIN olarak yalnızca eşleşen satırları vermeyecek, ancak öğrenciler tablosu olan soldaki tablodan eşleşmeyen satırlara sahip ekstra parçayı verecektir.
Eşleşen bölümü olmayan herhangi bir öğrenci adının, bölüm adı için "boş" bir değere sahip olacağına dikkat edin, çünkü kendisi için eşleşen bir değer yoktur ve bu değerler, eşleşmeyen satırlardaki değerlerdir.
SQLite CROSS JOIN
ÇAPRAZ BİRLEŞTİRME, ilk tablodaki tüm değerleri ikinci tablodaki tüm değerlerle eşleştirerek, birleştirilen iki tablonun seçilen sütunları için Kartezyen çarpımı verir.
Dolayısıyla, ilk tablodaki her değer için, ikinci tablodan "n" eşleşmeleri elde edersiniz, burada n, ikinci tablo satırlarının sayısıdır.
INNER JOIN ve LEFT OUTER JOIN'den farklı olarak, CROSS JOIN ile bir birleştirme koşulu belirtmenize gerek yoktur çünkü SQLite, CROSS JOIN için buna ihtiyaç duymaz.
SQLite, ilk tablodaki tüm değerleri ikinci tablodaki tüm değerlerle birleştirerek mantıksal sonuç kümesine neden olacaktır.
Örneğin, ilk tablodan (colA) bir sütun ve ikinci tablodan (colB) başka bir sütun seçtiyseniz. ColA iki değer (1,2) içerir ve colB ayrıca iki değer (3,4) içerir.
Ardından, CROSS JOIN'in sonucu dört satır olacaktır:
- ColA'dan 1 olan ilk değeri colB (3,4) 'ün (1,3), (1,4) olacak iki değeriyle birleştirerek iki satır.
- Aynı şekilde, colA'dan 2 olan ikinci değeri colB (3,4) 'ün (2,3), (2,4) olan iki değeri ile birleştirerek iki satırdır.
Misal
Aşağıdaki sorguda Öğrenciler ve Bölümler tabloları arasında CROSS JOIN'i deneyeceğiz:
SEÇÖğrenciler.ÖğrenciAdı,Bölümler Bölüm AdıÖğrencilerdenCROSS JOIN Bölümleri;
Açıklama
- Select cümlesinde, öğrenciler tablosundan iki sütun "öğrenci adı" ve bölümler tablosundan "bölümAdı" seçtik.
- Çapraz birleştirme için, ortalarında CROSS JOIN ile birleştirilmiş iki tablonun herhangi bir birleştirme koşulu belirtmedik.
Çıktı:
Gördüğünüz gibi sonuç 40 satır; Öğrenci tablosundaki 10 değer, bölümler tablosundaki 4 bölümle eşleşti. Aşağıdaki gibi:
- Bölümler tablosundaki dört bölüm için dört değer ilk öğrenci Michel ile eşleşti.
- Bölümler tablosundaki Dört bölüm için dört değer, ikinci öğrenci John ile eşleşti.
- Bölümler tablosundaki Dört bölüm için dört değer üçüncü öğrenci Jack ile eşleşti.
… ve bunun gibi.
Özet
SQLite JOIN'leri kullanarak, her iki tablodan veya alt sorgulardan sütun seçmek için bir veya daha fazla tabloyu veya alt sorguyu birbirine bağlayabilirsiniz.