Sql İç içe Select Kullanımı ?

Kodla Büyü

emre.svr

Üye
Mesajlar
1
Merhaba arkadaşlar bilgisayar bölümü öğrenciyim.
İç içe select kullanımında biraz sıkıntım var.
Çalışırken ders notlarına bakıp, aynısını kendim yazmaya çalışıyorum.Benim notlarım bu şekilde farklı oluyor ? İki kodda aynı görevi mi görür ?

Tablolarımız:

Ogrenci: *ogr_no, adi, soyadi, adres, cinsiyet, bolum_kod
ders_al: ogr_no, ders_kod, ders_notu
ders: *ders_kod, ders_ad
bolum: *bolum_kod, bolum_ad

-Herhangi bir dersten 70 ve üzeri not alan bilgisayar bölümünde ki öğrencilerin adı ve soyadlarını getirmek istiyoruz.

Tuttuğum notlardaki kod:

select adi, soyadi, from ogrenci where bolum_kod in(select bolum_kod from bolum where bolum_ad="bilgisayar")and ogr_no in(select ogr_no from ders_al where ders_notu >= 70)

Benim bakmayarak yazdığım kod ise:

select adi, soyadi from ogrenci where ogr_no in(select ders_kod from ders_al where ders_not >= 70 and bolum_kod in(select bolum_kod from bolum where bolum_ad="veritabanı 1")

İki kod aynı yola mı çıkar yoksa benim yazdığım hatalı mı ? Hatalı ise neden ? Yardımlarınız için teşekkür ederim :)
 
İkisinde de ogr_no'yu ders_not'tan 70 ve üzeri olanlardan seçiyorsunuz. İkincisinde
select adi, soyadi from ogrenci where ogr_no in(select ders_kod from ders_al where ders_not >= 70) and bolum_kod in(select bolum_kod from bolum where bolum_ad="veritabanı 1")
parantez eksik.
Ders notundaki kodda bölümü bilgisayar olan öğrencilerden notu 70 ve üzeri olanı getirecek.
Sizin yazdığınızda bölümü veritabanı 1 olan öğrencilerden notu 70 ve üzeri olanı getirecek gibi görünüyor. Fark var yani. Bilgisayar bölümü yazmalısınız kodunuzda bolum_ad=......"noktalı yere
Noktalamaya(parantez, işaret) dikkat ederseniz sorun olmaz sanırım.
 
burada asıl sorun sorgudan ziyade yaklaşım hatası var. bu daha çok join senaryosudur. select..in yapısının amacı daha farklıdır burada iş görüyor gibi olsa da tutarlılık sorunlarına yol açabilir.

bu tarz senaryolarda from tarafında ihtiyaç olan tüm tablolar join ile birleştirilip evrensel tablo haline getirilir ve select tarafında içinden istenen alanlar seçilir.

bir de where ifadesinde bölüm ismi üzerinden de gidilmez çünkü benzersizlik garantisi yoktur ama sorunun yapısı gereği gidilir kabul edersek sorgu şöyle olmalıdır:

select adi, soyadi from ogrenci inner join ders_al on ogrenci.ogr_no = ders_al.ogr_no inner join bolum on ogrenci.bolum_kod = bolum.bolum_kod
where bolum_ad = "bilgisayar" and ders_not >= 70
 
erfatm' Alıntı:
select adi, soyadi from ogrenci where ogr_no in(select ders_kod from ders_al where ders_not >= 70) and bolum_kod in(select bolum_kod from bolum where bolum_ad="veritabanı 1")

Sizin yazdığınızda bölümü veritabanı 1 olan öğrencilerden notu 70 ve üzeri olanı getirecek gibi görünüyor.
Burada asıl sıkıntı ogr_no in dediğimizde parantez içinde öğrenci noları seçmemiz gerekir. fakat emre.svr kardeşimiz parantez içinde ders kodu kısmını seçerek hata yapmış. bu nedenle ders kodu ve öğrenci noları farklı olduğu için sorgu herangi bir değer döndürmez.

aslında Parhelion hocamızın yaptığı daha doğru ama hocanız ders notlarına uygun şekilde yapmanızı isterse defterdeki notu dikkate almanızı tavsiye ederim
 
leventgenc' Alıntı:
erfatm' Alıntı:
select adi, soyadi from ogrenci where ogr_no in(select ders_kod from ders_al where ders_not >= 70) and bolum_kod in(select bolum_kod from bolum where bolum_ad="veritabanı 1")

Sizin yazdığınızda bölümü veritabanı 1 olan öğrencilerden notu 70 ve üzeri olanı getirecek gibi görünüyor.
Burada asıl sıkıntı ogr_no in dediğimizde parantez içinde öğrenci noları seçmemiz gerekir. fakat emre.svr kardeşimiz parantez içinde ders kodu kısmını seçerek hata yapmış. bu nedenle ders kodu ve öğrenci noları farklı olduğu için sorgu herangi bir değer döndürmez.


aslında Parhelion hocamızın yaptığı daha doğru ama hocanız ders notlarına uygun şekilde yapmanızı isterse defterdeki notu dikkate almanızı tavsiye ederim

Evet hocam onu siz söyleyince fark ettim :oops:
 
Geri
Üst