Sql
Uygulamaları -2
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Dergimizin ikinci sayısında tekrar birlikte olmanın verdiği mutlulukla, herkese en içten merhabalar. Bu sayımızda, SELECT komutu ile kullanılan öncelikli komutları ve kullanılış biçimlerini görecek, bölüm sonunda bu komutları kullanarak iki ayrı uygulama yapacağız. WHERE SELECT, UPDATE veya DELETE komutları kullanıldığında, tablo içerisindeki sadece belirli satırların işlem görmesini sağlayan şart ifadesidir. Yukarıdaki komutlarla başlayan her cümlede yalnız bir kez kullanılır. WHERE’ den sonraki şartlar için AND, OR, IN, NOT IN, ANY, SOME, ALL, BETWEEN, NOT BETWEEN, EXISTS, NOT EXISTS, LIKE, NOT LIKE, IS NULL, IS NOT NULL ifadeleri bir veya birden fazla kullanılabilir. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_key = 20 İfadesi, dosya numarası 20 olan kaydı ekrana getirir. BETWEEN a BETWEEN b AND c WHERE şartından sonra kullanılır. a ifadesinin, b’ ye eşit ve b’ den büyük, c’ ye eşit ve c’ den küçük olup olmadığını test eder. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_key BETWEEN 30 AND 60 ifadesi, dosya numarası 30 ve 30’ dan büyük olan kayıtlar ile, 60 ve 60’ dan küçük olan kayıtları geri döndürür. NOT ifadesi kullanıldığında, sonucun tam tersi geri döndürülecektir. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_key NOT BETWEEN 30 AND 60 ifadesi, dosya numarası 30 ile 60 arasında olmayan tüm satırları geri döndürür. AND WHERE ifadesi içinde yer alan şartlara bağlaçlık işlevini yerine getirir. Devam eden şart anlamındadır. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_key BETWEEN 30 AND 60 AND cinsiyet = ‘K’ ifadesi ile, dosya numarası 30 ile 60 arasında olan ve (AND) cinsiyet alanında ‘K’ olan satırlar geri döndürülür. AND öncesi kullanılan şartlar ile, AND sonrası kullanılan şartların sonuçları aşağıdaki tablodaki gibi açıklanabilir.
OR WHERE ifadesinde kullanılan bir önceki şart ile yeni bir şart ifadesini bağlamak amacıyla kullanılır. OR, eğer kendinden önceki şart gerçekleşmez ise işlem görür. Aksi durumda OR’ dan sonraki şart üzerinde sorgu yapılmaz. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_key = 30 OR hs_key = 60 Ifadesi ile, dosya numarası 30 veya (OR) 60 olan satırlar geri döndürülür. OR öncesi kullanılan şartlar ile, OR sonrası kullanılan şartların sonuçları aşağıdaki tablodaki gibi açıklanabilir. AND ve OR komutlarının başına NOT ifadesi eklenebilir. Bu durumda AND ve OR ile dönen satırların tam tersi geri döndürülecektir. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_key BETWEEN 30 AND 60 AND NOT cinsiyet = ‘K’ İfadesi ile, dosya numarası 30 ile 60 arasında olan ve cinsiyet alanı ‘K’ olmayan satırlar geri döndürülecektir.
IN a IN (b, c...) a ifadesinin, parantez içerisinde verilen ifadelerden en az bir tanesine eşit olup olmadığını test eder. Birden fazla veya (OR) ifadesi yerine kullanılır. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_key IN (30, 40, 60) İfadesi, dosya numarası 30 veya 40 veya 60 olan satırları geri döndürür. Aynı ifade OR kullanarak aşağıdaki şekilde yazılabilir. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_key = 30 OR hs_key = 40 OR hs_key = 60 IN komutunun başına NOT eklenerek, sonucun tersi alınabilir. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_key NOT IN (30, 40, 60) İfadesi, dosya numarası 30, 40 ve 60’dan farklı olan satırları geri döndürür. LIKE a LIKE b b ifadesinin, a içerisinde olup olmadığı çeşitli şartlara göre test edilir. “_” (altçizgi) işareti kullanıldığında, karakter karşılaştırması yapılır. “%” işareti kullanıldığında, bu işaretin kullanıldığı yere göre arama yapılır. DOS işletim sisteminde kullanılan * ve ? işaretleri yerine, benzer şekilde SQL işlemlerinde % ve _ işaretleri kullanılır. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_ad LIKE ‘Kem%’ ifadesi, hs_ad alanında Kem ile başlayan kayıtları geri döndürür. % işareti başta kullanılırsa (‘%Kem’), Kem ile biten kayıtları geri döndürür. % işareti hem başta hem sonda kullanılabilir (‘%Kem%’). Bu durumda hs_ad alanı içerisinde herhangi bir yerde Kem ifadesi geçen kayıtları geri döndürür. % işareti kullanılmadığında (‘Kem’), hs_ad alanında değeri Kem olan kayıtları geri döndürür. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_ad LIKE ‘_em%’ İfadesi, hs_ad alanında, 2. harfi e, 3. harfi m olan (birinci harf herhangi bir değer alabilir) ve 3. harften sonrası önemli olmayan tüm kayıtları geri döndürür. Yukarıdaki ifadede % işareti kullanılmadığında, 2. harfi e ve 3. harfi m olan ve 3 harfli olan kayıtları geri döndürür. LIKE komutunun başına NOT ifadesi eklendiğinde, geri dönen satırların tam tersi döndürülecektir. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_ad NOT LIKE ‘Kem%’ İfadesi, hs_ad alanında Kem ile başlamayan satırları geri döndürür. IS NULL Alan içerisindeki değerin boş (NULL) olup olmadığını test eder. AND ve OR ifadelerinde belirtildiği üzere, alanın değerinin NULL olup olmaması, kullanıldığı şartın sonuç değerini doğrudan etkilemektedir. SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_soyad IS NULL ifadesi, hs_soyad alanında değer girilmemiş, yani boş olan satırları geri döndürür. İfadede NOT kullanılırsa, SELECT hs_key, hs_ad, hs_soyad FROM hasta WHERE hs_soyad IS NOT NULL hs_soyad alanında değer olan satırlar geri dönecektir. SELECT ifadesinde özellikle matematiksel ifadeler kullanılacaksa, alanın NULL olup olmaması, sonucu doğrudan etkileyecektir. SELECT (fiyat1 + fiyat2) AS yenifiyat FROM hhizmet İfadesi, hhizmet tablosundaki fiyat1 ve fiyat2 alanlarını toplar ve sonucu yenifiyat alanında gösterir. Eğer fiyat1 veya fiyat2 alanlarından bir tanesinde değer varsa ve diğeri NULL ise, yenifiyat alanında NULL gözükecektir. Hatalı sonuçların elde edilmemesi için toplam içerisinde kullanılacak alanlarda NVL fonksiyonunun kullanılması gerekmektedir. NVL NVL(a, yenideğer) a ifadesinin değeri NULL ise, NULL yerine yenideğer'in döndürülmesini sağlar. Yukarıdaki SQL ifadesi hatasız sonuç üretmesi için aşağıdaki şekilde yazılmalıdır. SELECT (NVL(fiyat1,0) + NVL(fiyat2,0)) AS yenifiyat FROM hhizmet Bu şekilde, eğer fiyat1 alanının değeri NULL ise, NULL yerine 0, fiyat2 alanının değeri NULL ise, NULL yerine 0 döndürülecek ve toplama ifadesi doğru çalışacaktır. MAX, MIN MAX (ifade), MIN (ifade) MAX komutu, verilen bir sütun içerisindeki değerlerin en büyüğünü geri döndürürken, MIN komutu, sütun içerisindeki değerlerin en küçüğünü geri döndürür. SELECT MAX(hs_key) FROM hasta İfadesi, hasta tablosundaki en büyük dosya numarasını geri döndürür.
Aynı şekilde, SELECT MIN(hs_key) FROM hasta
İfadesi, hasta tablosundaki en küçük dosya numarasını geri döndürür. SELECT MIN(hs_key), MAX(hs_key) FROM hasta WHERE hs_key between 100 AND 500 İfadesi, 100 ile 500 arasındaki en küçük ve en büyük dosya numaralarını geri döndürür. Görüldüğü üzere, 100 ile 500 arasındaki dosya numaralarını istememize rağmen, 500 dosya numarası iptal edildiği için, en büyük dosya numarası olarak 499 geri döndürüldü.
ABS ABS (ifade) Parantez içinde yer alan İfadenin mutlak değerini döndürür. SELECT ABS(-1), ABS(1) FROM DUAL İfadesi, -1 ve 1 değerinin mutlak değerini aşağıdaki şekilde geri döndürür.
SUM SUM(ifade) Bir sütun veya ifadenin, belirtilen şartlar içerisindeki toplamını hesaplar. Genellikle GROUP BY ile kullanılır. SELECT SUM(toplam) FROM hfis İfadesi, şu ana kadar hastalara verilen hizmet fişlerinin toplamını geri döndürür.
Komutların kullanım şekillerini daha iyi öğrenmek için, aşağıdaki uygulamaları inceleyelim. İlk uygulamada, iki tarih arasında poliklinikler bazında hastaneye başvuran hasta sayıları grafik olarak gösterilecektir. Çözüm Hasta Takip programında, hasta başvuru bilgileri hpislem tablosunda saklanır. Buradaki serviskey alanı, servis bilgilerinin saklandığı servis tablosundaki sr_key alanı ile ilişkilendirilmiştir. Başvuru tarihi hpislem tablosundaki girtarih alanında saklanır. SELECT serviskey, COUNT(*) AS toplam FROM hpislem WHERE girtarih BETWEEN '01.06.2002' and '30.06.2002' GROUP BY serviskey İfadesinde, COUNT komutu ile serviskey alanı birlikte kullanıldığı için, GROUP BY ifadesi SQL' e eklendi. SQL çalıştırıldığında,
Sonucu elde edilir. Bizim kayıtlarımızda sadece 5 servisimiz tanımlıdır. Sizde, servis sayısı farklı olabilir. Şimdi yukarıdaki SQL ifadesini, servis tablosu ile birleştirelim ve servis tablosundaki servisad alanını seçelim. SELECT s.servisad, COUNT(*) AS toplam FROM hpislem a, servis s WHERE a.girtarih BETWEEN '01.06.2002' and '30.06.2002' AND a.serviskey = s.sr_key GROUP BY s.servisad Yukarıdaki SQL ifadesi çalıştırıldığında, aşağıdaki sonuç elde edilecektir.
SQL ifadesinde, tablo tanımlarından sonra tablolara işaret etmek amacıyla tanımlayıcı olarak birer harf eklendi ve kullanılan alanların başına, bu alanların hangi tabloya ait olduğunu belirtmek için bu tanımlayıcılar “.” İşareti ile birlikte eklendi. Eğer tablolarda aynı isimli alanlar yok ise, bu tanımlayıcıların kullanılmasına gerek yoktur. Ancak, aynı isimli alanlar varsa, SQL ifadesinin hata vermemesi için mutlaka bu tanımlayıcıların kullanılması veya alanların başına tablo isimlerinin yazılması gerekir. Tanımlayıcılar kullanılmadığında, SQL aşağıdaki şekilde yazılabilir. SELECT servis.servisad, COUNT(*) AS toplam FROM hpislem, servis WHERE hpislem.girtarih BETWEEN '01.06.2002' and '30.06.2002' AND hpislem.serviskey = servis.sr_key GROUP BY servis.servisad Listenin, servis adına veya toplama göre artan veya azalan şekilde sıralanması için ORDER BY komutunun kullanılması gerekir. ORDER BY ORDER BY a, b, ... ASC/DESC SELECT ifadesinin kullanıldığı SQL cümlelerinde, sonucun bir veya birden fazla ifadeye göre azalan ya da artan şekilde sıralanmasını sağlar. İfadeden sonra hiç birşey yazılmadığında veya ASC kullanıldığında artan, DESC kullanıldığında azalan sıralama yapılır. Bir ifadeye göre artan sıralama, diğerine göre azalan sıralama kullanılabilir. Yukarıdaki SQL sonucunu servis adına göre artan şekilde sıralamak için SELECT servis.servisad, COUNT(*) AS toplam FROM hpislem, servis WHERE hpislem.girtarih BETWEEN '01.06.2002' and '30.06.2002' AND hpislem.serviskey = servis.sr_key GROUP BY servis.servisad ORDER BY servis.servisad yazılması yeterlidir. F9 SQL işlemlerinde yukarıdaki sql'i çalıştırıp, Ctrl+G tuşuna basıldığında, servisler bazında grafik sonucu elde ederiz. İkinci uygulamamızda, dosya numarasını kullanarak, hastanın herhangi bir işleminde verilen hizmetlerin toplamını bulacağız. Hasta kayıtları hasta tablosunda saklanır. hasta tablosundaki hs_key alanında hastanın dosya numarası saklanır. İşlem kayıtlarının hpislem tablosunda saklandığını yukarıda öğrenmiştik. hpislem tablosundaki pi_hs_key alanı ile hasta tablosundaki hs_key alanı ilişkilendirilmiştir. Hastanın hastaneye geliş sayısı hpislem tablosundaki islemno alanında saklanır. Şimdi bu iki tabloyu birbiri ile ilişkilendirelim. SELECT h.hs_ad, h.hs_soyad, p.girtarih, p.islemno, p.pi_key FROM hasta h, hpislem p WHERE h.hs_key = 533 AND h.hs_key = p.pi_hs_key İfadesi ile, dosya numarası 533 olan hastanın tüm işlem kayıtlarını listelemiş olacağız.
Hastaya verilen hizmet kalemleri hfiskal tablosunda saklanır. Birden fazla fiş kaleminin birleştirildiği tablo ise hfis tablosudur. Bu iki tablo birbirlerine fs_no alanı ile bağlıdır. Hfis tablosu, hpislem tablosundaki pi_key alanına, fs_pi_key alanı ile bağlıdır. Biz, hastanın hastaneye son gelişinin, yani 3. işleminin hizmet kalem toplamlarını bulacağız. 3. İşlemin pi_key değeri 1236521'dir. Bu işleme bağlı fiş kalemlerinin aşağıdaki SQL ifadesi ile bulabiliriz. SELECT SUM(b.miktar * b.fiyat) AS toplam FROM hfis a, hfiskal b WHERE a.fs_pi_key = 1236521 AND a.fs_no = b.fs_no
Uyguladığımız aşamaları sıralarsak, ilk aşamada hastanın dosya numarasını kullanarak, işleminin pi_key değerini bulduk. İkinci aşamada bulduğumuz pi_key değerini kullanarak, hastaya verilen hizmetlerin (yalnızca tek bir işlemine ait) toplamını bulduk. Kullandığımız iki SQL ifadesini birleştirip, aşağıdaki satırlar ile aynı sonucu elde edebiliriz. SELECT SUM(b.miktar * b.fiyat) AS toplam FROM hasta h, hpislem p, hfis a, hfiskal b WHERE h.hs_key = 533 AND h.hs_key = p.pi_hs_key AND p.islemno = 3 AND p.pi_key = a.fs_pi_key AND a.fs_no = b.fs_no Görüldüğü üzere, dosya numarasını ve işlem numarasını belirtmemiz yeterli oldu. İşlem, fiş ve fiş kalemleri arasındaki bağlantı otomatik olarak sağlandı. SQL komutları ile ilgili sorularınız için Bir sonraki sayıda görüşmek dileğiyle hepinize SQL'li güzel günler diliyorum. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Fatih Şahin
|