CodeGym/Java Kursu/All lectures for TR purposes/Birden çok tablodan veri seçme

Birden çok tablodan veri seçme

Mevcut

bağımlı tablo

Şimdi sorgularımızı biraz karmaşıklaştıralım. Veritabanımıza çalışanlarımız için görevler içeren yeni bir görev tablosu ekleyelim. Ve hangi girişleri içerdiğini görelim:

SELECT * FROM task

Böyle bir talebin sonucu:

İD çalışan kimliği isim son teslim tarihi
1 1 Ön uçtaki bir hatayı düzeltin 2022-06-01
2 2 Arka uçtaki bir hatayı düzeltin 2022-06-15
3 5 kahve satın al 2022-07-01
4 5 kahve satın al 2022-08-01
5 5 kahve alacak 2022-09-01
6 (HÜKÜMSÜZ) ofisi temizle (HÜKÜMSÜZ)
7 4 Hayatın tadını çıkar (HÜKÜMSÜZ)
8 6 Hayatın tadını çıkar (HÜKÜMSÜZ)

Bu tabloda yalnızca 4 sütun vardır:

  • id — benzersiz görev numarası (ve tablodaki satırlar);
  • çalışan_kimliği — görevin atandığı çalışan tablosundaki çalışanın kimliği;
  • isim - görevin adı ve açıklaması;
  • son tarih - görevin tamamlanması gereken süre.

Birkaç nüansa dikkat edin. Görev N6'da bir çalışan_kimliği yok, bir temizleyicimiz yok. Görev orada ama icracı yok. Olur.

Ayrıca, 6-9 görevlerinin belirlenmiş bir son tarihi yoktur. Bu, bir görevin düzenli ve sürekli olarak yapılması gerektiğinde gerçekleşir. Örneğin ofisin her gün temizlenmesi gerekiyor ama sizin de her gün hayattan keyif almanız gerekiyor :)

Bir tablo başka bir tablonun kimliklerini kullanıyorsa, böyle bir tabloya bağımlı tablo denir .

Birden çok tabloya karşı sorgulama

Burada görev tablosunda “Hayattan zevk almak” olmak üzere iki görev olduğunu görüyoruz. Bu şanslıların kim olduğunu nasıl bilebiliriz?

Bunu yapmak için, SQL'de aynı anda iki tablo üzerinde bir sorgu yürütebilirsiniz. Genel olarak, SQL'de aynı anda istediğiniz sayıda tabloyu sorgulayabilirsiniz. Böyle bir talebin genel formatı şöyledir:

SELECT columns
FROM Table 1, table 2, tableN

Önemli! Aynı anda birkaç tabloya bir sorgu yazarsanız, sonuç olarak tablo satırlarının Kartezyen çarpımını alırsınız . İlk tablodaki her satır, ikinci tablodaki her satıra yapıştırılır ve bu böyle devam eder.

Yani birinci tabloda 5, ikincide 10 satırınız varsa toplamda 50 satırınız olur. Java'da bu sorgu şuna benzer:

for (String row1 : table1)
{
	for (String row2 : table2)
   {
  	System.out.println(row1 + row2);
   }
}

Sorgumuzu iki tabloya aynı anda yazalım ve ne olduğunu görelim:

SELECT * FROM employee, task

Ve bu sorgunun sonucu:

İD isim meslek maaş yaş İD çalışan _İD isim son teslim tarihi
1 İvanov İvan Programcı 100000 25 1 1 Ön uçtaki bir hatayı düzeltin 2022-06-01
2 Petrov Petr Programcı 80000 23 1 1 Ön uçtaki bir hatayı düzeltin 2022-06-01
3 İvanov Sergey test cihazı 40000 otuz 1 1 Ön uçtaki bir hatayı düzeltin 2022-06-01
4 Rabinovich Moisha Müdür 200000 35 1 1 Ön uçtaki bir hatayı düzeltin 2022-06-01
5 Kirienko Anastasia Ofis Yöneticisi 40000 25 1 1 Ön uçtaki bir hatayı düzeltin 2022-06-01
6 Vaska kedi 1000 3 1 1 Ön uçtaki bir hatayı düzeltin 2022-06-01
1 İvanov İvan Programcı 100000 25 2 2 Arka uçtaki bir hatayı düzeltin 2022-06-15
2 Petrov Petr Programcı 80000 23 2 2 Arka uçtaki bir hatayı düzeltin 2022-06-15
3 İvanov Sergey test cihazı 40000 otuz 2 2 Arka uçtaki bir hatayı düzeltin 2022-06-15
4 Rabinovich Moisha Müdür 200000 35 2 2 Arka uçtaki bir hatayı düzeltin 2022-06-15
5 Kirienko Anastasia Ofis Yöneticisi 40000 25 2 2 Arka uçtaki bir hatayı düzeltin 2022-06-15

Toplamda 48 sonuç satırımız var ama burada sadece 11 tane verdim. Aksi takdirde, yeterli alan olmayacak.

Üç şeye dikkat edin:

  • Aynı ada sahip sütunlar: id . Bu, çalışan tablosundaki kimlik ve görev tablosundaki kimliktir .
  • Her tablonun satırları tekrarlanır. Sol sütunda, ID 6'yı tekrar ID = 1 takip eder.
  • Örneğin, kimliğin (çalışan tablosundan) 6 olduğu ve aynı satırda çalışan_kimliğinin 1 olduğu anlamsız satırlarımız var.

Anlamsız satırları kaldırma

Çalışan ve görev tablolarının tüm satırlarının Kartezyen ürünü olan sonuç tablomuzda çok fazla satır var .

Mantıksal olarak, çalışan_id satırı 3 ise, çalışan tablosundan yalnızca id'nin 3 olduğu satıra yapıştırılmalıdır. WHERE ile bu yanlış anlaşılmayı düzeltmeye çalışalım.

Şöyle bir sorgu yazalım:

SELECT * FROM employee, task 
WHERE emploee.id = task.emploee_id 

Ve bu sorgunun sonucu:

İD isim meslek maaş yaş İD çalışan kimliği isim son teslim tarihi
1 İvanov İvan Programcı 100000 25 1 1 Ön uçtaki bir hatayı düzeltin 2022-06-01
2 Petrov Petr Programcı 80000 23 2 2 Arka uçtaki bir hatayı düzeltin 2022-06-15
4 Rabinovich Moisha Müdür 200000 35 7 4 Hayatın tadını çıkar (HÜKÜMSÜZ)
5 Kirienko Anastasia Ofis Yöneticisi 40000 25 3 5 kahve satın al 2022-07-01
5 Kirienko Anastasia Ofis Yöneticisi 40000 25 4 5 kahve satın al 2022-08-01
5 Kirienko Anastasia Ofis Yöneticisi 40000 25 5 5 kahve alacak 2022-09-01
6 Vaska kedi 1000 3 8 6 Hayatın tadını çıkar (HÜKÜMSÜZ)

İyi haber şu ki, anlamsız satırlar ortadan kalktı: ilk sütundaki kimlik her zaman çalışan_id'ye eşittir.

Kötü haber ise, ofis temizliği gibi kimseye verilmeyen görevler ortadan kalktı. Çalışan_id'leri NULL'du, bu yüzden WHERE yapıldıktan sonra atıldılar.

Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok