Upload
saltuk-bugra-karahanli
View
42
Download
6
Tags:
Embed Size (px)
Citation preview
Personel Adres Departman
Emsanno Emsanno Departman_kod
Ad Adres Departman_ad
Soyad Il_Ilçe_ad
Maaş Ev_tlf
Departman
Görev
***************************************************************************************************
ÖRNEK SQL’LER
***************************************************************************************************
Örnek-1: Personel tablosunun sütunlarını (yapısını) listeleyiniz.
Cevap: DESC (Describe) komutu tabloların sütunlarını listelemektedir (göstermektedir).
DESC PERSONEL
Örnek-2: Personel tablosundaki bütün kayıtları listeleyiniz.
Cevap: SELECT’ten sonra konacak “*” bütün alanları ifade etmektedir ve WHERE bölümüne herhangi bir şart
yazılmadı ise bütün kayıtları listele demektir.
SELECT *
FROM PERSONEL;
Örnek-3: Personel tablosundaki bütün kayıtların emsanno,ad ve soyad alanlarını listeleyiniz.
Cevap: SELECT’ten sonra istenen alanlar (column) virgül ile ayrılarak yazılır ve WHERE bölümüne herhangi bir
şart yazılmadı ise bütün kayıtları listele demektir.
SELECT EMSANNO, AD, SOYAD
FROM PERSONEL;
Örnek-4: Personel tablosundaki bütün kayıtların emsanno,ad,soyad ve yıllık maaşlarını listeleyiniz.
Cevap: Yıllık maaş, aylık maaşın 12 ile çarpılmasından elde edilir. Bu örnekte görüleceği gibi, SQL cümlelerinde
aritmetik ifadeler (çarpma, toplama, çıkarma, bölme, vb.) kullanılabilmektedir.
SELECT EMSANNO, AD, SOYAD, MAAS * 12
FROM PERSONEL;
Örnek-5: Personel tablosundaki bütün kayıtların emsanno,ad,soyad ve yıllık maaşlarını listeleyiniz ve maas*12
sütununa yeni bir isim (“YILLIKMAAS”) veriniz.
Cevap: Bu örnek, yukarıdaki örneğin aynısı gibi gözüküyor fakat sadece bir fark var: O da maas*12 sütununa yeni
bir isim verme işlemi. SQL’de her yazılan sütuna yeni bir isim verilebilir, buna diğer isim (alias) denir. Şu şekilde
kullanılır:
SELECT EMSANNO, AD, SOYAD, MAAS * 12 YILLIKMAAS
FROM PERSONEL;
Örnek-6: Personel tablosundaki bütün kayıtların emsanno,ad ve soyad alanlarını listeleyiniz. Fakat, ad ve soyad
alanlarını aralarında bir boşluk olmak üzere beraber listeleyiniz.
Cevap: SQL’de, iki veya daha fazla alan birleştirilebilir. Bu işleme, neticelerin sıralanması (concatenation) denir.
Şu şekilde kullanılır:
SELECT EMSANNO, AD||’ ‘|| SOYAD
FROM PERSONEL;
Örnek-7: Personel tablosundaki bütün kayıtların ad,soyad ve departman numarası alanlarını listeleyiniz. Fakat,
ad ve soyad alanlarını aralarında bir boşluk olmak üzere beraber listeleyiniz ve departman numarasından sonra
da “numaralı departmanda çalışıyor” ibaresini ekleyiniz.
Cevap:
SELECT AD||’ ‘|| SOYAD ISCI ,
DEPARTMAN||’ numaralı departmanda çalışıyor’ BOLUM
FROM PERSONEL;
Örnek-8: Personel tablosundaki bütün kayıtların departman numarası alanını listeleyiniz.
Cevap:
SELECT DEPARTMAN
FROM PERSONEL;
Örnek-9: Yukarıdaki örnekte görüleceği gibi bazı departman numaraları birden fazla geldi. Bunun sebebi, aynı
departmanda çalışan birden fazla insan olmasıdır. Eğer her departman numarasından bir tane gelmesini
isteseydik; soru ve cevap şu şekilde olacaktı:
Personel tablosundaki bütün kayıtların departman numarası alanını listeleyiniz fakat her departman
numarasından bir tane (tekil, unique) olsun.
Cevap: Kayıtları tekil olarak listeleme işlemi DISTINCT komutuyla yapılmaktadır. DISTINCT komutu, tekil olarak
listelenecek alan veya alanlardan önce yazılmaktadır.
SELECT DISTINCT DEPARTMAN
FROM PERSONEL;
Örnek-10: Personel tablosundaki bütün kayıtların ad, soyad ve maas alanlarını, maas alanı küçükten büyüğe
doğru sıralı olmak üzere listeleyiniz.
Cevap: Normalde, sorgu sonucu dönen kayıtların belirli bir sırası yoktur. Gelen kayıtlar sıraya konulmak istenirse
ORDER BY komutunu kullanmak gerekir. ORDER BY komutunun iki tipi vardır. Birincisi, küçükten büyüğe doğru
olanıdır, buna ASC (ascending) denir. İkincisi, büyükten küçüğe doğru olanıdır, buna da DESC (descending)
denir. Eğer belirtilmezse, standart olarak ASC kullanılmaktadır. Bu komut şu şekilde kullanılmaktadır:
Cevap:
SELECT AD, SOYAD, MAAS
FROM PERSONEL
ORDER BY MAAS;
Örnek-11: Personel tablosundaki bütün kayıtların emsanno, ad ve soyad alanlarını, emsanno alanı büyükten
küçüğe doğru sıralı olmak üzere listeleyiniz.
Cevap:
SELECT EMSANNO, AD, SOYAD
FROM PERSONEL
ORDER BY EMSANNO DESC;
Örnek-12: Personel tablosundaki görevi “ÜRETİM ŞEFİ” olan bütün kayıtların ad, soyad ve gorev alanlarını
listeleyiniz.
Cevap:
SELECT AD, SOYAD, GOREV
FROM PERSONEL
WHERE GOREV = ‘ÜRETİM ŞEFİ’ ;
Örnek-13: 100 numaralı departmanda çalışan personelin departman, ad ve soyad alanlarını listeleyiniz ve
kayıtları ad alanına göre küçükten büyüğe doğru sıralayınız.
Cevap:
SELECT DEPARTMAN, AD, SOYAD
FROM PERSONEL
WHERE DEPARTMAN = 100
ORDER BY AD ASC ;
Örnek-14: 100 ve 200 numaralı departmanlarda çalışan personelin departman, ad ve soyad alanlarını listeleyiniz
ve kayıtları departman ve ad alanlarına göre küçükten büyüğe doğru sıralayınız.
Cevap: SQL’lerde bir alanın değeri birden fazla verilirse, bu tip SQL’lerde WHERE bölümünde operatör olarak IN
kullanılmaktadır. Değerlerde, parantez içerisinde yazılmaktadır.
SELECT DEPARTMAN, AD, SOYAD
FROM PERSONEL
WHERE DEPARTMAN IN (100,200)
ORDER BY DEPARTMAN, AD ASC ;
Örnek-15: Personel tablosundaki görevi “ÜRETİM ŞEFİ” ve “SATIŞ UZMANI” olan bütün kayıtların ad, soyad ve
görev alanlarını listeleyiniz ve kayıtları görev ve ad alanlarına göre küçükten büyüğe doğru sıralayınız.
Cevap: Eğer, IN bölümünde liste içerisine yazılacak değerler karakter değerler ise tırnak içerisinde yazılmaktadır.
SELECT AD, SOYAD, GOREV
FROM PERSONEL
WHERE GOREV IN (‘ÜRETİM ŞEFİ’, ‘SATIŞ UZMANI’)
ORDER BY GOREV, AD;
Bu SQL, şu şekilde de yazılabilmektedir:
SELECT AD, SOYAD, GOREV
FROM PERSONEL
WHERE GOREV IN (‘ÜRETİM ŞEFİ’, ‘SATIŞ UZMANI’)
ORDER BY 3,1 ;
Burada, alanların isimleri yerine alanların sırası ORDER BY bölümünde kullanılmıştır. Bu kullanım yazım
açısından daha kolaydır.
Örnek-16: Maaşı 150 milyon liradan fazla olan personelin ad, soyad ve maas alanlarını listeleyiniz ve kayıtları
maas alanına göre küçükten büyüğe doğru sıralayınız.
Cevap:
SELECT AD, SOYAD, MAAS
FROM PERSONEL
WHERE MAAS > 150000000
ORDER BY MAAS;
Sorudaki 150 milyondan büyük cümlesi, 150 milyona eşit ve büyük şeklinde değiştirilirse, SQL ve sorgu sonucu
dönen kayıtlar şu şekilde olur:
SELECT AD, SOYAD, MAAS
FROM PERSONEL
WHERE MAAS >= 150000000
ORDER BY MAAS;
Yine, sorudaki 150 milyondan büyük cümlesi, maaşı 100 milyon ile 200 milyon arasında olanlar şeklinde
değiştirilirse, SQL ve sorgu sonucu dönen kayıtlar şu şekilde olur:
SELECT AD, SOYAD, MAAS
FROM PERSONEL
WHERE MAAS BETWEEN 100000000 AND 200000000
ORDER BY MAAS;
Örnek-17: Adres kayıtlarından ev telefonu alanı boş olan kayıtların emsanno,adres ve il_ilce_ad alanlarını
listeleyiniz.
Cevap: Önce, adres tablosunun kayıt alanlarını listeleyelim.
DESC ADRES
SELECT EMSANNO, ADRES, IL_ILCE_AD
FROM ADRES
WHERE EV_TLF IS NULL;
Örnek-18: Adres kayıtlarından ev telefonu alanı boş olmayan kayıtların emsanno,adres ve il_ilce_ad alanlarını
listeleyiniz.
Cevap:
SELECT EMSANNO, ADRES, IL_ILCE_AD
FROM ADRES
WHERE EV_TLF IS NOT NULL;
Örnek-19: Personel kayıtlarından adı “A” ile başlayan kayıtların emsanno, ad ve soyad alanlarını listeleyiniz.
Cevap: Adı “A” ile başlayan kayıtlar denildiğinde LIKE kullanılır. LIKE’ın kullanımı şu şekildedir:
<değer>% Başı değer ile başlayan ve sonu
önemsiz olan demektir.
%<değer> Sonu değer ile biten ve başı önemsiz
olan demektir.
%<değer>% İçerisinde herhangi bir yerde değer
geçen demektir.
SELECT EMSANNO, AD, SOYAD
FROM PERSONEL
WHERE AD LIKE ‘A%’ ;
Örnek-20: Personel kayıtlarından maaşı 100 milyon ile 200 milyon arasında olan ve görevi “ÜRETİM ŞEFİ” olan
kayıtların ad, soyad, maas ve gorev alanlarını listeleyiniz ve kayıtları ad ve soyad alanlarına göre sıralayınız.
Cevap: WHERE bölümüne, birden fazla şart aralarına “AND” konarak yazılabilir. Buna örnek olarak:
SELECT AD, SOYAD, MAAS, GOREV
FROM PERSONEL
WHERE MAAS BETWEEN 100000000 AND 200000000 AND
GOREV = ‘ÜRETİM ŞEFİ’ ;
ORDER BY AD, SOYAD;
Örnek-21: Personel kayıtlarından maaşı 100 milyon ile 200 milyon arasında olan veya görevi “ÜRETİM ŞEFİ”
olan kayıtların ad, soyad, maas ve gorev alanlarını listeleyiniz ve kayıtları ad ve soyad alanlarına göre listeleyiniz.
Cevap:
SELECT AD, SOYAD, MAAS, GOREV
FROM PERSONEL
WHERE (MAAS BETWEEN 100000000 AND 200000000) OR
GOREV = ‘ÜRETİM ŞEFİ’ ORDER BY AD, SOYAD;
Örnek-22: Personel tablosundaki bütün kayıtların ad ve gorev alanlarını ve görevi “SATIŞ UZMANI” olanlar için 1,
“GENEL MÜDÜR” olanlar için 2, “ÜRETİM ŞEFİ” olanlar için 3 yazarak listeleyiniz.
Cevap: SQL fonksiyonlarından bazıları vardır ki, yukarıdaki bölümlerin hiçbirisine girmez. Bunlara örnek
olarak DECODE sayılabilir. DECODE, programlama dillerindeki “if-then-else” veya “case” ifadelerinin karşılığıdır.
Yani, DECODE seçim işlemini yapmaktadır. Özellikle, rapor hazırlarken çok kullanışlı bir komuttur. Mesela,
veritabanında cinsiyet için “E” ve “K” tutup, rapor alırken “Erkek” ve “Kadın” şeklinde gösterme işlemi gibi işlerde
kullanılmaktadır.
SELECT AD, GOREV,
DECODE(GOREV, ‘SATIŞ UZMANI’, ’1′, ‘GENEL MÜDÜR’, ’2′, ‘ÜRETİM ŞEFİ’, ’3′)
FROM PERSONEL;
Örnek-23: Personel tablosundaki bütün kayıtların ortalama maaşını hesaplayınız.
Cevap:
SELECT AVG(MAAS)
FROM PERSONEL;
Örnek-24: Personel tablosundaki kayıt sayısını hesaplayınız.
Cevap:
SELECT COUNT(*)
FROM PERSONEL;
Örnek-25: Personel tablosundaki her görev grubunun ortalama maaşını hesaplayınız ve kayıtları büyükten
küçüğe doğru sıralayınız.
Cevap: Kayıtları belli özelliklerine göre gruplayıp onlar üzerinde işlem yapılacağı zaman GROUP BY komutu
kullanılır. GROUP BY komutu kullanılırken GROUP BY bölümünde SELECT bölümünde yazılan alanların grup
fonksiyonunun kullanıldığı alan hariç hepsi yazılmak zorundadır. Aksi halde, yazım hatası yapılmış olmaktadır ve
SQL cümlesi çalıştırılamaz. Kullanımı şu şekildedir:
SELECT GOREV, AVG(MAAS)
FROM PERSONEL
GROUP BY GOREV
ORDER BY 2 DESC;
Örnek-26: Personel tablosundaki en yüksek maaşı gösteriniz.
Cevap:
SELECT MAX(MAAS)
FROM PERSONEL;
Örnek-27: Her departmandaki en yüksek maaşları listeleyiniz.
Cevap: Grup fonksiyonlarının bulunduğu SQL cümlelerinde, SELECT bölümünde grup fonksiyonu haricindeki
bütün alanlar GROUP BY bölümünde bulunmak zorundadır.
SELECT DEPARTMAN, MAX(MAAS)
FROM PERSONEL
GROUP BY DEPARTMAN;
Örnek-28: Ortalama maaşı 100 milyondan büyük olan departmanları listeleyiniz.
Cevap: Grup fonksiyonlarının bulunduğu SQL cümlelerinde, grup ile ilgili şartlar WHERE bölümüne değil,HAVING
bölümüne yazılır.
SELECT DEPARTMAN, AVG(MAAS)
FROM PERSONEL
GROUP BY DEPARTMAN
HAVING AVG(MAAS) > 100000000;
Eğer, bu SQL’de 100 milyon şartı olmasaydı; SQL ve sonucu şu şekilde olurdu:
SELECT DEPARTMAN, AVG(MAAS)
FROM PERSONEL
GROUP BY DEPARTMAN;
Örnek-29: Her departmandaki ortalama maaşları “GENEL MÜDÜR” hariç olmak üzere listeleyiniz ve kayıtları en
yüksek ortalamadan en düşük ortalamaya doğru sıralayınız.
Cevap: Grup fonksiyonlarının bulunduğu SQL cümlelerinde, grubu ilgilendirmeyen şartlar WHERE bölümüne
yazılmaktadır. Bu örnekte, “GENEL MÜDÜR”ün hariç olması, WHERE bölümünde veya HAVING bölümünde
belirtilebilir, yani “GENEL MÜDÜR”ün hariç olması hem grubu ilgilendirmektedir hem de
ilgilendirmemektedir. Şartların grubu ilgilendirip ilgilendirmediğine, şartın belirtildiği değerin veritabanında
olup olmadığına göre karar verilmektedir. Eğer, belirtilen şart GROUP işlemi sonucu meydana çıkan bir grup
fonksiyonu ile ilgili ise bu şart grupla ilgilidir. Mesela, ortalama maaşı 100 milyondan büyük departmanları
listeleyin denilirse, bu şart grupla ilgilidir. Çünkü, bu değer veritabanında yoktur ve GROUP işlemi sonucu grup
fonksiyonundan bu değer gelmektedir.
SELECT DEPARTMAN, AVG(MAAS)
FROM PERSONEL
WHERE GOREV != ‘GENEL MÜDÜR’
GROUP BY DEPARTMAN
ORDER BY 2 DESC;
Örnek-30: Bütün personelin ad, soyad ve departman adı bilgilerini listeleyiniz.
Cevap: Personel tablosunda departman adı diye bir alan yoktur. Bu değer ancak, departman tablosundan
seçilebilir. O halde birleştirme işlemi yapmak lazımdır. Personel ve Departman tabloları arasındaki birleştirme
işlemi departman alanı üzerinden yapılır. Bu işlem şu şekilde yapılır:
SELECT AD, SOYAD, DEPARTMAN_AD
FROM PERSONEL, DEPARTMAN
WHERE PERSONEL.DEPARTMAN = DEPARTMAN.DEPARTMAN_KOD;
Örnek-31: Bütün personelin emsanno, ad, soyad ve departman adı bilgilerini listeleyiniz ve her alanın başına
ilgili tablonun ismini yazınız.
Cevap: Bu SQL’de, SELECT bölümünde emsanno alanı yazılırken bir karışıklığa meydan vermemesi için alanın
başına tablonun ismi yazılır. Çünkü, her iki tabloda da emsanno alanı vardır.
SELECT PERSONEL.EMSANNO, AD, SOYAD, DEPARTMAN_AD
FROM PERSONEL, DEPARTMAN
WHERE PERSONEL.DEPARTMAN = DEPARTMAN.DEPARTMAN_KOD;
SELECT P.EMSANNO, P.AD, P.SOYAD, D.DEPARTMAN_AD
FROM PERSONEL P, DEPARTMAN D
WHERE P.DEPARTMAN = D.DEPARTMAN_KOD;
Örnek-32: Bütün personelin ad, soyad ve ev telefonu alanlarını listeleyiniz.
Cevap:
SELECT P.AD, P.SOYAD, A.EV_TLF
FROM PERSONEL P, ADRES A
WHERE P.EMSANNO = A.EMSANNO;
Burada, sadece 5 tane kayıt gelmektedir, yani 5 tane personelin adres kayıdı var, bunlardan da 2
tanesinin ev_tlf alanı boş. Aslında, personel tablosunda 10 kayıt vardı. Diğer 5 personelin adres tablosunda kayıdı
olmadığı için sorgu sonucunda gelmedi. Eğer SQL, dış birleştirme yöntemiyle yapılırsa, SQL ve sonuç şu şekilde
değişir:
SELECT P.AD, P.SOYAD, A.EV_TLF
FROM PERSONEL P, ADRES A
WHERE P.EMSANNO = A.EMSANNO (+) ;
Örnek-33: Maaşı en fazla olan personelin emsanno, ad, soyad ve maas alanlarını listeleyiniz.
Cevap: Bu soru daha önce sorulsaydı, cevap vermek zor olacaktı. Fakat, altsorgu ile bu işlem çok kolay bir
şekilde yapılabilir. Altsorguda, ilk önce en fazla maaş bulunur ve bu maaş WHERE bölümüne yazılarak ilgili
kayıda erişilmiş olur.
SELECT EMSANNO, AD, SOYAD, MAAS
FROM PERSONEL
WHERE MAAS =
(SELECT MAX(MAAS)
FROM PERSONEL);
Örnek-34: Her departmanda en az maaş alan personelin emsanno, ad, soyad ve maas alanlarını listeleyiniz.
Cevap: Bu örnekde altsorguda group by işlemi var, böylece altsorgudan birden fazla kayıt dönmektedir. Bu
yüzden, WHERE bölümünde şart yazarken IN komutu kullanılmaktadır.
SELECT DEPARTMAN, EMSANNO, AD, SOYAD, MAAS
FROM PERSONEL
WHERE MAAS IN
(SELECT MIN(MAAS)
FROM PERSONEL
GROUP BY DEPARTMAN);
Örnek-35: 100 numaralı departmanda çalışan herhangi bir personelden daha fazla maaş alan personelin
emsanno, ad, soyad ve maas alanlarını listeleyiniz.
Cevap: Bu örnekteki “herhangi bir” ifadesi bize SOME/ANY kullanılacağını göstermektedir.
SELECT EMSANNO, AD, SOYAD, MAAS
FROM PERSONEL
WHERE MAAS > SOME
(SELECT DISTINCT MAAS
FROM PERSONEL
WHERE DEPARTMAN = 100);
Örnek-36: 100 numaralı departmanda çalışan her personelden daha fazla maaş alan personelin emsanno, ad,
soyad ve maas alanlarını listeleyiniz.
Cevap: Bu örnekteki “her personel” ifadesi bize ALL kullanılacağını göstermektedir.
SELECT EMSANNO, AD, SOYAD, MAAS
FROM PERSONEL
WHERE MAAS > ALL
(SELECT DISTINCT MAAS
FROM PERSONEL
WHERE DEPARTMAN = 100);
Bu örnek MAX fonksiyonu ile de çözülebilmektedir. Çünkü, 100 numaralı departmanda çalışan her personelden
fazla demek, o departmanda en yüksek maaş alan personelden fazla demektir. Eğer, SQL’i bu şekilde yazacak
olursak :
SELECT EMSANNO, AD, SOYAD, MAAS
FROM PERSONEL
WHERE MAAS >
(SELECT MAX(MAAS)
FROM PERSONEL
WHERE DEPARTMAN = 100);
Örnek-37: 400 numaralı departmanda çalışan personelin ortalama maaşından daha fazla ortalama maaşı olan
departmanları listeleyiniz.
Cevap:
SELECT DEPARTMAN, AVG(MAAS)
FROM PERSONEL
GROUP BY DEPARTMAN
HAVING AVG(MAAS) >
(SELECT AVG(MAAS)
FROM PERSONEL
WHERE DEPARTMAN = 400);
Örnek-38: Personel tablosunda kendi bölümünün ortalama maaşından daha fazla maaş alan personelin
emsanno, ad, soyad ve maas alanlarını listeleyiniz.
Cevap: SQL’de her tablo kendisi ile birleştirilebilmektedir. Örnek olarak:
SELECT P.EMSANNO, P.AD, P.SOYAD, P.MAAS
FROM PERSONEL P
WHERE P.MAAS >
(SELECT AVG(MAAS)
FROM PERSONEL P2
WHERE P2.DEPARTMAN = P.DEPARTMAN);