Sağlık ve Bilişimde Objektif Haber

  English
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.

AND Öncesi
AND Sonrası
Sonuç
Doğru
Doğru
Doğru
Yanlış
Yanlış
Yanlış
Doğru
Yanlış
Yanlış
Yanlış
Doğru
Yanlış
Doğru
Boş
Boş
Yanlış
Boş
Yanlış

     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.

OR Öncesi
OR Sonrası
Sonuç
Doğru
Doğru
Doğru
Yanlış
Yanlış
Yanlış
Doğru
Yanlış
Doğru
Yanlış
Doğru
Doğru
Doğru
Boş
Doğru
Yanlış
Boş
Boş
Boş
Doğru
Doğru
Boş
Yanlış
Boş
Boş
Boş
Boş

     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.

MAX(HS_KEY)
592,871

     Aynı şekilde,

SELECT MIN(hs_key) FROM hasta

MIN(HS_KEY)
1

İ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ü.

MIN(HS_KEY)
MAX(HS_KEY)
1
499

      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.

ABS(-1)
ABS(1)
1
1

     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.

SUM(Toplam)
74,050,958,775

      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,

SERVISKEY
TOPLAM
1
1825
2
2010
3
1640
4
1422
5
1385

      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.

SERVISAD
TOPLAM
İntaniye
1825
Acil
2010
Fizik Tedavi
1640
K.B.B
1422
Nöroloji
1385

     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.

HS_AD
HS_SOYAD
GIRTARIH
ISLEMNO
PI_KEY
Mahmut
Likoğlu
16.11.1999 17:03:00
1
10285
Mahmut
Likoğlu
06.04.2001 11:25:16
2
85144
Mahmut
Likoğlu
10.02.2002 09:25:11
3
1236521

     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

TOPLAM
128,144,000

     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

cozumfatih@hotmail.com

fatih@cozumbil.com.tr

Bir sonraki sayıda görüşmek dileğiyle hepinize SQL'li güzel günler diliyorum.

Fatih Şahin