16 Ocak 2017 Pazartesi

ANDROİD TABANLI SAĞLIK UYGULAMASI


Egzersiz yapmakta zorlanan, spor salonuna gidemeyen ya da ne yapacağı konusunda fikir sahibi olmayan kişiler için spor yapmanın en kolay yolu yürümektir. Düzenli bir şekilde yürüyüş yapmanın kalp rahatsızlığı, damar tıkanıklığı gibi hastalıklara iyi geldiği bilinmektedir. Ayrıca günlük yapılan yürüyüşler kilo kaybı ve daha zinde bir vücut da sağlayabilir. Uzmanlar düzenli, tempolu yürüyüşün hastalıklardan koruduğu, günde ortalama 10 bin ile 15 bin adım atmanın insan sağlığına faydalı olduğu görüşündeler. Bu düşüncelerden yola çıkılarak android tabanlı sağlık uygulaması olan Fitness Club geliştirildi. Fitness Club, kullanıcıların, android işletim sistemine sahip akıllı telefonlarından rahatça girebilecekleri, kullanımı kolay bir sağlık uygulamasıdır. Fitness Club’da kullanıcılar GPS teknolojisi ile konumlarını bulabilir, yürüdükleri mesafeleri görebilir,  boy ve kilo değerlerini girerek vücut kitle indeksini, ideal kilosunu, toplam vücut suyunu, vücut yüzey alanını, yağsız vücut ağırlığını, vücut kitle indeks sınıfını ve varsa fazla kilo miktarını, buna bağlı olarak da harcamaları gereken kalori değerlerini hesaplayabilmektedir. Ayrıca akıllı telefonlarda yer alan hareket sensörü yardımıyla kişilerin attığı adımlar sayılır, adım sayısına göre yakmış oldukları kalori miktarı hesaplanır ve hedef kaloriye ulaşılıp ulaşılmadığı hakkında bilgi verilir. Kullanıcıların gün boyu yapmış oldukları aktiviteler kayıt altına alınır, istendiğinde haftalık ve aylık raporlar görsel bir şekilde kullanıcıya sunulur. Fitness Club sayesinde sporun daha eğlenceli bir hale getirilmesi ve aktivitelerin disipline edilmesi amaçlanmıştır.

Projeyi Hazırlayanlar: Sema BAYRİ, Tuğba ÇIRDAKLI

DELETE

Kayıt Silme



Bir tabloda bulunan bir yada daha fazla satır silinebilmektedir. Silme işlemi için DELETE deyimi kullanılmaktadır. Bu deyimin genel yapısı şu şekildedir.

DELETE FROM tablo_adı
      WHERE koşul


Bir tabloda bütün kayıtlar silinebileceği gibi belli bir şartı sağlayan herhangi bir kayıtta silinebilmektedir. Örneğin daha önce oluşturduğumuz «secilenmüsteri» tablosunun tüm kayıtlarını silmek için şöyle bir SQL ifadesi yazılacaktır.

DELETE FROM secilenMüsteri

Herhangi bir koşul olmadığı için bütün kayıtlar silinecektir.


Şimdi de belli bir şarta sahip kayıtları silmek için bir örnek verelim. Müşteriler tablosunda “Ali Arslan” isimli müşteri ile artık çalışmadığımızı düşünerek bu müşteriyi tamamen silelim. SQL ifademiz şöyle olacaktır.

DELETE FROM musteriler
      WHERE (adi='Ali' AND soyadi='Arslan')

Aynı şekilde bir tabloda istenilen şartı sağlayan birden fazla kayıtta silinebilmektedir. Örneğin Müşteriler tablosunda Ankara ‘da oturan bütün müşterileri silmek istersek SQL ifademiz aşağıdaki gibi olacaktır.

DELETE FROM musteriler
      WHERE il ='Ankara'



DELETE komutunda da tıpkı INSERT INTO ve UPDATE komutlarında olduğu gibi alt sorgular kullanılarak da kayıtlar silinebilmektedir. Bu noktada yine SELECT ifadesinden yararlanılmaktadır.

Örneğin; personel tablosunda İMALAT bölümüne ait bütün kayıtları silmek istiyoruz. Bu işlemi gerçekleştiren SQL ifadesi şöyle olacaktır:

DELETE FROM personel
      WHERE bolumID = (SELECT bolumID
                                                 FROM bolum
                                                        WHERE bolumAdi = 'İMALAT')

UPDATE


Kayıt Güncelleme


Bir tabloya eklenen bilgiler gerektiğinde değiştirilebilmelidir. Bu amaçla UPDATE komutu kullanılmaktadır. UPDATE komutunun genel kullanıl biçimi şöyledir.

UPDATE tablo_adı
         SET sütun1=değer1, sütun2=değer2, …
           [WHERE koşul]

Bu tanımda kullanılan WHERE deyimi değişikliğin hangi kayıt üzerinde yapılacağının bulunmasına yardımcı olmaktadır. Bu tanım yapılmadığında söz konusu tablonun tüm satırlarında değişiklikler meydana gelecektir.



Bahçe işleri veritabanında müşteriler tablosunda isim bilgisi “Ali Arslan” olan kişinin Ankara’dan İstanbul Üsküdar’a iş yerini taşıdığını düşünerek gerekli değişiklikleri yapmak için aşağıdaki SQL sorgusunu yazmak gerekir.

UPDATE musteriler
     SET il='İstanbul', ilce = 'Üsküdar'
       WHERE (adi='Ali' AND soyadi='Arslan')



UPDATE komutu ile matematiksel işlemler de gerçekleştirilebilmektedir. Tüm personelin ücretine %20 zam yapılacağını düşünerek tablo üzerinde değişiklikleri gerçekleştiren  SQL ifadesi aşağıdaki gibi olacaktır.

UPDATE personel SET ucret = ucret*1.20

Bu komut çalıştırıldığında bütün kayıtlar bu değişiklikten etkilenecektir. Çünkü herhangi bir koşula bağlı bir işlem gerçekleştirilmemiştir.


UPDATE işlemi tıpkı INSERT INTO deyiminde olduğu gibi alt sorgularla da çalışabilmektedir. Yani bilgi güncelleştirme işlemi bir tablodan okunan bilgilerin güncellenerek başka bir tabloya eklenmesi ile de gerçekleşebilmektedir.

Yine burada alt sorgular yazılırken SELECT deyiminden faydalanılmaktadır.


UPDATE komutunda alt sorgulara şöyle bir örnek verebiliriz. BolumID’si 200 olan personel ile aynı göreve sahip tüm personelin bolumID’sini 100 olarak değiştirmek istersek şöyle bir SQL ifadesi yazabiliriz.

UPDATE personel SET bolumID = 100
      WHERE gorevi = (SELECT gorevi
                                             FROM personel
                                                    WHERE bolumID=200)



UPDATE personel SET bolumID = 100
      WHERE gorevi = (SELECT gorevi
                                             FROM personel
                                                    WHERE bolumID=200)

Bu sorguda öncelikle alt sorguda bolumID’si 200 olan personelin görevinin ne olduğu tespit edilmektedir. Daha sonra tespit edilen bu görevle aynı görevi icra eden personel kayıtlarında bolumID’leri 100 olarak değiştirilmektedir.

INSERT INTO

Tabloya Kayıt Ekleme


Bir tabloya kayıt eklemek için INSERT INTO deyimi kullanılmaktadır. Bazı durumlarda SQL ifadeleri kullanarak bir tabloya kayıt eklemek durumunda kalabilirsiniz. Bu gibi durumlarda bu deyimi kullanmak yerinde olacaktır. Bu deyimin genel kullanım biçimi şöyledir.

    INSERT INTO tablo_adı (sütunlar) VALUES (değerler)


Burada, tablo_adı; verilerin kaydedileceği tablonun adıdır.
Sütunlar, tablo içinde verilerin kaydedileceği alanlardır.
Değerler ise tabloya kaydedilecek olan verileri göstermektedir.
Bu SQL deyimi her çalıştırıldığında tabloya yeni bir kayıt eklenecektir.

Örnek için yine bahçe işleri veritabanında "kategoriler" tablosuna çeşitli kayıtlar ekleyelim. Bunun için SQL ifademiz şöyle olacaktır:

INSERT INTO kategoriler (kategoriID, kategoriAdi)
VALUES (5, 'Bahçe Çiçekleri')

INSERT INTO kategoriler (kategoriID, kategoriAdi)
VALUES (5, 'Bahçe Çiçekleri')

Sorgusunda eğer tablodaki bütün alanlara kayıt yapılacaksa sütun adlarını kullanmadan da kayıt ekleme işlemi yapılabilmektedir.

INSERT INTO kategoriler
VALUES (5, 'Bahçe Çiçekleri')


INSERT INTO deyimi ile çeşitli fonksiyonları da kullanmak mümkündür. Bir tarih bilgisi eklenmek istenildiğinde bunu doğrudan elle değil de bir fonksiyon aracılığı ile gerçekleştirebilirsiniz.
Örneğin, “siparisler” tablosunu göz önüne alalım. Bir sipariş verildiğinde bu siparişin verilme tarihini sistemden alarak tabloya kaydedelim.

INSERT INTO siparisler (siparisID, müsteriID, calısanID, siparisTarihi) VALUES (16, 7, 4, GETDATE())



Dikkat edilecek olursa sipariş tarihi bilgisi eklenmek istenildiğinde bu tarih bilgisi GETDATE ( ) fonksiyonu kullanılarak sistemden otomatik olarak alınmaktadır.
Alınan bu sistem bilgisi, siparisTarihi niteliğinin giriş değeri olmaktadır. Sorgu çalıştırıldığında ilgili kaydın eklendiği görülür.


INSERT INTO deyimi ile bir tabloya başka bir tablodan belirlenen bir satır bilgi eklenebilmektedir. Yani INSERT INTO deyimi ile birlikte alt sorgularda kullanılabilmektedir.
Alt sorgulama işlemleri için SELECT ifadesi kullanılmaktadır. Böyle bir alt sorgulama kullanılacağı zaman VALUES sözcüğü kullanılmaz.





Soru: Müşteriler tablosunda ilçesi ‘Çankaya’ olan müşterilerin musteriID, adi ve soyadi bilgilerini «secilenMüsteri» tablosuna kaydeden SQL ifadesi nedir?
Soruya dikkat edilirse soru iki bölümden oluşmaktadır. İlçesi Çankaya olanlar bulunacak ve ikinci olarak «secilenMusteri» tablosuna kayıt edilecek. Bu işlemler için SQL ifademiz şöyle olacaktır:
INSERT INTO secilenMusteri (musteriID, adi, soyadi) 
     SELECT musteriID, adi, soyadi
          FROM musteriler 
                WHERE ilce ='Çankaya'

HAVING




Belli bir guruba yönelik sorgular yazılırken gruplandırarak kümeleme fonksiyonlarından yaralanılır.
HAVING deyimi sorguda bir koşul belirtilmesi gerekirse kullanılmaktadır. Daha önceki slayttan hatırlayacağınız gibi gruplandırma işlemini gerçekleştirmek için GROUP BY fonksiyonunu kullanmıştık.
GROUP BY fonksiyonunda bir koşula ihtiyaç var ise HAVING deyimi kullanılmaktadır.

HAVING deyiminin genel kullanım biçimi aşağıdaki gibidir.
SELECT Alan_Adları
     FROM Tablo/Tablolar
          [WHERE Şart/Şartlar]
                  [GROUP BY Sütunlar]
                           [HAVING Grup_Kısıtlaması]

HAVING deyimi, GROUP BY fonksiyonu olmadan kullanılamaz.


HAVING deyiminin ardından SUM, COUNT, MAX, MIN ve AVG gibi fonksiyonlar gelmelidir. Çünkü HAVING deyimi sadece gruplanmış veriler üzerindeki işlemlerde geçerlidir.
WHERE komutu ise, tablonun tek satırı üzerinde işlem yapıldığında kullanılabilmektedir. Bazı durumlarda bir SQL sorgusunda WHERE ve HAVING deyimleri birlikte kullanılabilmektedir.


HAVING deyiminin kullanımına bir örnek verelim.
Sipariş detayları tablosunda 1 den fazla sipariş edilen ürünlerin, ürün numaraları ve sayısını gösteren SQL ifadesi şöyle olacaktır:
SELECT urunID, COUNT (*) AS 'Sipariş Sayısı'
      FROM siparisDetay
             GROUP BY urunID
                      HAVING COUNT(*) > 1



Bu sorgu, öncelikle siparisDetay tablosunun urunID’lerine göre gruplandırır. Daha sonra gruplamış olduğu bu urunID’lerini COUNT(*) fonksiyonunu kullanarak sayar. Eğer 1’den büyük ise 'urunID' ve verilen sipariş sayısını kullanıcıya gösterir.



Başka bir örnek verelim. Bu örneğimizde birden fazla tablo kullanılacaktır.
Toplam sipariş tutarı 100 TL’ nin üzerinde olan müşterilerin vermiş oldukları toplam sipariş sayısını, müşteri numaralarını ve toplam sipariş tutarlarını görüntüleyen SQL ifadesi şöyle olacaktır:
SELECT musteriID, COUNT (*) AS 'Toplam Sipariş Sayısı',
                 SUM (siparisDetay.birimFiyat*siparisDetay.miktar)
                 AS 'Toplam Sipariş Tutarı'
FROM siparisler  INNER JOIN siparisDetay
             ON siparisler.siparisID = siparisDetay.siparisID
GROUP BY siparisler.musteriID
HAVING SUM (siparisDetay.birimFiyat*siparisDetay.miktar) > 100


Ortalama sipariş tutarı 50 TL nin üzerinde olan tüm müşterilerin vermiş oldukları toplam sipariş sayısı, toplam sipariş tutarı ve ortalama sipariş tutarını gösteren SQL ifadesi şöyle olacaktır.
   
SELECT musteriID, COUNT(*) AS 'Toplam Sipariş Sayısı',
                 SUM (siparisDetay.birimFiyat*siparisDetay.miktar)
                 AS 'Toplam Sipariş Tutarı',
                 AVG (siparisDetay.birimFiyat*siparisDetay.miktar)
                 AS 'Ortalama Sipariş Tutarı'
FROM siparisler INNER JOIN siparisDetay ON
              siparisler.siparisID = siparisDetay.siparisID
GROUP BY siparisler.musteriID
HAVING AVG (siparisDetay.birimFiyat*siparisDetay.miktar) > 50

NOT: Bu sorgular yazılırken satici veritabanında Siparişler ve Sipariş Detayları tablolarını kullanınız.


Bu sorguda “siparisler” ve “siparişDetay” tabloları birleştirilerek, müsteriID’lerine göre gruplanmıştır. Daha sonra HAVING kısmında AVG ile ortalama sipariş tutarları hesaplanarak 50 TL den büyük ise listelenmesi sağlanmıştır.

HAVING ve diğer gruplama fonksiyonlarının kullanımına dikkat etmek gerekir. Grup koşulları WHERE ifadesi ile birlikte kullanılamazlar.
Örneğin bir bölüm bazında yapılacak olan bir işlemde bölümdeki personelin ücret ortalaması 1000 TL den büyük olanları listelemek istersek aşağıdaki kullanım yanlış olacaktır.

SELECT bolumNo, AVG(ucret)
     FROM personel
           WHERE AVG(ucret) > 1000
                  GROUP BY bolumNo


Bu SQL cümlesi istenildiği gibi çalışmayacaktır. Çünkü grup koşulları WHERE ifadesi ile birlikte çalışmazlar. Bunun doğru kullanımı şöyle olacaktır.

SELECT bolumNo, AVG(ucret)
         FROM personel
           GROUP BY bolumNo
                  HAVING AVG(ucret) > 1000

Gruplandırma Fonksiyonları

Bazı durumlarda belli bir koşula sahip bilgileri sorgulamak için SQL ifadeleri kullanılabilir. Bu gibi durumlarda gruplama fonksiyonlarından yararlanılmaktadır.
Örneğin bir ürünü, ürün kategorilerine göre gruplayıp ardından bu gruplar içerisinde sorgu yapmak isteyebiliriz. Bu işlemi gerçekleştirmek için GROUP BY fonksiyonu kullanılmaktadır.


GROUP BY fonksiyonu belli bir alana göre gruplama işlemi yapmak için kullanılmaktadır. Genel kullanımı şu şekildedir.
    SELECT Alanlar
          FROM Tablo_Adı 
                WHERE Şart_İfadeleri
                        GROUP BY Sütun/Sütunlar




Bu fonksiyonun kullanımına örnek verelim.
"siparisler" tablosunu göz önüne alarak her bir nakliye firmasının kaç kere nakliye yaptığını bulmak için SQL ifademiz şöyle olacaktır:
    SELECT nakliyeciFirmaID, COUNT (*) AS 'Nakliye Sayısı'
          FROM siparisler
                GROUP BY nakliyeciFirmaID

JOIN Komutu



Şu ana kadar anlatmış olduğumuz sorgular sadece tek tablo kullanılarak gerçekleştirildi. Bazı durumlarda tek bir tablo ile çalışmak yeterli olmayacaktır.
Böyle bir durumda birleştirme/eşleştirme adını verdiğimiz bir yapı kullanılmak zorundadır. Bu işlemin gerçekleştirilmesi için JOIN komutu kullanılmaktadır.

JOIN işlemini anlatmak için "kategoriler" ve "urunler" tablolarını göz önüne alalım. Bu tablolarda yer alan kayıtlar aşağıda görüldüğü şekildedir.



Dikkat edilirse, "kategoriler" tablosunda ilgili ürünün bir kategori numarası ve ait olduğu kategori adı bulunmaktadır.

Bir ürüne ilişkin detaylar bu tabloda verilmemiş olup, gerekli diğer detaylar "urunler" tablosunda verilmiştir. Bu iki tablo birbirlerine 'kategoriID' ile bağlıdır.



Şimdi bu iki tabloyu kullanarak iki tablo arasındaki bağlantıyı da gösteren SQL ifadesini şöyle yazabiliriz.

    SELECT K.kategoriID, K.kategoriAdi, U.urunAd
          FROM kategoriler K, urunler U 
                WHERE K.kategoriID = U.kategoriID


SELECT K.kategoriID, K.kategoriAdi,U.urunAd
          FROM kategoriler K, urunler U 
                WHERE  K.kategoriID = U.kategoriID

Bu SQL cümlesinde tablolara bir takma ad verilmiştir.

Buradaki “WHERE  K.kategoriID = U.kategoriID”     cümlesi ile bir birleştirme işlemi gerçekleştirilmiştir. Yani "kategoriler" tablosundaki 'kategoriID' ile "urunler" tablosundaki 'kategoriID' eşit ise kayıtlar listelenecektir.




SELECT K.kategoriID, K.kategoriAdi, U.urunAd
          FROM kategoriler K, urunler U 
                WHERE  K.kategoriID = U.kategoriID
 


Bu işlemi INNER JOIN komutu ile gerçekleştirmek istersek SQL cümlemiz aşağıdaki gibi olacaktır.
    SELECT urunAd, kategoriAdi
         FROM kategoriler
               INNER JOIN urunler
                     ON kategoriler.kategoriID = urunler.kategoriID

Burada INNER JOIN ifadesi her iki tabloda da ortak olan değerlere bakarak eşit olanları ekrana listeleyecektir.


INNER JOIN işlemi her türlü FROM yan cümlesi ile kullanılabilir. En sık kullanılan birleştirme türüdür.
Her iki tabloda eşleşen değerler var ise birleştirme işlemi gerçekleştirilir ve kayıtlar ekrana listelenir.


INNER JOIN işlemini daha iyi anlatabilmek için daha karmaşık bir örnek yapalım. Aşağıdaki ilişkiyi göz önüne alalım.


Dikkat edilirse, birden fazla tablo birbirlerine farklı anahtarlar kullanılarak bağlanmış durumdadırlar. INNER JOIN komutu bu tablolarda ortak olan değerler kullanılarak birleştirme işlemini çok kolay bir şekilde yerine getirmektedir.
Bu dört tablonun INNER JOIN komutu kullanılarak yazılan SQL cümlesi şöyle olacaktır:

    SELECT * FROM (kategoriler INNER JOIN urunler  ON kategoriler.kategoriID = urunler.kategoriID) INNER JOIN (siparisler INNER JOIN siparisDetay ON siparisler.siparisID = siparisDetay.siparisID) ON urunler.urunID = siparisDetay.urunID



Aşağıdaki söz dizimi kullanılarak INNER JOIN ifadesi içerisinde ON yan cümleleri de yazabilirsiniz.

SELECT alanlar
FROM tablo1 INNER JOIN tablo2
ON tablo1.alan1 karşılaştırma tablo2.alan1 AND
ON tablo1.alan2 karşılaştırma tablo2.alan2) OR
ON tablo1.alan3 karşılaştırma tablo2.alan3)

DISTINCT Komutu



SQL içerisinde bir tabloda birden fazla kayıt olabilmektedir.
Eğer aynı satırların listelenmesi gerekirse bu satırların bir defa yazılması gerekmektedir. Böyle bir durumda DISTINCT komutu kullanılmak zorundadır.
Siparişleri hangi Nakliye firmalarının taşıdığını ekrana listeleyen SQL ifadesi şöyle olacaktır:
   
   
SELECT nakliyeciFirmaAdi FROM siparisler, nakliyeciler

Dikkat edilecek olursa nakliyeci firma adları tekrar etmiştir. Bunu engellemek için şöyle bir SQL ifadesi yazılması gerekmektedir.

    SELECT DISTINCT nakliyeciFirmaAdi
          FROM siparisler, nakliyeciler

VERİLERİ GRUPLAYARAK ANALİZ ETMEK

Grup fonksiyonlarının tanımlanması,
Gruplama işlemlerini,
Gruplama işlemlerinde dikkat edilecek noktalar,
Birden fazla sütuna göre gruplama yapmak,
Grup koşullarının tanımlanması.

   
Önceki bölümde SQL'in bize sunduğu hazır fonksiyonların tek satırla ifade edilebilen tiplerini öğrenmiştik. Bu bölümde ise, SQL yapısal sorgulama dilinde bulunan çok satırlı fonksiyonları ele alacağız.

Bu bölümde, grup fonksiyonlarının nasıl tanımlanacağını, gruplama işlemlerini, gruplama işlemlerinde dikkat edilecek noktaları, birden fazla sütuna göre gruplama yapmayı ve grup koşullarının tanımlanmasını öğreneceğiz.