19 Mayıs 2014 Pazartesi

SQL'de Tablo Birleştirme ve JOIN


SQL'de bazı durumlarda birden fazla tablodan veri çekme ihtiyacı duyabiliriz. Bunun için tablolar arasında bir ilişki kurulması gerekmektedir. Bu ilişki JOIN ile sağlanır. JOIN ifadesi birden fazla tabloyu birbirine bağlayıp  bu tablolar üzerinde işlem yapmamıza olanak sağlar.

JOIN ifadesi ile hangi tabloları ve nasıl birleştireceğimizi ON ifadesi ile tabloların hangi alanlar üzerinden birleşeceğini belirtiriz.

Tablolar genelde Birincil Anahtar ve Yabancı Anahtar alanları üzerinden birleştirilselerde, gerektiğinde diğer herhangi bir alan da bunun için kullanılabilir. Fakat bu alanların aynı tür veri içerdiğinden emin olmalısınız.

Birincil Anahtar (Primary key), her kayıt için benzersiz bir değer taşıyan alandır. 

Örneğin, öğrenci kayıtlarının tutulduğu bir tabloda, öğrenci numarasının saklandığı alan birincil anahtar olarak seçilebilir. Zira öğrenciyle ilgili tüm bilgiler gerçekte onun numarası ile kodlanmıştır ve her öğrencinin numarası bir birinden farklıdır.

Tablolar birleştirilirken Primary Key - Foreign Key ikilisi kullanılır. Tablolar arası ilişkiler aynı zamanda Unique Index kullanılarakta yapılabilir. Fakat yaygın olarak PK - FK kullanılır.

Primary Key (Birincil Anahtar) : Her satırı tekil bir şekilde tanımlayan benzersiz anahtardır. Primary Key sayesinde tablolarda bulunan satırlar birbirlerinden farklı olur ve her satırın Primary Key değeri farklı atanır. Primary Key tek bir sütun olduğu gibi birden fazla sütundan da oluşabilir.

  • Primary Key olacak sütun asla boş değer almamalıdır.
  • Primary Key olacak sütun tekrarı olmayan kayıtlardan oluşmalıdır...
  • Primary Key sütunu olabildiğince küçük ve basit veri tipinde tanımlanmalıdır.

Foreign Key (Yabancı Anahtar) : Bir tablodaki sütunun başka tablodaki anahtara olan referansını belirler. Primary Key'den farklı olarak bir tabloda birden fazla Foreign Key olabilir.

Örnek Sorgularda kullandığım Northwind Veritabanı diyagramını inceleyerek PK - FK bağlantılarını görebilirsiniz (diyagram'ın ayrıntılı sürümünü indirmek için tıklayınız.)


SQL'de COMPUTE ve COMPUTE BY Kullanımı

  • COMPUTE sorgumuzdaki kolonları Aggregate Fonksiyonlar ile kullanmamızı sağlar.
  • COMPUTE tüm sonuç kümesini listeler ve bu listenin altında tek bir detay satırı görüntüler. 
  • Farklı olarak tek sorguda 2 tane sonuç listesi bize döndürür. 2.liste detay listesidir. 
  • COMPUTE ile kullanılan sütun SELECT ifadesinde yer almalıdır.
  • COMPUTE BY kullanarak daha detaylı gruplandırma da yapılabilir.
NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 

Örnek Sorgu 1:
SELECT productid, orderid, quantity FROM [Order Details]
ORDER BY productid, orderid COMPUTE SUM(quantity)

(Sipariş detayları (Order Details) tablosundaki tüm satırları listeler ve kayıt kümesinin sonuna tüm ürünlerin genel toplamını verir.)

Örnek Sorgu 2:
SELECT productid, orderid, quantity FROM [order details]WHERE orderid<10250 ORDER BY orderid,productid COMPUTE SUM(quantity) BY orderid COMPUTE SUM(quantity)

(Sipariş Detayları (Order Details) tablosundaki tüm satırları listeler ve her sipariş altına sipariş genel toplamını verir. Son olarak ise tüm siparişlerdeki genel toplam görüntülenir.)  

NOT : SQL Server 2008 RS sonrası sürümlerde COMPUTE ve COMPUTE BY çalışmamaktadır. MSDN makalelerinde COMPUTE ve COMPUTE BY için SQL Server 2008 RS sonrası sürümlerde kaldırılacağı ve yerine ROLLUP kullanılması tavsiye edilmektedir. Detaylı bilgi için tıklayınız.

GROUPING Fonksiyonu

  • SQL Server'da Fonksiyonlar, hesaplamalarda ve özellikle sistem hakkında bilgi almada yaygın olarak kullanılan araçlardır. Transact-SQL (T-SQL) programlama dilinde değişik kategorilerle adlandırılan fonksiyonlar vardır. Bunlardan en yaygını veriler üzerinde işlem yapan toplama ya da gruplama olarak adlandırabileceğimiz aggregate fonksiyonlarıdır. 
  • GROUPING Aggregate (Gruplama) Fonksiyonudur.
  • GROUP BY ile kullanılan ROLLUP ve CUBE ile elde edilen sonuç listesini GROUPING fonksiyonu daha kolay değerlendirip yorumlamamızı sağlar. 
  • Sütunlarda özet bilgiler için 1, detay bilgiler için 0 değeri görüntülenir.
NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 

Örnek Sorgu :
SELECT OrderID, GROUPING(OrderID), ProductID,GROUPING(ProductID), SUM(quantity) AS 'Toplam Sipariş'
FROM [order details] WHERE OrderID < 10250
GROUP BY OrderID, ProductID WITH CUBE ORDER BY OrderID, ProductID


Sorgumuzda sütunlara dikkat edelim. OrderID alanı NULL olarak görünen kayıtlar tüm siparişlerdeki ürünlerin toplamlarını göstermektedir.

18 Mayıs 2014 Pazar

Java SWITCH CASE Örnek


Dışardan girilen bir sayi için;
f:faktöriyel hesabı yapan,
i:girilen sayı kadar isim yazan
t:girilen sayıya kadar kaç tane tek var
y:girilen sayıya kadar kaç tane cift var

İşlemlerini yapan yapan programı switch case ile yazınız.
Program sonunda; Devam etmek istiyormusun(E/H) sorusuyla başa dönmelidir.
Faktöriyel döngüsü do while; isim yazdırma döngüsü while ile yazılmalıdır.
import java.util.Scanner;
public class SWITCHCASE {
private static Scanner giris;
public static void main (String Arg[])
{
 
    gidilecekYer: do {
 //---------------------
 int s,f=1;
 int u=1;
 int x,m;
 
 Scanner giris = new Scanner(System.in);
 System.out.println("islem yapilacak sayiyi giriniz:");
 s=giris.nextInt();
 
 System.out.println("\n\n(f) Faktoriyel Hesapla");
 System.out.println("(i) Girilen Sayi Kadar Isim Yaz");
 System.out.println("(t) Sayiya kadar kac adet tek sayi var");
 System.out.println("(y) Sayiya kadar kac adet cift sayi var");
 String a=giris.next();
 char z = a.charAt(0);
 
 switch (z) {
  case 'f':
   do
   {
   f=f*s;
   s--;
   }
   while (s!=1); //sayi 1 e esit degilse dön. yani do calissin.
   System.out.println("Faktoriyel Sonuc:"+f); 
   
 break;
  case 'i':
   m=1;
   while (m<s+1)
   {
    System.out.println("BAYRAKTAR\n");
    m++;
   }
 break;
  case 't':
   for(m=0;m<s+1;m++)
   {
    if(m%2==1)
    {
     System.out.println("tek sayi: "+m);
    }
   }
   break;
  case 'y':
   x=1;
   for(m=0;m<s+1;m++)
   {
    if(m%2==0)
    {
     System.out.println(x+".cift sayi: "+m);
     x++;
    }
   }
   break;
   
  default: System.out.println("Hatali Deger Girdin."); break;
    
 }
 //--------------
 System.out.println("Devam Etmek istiyor musunuz ? (e/h)");
 String x1=giris.next();
 char x2 = x1.charAt(0);
 
 if(x2=='e')
 {
  continue gidilecekYer; 
 }
 else
 {
 break;
 }
  } while(true);
 
}}

C Programlama SWITCH CASE Örnek

Dışardan girilen bir sayi için;
f:faktöriyel hesabı yapan,
i:girilen sayı kadar isim yazan
t:girilen sayıya kadar kaç tane tek var
y:girilen sayıya kadar kaç tane cift var

İşlemlerini yapan yapan programı switch case ile yazınız.
Program sonunda; Devam etmek istiyormusun(E/H) sorusuyla başa dönmelidir.
Faktöriyel döngüsü do while; isim yazdırma döngüsü while ile yazılmalıdır.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(void)
{
    gidilecekYer: ;
    system("cls");       
    int s;
    int f=1;
 int u=1;
 int x,m;
 char z;

    printf ("Islem Yapilacak Sayiyi Giriniz: ");
    scanf("%d",&s);
 printf("\n\n(f) Faktoriyel Hesapla"); 
 printf("\n(i) Girilen Sayi Kadar Isim Yaz");
 printf("\n(t) Sayiya kadar kac adet tek sayi var");
 printf("\n(y) Sayiya kadar kac adet cift sayi var\n\n"); 
 
 scanf("%s",&z);
    
      switch (z) {
  case 'f':
   do
   {
   f=f*s;
   s--;
   }
   while (s!=1); //sayi 1 e esit degilse dönecek. do calisacak.
   printf ("Faktoriyel Sonuc: %d",f);
   break;
    case 1:
   printf ("1e");
   break;
        case 'i':
   m=1;
   while (m<s+1)
   {
   printf ("BAYRAKTAR\n");
   m++;
   }
   break;
      
        case 't':
   for(m=0;m<s+1;m++)
   {
    if(m%2==1)
    {
   printf("tek sayi: %d",m);
    }
   }
   break;
   
  case 'y':
   x=1;
   for(m=0;m<s+1;m++)
   {
    if(m%2==0)
    {
   printf(x+".cift sayi: %d",+m);
   x++;
    }
   }
   break;   
   
            default: printf("Hatali Deger Girdin"); break;
} 
   
   char x2; 
   printf("\n\nDevam Etmek istiyor musunuz ? (e/h)\n");
   scanf("%s",&x2); 
   
 
   if(x2=='e')
   {
               goto gidilecekYer;
} 
}

Copyright 2013-2017 | İbrahim BAYRAKTAR /dev/null Web Günlüğü