16 Ocak 2017 Pazartesi
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
Ö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.
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.
12 Ocak 2017 Perşembe
Static & Dinamik Testler
Sadece kod çalıştırmadan koda bakılarak yapılacağı gibi(statik test). Yazılım kodu çalıştırılarakta yapılabilir(dinamik.
Yazılım kodu çalıştırılmadan yapılan testlere statik, Kod çalıştırılarak yapılan testlere ise dinamik testler diye adlandırılır.
Veri Akış Test Adımları
Seçilen yollara öncelik ata.
Yol üzerinde belirlenmiş bütün seçilen objeleri en az bir kere çalıştır.
Data Object Kategorileri
(d) Tanımlanmış, Oluşturulmuş, İlklendirilmiş
(k) Tanımlanmamış,
(u) Kullanılan:
(c) Hesaplamada kullanılmış
(p) Tahminde kullanılmış
Data Objelerinin Tanımlanması
Program içerisinde çağrıldığında.
Yeni bir değer barındırdığında.
Bir file tarafından veri geldiğinde
Dinamik olarak yapıdan çıktığında
Tanımlama ve Kullanım Örneği
1. read (x, y);
2. z = x + 2;
3. if (z < y)
4 w = x + 1;
else
5. y = y + 1;
6. print (x, y, w, z);
Veri Akış Testi İpuçları
Veri akışı ile ilgili tüm anormallikleri incele.
Verileri aşağıdan yukarı ve yukarıdan aşağı olarak incele.
Olabilecek farklı veriler ile veri akışını gerçekleştir.
Veri Akış Testi
Algoritma içerisinde verinin ne şekilde değiştiğini anlamak için yapılan testtir.
Veri ile ilgili anormallikleri ortaya çıkartmak kullanılmaktadır.
Algoritma üzerinde farklı yollar ve farklı dataların seçilmesine dayanır.
Veri testtinin asıl Amacı path, branch ve statment testlerinde eksik kalan kısımları tamamlamaktır.
Veri kod karar önemlidir.
Veri testti veri ile ilgili anormalliklerini tanımlamak için kullanılır.
Veri akış testi paths ve branch testleri arasındaki açıkları kapatmak için yapılmaktadır.
VARIANCE ( ) Fonksiyonu
Varyans, sayısal değerler arasındaki değişkenliği ölçen bir kavramdır. İstatistiksel veri analizlerinde yaygın biçimde kullanılmaktadır. Standart sapmanın karesi olarak bilinmektedir. Bir dizi sayısal değerin varyansını hesaplamak için VARIANCE ( ) fonksiyonu kullanılır.
Örnek-1: Personel maaş bilgilerinin ne ölçüde değişken olduğunu belirlemek istiyoruz;
SELECT VARIANCE (maasi) AS "Varyans"
FROM personel
MS Access'de bu fonksiyon yerine; VARP() fonksiyonu kullanılır.
Kaydol:
Kayıtlar (Atom)