SQL Komutları & SQL ile ilgili herşey
SQL (STRUCTURED QUERY LANGUAGE) Yapısal Sorgulama Dili olan SQL, ilişkisel veritabanlarındaki bilgileri sorgulamak için standart kullanımı olan bir dildir. Standart bir dil olmasına karşılık, çeşitli veritabanlarında SQL kullanımları arasında farklılıklar vardır.
SQL komutları ile, tablolara yeni kayıt girme, varolan kayıtları sorgulama (arama ve listeleme), varolan bilgileri değiştirme ve varolan kayıtları silme işlemleri yapılabilir.
Bu yazı dizimizde SQL Komutlarını inceleyeceğiz.
Tablo Adı: “musteriler” olan bir veritabanı tablomuzu örnek alalım.
| musteriNo | ad | soyad | dogumTarihi | sehir | cinsiyet | puan |
| 1 | Ali | Timur | 1996-11-03 00:00:00.000 | Ankara | E | 85 |
| 2 | Merve | Genç | 1976-02-19 00:00:00.000 | Çorum | K | 90 |
| 3 | Hakkı | Temiz | 1966-06-10 00:00:00.000 | Elazığ | E | 10 |
| 4 | Nilay | Çağla | 1992-02-18 00:00:00.000 | İstanbul | K | 40 |
| 5 | Muzaffer | Batmaz | 1955-12-30 00:00:00.000 | Ankara | E | 55 |
Yukardaki tablomuz bir veritabanından örnek olarak alınmış olup, musteriler isminde içerisinde musteriNo,ad,soyad,dogumTarihi,sehir,cinsiyet ve puan sütunlarını içeren bir örnektir.
NOT: Bu tabloyu bir eğitim firmasına ait veriler kümesi olarak düşününüz.
Sırayla örnek tüm işlemlerimizi yapalım.
SELECT
Select komutu ile biz veritabanı tablomuzun ilgili sütunlarındaki değerlerini getirebiliriz.
SELECT * FROM musteriler
Yukartaki tabloyu aynen getirir. Örnek olması açısından sizinde yapmanızı isteyeceğim bir kaç soru da ekleyeceğim.
SELECT ad,soyad,puan FROM musteriler
müşterilerin adını, soyadını ve puanını listeler.
Soru 1 : Müşterilerin Ad, Soyad, Şehir bilgilerini getiren SQL ‘ide siz yazınız ?
Soru 2: Müşterilerin yalnızca doğum tarihlerini getiren SQL sorgusunu yazınız ?
SELECT DISTINCT
SELECT DISTINCT komutu ile bizler tekrarlayan verileri yalnızca bir kayıt gösterecek şekilde ayarlayabiliriz.
SELECT DISTINCT sehir FROM musteriler
Örneğin müşterilerimizin hangi illerden olduğunu öğrenmek istiyoruz. Şehir listesinde 2 tane Ankara değeri bulunmaktadır. Bu değeri tekilleştirmemiz gerekiyor. İşte bu kısımda devreye bu güzel komutumuz giriyor. Yukarıdaki örnek bu cümlemizi aynen gerçekleştirmektedir.
Soru 1 : Sizde cinsiyet sütunundaki tekrarlayan verileri temizleyecek bir SQL komutu yazınız.
WHERE
Tablolarımızdaki verilerimizi listelerken filtreleme yapmamız için kullandığımız komuttur.
SELECT * FROM musteriler WHERE sehir = 'Çorum'
Şehiri Çorum olan tüm müşteri bilgilerimize ulaşmamız için yukardaki SQL sorgumuzu yazarız.
SELECT musteriNo,ad,soyad FROM musteriler WHERE puan >= 50
Eğitim sertifikaları vermemiz için tüm müşterileri bir sınava soktunuz. Sınavda 50 geçer not ve biz tüm geçenleri listelememiz gerekmektedir. Yukardaki sorgu ile bunu yapabiliriz.
WHERE komutu ile tüm istediğimiz filtreleme özelliklerini kullanabiliriz. Tabi bunun için operatörleri bilmemiz gerekmektedir. Liste aşağıdadır.
| Operator | Açıklama |
|---|---|
| = | Eşit |
| <> | EşitDeğil.Not:Bazı versiyonlarda “!=” kullanılabilir. |
| > | Büyüktür |
| < | Küçüktür. |
| >= | Büyük Eşittir |
| <= | Küçük Eşittir |
| BETWEEN | Arasında |
| LIKE | Örüntü arama |
| IN | Bir sütun için birden çok olası değerleri belirtmek için |
BETWEEN
Belirli koşullar arasındaki kayıtları listeler. Sayı, Metin veya Tarih değerleri verilebilir.
SELECT * FROM musteriler WHERE puan BETWEEN 60 AND 70
Puanı 60 ve 70 arasındaki müşterilerin tüm bilgilerini getirir.
SELECT * FROM musteriler WHERE ad BETWEEN 'A' AND 'D'
adının ilk harfi A ile D arasında olan verileri getiren sql sorgusudur.
LIKE
Tablodaki verileri aramak için LIKE komutu kullanılır.
SELECT * FROM musteriler WHERE ad LIKE 'A%'
Adı A ile başlayan tüm verilerin bilgilerini getirir.
SELECT ad,soyad FROM musteriler WHERE sehir LIKE 'Ç%'
Şehri Ç ile başlayan müşterilerin ad ve soyadlarını getirir.
SELECT ad,soyad FROM musteriler WHERE ad LIKE '%a%'
Müşteiler tablosunda ad sutünunda içerisinde a bulunan verileri getiren SQL sorugusudur.
Soru 1 : Puanı 50 ‘den yüksek ve adı A ile başlayan müşterinin tüm bilgilerini getiren SQL sorgusu yazınız.
IN
IN operatörü WHERE ile birlikte birden çok değeri belirlememize yarayan komuttur.
SELECT * FROM musteriler WHERE sehir IN ('İstanbul','Ankara')Şehiri istanbul ve Ankara olan müşterilerin bilgilerini getirir.
Soru 1 : müşteriler tablosunda Adı Ali, Gökçe ve Merve adındaki müşterilerin adı, soyadı, doğum tarihi ve puan bilgisini getiriniz.
AND – OR Kullanımı
AND komutu ve OR komutunu Bilgisayarla ilgili sayısal tasarım, işaret işleme gibi donanımsal derslerden hatırlıyorsunuzdur.
en az 2 koşul sunuyorsunuz, AND ‘te eğer hepsi 1 ise size başarılı sonuç geliyor, OR ‘da en az 1 ‘i geçerli bir sonuç ise yani 1 size yine başarılı bir sonuç dönüyor. Yoksa gelmiyor.
SELECT * FROM musteri WHERE sehir='Ankara' AND cinsiyet='E'
Örneğin şehri Ankara ve cinsiyeti Erkek olanları getirmek için yaptık.
Soru 1 : Cinsiyeti Kız ve Puanı 50 ‘den yüksek olan öğrencileri getiren bir SQL yazınız.
SELECT * FROM musteri WHERE ad="Ali" or soyad='Genç'
Adı Ali veya Soyadı Genç olan müşterilerimizin tüm bilgilerini getirmek için yukardakini yazdık.
Son olarak and ve or birlikte kullanılırsa,
SELECT * FROM musteriler WHERE cinsiyet='E' AND (sehir='Ankara' OR sehir='İstanbul')
cinsiyeti Erkek olup şehiri Ankara veya istanbul olan verileri getirmek için yukardaki sorguyu çalıştırdık.
Soru 2 : Şehiri Ankara ve notu 55 veya cinsiyeti Erkek olanları getiren bir sorgu yazınız.
Soru 3 : Kız öğrenci olup 50 üstü not alan öğrencilerin musteri numaralarını, ad ve soyadlarını gösteren SQL komutu yazınız.
INSERT INTO
Veritabanına yeni bir kayıt eklerken kullanırız.
INSERT INTO musteriler(ad,soyad,dtarih,sehir,cinsiyet,puan)
VALUES ('Gökçe','Cengiz','1997-02-12','Bursa','K',40)Soru 1 : Kendinizi müşterileriler tablosuna yeni bir kayıt olarak ekleyiniz.
Veritabanında musteriNo primaryKey yani aynı kayıt olmaması gerekir ve bu kayda göre veriler getirilebilir. Örneğin T.C Kimlik Numaranız. Burada AUTO INCREMENT olduğundan veritabanında otomatik olarak id değeri 1 arttılır. Ondan eklenmemiştir.
UPDATE
Veri tabanında bir kaydı güncellemek için kullanırız.
UPDATE musteriler SET puan=85 WHERE musteriNo=1
Müşteri nosu 1 olan müşterinin puanını 85 yapar.
Soru 1 : Yeni eklemiş olduğunuz kaydınızın puanını güncelleyeniz.
DELETE
Veri tabanınızdan verileri silmeye yarar.
DELETE FROM musteriler WHERE musteriNo=5
müsteriNo 5 olan müşterinin tüm verilerini siler. WHERE kullanılmazsa tüm tablodaki verileri siler.
Soru 1 : Sizde yeni oluşturduğunuz kaydı silen bir SQL sorgusu yazınız.
SELECT TOP
Belirtilen sayıda kayıt gösterilmesi için kullanılır.
SELECT TOP 3 * MUSTERILER
İlk 3 müşterinin bilgsini gösterir.
SELECT AVG
Sütunun ortalama değerini döndürür.
SELECT AVG(puan) FROM musteriler
Müşteriler tablosunda puan ortalamasını döndürür.
SELECT AVG(puan) FROM musteriler WHERE memleket='Ankara'
Memleketi Ankara olanların puan ortalamasını getirir.
SELECT COUNT
Belirtilen koşuldaki toplam sayıyı gösterir.
SELECT COUNT(memleket) FROM musteriler WHERE sehir='Ankara'Şehiri Ankara olan müşterilerin toplam sayısını getirir.
SELECT MAX
Şeçilen sütunun en büyük değerini döndürür.
SELECT MAX(puan) FROM musteriler
müşteriler tablosundaki en yüksek puanı getirir.
SELECT MIN
Şeçilen sütunun en küçük değerini döndürür.
SELECT MIN(puan) FROM musteriler
Müşteri tablosundan en küçük puanı görüntülemek için;
ORDER BY
Sıralama yapmaya yarar.
SELECT * FROM musteriler ORDER BY dtarih
Doğum Tarihine göre müşteriler tablosunu sıralar.
ORDER BY .. DESC
DESC komutu Büyükten Küçüğe Sıralama yapar.
SELECT * FROM musteriler ORDER BY dtarih DESC
Büyükten küçüğe doğru doğrum tarihine göre müşteriler tablosunu sıralar.
LIMIT
Ekranda kaç tane sorgu gösterileceğini ayarlar.
SELECT * FROM musteriler limit 5
Müşteriler tablosundaki 5 kaydı gösterir.
SELECT * FROM musteriler limit 3,4
Müşteriler tablosundaki 3 kayıttan itibaren sonraki 4 kaydı gösterir.
SQL YER TUTUCU KARAKTERLER
musteriler tablosunda adı “al” ile başlayan kayıtları listelemek için;
SELECT * FROM musteriler WHERE ad LIKE 'al%'
musteriler tablosunda ismi M ile başlayıp ondan sonraki 2 karakteri herhangi bir harf olan ve v ile devam eden ve ondan sonraki harfi belli olmayan kayıtları listeleyelim.(Adı Merve olanları listelemek için)
SELECT * FROM musteriler WHERE ad LIKE 'M_ _ v_'
Müşteriler tablosunda adı a ile b ile yada s ile başlayan kayıtları listeleyelim.
SELECT * FROM musteriler WHERE ad LIKE '[abs]%'
şimdide tam tersi a ile b ile yada s ile başlamayan kayıtları listeleyelim.
SELECT * FROM musteriler WHERE adLIKE '[!abs]%'
SQL JOIN
İki farklı tablo da SQL Join ile işlemler yapabilmekteyiz. Örnek olarak Orders ve Customers tabloları aşağıdaki gibidir.
| OrderID | CustomerID | OrderDate |
|---|---|---|
| 10308 | 2 | 1996-09-18 |
| 10309 | 37 | 1996-09-19 |
| 10310 | 77 | 1996-09-20 |
| CustomerID | CustomerName | ContactName | Country |
|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mexico |
Bu tabloları sadece 3 ‘er veri olarak görmeyiniz. Bir sürü veri olduğu düşünülen tabloda customerID ‘ler ortaktır. Şimdi CustomerID ‘ye göre sıralama yapacak olursak;
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
Yukarıdaki sorguyu çalıştırdıktan sonra;
| OrderID | CustomerName | OrderDate |
|---|---|---|
| 10308 | Ana Trujillo Emparedados y helados | 9/18/1996 |
| 10365 | Antonio Moreno Taquería | 11/27/1996 |
| 10383 | Around the Horn | 12/16/1996 |
| 10355 | Around the Horn | 11/15/1996 |
| 10278 | Berglunds snabbköp | 8/12/1996 |
SQL LEFT JOIN Kullanımı
1 2 3 4 5 | SELECT Customers.CustomerName, Orders.OrderIDFROM CustomersLEFT JOIN OrdersON Customers.CustomerID=Orders.CustomerIDORDER BY Customers.CustomerName |
SQL RIGHT JOIN Kullanımı
1 2 3 4 5 | SELECT Orders.OrderID, Employees.FirstNameFROM OrdersRIGHT JOIN EmployeesON Orders.EmployeeID=Employees.EmployeeIDORDER BY Orders.OrderID |
SELECT INTO Kullanımı
SELECT INTO bir tablodan veriyi seçer ve yeni bir tabloya ekler.
Müşteriler tablosunun MusterilerBackup isimli yedeğini oluştabiliriz.
SELECT * INTO MusterilerBackup FROM musteriler
Sadece şehri “İstanbul” olan kayıtları ekleyebilmek için;
SELECT * INTO MusterilerBackup FROM musteriler WHERE sehir='İstanbul'
SQL CREATE Kullanımı
Yeni bir veritabanı oluşturmak için;
CREATE DATABASE dbname
SQL CREATE TABLE Kullanımı
Yeni tablo oluşturabilmek için kullanılır.
1 2 3 4 5 6 7 8 9 10 | CREATE TABLE musteriler(musteriNo int,ad varchar(20),soyad varchar(20),dogumTarihi datetime,cinsiyet varchar(1),sehir varchar(20),puan int); |
SQL ROUND Kullanımı
Ondalık sayıyı yuvarlamak için kullanılır.
1 2 | SELECT urunadi, ROUND(fiyat,0) AS YuvarlanmisFiyatFROM urunler |
SQL LEN() KULLANIMI
LEN () fonskiyonu, bir metinin karakter değerinin uzunluğunu döndürür.
Müşteriler tablosunda ad alanının yanına soyad uzunluklarını yazdırmak için;
1 2 | SELECT ad,LEN(soyad) as soyaduzunluguFROM musteriler; |
SQL NOW() Kullanımı
NOW() fonksiyonu, sistemin tarih ve saatini döndürür.
Aşağıdaki SQL deyimi “Products” tablosundan bugün için ürün adını ve fiyatını seçelim.
1 2 | SELECT ProductName, Price, Now() AS PerDateFROM Products; |
Öğrenci tablosundaki öğrencinin adını ve soyadını birleştirip, adsoyad olarak listeleyiniz. (as kullanım örneği)
1 2 3 | select ograd+ogrsoyad as ‘Ad Soyad’ from ogrenci |
13. Öğrenci tablosundaki sınıfı 9A olan Erkekleri veya sınıfı 9B olan kızların adını, soyadını, sınıfını ve cinsiyetini listeleyiniz.
1 2 3 4 | select ograd,ogrsoyad,sinif,cinsiyet from ogrenci where (sinif=‘9A’ and cinsiyet=‘E’) or (sinif=‘9B’ and cinsiyet=‘K’) |
15.Öğrenci tablosunda doğum yılı 1989 olan öğrencileri listeleyiniz.(Not: veritabanında tarihler ay/gün/yıl şeklinde sorgulanır)
1 2 3 4 | select * from ogrenci where dtarih between ’01/01/1989′ and ’12/31/1989′ |
21. Öğrenciler tablosundaki ilk 10 kaydın ad, soyad ve doğum tarihi bilgilerini listeleyiniz.
1 2 3 | select top 10 ograd,ogrsoyad,dtarih from ogrenci |
23. Öğrenciler tablosundaki en genç öğrenciyi listeleyiniz.
1 2 3 | select top 1 ograd,ogrsoyad,dtarih from ogrenci order by dtarih desc |
24. 10A sınıfındaki en yaşlı öğrenciyi listeyin.
1 2 3 4 | select top 1 ograd,ogrsoyad,dtarih from ogrenci where sinif=’10A’ order by dtarih |
25. İkinci harfi N olan kitapları listeleyiniz.
1 2 3 4 | select * from kitap where kitapadi like ‘_n%’ |
newid() ?
32. 10A sınıfı olan ÇAĞLAR ÜZÜMCÜ isimli erkek, sınıfı 9B olan LEYLA ALAGÖZ isimli kız ve sınıfı 11C olan Ayşe Bektaş isimli kız öğrencileri tek sorguda ekleyin.
1 2 3 4 | insert into ogrenci(ograd,ogrsoyad,sinif,cinsiyet) values(‘Çağlar’,‘Üzümcü’,’10A’,‘E’),(‘Leyla’,‘Alagöz’,‘9B’,‘K’),(‘Ayşe’,‘Bektaş’,’11C’,‘K’) |
34.Öğrenci numarası 10 ile 30 arasındaki öğrencileri yazar olarak ekleyiniz.
1 2 3 4 | insert into yazar(yazarad, yazarsoyad) select ograd,ogrsoyad from ogrenci where ogrno between 10 and 30 |
38. Tüm öğrencilerin puanını 5 puan arttırın.
1 2 3 4 5 6 | update ogrenci set puan=puan+5 –sorguyu görüntülemek için yazıldı select * from ogrenci |
Select sorguları içinde değeri null olan kayıtları ararken alanadı=null olarak arama yapılamaz. Null olan alanları aramak için is null ifadesi kullanılır.
40. Doğum tarihi null olan öğrencileri listeleyin. (insert sorgusu ile girilen 3 öğrenci listelenecektir)
1 2 3 | select * from ogrenci where dtarih is null |
BİRDEN ÇOK TABLODAN VERİ ÇEKME (JOIN KULLANMADAN)
41. Öğrencinin adını, soyadını ve kitap aldığı tarihleri listeleyin.
1 2 3 4 | select ograd,ogrsoyad,atarih from ogrenci,islem where ogrenci.ogrno=islem.ogrno |
42. Fıkra ve hikaye türündeki kitapların adını ve türünü listeleyin.
1 2 3 4 5 | select kitap.kitapadi, tur.turadi from kitap,tur where kitap.turno=tur.turno and tur.turadi in (‘Hikaye’,‘Fıkra’) |
43. 10B veya 10C sınıfındaki öğrencilerin numarasını, adını, soyadını ve okuduğu kitapları listeleyin.
1 2 3 4 5 6 7 | select ogrenci.ogrno,ograd,ogrsoyad,kitapadi from ogrenci,islem,kitap where (sinif=’10B’ or sinif=’10C’) and ogrenci.ogrno=islem.ogrno and islem.kitapno=kitap.kitapno |
44. Roman türündeki kitapları okuyan öğrencilerin numarasını, adını, soyadını ve okuduğu kitabın adını listeleyin
1 2 3 4 5 6 7 8 | select distinct ogrenci.ogrno,ograd,ogrsoyad,kitapadi from ogrenci,islem,kitap,tur where ogrenci.ogrno=islem.ogrno and islem.kitapno=kitap.kitapno and kitap.turno=tur.turno and tur.turadi=‘Roman’ |
SQL JOIN ( INNER JOIN ) KULLANIMI
45. Öğrencinin adını, soyadını ve kitap aldığı tarihleri listeleyin.
1 2 3 4 | select ograd,ogrsoyad,islem.atarih from ogrenci join islem on islem.ogrno=ogrenci.ogrno |
46. Fıkra ve hikaye türündeki kitapların adını ve türünü listeleyin.
1 2 3 4 5 | select kitapadi,turadi from kitap join tur on kitap.turno=tur.turno and tur.turadi in(‘Hikaye’,‘Fıkra’) |
yada
1 2 3 4 5 | select kitapadi,turadi from kitap join tur on kitap.turno=tur.turno where tur.turadi in(‘Hikaye’,‘Fıkra’) |
47. 10B veya 10C sınıfındaki öğrencilerin numarasını, adını, soyadını ve okuduğu kitapları, öğrenci adına göre listeleyin.
1 2 3 4 5 6 7 8 | select ogrenci.ogrno,ograd,ogrsoyad,sinif,kitapadi from ogrenci join islem on ogrenci.ogrno=islem.ogrno join kitap on islem.kitapno=kitap.kitapno where sinif=’10B’ or sinif=’10C’ order by ogrenci.ograd |
SQL LEFT JOIN Kullanımı
48. Kitap alan öğrencinin adı, soyadı, kitap aldığı tarih listelensin. Kitap almayan öğrencilerinde listede görünsün.
1 2 3 4 | select ograd,ogrsoyad,islem.islemno from ogrenci left join islem on islem.ogrno=ogrenci.ogrno |
49. Kitap almayan öğrencileri listeleyin.
1 2 3 4 5 | select ograd,ogrsoyad,islem.atarih from ogrenci left join islem on islem.ogrno=ogrenci.ogrno where islem.atarih is null |
50. Alınan kitapların kitap numarasını, adını ve kaç defa alındığını kitap numaralarına göre artan sırada listeleyiniz.
1 2 3 4 5 6 7 | select kitap.kitapno, kitap.kitapadi,count(*) from islem left join kitap on kitap.kitapno=islem.kitapno group by kitap.kitapadi,kitap.kitapno order by kitap.kitapno |
51. Alınan kitapların kitap numarasını, adını kaç defa alındığını (alınmayan kitapların yanında 0 olsun) listeleyin.
1 2 3 4 5 6 | select kitap.kitapno, kitap.kitapadi,count(islem.islemno) as adet from kitap left join islem on kitap.kitapno=islem.kitapno group by kitap.kitapadi,kitap.kitapno,islem.kitapno order by adet |
52. Öğrencilerin adı soyadı ve aldıkları kitabın adı listelensin.
1 2 3 4 5 | Select * from ogrenci left join islem on islem.ogrno=ogrenci.ogrno left join kitap on islem.kitapno=kitap.kitapno |
SQL LEFT JOIN ve RIGHT JOIN Kullanımı
53.Her öğrencinin adı, soyadı, kitabın adı, yazarın adı soyad ve kitabın türünü ve kitabın alındığı tarihi listeleyiniz. Kitap almayan öğrenciler de listede görünsün.
1 2 3 4 5 6 7 | Select ograd,ogrsoyad yazarad,yazarsoyad,kitapadi,turadi from kitap join tur on tur.turno=kitap.turno join yazar on kitap.turno=yazar.yazarno join islem on kitap.kitapno=islem.kitapno right join ogrenci on ogrenci.ogrno=islem.ogrno |
54.Her öğrencinin adı, soyadı, kitabın adı, yazarın adı soyad ve kitabın türünü ve kitabın alındığı tarihi listeleyiniz. Kitap almayan öğrenciler de listede görünsün.( Farklı Çözüm)
1 2 3 4 5 6 7 | Select ograd,ogrsoyad yazarad,yazarsoyad,kitapadi,turadi from islem join kitap on islem.kitapno=kitap.turno right join ogrenci on ogrenci.ogrno=islem.ogrno left join tur on kitap.turno=tur.turno left join yazar on yazar.yazarno=kitap.yazarno |
55. 10A veya 10B sınıfındaki öğrencilerin adı soyadı ve okuduğu kitap sayısını getirin.
1 2 3 4 5 6 7 | select sinif, ograd,ogrsoyad,count(islemno) from ogrenci left join islem on islem.ogrno=ogrenci.ogrno where sinif in (’10A’,’10B’) group by sinif,ograd,ogrsoyad order by count(*) |
İÇ İÇE SELECT SORGULARI
56.En fazla sayfa sayılı kitabın bilgilerini listeleyiniz.
Yöntem 1
1 2 3 | select top 1 * from kitap order by sayfasayisi desc –1 |
Yöntem 2( İç içe select ile)
1 2 3 | select * from kitap where sayfasayisi in (select max(sayfasayisi) from kitap) –2 |
57. Sayfa sayısı ortalama sayfa sayısından fazla olan kitapları listeleyiniz.
1 2 3 | select * from kitap where sayfasayisi >(select avg(sayfasayisi) from kitap) |
58.İç içe select ile dram türündeki kitapları listeleyiniz.
1 2 3 | select * from kitap where kitap.kitapno=(select (kitap.kitapno) from tur where turadi=‘dram’) |
59.Adı e harfi ile başlayan yazarların kitapları
1 2 3 | select * from kitap where kitap.yazarno in (select yazar.yazarno from yazar where yazarad like ‘e%’) |
60.İç içe sorgu ile kitap okumayan öğrencileri listeleyiniz.
1 2 3 | select * from ogrenci where ogrenci.ogrno not in ( select distinct islem.ogrno from islem) |
61. İç içe select ile okunmayan kitapları listeleyiniz.
1 2 3 | select * from kitap where kitap.kitapno not in (select distinct islem.kitapno from islem) |
62. Mayıs ayında okunmayan kitapları listeleyin.
1 2 3 | select * from kitap where kitap.kitapno not in (select distinct islem.kitapno from islem where MONTH(islem.atarih)=5) |
SQL AVG Kullanımı
AVG fonksiyonu ortalama değeri döndürür.
–Tüm kitapların ortalama sayfa sayısını bulunuz.
1 2 3 | select avg(sayfasayisi) as [ortalama sayfa] from kitap |
–Sayfa sayısı ortalama sayfanın üzerindeki kitapları listeleyin.
1 2 3 4 | select kitapadi,sayfasayisi from kitap where sayfasayisi>(select avg(sayfasayisi) from kitap) |
SQL COUNT Kullanımı
COUNT fonksiyonu , belirtilen ölçütlerle eşleşen satır sayısını döndürür.
–Öğrenci tablosundaki öğrenci sayısını gösterin
1 2 3 | select count(*) from ogrenci |
–Öğrenci tablosundaki toplam öğrenci sayısını toplam sayı takma(alias kullanımı) adı ile listeleyin.
1 2 3 | select count(*) as ogrenciSayisi from ogrenci |
–Öğrenci tablosunda kaç farklı isimde öğrenci olduğunu listeleyiniz.
1 2 3 | select count(distinct ograd) from ogrenci |
SQL MAX Kullanımı
MAX fonksiyonu belirtilen ölçülerle eşleşen en yüksek kayıtı getirir.
–En fazla sayfa sayısı olan kitabın sayfa sayısını listeleyiniz.
1 2 3 | select max(sayfasayisi) as ‘En Fazla Sayfa’ from kitap |
–En fazla sayfası olan kitabın adını ve sayfa sayısını listeleyiniz.
1 2 3 4 | select kitapadi,sayfasayisi from kitap where sayfasayisi= (select max(sayfasayisi) from kitap) |
SQL MIN Kullanımı
MINfonksiyonu belirtilen ölçülerle eşleşen en yüksek kayıtı getirir.
–En az sayfa sayısı olan kitabın sayfa sayısını listeleyiniz.
1 2 3 | select min(sayfasayisi) as ‘En Fazla Sayfa’ from kitap |
–En az sayfası olan kitabın adını ve sayfa sayısını listeleyiniz.
1 2 3 4 | select kitapadi,sayfasayisi from kitap where sayfasayisi= (select min(sayfasayisi) from kitap) |
–Dram türündeki en fazla sayfası olan kitabın sayfa sayısını bulunuz.
1 2 3 4 | select max(sayfasayisi) from kitap,tur where kitap.turno=tur.turno and tur.turadi=‘dram’ |
–numarası 15 olan öğrencinin okuduğu toplam sayfa sayısını bulunuz.
1 2 3 4 5 6 | select sum(sayfasayisi) from ogrenci,islem,kitap where ogrenci.ogrno=islem.ogrno and islem.kitapno=kitap.kitapno and ogrenci.ogrno=15 |
SQL DATE / SQL DATEDIFF Kullanımı
DATEDIFF :Belirtilen tarihler arasındaki farkı hesaplamak için kullanılır.
GETDATE :Şuan ki tarih ve zamanı getirir. MySqlde now() fonksiyonu kullanılır.
–Öğrencinin adını, soyadını ve yaşını listeleyin.
1 2 3 | SELECT ograd, ogrsoyad,DATEDIFF(year,dtarih,GETDATE()) from ogrenci |
SQL GROUP BY Kullanımı
–İsme göre öğrenci sayılarının adedini bulunuz.(Örn: ali 5 tane, ahmet 8 tane )
1 2 3 | select ograd,count(*) from ogrenci group by ograd |
–Her sınıftaki öğrenci sayısını bulunuz.
1 2 3 | select sinif, count(*) from ogrenci group by sinif |
–Her sınıftaki erkek ve kız öğrenci sayısını bulunuz.
1 2 3 | select sinif, cinsiyet,count(*) from ogrenci group by cinsiyet,sinif |
–Her öğrencinin adını, soyadını ve okuduğu toplam sayfa sayısını büyükten küçüğe doğru listeleyiniz.
1 2 3 4 5 6 | select ograd,ogrsoyad,sum(sayfasayisi) as sayfa from ogrenci,kitap,islem where ogrenci.ogrno=islem.ogrno and kitap.kitapno=islem.kitapno group by ograd,ogrsoyad,ogrenci.ogrno order by sayfa |
–Her öğrencinin okuduğu kitap sayısını getiriniz.
1 2 3 4 5 6 | select ograd,ogrsoyad,count(*) as kitapsayisi from ogrenci,kitap,islem where ogrenci.ogrno=islem.ogrno and kitap.kitapno=islem.kitapno group by ograd,ogrsoyad,ogrenci.ogrno order by kitapsayisi |
–Çalışacağımız veri tabanını belirtmek için
USE Veritabanı_Adı
Person adında veri tabanı oluşturma
CREATE DATABASE person
Personel adında tablo oluştur tablo sütunları PERSONEL_ID,AD,SOYAD
CREATE TABLE PERSONEL
(
PERSONEL_ID İNT,
AD varchar(10),
SOYAD varchar(10)
)
–PERSONEL tablosuna BABA_AD sütunu ekle veri girişini zorunlu tut.
ALTER TABLE PERSONEL
ADD BABA_AD varchar(20) NOT NULL
–AD sütunun alabileceği karakter sayısını 15 yap, veri girişini zorunlu tut.
ALTER TABLE PERSONEL
ALTER COLUMN AD varchar(15) NOT NULL
–PERSONEL TABLOSUNU SİLME
DROP TABLE PERSONEL
–PERSONEL tablosundaki tüm alanları seçme
SELECT * FROM PERSONEL
–PERSONEL tablosundaki PERSONEL_ID ve AD alanlarını seçme
SELECT PERSONEL_ID, AD FROM PERSONEL
–PERSONEL tablosundaki AD ve SOYAD alanlarını birleştirme
SELECT AD+’ ‘+SOYAD FROM PERSONEL
–rehber tablosundaki ad ali olan tüm kayıtlar
SELECT * FROM rehber WHERE AD=’Ali’
–Artan sıralama ASC, Azalan sıralama DESC
SELECT * FROM rehber WHERE ad=”Tuncay” ORDER BY ad ASC
–Yeni kayıt girme
INSERT INTO PERSONEL(AD,SOYAD)
VALUES(‘Mustafa’,’KUM’)
–Soyadı KUM olanların adını Mustafa yap
UPDATE PERSONEL SET AD=’Mustafa’ WHERE SOYAD=’KUM’
–Soyadı KUM olan tüm kayıtları sil
DELETE FROM PERSONEL WHERE SOYAD=’KUM’
–Değişken tanımlama
DECLARE @ogr_no VarChar(10)
DECLARE @tckimlik_no int
–Tablo türünde değişken tanımlama
DECLARE @değişken_adı TABLE
–Değişkene değer atama yöntemleri
SET @değişken_adi=değer
SELECT @değişken_adı=değer
INSERT INTO @tablo_değişken SELECT adi,soyadi FROM person –(Tablo değişkenler değer atama)
–AD değişkeninin içeriğini PRINT ile gösterme
USE Deneme
GO
DECLARE @ad VARCHAR(10)
SELECT @ad=’Mustafa’
GO
PRINT @ad
GO
–Bir yığının sonunu belli etmek için GO komutu kullanılır.
–Notu 56 dan küçük olan öğrencileri listeleme
SELECT * FROM tablo2 WHERE nt2<=56
–Adı Mustafa olmayan kayıtları listeleme
SELECT * FRPM PERSONEL WHERE AD’Ali’
–tablo1′deki adı Er ile başlayan kayıtları listeleme
SELECT * FROM tablo1 WHERE ad LIKE ‘%Er%’
–Doğum tarihi 1970 den önce olan ve maaşı 700-1200 arasında olan personeli listeleme
SELECT * FROM person WHERE dogum tarihi=700 AND Maas={01/01/1970} AND cinsiyet=Erkek
OR dogum_tarih>={01/01/1975} AND cinsiyet=Kadın
–Person tablosunda Adı Mustafa olmayanları listeleme
SELECT * FROM Person WHERE NOT AD=’Mustafa’
–Ogr_Notlar Tablosunda not ortalamasını hesaplama
SELECT (nt1+nt2+nt3)/3 FROM Ogr_Notlar
–Şimdiki tarih ve saat değerini gösterme
SELECT GETDATE()
–İki tarih arasındaki gün sayısını bulma
SELECT DATEDIFF(dd,’04,04,1974′,’02,10,2007′)
–ASCII kodu verilen harfi görüntüleme
SELECT CHAR(65) –A Harfini verir
SELECT ASCII(A) –65 Rakamını verir(int tipinde)
–Bir metin içindeki metin parçasını istenilen konumdan itibaren arama CHARINDEX()
SELECT CHARINDEX(‘bu’,@soyad,1)
–Metnin baş taraftan itibaren istenilen sayıdaki harfini alma
SELECT LEFT (@ad,2)
–Metnin uzunluğunu veren fonksiyon
SELECT LEN(@Soyad)
–Öğrencinin not ortalamasına göre 85 üzerinde olanlara PEKİYİ , 85 den küçük olanlara İYİ yazdıran kod
DECLARE @enbuyuk int
SELECT @enbuyuk=MAX(ort) FROM tablo2
IF (@enbuyuk>=84)
BEGIN
PRINT ‘DURUMUNUZ PEKİYİ’
END
ELSE IF (@enbuyuk65
–Numaraya göre her öğrencinin almış olduğu notları listeleme
SELECT ogrno,AVG(ort) FROM tablo2 GROUP BY ogrno
–Numara ve Bölüm adına göre ögrenci not ortalamalarını listeleme
SELECT ogrno,bolum,MAX(ort) FROM tablo2 GROUP BY ogrno,bolum
–En yüksek not ortalamasını bulma
SELECT MAX(not_ortalama) FROM Ogr_Notlar
–En düşük not ortalamasını bulma
SELECT MİN(not_ortalama) FROM Ogr_Notlar
–Adı Mustafa, soyadı Kum olan kişinin maaşına % 20 zam yapma
declare @no int
select @no = sicil_no from personel
where adi = ‘Mustafa’ and soyadi = ‘Kum’
UPDATE maaslar SET maas = maas * 0.20 + maas where sicil_no = @no
–Maası en yüksek olan personelin adresini halkalı-istanbul olarak değiştirme
declare @enyuksek int
declare @sicil_no int
SELECT @enyuksek = max(maas) from maaslar
SELECT @sicil_no = sicil_no from maaslar WHERE maas = @enyuksek
UPDATE personel SET adres = ‘halkalı-istanbul’ where sicil_no = @sicil_no
–hangi veri tabanı üzerinde işlem yapılacağı belirtilir
USE Person
–Personel adında tablo oluşturma, sütunlar;Personel_ID, AD, SOYAD
CREATE TABLE PERSONEL(PERSONEL_ID int, AD varchar(10), SOYAD varchar(10))
–Personel Yakın Adlı Tablo Oluştur, Sütunları:PERSONEL_ID, YAKIN_ID, YAKIN_AD, YAKIN_SOYAD
CREATE TABLE PERSONELYAKIN(PERSONEL_ID INT, YAKIN_ID INT, YAKIN_AD varchar(10), YAKIN_SOYAD varchar(10))
–rehber adında tablo oluşturma
create table rehber(ad varchar(20), soyad varchar(20),telefon varchar(11))
–Personel tablosuna BABA_AD adlı sütun ekleme
ALTER TABLE PERSONEL
ADD BABA_AD varchar(20) NOT null — veri girişi zorunlu
–rehber tablosuna adres ekleme
ALTER TABLE rehber add adres varchar(50)
– AD sütununun karakter sayısı 15 olarak değiştirildi, veri girişi zorunlu yapıldı
ALTER TABLE PERSONEL
ALTER COLUMN AD varchar(15) not null
–Personel Tablosunu silme
DROP TABLE PERSONEL
–Personel tablosundaku tüm alanları seçme
select * from PERSONEL
–Personel tablosundaki PERSONEL_ID, AD alanlarını seçme
select PERSONEL_ID, AD from PERSONEL
–Personel tablosundaki AD,SOYAD alanlarını tek sütun gibi gösterme
select AD+’ ‘+SOYAD from PERSONEL
–rehber tablosundaki ad bilgilerinin elde edilmesini sağlar
select ad from rehber
–mustafa adındaki tüm kayıtları göster
select * from rehber where ad=’mustafa’
–ad alanına göre artan seçme ad aynı ise soyada göre artan
select * from rehber order by ad,soyad
–Personel tablosuna yeni kayıt ekleme
insert into PERSONEL(PERSONEL_ID,AD,SOYAD,BABA_AD)
values(11,’azmi’,’akbaş’,’ZİYA’)
–Soyadı Akbaş olan kayıtların adını nizmi yapma(güncelleme)
update PERSONEL SET AD=’nazmi’ where SOYAD=’AKBAŞ’
–soyadı akbaş olanları silme
delete from PERSONEL where SOYAD=’akbaş’
–mustafanın telefon numarasını 0536 yap
update rehber set telefon =’0536′ where ad=’mustafa’
–Personel tablosunda ada göre artan sıralama
select * from PERSONEL order by AD ASC
–Personel tablosunda ada göre azalan sıralama
select * from PERSONEL order by AD DESC
–Değişken tanımlama
declare @ogr_no varchar(10)
declare @tckimlik_no int
–Tek declare ile birden fazla degişken tanımlama
declare @ogr_no varchar(10), @tc_kimlik int
–tablo türünde değişken tanımlama
declare @dagişken_adi table
–Set ile değişkene değer atama
set @degisken_adi = deger
–select ile değer atama
select @degisken_adi =deger
–Tablo degişkenlere insert into ile degir atama
insert into @tablo_degisken select adi,soyadi from person
–Print
use deneme
go
declare @ad varchar(10)
select @ad=’mustafa’
GO
print @ad
go
–adı ali olmayanları listeleme
select * from personel where’ali’
–tablo 2 de notu 56 dan küçük olanlar
select * from tablo2 where nt2>=56
–baş harfi er olanlar
select * from tablo1 where ad LIKE%er%
–dogum tarihi 1970 önce maaşı 700-1200 arasında
select * from person
where dogum_tarihgi=700 and maas<=1200
–adı ali olmayanları listeler
select * from sınıf
where not ad=’ali’
–or oparatörü
select * from ogrenci where bolum=’bilgisayar’ or bolum=’elektrik’
–not ortalaması hesaplar
select(n1+n2+n3)/3 from ogr_notlar
–nt1 sütunun not toplamını hesaplama
select sum(nt1) from ogr_notlar
–maası 500 olan personel maasları toplamı
select sum(maas) from person where maas55
GO
–EXEC Komutu
EXEC UNotlar
Stored Procedure çalıştırır.
–Ortalamaya göre sonuç veren Stored Procedure
CREATE PROCEDURE UHesapla
@ort int
AS
IF @ort>44 PRINT ‘Başarılı’
IF @ort<45 PRINT ‘Başarısız’
GO
–Adlarının İçinde “a” harfi geçen ögrenvcileri gösteren Stored Procedure
CREATE PROCEDURE Ogr_Ara (@ara VARCHAR(10)=NULL )
AS
IF @ara IS NOT NULL
SELECT * FROM Sinif
WHERE Ad LIKE ‘%’+@ara+’%’
GO
–İki sayıyı Stored Procedure ile toplama
CREATE PROC UTopla(
@s1 int,
@s2 int,
@tpl int OUTPUT
)
AS
SELECT @tpl=@s1+@s2
GO
DECLARE @sayi1 int
DECLARE @sayi2 int
DECLARE @toplam int
SELECT @sayi1=9
SELECT @sayi2=8
SELECT @toplam=NULL
EXEC UTopla @sayi1,@sayi2,@toplam OUTPUT
–Stored Procedure Uygulama örneği
–Çalışma saati ve saat ücreti verildiğinde alacağı günlük yevmiye tutarını gösteren Stored procedure
CREATE PROC UYevmiyeHesap(
@CSaat smallint,
@SUcret int,
@Yevmiye float Output
)
–Çalışma saati 8 saat ve 8 saaten az ise alacagı yevmiye çalışma saati ve saat ücreti çarpımı ile bulunacaktır
AS
IF (@CSaat8)
BEGIN
SELECT @Yevmiye=(@CSaat*@SUcret)+((@CSaat*@SUcret)*0.05)
END
GO
–16 ve 17 yaşındaki öğrencileri IN deyimi ile listeleme
SELECT Ad,Soyad,Yas
From Sinif
WHERE yas IN(16,17)
–16 yaşında olmayan öğrencileri IN deyimi ile listeleme
SELECT Ad,Soyad,Yas
From Sinif
WHERE yas NOT IN(16)
–Yaşı 18 olan ögrenciyi bulma (iç içe Select)
SELECT Ad,Soyad,Yas
FROM Sinif
WHERE Yas = ( SELECT Yas
FROM Sinif
WHERE Yas=18
)
–Ad, Soyad ve ortalama yaşı veren sorgu (iç içe Select)
SELECT Ad,Soyad,Yas,Ortalama=(
SELECT AVG(Yas)
FROM Sinif
)
FROM Sinif
–Yaşı 18 den küçük olanları listeleme (İç içe Select)
SELECT Ad,Soyad,Yas
FROM Sinif
WHERE Yas IN(
SELECT Yas FROM Sinif Where Yas 16
–Yaşları aynı olan öğrencileri listeleme (Türetilmiş Tablolar)
SELECT * FROM Sinif
SELECT MAX(grup.adet)
FROM(SELECT YAS, COUNT (*) as adet
FROM Sinif
GROUP BY yas
)grup
– PERSONEL ve PERSONEL YAKIN Tablolarını kullanarak PERSONEL tablosundaki personellerden en az bir yakını olanları bulma
SELECT PERSONEL_ID, PERSONEL_AD, PERSONEL_SOYAD
FROM PERSONEL
WHERE EXISTS (
SELECT *
FROM PERSONELYAKIN
WHERE PERSONELYAKIN.YAKIN_ID=PERSONEL.PERSONEL_ID
)
–Hiç yakını olamayan personeli listeleme
SELECT PERSONEL_ID,PERSONEL_AD,PERSONEL_SOYAD
FROM PERSONEL
WHERE NOT EXISTS (
SELECT *
FROM PERSONELYAKIN
WHERE PERSONELYAKIN.YAKIN_ID=PERSONEL.PERSONEL_ID
)
–Kitap_ID alanları eşleşecek şekilde Kitap_Ad ve Kitap_Yayınevi alanları için INNER JOIN yöntemini uygulama
SELECT Kitap_Ad, Kitap_Yayınevi
From tablo_Kitap INNER JOIN tablo_KitapBilgi
ON tablo_Kitap.Kitap_Id=tablo_KitapBilgi.Kitap_Id
–Birinci Tablodaki kayıtlara göre ikinci tablodaki ilişkili kayıtları gösterecek OUTER JOIN yöntemi
SELECT tablo_Kitap.*, tablo_KitapBilgi.*
FROM tablo _Kitap LEFT OUTER JOIN tablo_KitapBilgi
On tablo_Kitap.Kitap_Id= tablo_KitapBilgi.Kitap_Id
–Sayfa sayısı 450 ve 550 olan kitapları listeleyen sorgu
SELECT *
FROM tablo_Kitap
WHERE Kitap_Sayfa IN(450,550)
–Sayfa sayısı 310 ve 330 olmayan kitapları listeleyen sorgu
SELECT *
FROM tablo_Kitap
WHERE Kitap_Sayfa NOT IN(310,330)
–tablo_Kitap tablosundan kitap_Id,Kitap_Ad ve Kitap_Yazar alanlarını seçerek sayfa sayısı 450 den büyük olanları gösteren iç içe sorgu
SELECT Kitap_Id,Kitap_Ad,Kitap_Yazar
FROM tablo_Kitap
WHERE Kitap_Sayfa IN(
SELECT Kitap_sayfa
FROM tablo_Kitap
WHERE(Kitap_Sayfa>450)
)
–tablo_Kitap tablosunda Kitap_Id’si 130′dan büyük olanları listeleyen türetilmiş tablo sorgusu
SELECT Sayfa.*
FROM(
SELECT Kitap_Id,Kitap_Sayfa
FROM tablo_Kitap
)
Sayfa(Kitap_Id,Kitap_Sayfa)
Where Sayfa.Kitap_Id>130
–Kitap Bilgisi Olmayan Kitapları Listeleyen sorgu (not exists kullanımı)
SELECT Kitap_Id,Kitap_Ad,Kitap_Yazar
FROM tablo_Kitap
WHERE NOT EXITS(
SELECT *
FROM tablo_KitapBilgi
WHERE tablo_Kitapbilgi.Kitap_Id=tablo_Kitap.Kitap_Id
)
–Fiyatı 20 Lira altına %10, üstünde olan kitaplara %5 zam yapan imleç programlayınız (imleç)
DECLARE @fiyat int
DECLARE @fiyatlar CURSOR
SET @fiyatlar=CURSOR FOR
SELECT Kitap_Fiyat FROM Kitaplar
OPEN @fiyatlar
FETCH NEXT FROM @fiyatlar INTO @fiyat
SELECT Kitap_Fiyat From Kitaplar
WHILE(@@FETCH_STATUS=0)
BEGIN
IF @fiyat<20
UPDATE Kitaplar SET Kitap_Fiyat=(@fiyat+(@fiyat*0.1))
WHERE CURRENT OF @fiyatlar
ELSE
UPDATE Kitaplar SET Kitap_Fiyat=(@fiyat+(@fiyat* .05))
WHERE CURRENT OF @fiyatlar
FETCH NEXT FROM @fiyatlar INTO @fiyat
END
SELECT Kitap_Fiyat FROM Kitaplar
–İmleci kapatma
CLOSE @fiyatlar
DEALLOCATE @fiyatlar
Tablodaki Verileri Sıralama – ORDER BY :
Verileri Sıralı olarak almak için ORDER BY ifadesi kullanılır. Bu ifadeden sonra sıralamanın hangi alana göre yapılacağı yazılır ve sıralamanın artan mı yoksa azalan mı olduğunu belirlemek için ASC ve DESC ifadeleri kullanılır. A dan Z ye doğru sıralamak için ASC kullanılır.
SELECT alanlar FROM tablo_adi ORDER BY alan_adi ASC
Z den A’ya doğru sıralama için DESC kullanılır.
SELECT alanlar FROM tablo_adi ORDER BY alan_adi DESC
Sıralama biçimi belirtilmezse A’dan Z’ye sıralama yapılır.
Sıralama işleminde birden fazla alana göre de sıralama yapılabilir. Örneğin önce soyada sonra ada ve unvan alanına göre sıralama yapalım.
SELECT soyad,ad,unvan FROM personel ORDER BY soyad,ad,unvan
Burada birinci ölçü soyad alanıdır. Soyad alan içerikleri aynı olduğunda Ad alanı, o da aynı olduğunda unvan alanına göre sıralanır.
Birden fazla alana göre sıralama yaparken bütün alanlar artan ya da azalan sırada olmak zorunda değildir. Örneğin soyad alanına göre artan sıralama yaparken Ad alanına göre azalan sıralama yapılabilir.
SELECT soyad,ad FROM personel ORDER BY soyad ASC, ad DESC
Burada birinci ölçü soyad alanıdır ve artan sırada istenmiştir.Soyad aynı olduğunda Ad alanına göre azalan sıralama yapılır.
WHERE ile Veri Filtreleme :
Tabloda bulunan verileri istediğimiz belli şartlara bağlı olarak listeleyebiliriz. Bu şartları oluşturmak için WHERE kullanılır.
SELECT alanlar FROM tablo_adi WHERE şart_ifadesi
Örneğin Başlık alanında “Satış Danışmanı” yazan kayıtları listelemek için sorgu cümlemiz şu şekilde olacaktır.
SELECT * FROM personel WHERE başlık=”Satış Danışmanı”
Örnek 2:Görevi yonetici olan ve gorev suresi 25 yıldan fazla olan personel soyad,ad, görevsüresini Adına göre artan şekilde listeleyen SQL sorgusunu yazınız.
SELECT soyad,ad,gorevsuresi FROM personel WHERE gorev=”Yonetici” AND gorevsuresi>25 ORDER BY ad ASC
Şartlı Sorgulama Operatörleri:
Şart ifadesi olarak kullanabileceğimiz operatörler şunlardır.
| Operatör | Anlamı |
| < | Küçük |
| > | Büyük |
| <= | Küçük eşit |
| >= | Büyük Eşit |
| = | Eşit |
| <> | Eşit Değil |
| And | Ve anlamındadır. İki şartın sağlanmasıİçin kullanılır. |
| Or | Veya anlamındadır.Sadece bir şartın sağlanması durumunda kullanılır. |
| Not | Şartın olumsuz olması durumunda(olmaması) kullanılır. |
| Between x AND y | X ve y değerleri arasındaki değerler için kullanılır. |
| LIKE | Bir alanın başlangıç, bitiş ya da orta kısımlarını süzer. |
| NOT LIKE | LIKE ile verilen şartın dışındakileri süzer |
| IN | Parantez içindeki değerleri süzer |
| NOT IN | Parantez içinde verilen değerlerin dışındakileri süzer. |
| != | Eşit Değil |
Örneğin doğum tarihi 1.1.1960 dan küçük olanları listelemek için sorgu cümlemiz şöyle düzenlenmelidir.
SELECT * FROM uyeler WHERE dogumtarihi<#1/1/1960#
Şartlarımızı yazarken AND, OR, NOT gibi mantıksal ifadeleri kullanarak birden fazla şartı da verebiliriz.
Örneğin doğum tarihi 1.1.1960 dan büyük ve bölümü Dahiliye olanları listelemek için SQL cümlemiz :
SELECT * FROM uyeler WHERE dogumtarihi>#1/1/1960# AND bolum=”Dahiliye”
BETWEEN kullanımı:
İki aralık belirtirken bu şartı between deyimi ile de kullanabiliriz.
Örneğin 1.1.2012 ile 1.2.2012 tarihleri arasında satılan ürünleri listelemek için sorgumuz :
SELECT * FROM satışlar WHERE satıstarihi BETWEEN #1/1/2012# AND #1/2/2012#
IN Kullanımı :
Birden fazla şartı belirtirken IN deyimini de kullanabiliriz. Örneğin bolum içerisinde ‘Elektrik’,’Bilişim’,’Makine’ olanları bulmak için SQL cümlemiz:
SELECT * FROM ogrenciler WHERE bolum IN (‘Elektrik’,’Bilişim’,’Makine’)
Aynı sorguyu OR kullanarak da yazabiliriz.
SELECT * FROM ogrenciler WHERE bolum=’Bilişim’ OR bolum=’Elektrik’ OR bolum =’Makine’
NOT IN Kullanımı:
IN parantezinde verilen değerlerin dışındaki değerleri içeren kayıtları listeler.
Örneğin bolum içerisinde ‘Elektrik’,’Bilişim’,’Makine’ olmayanları bulmak için SQL cümlemiz:
SELECT * FROM ogrenciler WHERE bolum NOT IN (‘Elektrik’,’Bilişim’,’Makine’)
LIKE Kullanımı:
Benzer kayıtları listelemek için LIKE deyimi kullanılır. LIKE operatörü yardımcı karakterler ile kullanılarak daha geniş bir sorgu imkanı sağlar.
| Yardımcı Karakter | Kullanım Biçimi | Açıklama |
| % | %van | Birden fazla karakterleri temsil eder.Tatvan,Elvan,Tavan,Kavan Gibi |
| Van% | Vanlı, Vanilya gibi | |
| %van% | İlvan,Tatvan,Karavana gibi | |
| – | z-p | Tek karakterleri temsil eder.Zip,Zap,Zep gibi… |
| [ ] | Ahmet [p k ]ara | Köşeli parantez içindeki tek karakteri temsil eder. Ahmet Para ya da Ahmet Kara gibi sonuçları listeler. |
| [ ^ ] | %p[ ^a ]% | Köşeli parantez içinde yazılan karakterleri içermeyen sonuçları listeler.Burada P den sonra a karakteri kesinlikle yer almayan kelimeleri listeleyecektir. |
| [ – ] | [a-d]% | Bir aralıktaki karakterlerle başlayan sonuçları listeleyecektir. Burada a,b,c,d ile başlayan kelimeler listelenecektir. |
| # | N1## | Sayısal olan tek karakterleri simgeler. Burada N100 ya da N124 gibi sonuçlar bulunacaktır. N10 ya da N1000 gibi sonuçlar bulunmayacaktır. |
Örnek : Bir Harf ile başlayan kayıtları sorgulama
Örneğin soyadı D harfi ile başlayan kayıtları listelemek için SQL cümlesi:
SELECT * FROM ogrenciler WHERE soyad LIKE ‘D%’
Burada LIKE ‘%D’ şeklinde kullanılırsa sonu D harfi ile bitenler listelenir.
LIKE %D% şeklinde kullanılırsa içinde D harfi geçenler listelenir.
Örneğin Adı alanında içerisinde ‘an’ harfi geçmeyen kayıtların ad ve soyad bilgilerini Adına göre artan şekilde listelemek için
SELECT ad,soyad FROM ogrenciler WHERE ad NOT LIKE ‘%an%’ ORDER BY ad ASC
Örneğin Soyad alanı içinde b,c,d,e,f ile başlayan kişilerin soyad ve ad bilgilerini listeleyen SQL sorgusu:
SELECT soyad,ad FROM ogrenciler WHERE soyad LIKE ‘[b-f]%’
NULL DEĞERLER
Boş kayıtları bulmak için IS NULL ifadesi şart olarak kullanılır. Örneğin soyadı girilmeyen kayıtların tüm bilgilerini listelemek için
SELECT * FROM ogrenciler WHERE soyad IS NULL
IS NOT NULL
Boş olmayan kayıtları listelemek için IS NOT NULL kullanılır. Örneğin soyad alanı boş olmayan kayıtları listelemek için
SELECT * FROM ogrenciler WHERE soyad IS NOT NULL
Örnek 1: Personel veritabanında uyeler tablosundan Doğum tarihi 1 Ocak 1980 ile 1 Ocak 1995 tarihleri arasında olan personelin adsoyad,bolum ve maaş bilgilerini maaşına göre artan şekilde sıralayan SQL cümlesi:
SELECT adsoyad,bolum,maas
FROM uyeler WHERE dogumtarihi BETWEEN #01/01/1980# AND #01/01/1995# ORDER BY maas ASC;
Örnek 2: Uyeler tablosundan maası 2500 den fazla ve 3000 den az olan personel adsoyad,bölüm,maaş bilgilerini Adsoyadına tekrarsız maaşına göre azalan şekilde listeleyen SQL sorgusu
SELECT adsoyad,bolum,maas DISTINCT adsoyad
FROM uyeler
WHERE maas BETWEEN 2500 AND 3000 ORDER BY maas DESC
Örnek 3:uyeler tablosundan bütün kişileri adsoyad alanına göre artan maaşına göre azalan şekilde listeleyen SqL Sorgusu
SELECT *
FROM uyeler
ORDER BY adsoyad ASC, maas DESC;
Örnek 4:uyeler tablosundan bütün kişileri maaşına göre azalan ve adsoyad alanına göre artan şekilde listeleyen SQL Sorgusu
SELECT *
FROM uyeler
ORDER BY maas DESC , adsoyad ASC;
Örnek5: Adres alanı içinde Çumra Kelimesi geçen kayıtların adsoyad ve adresini listeleyen SQL sorgusu
SELECT adsoyad,adres
FROM uyeler WHERE adres LIKE ‘*Çumra*’
Örnek 6 : Adresi Çumra olmayan kayıtları adsoyad alanına göre artan şekilde listeleyen SQL Sorgusu
1.Yöntem:
SELECT *
FROM uyeler
WHERE adres <>’Çumra’
2.Yöntem:
SELECT *
FROM uyeler
WHERE adres NOT LIKE ‘Çumra’
Örnek 7: Adresi içerisinde Çumra kelimesi geçmeyen veya maaşı 5000 ile 3000 arasında olan kişileri adsoyad, adres ve maaş bilgilerini maaşına göre artan şekilde listeleyen SQL sorgusu
SELECT adsoyad,adres,maas
FROM uyeler
WHERE adres NOT LIKE ‘*Çumra*’ OR maas BETWEEN ‘5000’ AND ‘3000’ ORDER BY maas ASC;
İSTATİSTİKSEL İŞLEMLER YAPMA:
Veritabanındaki bir alanda bulunan verilerin toplamını, ortalamasını, en büyük değeri veya en küçük değeri bulmak için istatistik amaçlı olarak kullanılan max, min, count, sum ve avg gibi fonksiyonlar kullanılır. Bu fonksiyonlar genellikle Group By cümlesi ile kullanılır.
MAX :
Max alandaki en büyük değeri verir. Örneğin Ürünler tablosunda fiyatı en yüksek olan ürünü bulan SQL sorgusu:
SELECT MAX(fiyat) AS enyuksekfiyat FROM urunler
Aynı ifadeyi şartlı olarak da yazabiliriz.
SELECT MAX(fiyat) AS enyuksekfiyat FROM urunler WHERE kategori=Anakart
MİN:
Min Alandaki en düşük değeri verir.
Örneğin SELECT MIN(fiyat) AS endusukfiyat FROM urunler
Veya
SELECT MIN(fiyat) AS endusukfiyat FROM urunler WHERE kategori=Anakart
Gibi.
AVG:
AVG bir sütundaki değerlerin ortalamasını verir.
Örneğin ürünler tablosundaki ürünlerin fiyat ortalamasını veren SQL sorgusu
SELECT AVG(fiyat) AS ortalamafiyat FROM urunler
Ya da
SELECT AVG(fiyat) AS anakartortalamafiyat FROM urunler WHERE kategori=Anakart
SUM:
SUM bir alandaki değerlerin toplamını verir. Örneğin Ürünler tablosundaki ürünlerin fiyatlarının toplamını veren SQL Sorgusu
SELECT SUM(fiyat) AS toplamfiyat FROM urunler WHERE kategori=’Anakart’
COUNT:
Count bir tablodaki kayıt sayısını listeler. Örneğin ürünler tablosundaki kayıt sayısı aşağıdaki gibi olacaktır.
SELECT COUNT(*) AS kayitsayisi FROM urunler
Örneğin fiyatı 20 TL den büyük olan ürünlerin sayısını aşağıdaki gibi bulabiliriz.
SELECT COUNT(*) AS kayitsayisi FROM urunler WHERE fiyat>20
Hangi Şehirde Kaç Kişi Yaşıyor?
Bir şehirde kaç kişinin yaşadığını bulmak için aşağıdaki gibi bir sorgu kullanabiliriz.
SELECT adres, COUNT(*) AS kisi FROM uyeler GROUP BY adres
Örnekler
Örnek 1:Uyeler Maaşı en yüksek olan kişinin maaşını bulan SQL Sorgusu
SELECT MAX(maas) AS enyuksekmaas FROM uyeler
Örnek 2: Bölümü KBB olan kişilerden maaşı en yüksek olan kişinin maaşını listeleyen SQL Sorgusu
SELECT MAX(maas) AS enyuksekmaas FROM uyeler WHERE bolum=’KBB’
Örnek 3: Bölümü Göz olan kişilerden maaşı en düşük olan kişinin maaşını listeleyen SQL Sorgusu
SELECT MIN(maas) AS endusukmaas FROM uyeler WHERE bolum=’Göz’
Örnek 4: Uyeler tablosundaki maaşların ortalamasını veren SQL Sorgusu
SELECT AVG(maas) AS ortmaas
FROM uyeler;
Örnek 5: Bölümü ‘Dahiliye’,’Ortopedi’veya ‘Kardiyoloji’ olmayan kişilerin maaşlarının toplamını veren SQL Sorgusu
SELECT SUM(maas) AS toplammaas
FROM uyeler WHERE bolum NOT IN (‘DAhiliye’,’Ortopedi’,’Kardiyoloji’);
Örnek 6 : Adres alanı içerisinde ÇUMRA kelimesi geçenlerin sayısını veren SQL sorgusu
SELECT COUNT(*) AS kisi FROM uyeler WHERE adres LIKE ‘*Çumra*’
Örnek 7 : Adresi ÇUMRA olan kişilerin sayısını veren SQL sorgusu
SELECT COUNT(*) AS kisi
FROM uyeler WHERE adres=’Çumra’;
Verileri Gruplandırma – GROUP BY
GROUP BY deyimi ile verileri belirli alanlara göre gruplandırabiliriz.
SELECT alanlar FROM Tablo_adi WHERE şart_ifadesi GROUP BY alan_adi
Örneğin Ürünler tablosundaki ürünlerin toplam fiyatlarını Ürün_id sutünuna göre aşağıdaki gibi gruplandırabiliriz.
SELECT ürün_id, SUM(urunfiyati) AS toplamfiyat FROM urunler GROUP BY urun_id
Örnek : Personel tablosundaki kişilerin bölümlerine gruplandırılmış bir şekilde göre toplam maaşlarını bulan SQL sorgusu:
SELECT bolum, SUM(maas) AS toplammaas FROM personel GRUP BY bolum
Örnek: 3 Mayıs 2012 tarihinde yapılan satışların ürün kategorisine göre gruplandırılmış bir şekilde elde edilen para miktarını veren SQL sorgusu
SELECT urunkategori, SUM(fiyat) AS toplamfiyat FROM satışlar WHERE tarih=’03/05/2012’ GROUP BY urunkategori
Örnek: Nisan ayında yapılan satışlardan ürün kategorisine göre gruplandırılmış bir şekilde elde edilen para miktarını veren SQL sorgusu
SELECT urunkategori, SUM(fiyat) AS toplamfiyat FROM satışlar WHERE tarih BETWEEN #01/04/2012# AND #31/04/2012# GROUP BY urunkategori
HAVING KULLANIMI:
Grup içinden sadece belirli şartlara sahip elemanları seçmek için kullanılır. Örneğin fiyat toplamı 100 TL yi geçen ürünlerin listesini ürün kategorisi sütununa göre aşağıdaki gibi gruplandırabiliriz.
SELECT ürün_id, SUM(fiyat) AS toplamfiyat FROM urunler GROUP BY ürün_id HAVING SUM(fiyat)>100
Örnek: Maaşları toplamı 6000 TL yi geçen kişilerin bölümlerini ve maaşları toplamını bölümlerine göre gruplandırarak listeleyen SQL sorgusu:
SELECT bolum, SUM(maas) AS toplammaas
FROM uyeler GROUP BY bolum HAVING SUM(maas)>=6000;
Örnek: Üyeler tablosundan aynı şehirde oturan kişi sayısının 3 ten büyük olanların sayıları ve şehir isimlerini listeleyen SQL sorgusu.
SELECT şehir,COUNT(*) AS kişi FROM üyeler GROUP BY şehir HAVING COUNT(*)>3
ALANLAR ÜZERİNDE İŞLEM YAPMA:
Veritabanında gerçekte bulunmayan alanları diğer alanlar üzerinde işlem yaparak oluşturabiliriz. Örneğin Günlük_Satışlar tablosunda FIYAT ve ADEDİ alanları olsun ama TUTUAR alanı bulunmasın. TUTAR alanı FIYAT ile ADEDİ çarpımından oluşacağı için bu işlemi yaparak şöyle bir sütun oluşturabiliriz.
SELECT adısoyadı, aldığıürün,adedi,fiyatı,(adedi*fiyatı) AS tutarı FROM Günlük_Satışlar
Buradaki (adedi*fiyatı) AS tutarı ifadesi fiyat ve adedi alanlarının çarpılarak Tutarı isimli alanda gösterileceğini belirtir. Bu işlem sonucunda tabloya Tutarı alanı eklenmez. Sadece ekranda bir sütun olarak listelenir.
Böylece tabloda olmayan ama kullanıcıya göstermek istediğimiz bilgileri hesap yoluyla oluşturabiliriz. Diğer alanlar üzerinde işlem yapılarak oluşturulabilecek alanları fazla yer kaplamaması için veritabanına yazmak istemiyorsanız bu yöntemi kullanarak işlemler oluşturabiliriz.
Aynı örneği geliştirerek tablomuzda olmamasına rağmen KDV ve TOPLAM_TUTAR alanlarını da oluşturabiliriz.
SELECT adısoyadı, adlığıürün,adedi,fiyatı, (adedi*f
yatı) AS TUTARI, (adedi*fiyatı*0.18) AS KDV, (adedi*
fiyatı*1.18) AS TOPLAM_TUTARI FROM Günlük_Satışlar
Üzerinde sql komutlarını uygulayacağımız, örnek olarak ozluk ve notlar tablosundan birkaç kayıt verilsin.
Ozluk tablosundaki alan isimleri ve örnek veriler;
ogr_no adi soyadi cinsiyeti
88050071 Muhittin Altınkaya E
89050020 Selda Anar K
91050099 Yahya Demircan E
Notlar tablosundaki alan isimleri ve örnek veriler;
ogr_no kodu donem sube vize final basari
88050071 A308 2003-04/2 A 45 60 60
88050071 A401 2003-04/1 B 50 94 94
89050020 A308 2003-04/2 A 50 50 50
89050020 A307 2003-04/1 A 80 40 45
91050099 A308 2003-04/2 A 20 60 50
91050099 A308 2003-04/2 B 60 60 66
91050099 A401 2003-04/1 A 80 80 94
91050099 A445 2003-04/1 A 0 0 0
91050099 A445 2003-04/1 A 60 60 66
Bu noktadan sonraki örnekleri yukarıdaki değerleri göz önünde tutarak inceleyiniz.
SQL FONKSİYONLARI
SQL’de kullanılan fonksiyonlar vardır, bu fonksiyonlar ekrana sadece tek değer görüntülerler.
SUM(DISTINCT] alan_adi) Belirtilen alan için toplam fonksiyonu (sayısal alanlarda)
COUNT(*) Toplam kayıt sayısı
COUNT(DISTINCT alan_adi) Belirtilen alana göre farklı olan kayıtların sayısı
MAX([DISTINCT] alan_adi) Belirtilen alanda en büyük değer
MIN(DISTINCT] alan_adi) Belirtilen alanda en küçük değer
AVG([DISTINCT] alan_adi) Belirtilen alanda ortalama değeri.
DISTINCT parametresi ile belirtilen alanda bulunan bilgilerden aynı olanlarından sadece birinin seçilmesini sağlar.
Örnek 1:
SELECT COUNT(*) FROM notlar.
Sonucunda ekrana gelecek kayıt sayısı 9 dur.
Örnek 2:
SELECT COUNT(DISTINCT ogr_no) FROM notlar.
Sql ifadesinde ekrana gelecek kayıt sayısı 3 olacaktır.
Örnek 3:
SELECT MAX(basari) FROM notlar.
En büyük basari notunu, ekrana 94 olarak görüntüler. En büyük değer kaç tane olursa olsun bir tanesi görüntülenir.
Örnek 4:
SELECT COUNT(*) FROM ozluk.
Ozluk tablosundaki kayıt sayısını 3 olarak verecektir.
SORGULAMA
SELECT [ALL|DISTINCT] { *|alan_adi_listesi}
[INTO değişken_listesi ]
FROM tablo-ismi
[WHERE koşul]
[GROUP BY alan_adi1 [ , alan_adi2] …]
[HAVING search-condition]
[ORDER BY siralama_alanlari]
şeklinde genel bir ifadesi vardır.
Buradaki ve genelde bilgisayar dünyasında yardım (help) menülerinde kullanılan işaretler,
[ ] seçimlik
{ } zorunlu
zorunlu
| veya anlamına gelmektedir.
Şartsız kayıt sorgulama:
Herhangi bir tabloya ait bilgi alanlarındaki bilgilerin listesini almak için;
SELECT FROM .
ifadesi kullanılır.
Örnek 1:
SELECT adi, soyadi FROM ozluk.
Ozluk tablosundaki tüm öğrencilerin adını ve soyadını ekrana görüntüleyecektir.
Örnek 2:
SELECT vize*10 FROM notlar.
Notlar tablosundaki tüm öğrencilerin vize notunu 10 ile çarpımını ekrana görüntüleyecektir. Burada vizelerin 10 ile çarpımı sadece ekrana görüntülenecek tabloda ise değişmeyecektir.
Örnek 3:
SELECT SUM(basari) FROM notlar.
Öğrencilerin başarı notlarının toplamını ekrana verecektir.
Örnek 4:
SELECT adi + soyadi FORMAT “x(25)” FROM ozluk.
Öğrencilerin adı ve soyadını bitişik yazan SQL ifadesidir.
Bu durumda iki alanın birleşmesi sonucunda karakter sayısı artacağı için yeni bir format belirtmek gerekir.Karakter alanlarda varsayılan görüntüleme 8 karakterdi, burada iki bilinin birleşmesi yeni bir bilgi alanı gibi davranacağından format belirtmek gereklidir.
Örnek 5:
SELECT * FROM notlar.
Notlar tablosundaki bütün bilgi alanlarının içeriklerini ekrana görüntüleyecektir (* joker gibi kullanılmaktadır,”*” ile kullanımda select ile from arasına başka ifade yazılmaz).
Örnek 6:
DEF VAR sayi AS INT
SELECT COUNT(*) INTO sayi FROM notlar.
Şeklinde bir kullanımla kayıt sayısı, “sayi” değişkeni içine aktarılmış olur, böylece elde edilen kayıt sayısı programın devamında amaca göre kullanılabilir.
Burada into parametresi kullanıldığı için sql sonucunda ekran hiçbir görüntü gelmeyecektir.
Örnek 7:
DEF VAR ksayisi AS INT.
DEF VAR ntoplam AS INT.
SELECT COUNT(*),SUM(basari) INTO ksayisi,ntoplam
FROM notlar.
Kayıt sayısı “ksayisi” değişkenine, basari notlarının toplamı da “ntoplam” değişkeni içine aktarılmış olacaktır.
Tek kayıt sorgulama:
Herhangi bir tabloya ait kayıtlardan birer tanesinin listesini almak için;
SELECT DISTINCT FROM .
ifadesi kullanılır. Burada distinct’den sonra yazılan alanların aynı olanlardan birer tanesi listelenir.
Örnek 1:
SELECT DISTINCT kodu FROM notlar.
Sorgu sonucu listelenecek kayıtlar;
Kodu
A308
A401
A307
A445
Bu örnekte notlar tablosunda bir ders, birden fazla olmasına rağmen, sadece her dersten bir tanesi görüntülenir.
Örnek 1
SELECT DISTINCT kodu, ogr_no FROM notlar.
Sorgu sonucu olarak (örnek kayıtlardan)
kodu ogr_no
A308 88050071
A401 88050071
A308 89050020
A307 89050020
A308 91050099
A401 91050099
A445 91050099
Notlar tablosunda sadece kodu ve ogr_no alanındaki kayıtlardan aynı olanlardan birer tanesini listelenmiştir.
SQL ifadelerini yazarken eğer cümle bir satırı aşıyorsa, daha anlaşılır olması açısından alt alta yazarak devam edilebilir.
Sorgu sonucu dönen kayıtları sıralama:
Herhangi bir tablodaki kayıtları herhangi bir alan adına göre azalan (artan) sırada sıralayabilmek için;
SELECT
FROM
ORDER BY [,alan_listesi] DESC | ASC.
ifadesi kullanılır (varsayılan olduğu için artan sırada olacaksa ASC kullanılmaz).
Örnek 1:
SELECT ogr_no, adi, soyadi FROM ozluk
ORDER BY soyadi DESC.
Öğrencilerin numara , ad ve soyadlarını , soyadı sıralı olarak Z’den A’ya sıralayarak ekrana görüntüler.
Örnek 2:
SELECT ogr_no, basari FROM notlar ORDER BY basari DESC.
Öğrencinin numara ve başarı notlarını, başarı notuna göre azalan sırada ekran görüntüler.
Örnek 3:
SELECT ogr_no, basari FROM notlar ORDER BY basari
DESC,ogr_no DESC.
Öğrencinin numara ve başarı notlarını, başarı notuna göre azalan sırada listelerken notu aynı olanları da numarasına göre azalan sırada ekranda görüntüler.
Şartlı kayıt sorgulama:
Bir tabloda istenilen şarta uygun kayıtların listesi için;
SELECT FROM WHERE
ifadesi kullanılır.
Örnek 1:
SELECT adi, soyadi, ogr_no FROM ozluk WHERE soyadı = “ “ .
Ozluk tablosundaki soyadı boş olan kayıtların ad,soyad ve numaralarını ekranda görüntüler.
Örnek 2:
SELECT ogr_no, basari FROM notlar WHERE basari = 100.
Notlar tablosundaki başarı notu 100 olan öğrencilerin numaralarını ve başarı notlarını listeler.
Bir alan içinde birden fazla değeri sağlayan kayıtları listelemek için;
Örnek 4:
SELECT adi, soyadi FROM ozluk WHERE soyadi = “demircan”
AND soyadi =”demirel”.
Bir alan içinde, birden fazla değeri sağlayan kayıtların listelenmesi, IN ifadesiyle daha kolay ve anlaşılır yazılabilir.
SELECT FROM
WHERE IN (değer1, değer2).
ifadesi kullanılır.
Örnek 5:
SELECTadi, soyadi FROM ozluk
WHERE soyadi IN (“demircan”,”demirel”).
Ozluk tablosunda soyadı demircan ve demirel olan öğrencilerin ad ve soyadlarını listeler.
Boş ve dolu alanlara göre sorgu:
Boş alanları listelemek için;
SELECT FROM WHERE IS NULL.
Örnek 1:
SELECT ogr_no, adi, soyadi FROM ozluk
WHERE cinsiyeti IS NULL.
Cinsiyet alanı boş olan öğrencilerin numaralarını, ad ve soyadlarını listeler.
Boş olmayan alanları listelemek için;
SELECT FROM
WHERE IS NOT NULL.
ifadeleri kullanılır.
Örnek 2:
SELECT ogr_no, adi, soyadi FROM ozluk
WHERE cinsiyeti IS NOT NULL.
Cinsiyet alanı boş olmayan olan öğrencilerin numaralarını, ad ve soyadlarını listeler.
Tam olmayan bilgiye göre sorgu:
İstenilen değer ile başlayan kayıtları listelemek için;
SELECT FROM
WHERE LIKE “%”.
Örnek 1:
SELECT adi,soyadi FROM ozluk WHERE adi LIKE “A%”.
Adı “B” ile başlayan kayıtların adı ve soyadını listeler.
İstenilen değer ile biten kayıtları listelemek için;
SELECT FROM
WHERE LIKE “%”.
Örnek 2:
SELECT adi,soyadi FROM ozluk WHERE adi LIKE “%A”.
Adı “A” ile biten kayıtların adı ve soyadını listeler.
İçinde herhangi bir yerde istenilen değer geçen kayıtları listelemek için;
SELECT FROM
WHERE LIKE “%%”.
Örnek 3:
SELECT adi,soyadi FROM ozluk WHERE adi LIKE “%HY%”.
Adı içinde “HY” geçen kayıtların adı ve soyadını listeler.
İki Tabloyu Beraber Sorgulama (Tabloya Alias [Geçici İsim] Verme):
SELECT FROM tablo1,tablo2 WHERE koşullar.
Birden fazla tablodan aynı anda bilgi getirilmesi gerektiğinde, ortak alanlar üzerinden birleştirme işlemleri yapılır. Birleştirme işlemi koşullar bölümünde yapılır, ortak olan alanlar eşleştirilir.
Örnek 1:
SELECT o.adi, o.soyadi, o.ogr_no, n.basari
FROM ozluk o,notlar n
WHERE o.ogr_no=n.ogr_no and n.kodu=’A308’.
A308 dersinde final notu 100 olan öğrencilerin adlarını, soyadlarını, numaralarını ve başarı notlarını listeler. Burada “o” ozluk tablosuna, “n” notlar tablosuna verilmiş geçici isimlerdir. Bu geçici isimler sayesinde sql i daha anlaşılır ve kısa yazmak mümkündür.
Örnek 2:
SELECT DISTINCT ogr_no, adi, soyadi
FROM ozluk o, notlar n
WHERE o.ogr_no = n.ogr_no AND n.kodu = “A206”.
A206 dersini alan tüm öğrencilerin numaralarını, ad ve soyadlarını listeler.
Kayıtları Gruplama:
Kayıtları, belirli alanlara göre gruplayarak sorgu yapılmasını sağlar.
Örnek 1:
SELECT kodu,count(*) FROM notlar
WHERE ogr_no = “91050099”
GROUP BY ogr_no,kodu.
Bu örnekte 91050099 nolu öğrencinin, aldığı dersleri ve bu dersleri kaç kez aldığını listeler. Örnek kayıtlara göre aşağıdaki sonuç elde edilir.
Kodu Count
A308 2
A401 1
A445 2
Kayıt girme:
Sql de tablolara yeni kayıt ekleme “Veri İşleme” bölümünde anlatılmıştır.
Kayıt güncelleme:
Sql de tablolarda varolan kayıtları güncelleme (bilgi düzeltme) işlemi “Veri İşleme” bölümünde anlatılmıştır.
Kayıt silme:
Sql de tablolardan varolan kayıtları tamamen silme işlemi “Veri İşleme” bölümünde anlatılmıştır.
SQL VERİTABANI KOMUTLARI
Sql de veritabanı komutları kalıcıdır, hatırlanırsa 4GL deki gibi oluşturulan geçici tablolar program durduğunda yok olmaktaydı.
Tablo oluşturma:
Yeni bir tablo oluşturmaya yarar.
CREATE TABLE alan1 {tip} [özellikler],
alan2 {tip} [özellikler],
…
[Unique (alan1,…, alan2)].
Özellikler, 4GL de değişken özelliklerini taşımaktadır..
Örnek 1:
CREATE TABLE ozluk1
(ogr_no char( not null,
adi char(15) not null,
soyadi char(15) not null,
sinifi int,
d_tarihi date,
cinsiyeti char(1),
ilce_kodu char(4) LABEL Doğum Yeri”,
harc_kredi logical,
adres1 char(30),
adres2 char(30),
adres3 char(30));
Ozluk tablosunun özelliklerini hatta aynısını SQL komutunu ile yukarıdaki gibi “ozluk1” tablosu oluşturulmaktadır.
“Not Null” özelliği bu alanların zorunlu olarak doldurulması yani boş geçilemez olduğunu ifade etmektedir.
Tablo adı değiştirme:
“Alter” komutu ile tablo yapısı değiştirilir.
Bir tablonun adı da değiştirilebilir.
ALTER TABLE
RENAME TABLE .
Tabloya alan ekleme:
Tablolara yeni bir alan eklenebilmektedir.
ALTER TABLE
ADD tip [[Label “ …”] [Format][Column Label]].
Tablodan alan silme:
Var olan alanlar silinebilir.
ALTER TABLE
DROP .
Tabloda alan adları değiştirme:
Bir tabloya ait alanların da adı değiştirilebilir.
ALTER TABLE
RENAME TABLE .
Tabloda alan güncelleme:
Var olan alanların özellikleri değiştirilebilmektedir.
ALTER TABLE
MODIFY tip [[Label “ …”] [Format]
[Column Label]].
Örnek 1:
ALTER TABLE ozluk1
ADD baba_adi CHAR (15).
Ozluk1 tablosuna öğrencinin baba adını girilebilmesi için, “baba_adi” adında bir alan eklenmiştir..
Örnek 2:
ALTER TABLE ozluk1
MODIFY baba_adi CHAR (25);
Ozluk tablosunda var “baba_adi” alanını 25 olarak genişleten SQL komutunu yazılabilir.
Örnek 3:
ALTER TABLE ozluk1
DROP baba_adi.
Ozluk1 tablosunda var olan “baba_adi” alanını silen SQL komutunu yazınız.
Örnek 4:
ALTER TABLE ozluk1
RENAME TABLE ozluk2.
“Ozluk1” tablosunun adını “Ozluk2” olarak değiştiren SQL komutudur.
Örnek 5:
ALTER TABLE ozluk2
RENAME TABLE adi ograd.
Ozluk2 tablosundaki “adi” alanının adını “ograd” olarak değiştiren SQL komutudur..
Tablo Silme:
Tablolara ihtiyaç kalmadığı zaman silmeye yarar.
DROP TABLE .
Örnek 1:
DROP TABLE ozluk2.
1.TEK TABLODAN SORGULAMALAR
—SELECT * FROM Tablo
—SELECT * DISTINCT FROM Tablo
2.TABLO BİLGİLERİNİN SIRALANMIŞ OLARAK LİSTELENMESİ
—ORDER BY
—ORDER BY ASC DSC
3.BİRDEN ÇOK ALANA GÖRE SIRALAMA
—SELECT alan1, alan2 FROM Tablo ORDER BY alan1
—KOŞULA BAGLI OLARAK LISTELEME
—–WHERE
—KARŞILAŞTIRMA OPERATÖRLERi
—–ÇEŞITLI VERI TIPLERI IÇIN BASIT SORGULAMALAR
———1.NÜMERİK VERİ TİPLERİ
———2.KARAKTER VERİ TİPLERİ (CHAR)
———3.TARİH VERİ TİPİ (DATE)
———4.MANTIKSAL VERİ TİPİ
4.BİRDEN ÇOK KOŞULA DAYALI SORGULAMALAR (NOT / AND / OR)
—BİR VERİ KÜMESİNDE ARAMA -IN OPERATÖRÜ
—BETWEEN SORGULAMA SÖZCÜĞÜ
—KARAKTER TÜRÜ BİLGİ İÇİNDE ARAMA YAPMA -LIKE SÖZCÜĞÜ
5.SQL’DE ARİTMETİKSEL İFADELER VE FONKSİYONLAR
—SUM FONKSİYONU
—AVG FONKSİYONU
—MAX FONKSİYONU
—MIN FONKSİYONU
—COUNT FONKSİYONU
6.GRUPLANDIRARAK İŞLEM YAPMAK
—GROUP BY
—HAVING
—BİRDEN FAZLA TABLOYU İLİŞKİLENDİRMEK (JOIN)
—SELF-JOIN
—NESTED SELECTS (İÇİÇE SEÇİMLER)
—UNION SÖZCÜĞÜ
—–-KOŞULLAR
———ANY / ALL / EXISTS / NOT EXISTS
———EXCEPT / INTERSECT / SAVE TO TEMP / KEEP
7.TABLOLARDA DEĞİŞİKLİK YAPMAK
—INSERT INTO tablo VALUES değerler
—DELETE FROM tablo WHERE alan = 1
—UPDATE tablo SET alan = alan * 2
—CREATE INDEX ON tablo
——TEK BİR ALANA GÖRE ARTAN SIRADA İNDEKSLEME
——TEK BİR ALANA GÖRE AZALAN SIRADA İNDEKSLEME
——BİRDEN FAZLA ALANA GÖRE İNDEKSLEME
———–UNİQUE SÖZCÜĞÜ
——MEVCUT BİR İNDEKSİN SİLİNMESİ
—TABLONUN YAPISINDA DEĞİŞİKLİK YAPMAK
——ALTER TABLE
———–ADD KOMUTU (MEVCUT BİR TABLOYA ALAN (FIELD) EKLEMEK)
———–MODIFY KOMUTU (MEVCUT BİR TABLONUN ALANLARINDA DEĞİŞİKLİK YAPMAK)
———–DROP KOMUTU (MEVCUT BİR TABLODAN BİR ALAN SİLMEK)
———–RENAME KOMUTU (MEVCUT BİR TABLONUN ADINI DEĞİŞTİRMEK)
———–DROP TABLE (MEVCUT BİR TABLONUN TÜMÜYLE SİLİNMESİ)
—CREATE VIEW (VERİ GÜVENLİĞİ)
——WITH CHECK OPTION
——EKLEME
——DELETE
——UPDATE
——DROP
8.DAHA FAZLA ÖRNEK VE AÇIKLAMA
1.TEK TABLODAN SORGULAMALAR:
SELECT * FROM tablo
ÖRNEK: Bütün bilgileri personel tablosundan koşulsuz olarak listele.
SELECT * FROM personel
ÖRNEK: Personel tablosundan SEÇ komutuyla istenen sütun adlarını belirt.
SELECT sicil,sosy_g_no,ad,soyad,dog_tar,
sicil,sosy_g_no,ad,soyad,dog_tar,
adres,cins,brüt,böl_no,yön_s_g_n
FROM personel;
ÖRNEK: Personel tablosundan istenen sütün başliklarini listele.
SELECT sicil,ad,soyad,brüt
FROM personel;
DISTINCT (Tekrarsız)
TANIM: SQL’de tablo içinde birbirinin aynı datalar bulunabilir.Aynı satırların listeleme esnasında bir kez yazılması için Distinct sözcüğünü kullan.
ÖRNEK: Par _sat dosyasından sat_no’lar tekrarsız olarak listelenecektir.
SELECT DISTINCT sat_no
FROM par_sat;
2.TABLO BİLGİLERİNİN SIRALANMIŞ OLARAK LİSTELENMESİ:
ORDER BY (Sırasıyla)
TANIM:Tablodaki sütunlardan ,belirli bir sütuna göre listelemek için SELECT komutuna , ORDER BY eklenir.
ÖRNEK: Personel dosyasından,sicil,ad,soyad,brüt sütunlarını seç ve brüt(maaşa)göre büyükten küçüğe sırala.
SELECT sicil,ad,soyad,brüt
FROM personel
ORDER BY brüt ASC;
DESC : Küçükten büyüğe sırala (A-Z) ASC : Büyükten küçüğe sırala (Z-A)
DESC yazılmazsa ASC direct kabul edilir (DEFAULT)
3.BİRDEN ÇOK ALANA GÖRE SIRALAMA:
TANIM: Bir tablo içinde ,birden fazla sütundan aynı anda sıralamak için kullanılır.
ÖRNEK )Personel dosyasından seçilen sütunlarını aynı anda hem ad,hem de otomatik olarak sıralar.
SELECT sicil,ad,soyad,brüt
FROM personel
ORDER BY ad,brüt;
ÖRNEK Personel tablosundan seçili sütunları öncelik adda olmak üzere (Z-A) adı bozmadan soyadı (A-Z) sıralı listeler.
SELECT sicil,ad,soyad,brüt
FROM personel
ORDER BY ad ASC,soyad DESC,
brüt ASC;
veya;
SELECT sicil,ad,soyad,brüt
FROM personel
ORDER BY ad,soyad DESC,brüt;
KOŞULA BAGLI OLARAK LISTELEME:
WHERE
TANIM:Verilen koşulu saglayanlar listelenir.Iki veri birbiriyle karşilaştirilmaktadir. Karşilaştirilan verilerin türü ayni olmalidir.
SELECT *
FROM personel
WHERE brüt > 5000000;
KARŞILAŞTIRMA OPERATÖRLERI:
OPERATÖR ANLAMI :
< …den daha küçük
> …den daha büyük
= Eşit
<= Küçük veya eşit
>= Büyük veya eşit
<> Eşit degil
!= Eşit degil
!< …den küçük değil
!> …den büyük değil
ÇEŞITLI VERI TIPLERI IÇIN BASIT SORGULAMALAR:
1.NÜMERİK VERİ TİPLERİ:
ÖRNEK: Maaşi 8000000TL’den fazla olmayan personeli listele.
SELECT *
FROM personel
WHERE brüt <= 8000000;
2.KARAKTER VERİ TİPLERİ (CHAR):
Karakter çift veya tek tırnak ile gösterilir.
ÖRNEK: Adı Ali olmayan personele ait kayıtları listele.
SELECT *
FROM personel
WHERE ad <> “Ali”;
3.TARİH VERİ TİPİ:
Tarih veri tipleri { } sembolleri içinde yazılır.
ÖRNEK: Hangi personelin doğum tarihi 1960 yılından daha öncedir?
SELECT *
FROM personel
WHERE dog_tar <={12/31/59};
4.MANTIKSAL (LOJİK) VERİ TİPİ:
Mantıksal veriler için mümkün olabilen sadece iki değer sözkonusudur.DOĞRU D(TRUE T) , YANLIŞ Y (FALSE F) ile simgelenir.
ÖRNEK: Personel tablosunda personelin cinsiyetini belirten cins adlı alan mantıksal(logical) olarak tanımlanmıştır.Cinsiyeti erkek olanları D,kadın olanları y ile tanımlarsak erkek olanları listele.
SELECT *
FROM personel
WHERE cins = .T.;
4.BİRDEN ÇOK KOŞULA DAYALI SORGULAMALAR: (NOT,AND,OR)
TANIM:Mantıksal operatörlerin yardımı ile birden çok koşulun gerçekleştirmesine bağlı olarak ifade edilebilecek (karmaşık yada birleşik koşullu listelemeleri gerçekleştirilmektedir.)
AND (VE)
ÖRNEK: Maaşı 5000000’dan fazla olan ve cinsiyeti erkek olan personelin listelenmesi istenir yani iki koşul verilmektedir ve ikisininde olmasi istenir.
SELECT *
FROM personel
WHERE brüt >5000000 AND cins =.T.;
NOT (DEĞİL)
OR (VEYA)
ÖRNEKLER:
1.Doğum tarihi 1960’dan önce olan maaşı 6000000 – 10000000 arasındaki bayan personelin listele.
SELECT *
FROM dog_tar < {01/01/60} AND
brüt > = 6000000 AND brüt < =10000000
AND cins = .F.;
2.Satış bölümüyle muhasebe bölümündekiler kimlerdir?
(Satış bölümünün böl_no’sunun 1 ve muhasebe bölümünün böl_no’sunun 2 olduğu varsayılmaktadır.)
SELECT *
FROM personel
WHERE bol_no =1 OR bol_no = 2;
3.Bölümü Satış yada Muhasebe olamayan 1960’dan sonra doğmuş bayan personeli listele.
1.YAZILIM:
SELECT *
FROM personel
WHERE NOT (böl_no =1 OR
böl_no =2) AND dog_tar > ={01/01/60}
AND cins =.F.;
2.YAZILIM:
SELECT *
FROM personel
WHERE böl_no <> 1 AND
böl_no <> 2 AND dog_tar > ={01/01/60}
AND cins =.F.;
BİR VERİ KÜMESİNDE ARAMA -IN OPERATÖRÜ
IN (İÇİNDE)
“IN” operatörü NOT ile kullanılılabilir.
ÖRNEK: Bölümü 1,2,3 olmayan personel kimlerden oluşmaktadir?
SELECT *
FROM personel
WHERE bol_no NOT IN (1,2,3);
ÖRNEK: Böl_no’su 1,2 yada 3 olan personeli listele.
SELECT *
FROM personel
WHERE böl_no = 1 OR böl_no= 2 OR
böl_no = 3;
Bu örneğin IN ile yapılmış şekli daha kısadır.
SELECT *
FROM personel
WHERE NOT böl_no IN (1,2,3);
BETWEEN SORGULAMA SÖZCÜĞÜ:
BETWEEN (ARASINDA)
ÖRNEK: Maaşi 5- 10 milyon arasinda olan personel kimlerdir?
SELECT *
FROM personel
WHERE brüt > =5000000 AND
brüt < = 10000000;
BETWEEN (ARASINDA) komutu ile daha kısa olacaktır.
SELECT *
FROM personel
WHERE brüt BETWEEN 5000000
AND 10000000;
KARAKTER TÜRÜ BİLGİ İÇİNDE ARAMA
LIKE SÖZCÜĞÜ:
TANIM ÖRNEĞİ: Adres sutunu içerisinde semt bölümüne ait ayrıca bir sutun olmadığını varsayarak semt adı adres sutunu içerisinde yer alır ve buradan da LIKE (BULUNAN) komutuyla adres sutunu içerisinde Taksim semtinde oturan personeli listele.
SELECT *
FROM personel
WHERE adres LIKE ‘% TAKSİM %’ ;
Adres LIKE ‘%TAKSİM%’ ifadesi adres içinde her hangi bir yerde TAKSİM yazan yerde oturan personeli listeleyecektir.
LIKE sözcüğünü ,alt çizgi (-) sembolü ile birlikte kullanmakta mümkündür.
SELECT *
FROM personel
WHERE ad LIKE ‘Mehmet —–‘;
Şekildeki komut ile ad alani “Mehmet “ ile başlayan ve ad alani uzunlugu 10 karakter olan isimlere sahip personeli listeleyecektir.”Mehmet Ali”,”Mehmet Can”- “Mehmetcik” gibi isimler
listeleyecektir.Anlaşilacagi gibi – sembolü , tek karakterlik bir bilgiyi temsil etmektedir.
5.SQL’DE ARİTMETİKSEL İFADELER VE FONKSİYONLAR :
KÜME FONKSİYONLARI:
SUM FONKSİYONU:
SUM (TOPLA)
Fonksiyonun argümanı olarak belirtilen sütun ile ilişkili olana toplama işlemini gerçekleştirir.
ÖRNEK: İşletmedeki personelin brüt maaşlar toplamı ne kadardır?
SELECT SUM (brüt)
FROM personel;
AVG FONKSİYONU:
AVG (ORTALA)
Aritmetiksel ortalama (average) hesaplamak için kullanılır.
SELECT AVG(brüt)
FROM personel;
MAX FONKSİYONU:
MAX (EN ÜST)
Tablo içinde ,belirtilen sutun (alan)içindeki en büyük değeri bulur.
ÖRNEK: İşletme içindeki en yüksek maaş ne kadardır?
SELECT MAX (brüt)
FROM personel;
MIN FONKSİYONU:
MIN (EN ALT)
Tablo içinde,belirlenen sutun alan içindeki en küçük değeri bulur.
ÖRNEK: İşletme içinde 4 Mayıs 1970’den önce doğanlar için,asgari ücret nedir?
SELECT MIN(brüt)
FROM personel
WHERE dog_tar < {05/04/70};
COUNT FONKSİYONU:
COUNT (SAY)
Tablo içinde, her hangi bir sayma işlemi gerçekleştirmek için kullanilir.
ÖRNEK:Ücreti 6000000’dan olan personel sayısı nedir?
SELECT COUNT (*)
FROM personel
WHERE brüt > 6000000;
COUNT (SAY) fonksiyonu DISTINCT (TEKRARSIZ)sözcüğü ile de kullanılır.
ÖRNEK: Personel tablosunda mevcut personelin işletme içinde kaç tane farkli bölümde çaliştigini bul.
SELECT COUNT(DISTINCT böl_no)
FROM personel;
COUNT (böl_no)
6.GRUPLANDIRARAK İŞLEM YAPMA:
GROUP BY (GRUPLA)
ÖRNEK: Her bölümdeki ortalama maaş nedir?
SELECT böl_no,AVG (brüt)
FROM personel
GOUP BY böl_no;
HAVING:
HAVING (SAHİP)
Gruplandırarak kümeleme fonksiyonunu uygularken koşulda verilebilir.Bu durumda grup üzerindeki hesaplamalarla ilgili koşul belirtilirken HAVING (SAHİP) sözcüğü kullanılır.
ÖRNEK: En yüksek maaşin 9000000’dan fazla oldugu bölümlerdeki personele ait ortalama maaşlari listele.
SELECT böl_no,AVG (brüt)
FROM personel
GROUP BY böl_no
HAVING AVG(brüt)> 9000000;
HAVING sözcüğü SELECT konusunda GROUP BY bulunmadığı zaman geçersizdir. HAVING sözcüğünü izleyen ifade içinde SUM , COUNT(*) ,AVG, MAX yada MIN fonksiyonlarından en az biri bulunmalıdır.
HAVING sözcüğü sadece gruplanmış veriler üzerindeki işlemlerde geçerlidir.
WHERE sözcüğü bir tablonun tek tek satırları üzerinde işlem yapan koşullar içinde geçerlidir.
Bazı durumlarda HAVING ve WHERE sözcükleri ile birlikte SELECT komutu içinde kullanılabilir.
ÖRNEK: Personel tablosu içinde her bölümde erkek personele ait maaşlar için ortalamanin 9000000’dan fazla oldugu bölümleri listele.
SELECT böl_no, AVG (brüt)
FROM personel
WHERE cins= .T.
GROUP BY böl_no
HAVING AVG (brüt) > 9000000;
BİRDEN FAZLA TABLOYU İLİŞKİLENDİRMEK:
JOIN (İLİŞKİLENDİR)
ÖRNEK: Personel ve bölüm adlı 2 tablo bulunmaktadır.
Çalışan her personel ve personelin yöneticisi ile ilişkili bilgiler nelerdir?
SELECT *
FROM personel,bölüm
WHERE personel .böl_no=bölüm.bölüm_no ;
ÖRNEK: JOIN (İLİŞKİLENDİR) işleminde arzu edilen(sicil,ad,soyad,böl_no,yön_s_g_n) alanların listele.
SELECT sicil,ad,soyad,böl_no,yön_s_g_n
FROM personel,bölüm
WHERE personel .böl_no = bölüm .bölüm_no;
SELF-JOIN: KENDİSİYLE -İLİŞKİLENDİR:
TANIM:Bir tablonun kendisi ile birleştirilmesine “KENDISIYLE-ILIŞKiLENDIR” denir.(SELF-JOIN)
SELECT A. sicil , A.ad , A.soyad,
B .ad , B.soyad , B.dog_tar
FROM personel A , personel B
WHERE A. yon_sos_g_n =B .sosy_g_no;
NESTED SELECTS:
İÇİÇE SEÇİMLER
TANIM: İç içe geçmiş SELECT komutlarından oluşur. İçteki Select komutunun bulduğu sonucu dış takı komutumuz işlevini yerine getirmesi için kullanılır.
ÖRNEK:Parça numarası 24 olan parçayı ,projelerde kullanan çalışan personeli listele.
SELECT *
FROM personel
WHERE sosy_g_no
IN(SELECT per_s_g_no
FROM parça,proje,çalışma
WHERE pr_no = proj_no AND
proj_no =proj_no AND
par_no =24);
ÖRNEK: Fatih’te oturan personelin çalıştığı projelerin adlarını ve yerlerini listele.
SELECT proj_ad,yer
FROM proje
WHERE proj_no IN
(SELECT proje_no
FROM personel,çalışma
WHERE sosy_g_no = per_s_g_no
AND adres LIKE “% fatih %”);
UNION SÖZCÜĞÜ:
UNION (BİRLEŞİM)
TANIM: İki ayrı SEÇ komutunun sonucunda elde edilen tabloların birleşimi işlemini gerçekleştirir.
ÖRNEK: Adı Ahmet ve Soyadı Caner olan kişi yada kişileri işletmenin yürüttüğü projelerde çalışan bir kişi (sıradan bir personel yada bölüm yöneticisi)olarak bulunduran projelerin isimlerini ve projelerin yürütüldüğü yerleri listele.
(SELECT proj_ad,yer
FROM proj,bölüm,personel
WHERE bl_no=bölüm_no AND
y_sos gno = sosy_g_no
AND ad =”Ahmet”AND soyad =”Caner”)
UNION (SELECT proj_ad,yer
FROM proje,çalışma,personel
WHERE proj_no = proje_no AND
Per_s_g_no = sosy_g_no AND ad =”Ahmet”
AND soyad =”Caner”)
KOŞULLAR:
UNION (BİRLEŞİM) sözcüğü ile ,iki yada daha çok kişi SELECT ’in sonucu olan tabloların küme birleşimi işlemine tabi tutulması için 2 koşul gereklidir.
1) SELECT komutları sonucunda elde edilecek tablolar aynı sayıda kolon içermelidirler.
2)Sonuç tabloları karşılıklı olarak kolonların aynı veri tipi ve aynı genişlikte olmalıdır.
ANY :
ANY (HER HANGİ BİRİ)
ÖRNEK:Satış bölümünde çalışan personelin her hangi birinden daha düşük maaş alan ve mühendislik bölümündeki kişileri listele.
SELECT *
FROM personel
WHERE brüt < ANY
(SELECT brüt
FROM personel
WHERE böl_no = 2) AND
böl_no =1;
Aynı ifade aşağıdaki gibi yazılabilir:
SELECT *
FROM personel
WHERE brüt < (SELECT MAX (brüt )
FROM personel
WHERE böl_no = 2) AND böl_no =1;
ALL (HEPSİ)
ÖRNEK: Satış bölümünde çalışan ve mühendislik bölümündeki personelin hepsinden daha fazla maaş alan personeli listele.Bu örnekte satış bölümü kodu = 2 ve mühendislik bölümü kodu = 1 alınmıştır.
YAPILIŞ YOLU:
1) SELECT *
FROM personel
WHERE brüt >
ALL (SELECT brüt
FROM personel
WHERE böl_no = 1)
AND böl_no = 2;
2) SELECT *
FROM personel
WHERE brüt >
(SELECT MAX (brüt)
FROM personel
WHERE böl_no = 1)
AND böl_no =2;
EXISTS (MEVCUT)
VE ,VEYA ,DEĞİL operatörleri ile kullanılabilir.
ÖRNEK: 27 no’lu parçayı satan satıcılarla ilişkili tüm bilgileri listele.
SELECT *
FROM satıcı
WHERE EXISTS
(SELECT *
FROM par_sat
WHERE sat_no = satıcı_n
AND parça_n =27);
NOT EXISTS (MEVCUT DEĞİL)
VE ,VEYA ,DEĞİL operatörleri ile kullanılabilir.
ÖRNEK: 27 no’lu parçayı satmayan satıcılar kimlerdir?
SELECT *
FROM satıcı
WHERE NOT EXISTS
(SELECT *
FROM par_sat
WHERE sat_no = satıcı_n
AND parça_n =27);
EXCEPT (FARKLI)
Tablo-1 – Tablo-2 işlemi sonuç(iki kümenin farki) elde edilecek tabloda,Tablo-1’de bulunup, Tablo-2’de bulunmayan veriler mevcut olacaktir.
ÖRNEK:Satış bölümündeki personel adlarından,mühendislik bölümünde bulunmayanları listele.
SELECT * FROM
(SELECT ad FROM personel
WHERE bol_no=1
EXCEPT
SELECT ad FROM personel
WHERE bol_no =2);
INTERSECT (KESİŞİM)
ÖRNEK: Hem Ankara’da,hem de İstanbul’daki projelerde görev alan bölümleri listele.
SELECT * FROM
(SELECT bl_no FROM proje
WHERE yer LIKE “%Ankara%”
INTERSECT
SELECT bl_no FROM proje
WHERE yer LIKE “%İstanbul%”);
SAVE TO TEMP (SAKLA)
ÖRNEK: Bayan personeli,bayan adlı bir tablo içinde sakla.
SELECT *
FROM personel
WHERE cins =.F. SAVE TO TEMP bayan;
KEEP:
KEEP (KALICI)
ÖRNEK:
SELECT *
FROM personel
WHERE cins = .F.
SAVE TO TEMP bayan KEEP;
7.TABLOLARDA DEĞİŞİKLİK YAPMAK:
INSERT (EKLE)
INTO (İÇİNE)
VALUES (DEĞERLER)
ÖRNEK: Bir personel tablosuna sicil_no’su 275 olan personel ile ilişkili bilgileri ekle.
INSERT INTO personel(sicil,
sosy_g_no,ad,soyad,doğ_tar
adres,cins,brüt,böl_no,yön_s_g_no
VALUES(‘275’,’27652418’,’Ali’,’Caner’,
{10/05/1962},’Merkez caddesi 46 -Fatih-İstanbul’,
.T.,27000000,2,’876215342’);
DELETE (SİL)
ÖRNEK: 2 no’lu bölümdeki personelin tümü tablodan sil.
DELETE FROM personel
WHERE böl_no = 2;
5 ROWS DELETED 5 SATIR SİLİNDİ
ÖRNEK:Brüt maaş alani boş olmayan tüm personeli sil.
DELETE FROM personel
WHERE brüt IS NOT NULL;
25 ROWS DELETED 25 SATIR SİLİNDİ
UPDATE (GÜNCELLE)
SET (YAP)
ÖRNEK:2’inci bölümün yürüttüğü projelerde kullanılan tüm parçaların fiyatlarını % 7
zam yap.
UPDATE parça
SET fiyat = fiyat *1,07
WHERE pr_no IN
(SELECT proj_no
FROM proje
WHERE bl_no = 2;
CREATE INDEX (INDEKS YARAT )
ON (Hangi Tablo İçin)
CREATE INDEX ındeks adı
ON tablo adı(kolon adı 1,kolon adı 2,.,.kolon adı n);
TEK BİR ALANA GÖRE ARTAN SIRADA İNDEKSLEME :
ÖRNEK:İşletmede çalışan personeli brüt maaşlarına göre artan sırada listele.(Brüt alana göre bir indeks oluşturmalıyız)
CREATE INDEX pers_maas
ON personel(brüt);
INDEX CREATED 127 ROWS İNDEKS YARATILDI 127 SATIR
127 satırlık personel tablosu ile ilişkili olarak brüt kolonu indeks anahtarı olarak kullanan pers_maas adlı indeks oluşturulmuştur.Bu durumda;
SELECT *
FROM personel;
_Şeklinde listeleme komutu sonucunda personel tablosundaki tüm personel, brüt maaşlarina göre sirali olarak listelenecektir.
TEK BİR ALANA GÖRE AZALAN SIRADA İNDEKSLEME :
DESC Küçükten büyüğe (K-B)
ÖRNEK:İşletmede çalışan personeli brüt maaşlarına göre azalan sırada (yüksek maaştan düşük maaşa doğru)listelemek istersek ,brüt alanına göre aşağıdaki şekilde oluşturmak gerekir.
CREATE INDEX
ON personel (brüt DESC);
BİRDEN FAZLA ALANA GÖRE İNDEKSLEME :
ÖRNEK:İşletmedeki personelin öncelikle adlarına göre,aynı adda olanların soyadlarına göre ,hem adı hemde soyadı aynı olanların maaşlarına göre sıralanmış olarak listele.
CREATE INDEX p_ad_soy_m
ON personel (ad,soyad,brüt);
Bu durumda;
SELECT *
FROM personel;
UNIQUE (TEK)
Bir tablo,seçilen bir sutüna (alana) göre indekslenirken , indeksleme alanı olarak seçilen sutündaki verilerintekrarlanmasına müsaade edilmesi istenmiyorsa,indeksleme yapılırken ,CREATE ,INDEX komutu iinde UNİQUE sözcüğü kullanılmalıdır.
CREATE UNIQUE INDEX pers_sicil
ON personel (sicil);
EKLEME İÇİN:
Personel tablosuna
INSERT INTO Personel
VALUES(53768 ,’27241685’,’ayşe’,
‘şen’{01/04/63},’Merkez cad. 82 –
Kadıköy’.F. ,27000000 ,2, ‘34261578’);
MEVCUT BİR İNDEKSİN SİLİNMESİ:
DROP IPTAL
DROP INDEX pers_in;
Komutu ile
INDEX DROPPED (İNDEKS SİLİNDİ)
TABLONUN YAPISINDA DEĞİŞİKLİK YAPMAK:
ALTER TABLE (TABLO DEĞİŞTİR)
MEVCUT BİR TABLOYA KOLON EKLEMEK:
ADD (EKLE)
ALTER TABLE (TABLO DEĞİŞTİR) komutu içinde ADD (EKLE) ile satır ekle.
ÖRNEK:Personel tablosuna ,işe başlama tarihini belirten bir kolon ekle
ALTER TABLE personel
ADD iş_baş_tar DATE;
ADD (EKLE)iş_baş_tar DATE NOT NULL (TARIH DEGERSIZ) bu şekilde kullanilsaydi bu kolon satiri gene boş kalirdi ; fakat bu kolon ile ilişkili yeni boş degerler eklemek istendiginde buna müsaade edilmeyecekti.
MEVCUT BİR TABLONUN ALANLARINDA DEĞİŞİKLİK YAPMAK :
MODIFY KOMUTU:
MODIFY (DEĞİŞTİR)
MEVCUT BİR TABLODAN BİR KOLON SİLMEK:
DROP KOMUTU :
DROP (İPTAL)
ÖRNEK:Personel tablosundan iş_baş_tar kolonunu sil.
ALTER TABLE personel
DROP iş_baş_tar ;
Birden fazla kolonda silinebilir.Birden fazla kolon silmek için virgülle ayrılarak silinir.
BİR TABLONUN ADINI DEĞİŞTİRMEK:
RENAME KOMUTU:
RENAME (TABLO YENİ AD)
ALTER TABLE personel personel Tablosunda değişiklik yap
RENAME TABLE elemanlar; elemanlar tablosunun adını değiştir
MEVCUT BİR TABLONUN BİR KOLONUNUN ADININ DEĞİŞTİRİLMESİ:
RENAME:
RENAME YENİ AD
ALTER TABLE personel
RENAME brüt br-maaş;
MEVCUT BİR TABLONUN TÜMÜYLE SİLİNMESİ
DROP TABLE (TABLO İPTAL)
ÖRNEK:Proje tablosunu sil.
DROP TABLE proje;
VERİ GÜVENLİĞİ:
CREATE VIEW GÖRÜŞ ALANI YARAT
ÖRNEK:Personel adlı temel tablodan persview adlı bir view oluştur.
CREATE VIEW perswiew
AS SELECT sicil,sos_g_no,ad,soyad,doğ_tar,
adres,cins,böl_no,yon_s_g_no
FROM personel;
VERİ BÜTÜNLÜĞÜNÜN SAĞLANMASI:
WITH CHECK OPTİON KONTROLLÜ
CREATE VIEW UST_PER_ VIEW ‘Önce bir vıew oluşturulsun
AS SELECT FROM personel
WHERE brüt >25000000
WITH CHECK OPTION;
Burada, maaşi 25000000’ün üzerinde olan personelden oluşan bir UST_PER_VIEW adli view oluşturulmuştur.Bu view’a brüt maaşi 13000000 olan bir personel eklemek istedigi zaman hata mesaji verecektir.
CHECK opsiyonu kullanılmasaydı hata mesajı alınmadan bu veri VİEW içine yükleyecekti.
EKLEME
INSERT INTO UST_PER_VIEW
VALUES (27521 ,’27865427’,’ayşe’,
‘okan’ ,{01/05/1962}’Cumh. Cad. 46 – Taksim’,
.F.,13000000 ,1 ,’27651112’);
VIEW İÇİNDE SATIR SİLME:
ÖRNEK:UST_PER_VIEW içinden,maaşi 2500000’den az olan kişileri sil.
DELETE FROM UST_PER_VIEW
WHERE brüt < 25000000;
VIEW SATIRLARI ÜZERİNDE GÜNCELLEME :
ÖRNEK: UST_PER_VIEW adlı view’de sicili 27251 olan kişnin maaşını 37000000 olarak değiştir.
UPDATE UST_PER_VIEW
SET brüt = 37000000
WHERE sicil = 27251;
BİR VIEW’U SİLMEK:
DROP VIEW (GÖRÜŞ ALANI IPTALI)
DROP VIEW UST_PER_VIEW; GÖRÜŞ ALANI IPTALI UST_PER_VIEW;




