Personel tablsoundaki tüm kayıtları görüntüleyen SQL sorgusu
use sirket
select * from personel
select ALL * from personel
Sadece adını ve doğum tarihini listeleyen sorgu
select ad,dogum_tarihi from personel
Başlık değiştirerek gösterme
select ad as iSİM,dogum_tarihi AS [DOĞUM TARİHİ] from personel
Ad ve soyadı tek başlık altında göstermek
select ad+' '+soyad as [AD SOYAD] from personel
Personelin maaşına 200 lira ilave edilmiş şekilde göstermek
select ad+' '+soyad as [AD SOYAD], maas+200 from personel
Personelin maaşına yüzde 10 ilave edilmiş şekilde göstermek
select ad+' '+soyad as [AD SOYAD], maas,maas*1.10 as ilave_edilmis_hali
from personel
TOP
En üstten belirli sayıda kayıtları göstermek
select TOP 5 * from personel
PERCENT
En üstten belirli oranda kayıtları göstermek
select TOP 10 PERCENT * from personel
DISTINCT
Tekrarlı alanların gösterilmesini önlemek
select DISTINCT cinsiyet from personel
Kaç farklı cinsiyet olduğunu bulan sorgu
select count(DISTINCT cinsiyet) from personel
ORDER BY
Ad alanına göre A-Z şeklinde gösteren sorgu
select * from personel order by ad
Ad alanına göre Z-A şeklinde gösteren sorgu
select * from personel order by ad desc
Soyad alanına göre Z-A , Maaş alanına göre düşükten yükseğe doğru sıralama
select * from personel order by soyad desc, maas asc
WHERE
Cinsiyeti erkek olan personeli listeleyen sorgu
select * from personel where cinsiyet='E'
select * from personel where cinsiyet <> 'K'
İşe başlama tarihi 2005 yılından önce olanları en yeni işe başlayandan itibaren sıralayınız.
select * from personel where baslama_tarihi< '2005-01-01' order by
baslama_tarihi desc
Maaşı 2500 liradan fazla olan Bayan personelin ad ve soyadını listeleyiniz.
select ad,soyad from personel where cinsiyet='K' and maas>2500
Doğum tarihi 1985 ile 1988 arasında olan personeli listeleyin
select * from personel where dogum_tarihi between '01-01-1985' and '01-01-
1988'
select * from personel where dogum_tarihi > '01-01-1985' and dogum_tarihi <
'01-01-1988'
Doğum Tarihi 1988 den büyük olan ya da 2002 den sonra işe başlayan personeli listeleyen sorgu
select * from personel where baslama_tarihi>'01-01-2002' or
dogum_tarihi>'01-01-1988'
IN,OR,NOT
1,2 veya 3 nolu birimlerde çalışanları listeleyen sorgu
select * from personel where birim_no=1 or birim_no=2 or birim_no=3
select * from personel where birim_no in (1,2,3)
Doğum yeri 1 ve 2 olmayanlar
select * from personel where dogum_yeri not in (1,2)
İşe başlama tarihi 2002’den sonra olan yada yaşı 35’den büyük olan personeli listeleyen sorgu
select * from personel where baslama_tarihi >'2002-01-01' or
datediff(year,dogum_tarihi,getdate())>35
LIKE OPERATÖRÜ
Adı A harfi ile başlayanlar
select ad,soyad from personel WHERE ad LIKE 'A%'
Soyadı LU ile bitenler
select ad,soyad from personel WHERE soyad LIKE '%LU'
Adı E harfi ile başlayıp 5 karakterli olanlar
select ad,soyad from personel WHERE ad LIKE 'E____'
İsminin herhangi bir yerinde AK harfleri geçenler
select ad,soyad from personel WHERE ad LIKE '%Ak%'
İsminin herhangi bir yerinde AL harfleri geçip, soyadı AR ile bitenler
select ad,soyad from personel WHERE ad LIKE '%AL%' and soyad LIKE '%AR'
SQL’de Birleşik Değerli (Aggregate) Fonksiyonlar
Kayıt sayısını veren sorgu
select count(*) from personel
Personele ödenen toplam prim sayısını veren sorgu
select sum(prim) from personel
Ortalama maaşı veren sorgu
select avg(maas) from personel
En yüksek maaş
select max(maas) from personel
Alfabatik olarak en sonda bulunan ismi veren sorgu
select max(ad) from personel
GROUP BY Yan Tümcesi
Her birimdeki çalşan sayısı
select birim_no , count(*) from personel group by birim_no
Her birimin ortalama maaşını veren sorgu
select birim_no , avg(maas)as [ortalama maas] from personel group by
birim_no
Her birimdeki en düşük maaşı ARTAN şekilde veren sorgu
select birim_no , min(maas)as [En dusuk maas] from personel group by
birim_no ORDER by [en dusuk maas] ASC
2500 liranın altında en yüksek maaşı birim_no ya göre gruplayarak veren
sorgu
select birim_no , max(maas) from personel
where maas<2500 group by birim_no
Doğum yeri 2 olan personeli unvan ve cinsiyetlerine göre listeleyen sorgu
select unvan_no,cinsiyet,count(*) [ADET]from personel
where dogum_yeri=2
group by unvan_no,cinsiyet
ORDER BY UNVAN_NO
HAVING
Personel sayısı 5’ten çok olanları listeleyen sorgu
select birim_no , count(*) as birimPersonelSayisi from personel
group by birim_no
HAVING count(*)>5
Personel sayısı 5’ten çok olanların içinde 2500 liradan fazla maaş alan
personel sayısını listeleyen sorgu
select birim_no , count(*) from personel
where maas>2500
group by birim_no
HAVING count(*)>5
Cinsiyeti erkek olup, en yüksek maaşı 4500 liradan fazla olan birimleri
birim numarasına göre artan sırada veren sorgu
select birim_no , max(maas) from personel
where cinsiyet='E'
group by birim_no
HAVING max(maas)>4500
ORDER BY birim_no
SQL’de Matematiksel Fonksiyonlar
SELECT ABS(-21547)
Sonuç: 21547
SELECT ACOS(-1.0)
Sonuç: 3, 14159265358979
SELECT ASIN(-1.0)
Sonuç: -1, 5707963267949
SELECT ATAN(-181.01)
Sonuç: -1, 56527182634403
SELECT CEILING($123.45)
SELECT CEILING($-123.45)
SELECT CEILING($0.0)
Sonuç: 124, 00
-123, 00
0, 00
SELECT COS(14.78)
Sonuç: -0, 599465426194654
SELECT COT(124.1332)
Sonuç: -0, 0403119983711489
SELECT DEGREES(PI()/2)
Sonuç: 90
SELECT EXP(10)
SELECT EXP(LOG (10))
Sonuç: 22026, 4657948067
10
SELECT FLOOR($123.45)
SELECT FLOOR($-123.45)
SELECT FLOOR($0.0)
Sonuç: 123, 00
-124, 00
0, 00
SELECT LOG(10)
SELECT LOG(EXP(10))
Sonuç: 2, 30258509299405
10
SELECT LOG10(145.175643)
Sonuç: 2, 16189375825097
SELECT PI()
Sonuç: 3, 14159265358979
SELECT POWER(2, 3) -- Sonuç: 8
SELECT POWER(27.00, 1.00/3.00) -- Sonuç: 3.00
SELECT RADIANS(45.01)
Sonuç: 0.785572696322647690
SELECT RAND()
Sonuç: 0, 338218701443104
SELECT ROUND(123.9, 0) -- Sonuç: 124
SELECT ROUND(123.9, 1) -- Sonuç: 123.9
SELECT ROUND(123.9994, 3) -- Sonuç: 123.9990
SELECT ROUND(123.9995, 3) -- Sonuç: 124.0000
SELECT ROUND(123.4545, 2) -- Sonuç: 123.4500
SELECT ROUND(123.45, -2) -- Sonuç: 100.00
SELECT ROUND(193.45, -2) -- Sonuç: 200.00
SELECT ROUND(748.58, -1) -- Sonuç: 750.00
SELECT ROUND(748.58, -2) -- Sonuç: 700.00
SELECT ROUND(748.58, -3) -- Sonuç: Hata, çünkü verilen değerin veritipi decimal(5, 2),
oysa yuvarlama yapıldığında değer 6 rakama (1000.00)
yükseliyor ve taşma oluşuyor.
SELECT ROUND(748.58, -2) -- Sonuç: 700.00
SELECT ROUND(748.58, -4) -- Sonuç: 0.00
SELECT SIGN(-5) -- Sonuç: -1
SELECT SIGN(0) -- Sonuç: 0
SELECT SIGN(5) -- Sonuç: 1
SELECT SIN(45.17) -- Sonuç: 0, 927512759975213
SELECT SQRT(2) -- Sonuç: 1, 4142135623731
SELECT SQRT(9) -- Sonuç: 3
SELECT SQUARE(2) -- Sonuç: 4
SELECT SQUARE(-3) -- Sonuç: 9
SELECT TAN(PI()/2) –- Sonuç: 1, 63312393531954E+16
SQL’de Tarihsel Fonksiyonlar
ÖRNEK:
SELECT GETDATE() -- Sonuç: 2015-11-01 18:15:40.290
SELECT GETDATE() -- Sonuç: 2015-11-01 18:28:42.237
SELECT DATEPART(YEAR, GETDATE()) -- Sonuç: 2015
SELECT DATEPART(MONTH, GETDATE()) -- Sonuç: 11
SELECT DATEPART(DAY, GETDATE()) -- Sonuç: 1
SELECT DATEPART(WEEK, GETDATE()) -- Sonuç: 45
SELECT DATEPART(HOUR, GETDATE()) -- Sonuç: 18
SELECT DATEPART(MINUTE, GETDATE())-- Sonuç: 28
SELECT GETDATE() -- Sonuç: 2015-11-01 18:55:39.590
SELECT YEAR(GETDATE()) -- Sonuç: 2015
SELECT MONTH(GETDATE()) -- Sonuç: 11
SELECT DAY(GETDATE()) -- Sonuç: 1
SELECT DATEFROMPARTS(2010, 12, 31) -- Sonuç: 2010-12-31
SELECT DATETIMEFROMPARTS(2010, 12, 31, 23, 59, 59, 0) -- Sonuç: 2010-12-31
23:59:59.000
SELECT DATEDIFF(DAY, '2007-05-04 12:10:09', '2007-05-08 12:10:09') --
Sonuç: 4
SELECT DATEDIFF(MONTH, '2007-02-04 12:10:09', '2007-05-08 12:10:09') --
Sonuç: 3
SELECT DATEADD(YEAR, 1, '2012-07-30 10:24:54.547') -- Sonuç: 2013-07-30
10:24:54.547
SELECT DATEADD(MONTH, -2, '2012-07-30 10:24:54.547') -- Sonuç: 2012-05-30
10:24:54.547
SELECT ISDATE('2012-07-30 10:24:54.547') -- Sonuç: 1
SELECT ISDATE('12-337-30 10:24:54.547') -- Sonuç: 0
INNER JOIN
OKUL TABLOSU İLE JOIN ÖRNEKLERİ
create database okul
GO
USE okul
GO
CREATE TABLE kulup (
kulup_no INT IDENTITY(1,1) PRIMARY KEY,
kulup_ad VARCHAR(30) NOT NULL UNIQUE
);
CREATE TABLE ogrenci (
ogrenci_no INT IDENTITY(1,1) PRIMARY KEY,
ad VARCHAR(20) NOT NULL,
kulup_no INT REFERENCES kulup(kulup_no)
);
INSERT INTO kulup VALUES ('BİLİŞİM'),('FOTOĞRAFÇILIK'),('KÜTÜPHANECİLİK');
INSERT INTO ogrenci VALUES
('AHMET',1),
('BURAK',1),
('CEYDA',2),
('DEMET',2),
('EVRİM',NULL)
Şirket Tablosu ile JOIN Örnekleri
[Link]
Aşağıdaki işlem kartezyen çarpım şeklinde gösterim yapar
select ad,soyad,personel.birim_no,birim_ad from personel,birim
Personeli birim isimleri ile listeleyen sorgu
select ad,soyad,birim_ad from personel inner join birim
on personel.birim_no=birim.birim_no
select ad,soyad,personel.birim_no,birim_ad from personel,birim
where personel.birim_no=birim.birim_no
Personeli doğduğu şehir adı ve çalıştığı birimin adı ile listeleyen sorguyu
yazınız.
SELECT ad,soyad,il_ad AS [DOÐUM YERİ],birim_ad AS [BİRİM] from personel
inner join il on personel.dogum_yeri=il.il_no
inner join birim on personel.birim_no=birim.birim_no
DOĞUM YERİ ANKARA olan personelin adını, soyadını, doğduğu şehir adını va
çalıştığı birim adını listeleyen sorgu
SELECT AD,SOYAD, il_ad AS [DOĞUM YERİ],birim_ad AS [BİRİM] from personel
inner join il on personel.dogum_yeri=il.il_no
inner join birim on personel.birim_no=birim.birim_no
where il.il_ad='ANKARA'
Kalite biriminde çalışan personelin adını,soyadını ve ünvanını soyada göre
artan şekilde sıralayan sorgu
SELECT AD,SOYAD,unvan_ad from personel
inner join unvan on personel.unvan_no=unvan.unvan_no
inner join birim on personel.birim_no=birim.birim_no
where birim.birim_ad='KALİTE'
order by soyad
SELECT INTO DEYIMI
Personel tablosundaki kişilerin ad ve soyadı ile yeni bir tablo oluşturan
SQL sorgusu
SELECT ad,soyad INTO isimler from personel
Doğum yeri ANKARA olan personelin adını,soyadını,doğum tarihini alarak
ANKARA isimli tablo oluşturan sorgu
SELECT ad,soyad,dogum_tarihi INTO ANKARA from personel
inner join il on il.il_no=personel.dogum_yeri
where il.il_ad='ANKARA'
01.01.1980’den sonra dünyaya gelen personelin adını,soyadını,ünvanını
alarak UNVANLAR isimli tablo oluşturan sorgu.
SELECT ad,soyad,unvan.unvan_ad INTO UNVANLAR from personel
inner join unvan on unvan.unvan_no=personel.unvan_no
where personel.dogum_tarihi>'01.01.1980'
'TEMİZ DÜNYA’ projesinde çalışan personelin adını,soyadını ve ünvanını
alarak TEMIZDUNYA isimli tablo oluşturan sorguyu yazınız.
select ad,soyad,unvan_ad INTO TEMIZDUNYA from personel
INNER JOIN gorevlendirme on gorevlendirme.personel_no=personel.personel_no
INNER JOIN proje ON proje.proje_no=gorevlendirme.proje_no
INNER JOIN unvan on unvan.unvan_no=personel.unvan_no
where proje_ad='TEMİZ DÜNYA'
Personelin adını,soyadını, çocuk adını alarak PERSONELCOCUK isimli tablo
oluşturan sorguyu yazınız.
select [Link] as personelAd,[Link] as personelSoyad,[Link]
as cocuk INTO PERSONELCOCUK from personel
INNER JOIN cocuk on cocuk.personel_no=personel.personel_no
SQL Alt Sorguları
İç içe Select Yapısı
En yüksek maaş alan personeli listeleyen sorguyu yazınız
select ad,soyad,maas from personel
where maas=(select max(maas) from personel)
Haftalık çalışma saati 35 den fazla olan personelin ad,soyadınıve ünvanını
listeleyen sorguyu yazınız
select ad,soyad,unvan.unvan_ad from personel
INNER JOIN unvan on unvan.unvan_no=personel.unvan_no
where personel_no in ( select personel_no from personel where
calisma_saati>35)
Yaşı 30 dan küçük olan personel arasında en yüksek maaş alan kişiyi bulan
sorgu
Select ad,soyad from personel where maas=
(
select max(maas) from personel where personel_no in
(
select personel_no from personel
where datediff(year,dogum_tarihi,getdate()) < 30
)
)
Projelerde en fazla görev alan personeli ünvanı ile bulan sorguyu yazınız.
select ad,soyad,unvan_ad from personel INNER JOIN unvan on
unvan.unvan_no=personel.unvan_no
where personel_no=(
select top 1 personel_no from gorevlendirme group by personel_no
order by count(*) desc)
INSERT INTO DEYIMI
Birim tablosuna MUHASEBE birimini ekleyen sorguyu yazınız.
INSERT INTO birim (birim_ad) VALUES ('MUHASEBE')
Aşağıdaki bilgileri cocuk tablosuna ekleyen sorguyu yazınız
Ad=TANER soyad=EKİNCİ CİNSİYET=E DOGUM TARIHI=05.02.2016
DOGUM YERİ=34 PERSONEL NO=1
INSERT INTO cocuk (ad,soyad,cinsiyet,dogum_tarihi,dogu_yeri, personel_no)
VALUES('TANER','EKİNCİ','E','05.02.2016',34,1)
ARGE biriminde çalışanları ARGE isimli tabloya ekleyen sorguyu yazınız.
Not: Aşağıdaki sorguyu çalıştırmadan önce ARGE tablosunun oluşturulmuş
olması gerekir.
CREATE TABLE ARGE (ad varchar(20),soyad varchar(20))
INSERT INTO ARGE (ad,soyad)
select ad,soyad from personel
INNER JOIN birim on birim.birim_no=personel.birim_no
WHERE birim.birim_ad='ARGE'
UPDATE DEYIMI
Tüm personele 50 lira zam yapan sorguyu yazın
UPDATE personel set maas=maas+50
Maaşı 2600 liradan düşük olan personelin primlerini yüzde 10 artıran
sorguyu yazınız.
UPDATE personel set prim=prim*1.10 where maas<2600
Çocuk sayısı 2 den fazla olan personelin maaşına 50 lira zam yapan sorguyu
yazınız.
Önce select ile ilgili personelleri gösterelerim
select ad from personel where personel_no in
(
select personel_no from cocuk group by personel_no having count(*) >1
)
update personel set maas=maas+50 where personel_no in
(
select personel_no from cocuk group by personel_no having count(*) >2
)
Çalıştığı proje sayısı 2 den fazla olan personelin maaşına 100 lira zam
yapan sorguyu yazınız
Önce select ile ilgili personelleri gösterelerim
select personel_no,count(*) from gorevlendirme group by personel_no
having count(*)>2
update personel set maas=maas+100 where personel_no in
(
select personel_no from gorevlendirme group by personel_no having
count(*)>2
)
DELETE DEYIMI
35 numaralı personeli silen sorguyu yazınız.
delete from personel where personel_no=35
Kullanılmayan ünvanları silen sorguyu yazınız.
delete from unvan where unvan_no not in
(
select unvan_no from personel
)
En az calisma saatine sahip kişiyi listeleyen sorguyu yazınız
delete from personel where calisma_saati in
(
select min(calisma_saati) from personel
)
En çok maaş alan personeli silen sorguyu yazınız.
delete from personel where maas= ( select max(maas) from personel )
ANY İşlemi
1 numaralı birimde çalışan personelin herhangi birinden daha fazla maaş
alan personelin adını ve maaşını listeleyen sorguyu yazınız.
select ad,maas from personel where maas > any
(
select maas
from personel
where birim_no=1
)
and birim_no=2
Başka bir şekilde yapacak olursak :
select ad,maas from personel where maas >
(
select min(maas)
from personel
where birim_no=1
)
and birim_no=2
ALL İşlemi
1 numaralı birimde çalışıp, 2 ve 3 numaralı birimde çalışanların hepsinden
daha fazla maaş alan personelin adını ve maaşını listeleyen sorguyu
yazınız.
select ad,maas from personel where birim_no=1
and maas> all
(
select maas from personel where birim_no=2 or birim_no=3
)
Başka bir şekilde yapacak olursak :
select ad,maas from personel where birim_no=1
and maas>
(
select max(maas) from personel where birim_no=2 or birim_no=3
)
UNION DEYİMİ
Doğum yeri ANKARA olan personelin adýný,soyadýný,doðum tarihini alarak
ANKARA isimli tablo oluþturan sorgu
SELECT ad,soyad,dogum_tarihi INTO ANKARA from personel
inner join il on il.il_no=personel.dogum_yeri
where il.il_ad='ANKARA'
2000 den sonra iþe baþlayan personelin adýný,soyadýný,doðum tarihini
alarak YENIGELEN isimli tablo oluþturan sorgu
SELECT ad,soyad,dogum_tarihi INTO YENIGELEN from personel
where baslama_tarihi>'01-01-2005'
Doğum yeri ANKARA olan ve şirkette yeni işe başlayanlar listeleyen bir
sorgu yazalım. Bunun için bu iki tablodan gelen sonuçları birleştirelim :
select * from ANKARA
UNION
SELECT * FROM YENIGELEN
Exists DEYİMİ
Çalışanlar içinde 2500 liradana daha az maaş alan varsa herkesin maaşına 50
lira zam yapan sorguyu yazınız.
UPDATE PERSONEL SET MAAS=MAAS+50
WHERE EXISTS (SELECT * FROM PERSONEL WHERE MAAS<2500)
Not Exists DEYİMİ
INSERT INTO PROJE (proje_ad,baslama_tarihi, planlanan_bitis_tarihi)
VALUES('GUVENLİ TAŞIT','2018.01.01','2022.02.05')
GÜVENLİ TAŞIT projesinde görevliendirilen personel yoksa ekrana 1 mesajını
veren SQL komutu :
SELECT 1 WHERE NOT EXISTS
(
select ad,soyad from personel
INNER JOIN gorevlendirme on gorevlendirme.personel_no=personel.personel_no
INNER JOIN proje ON proje.proje_no=gorevlendirme.proje_no
where proje_ad='GUVENLÝ TAÞIT'
)
Expect DEYİMİ
İki tablo arasındaki farkı vermek için kullanılır.
select * from ANKARA
EXCEPT
SELECT * FROM YENIGELEN
select * from YENIGELEN
EXCEPT
SELECT * FROM ANKARA
Intersect DEYİMİ
İki küme arasındaki kesişimi verir.
select * from YENIGELEN
INTERSECT
SELECT * FROM ANKARA
COMPUTE
COMPUTE ifadesi tüm sonuç kümesini listeler ve bu listenin altında tek bir detay satırı görüntüler.
COMPUTE ile kullandığınız sütun SELECT listesinde de yer almalıdır.
select birim_no,maas from personel
order by birim_no
compute sum(maas)
VIEW ( GÖRÜNÜM ) OLUŞTURMA
Satır ve sütunları olan gerçek tablo gibidir. İçerisinde sadece SQL
Fonksiyonlarını, Join, Group By ve Where ifadelerini kullanabilirsiniz.
Peki View’lere niye ihtiyaç duyulmuştur, birden fazla tablosu olan bir
veritabanı içerisinde yapacağınız sorgularda sürekli olarak innerjoin veya
daha farklı sorgu ifadeleri ile karmaşık bilgileri seçiyorsunuz, yada
tablonuz da size veya firmanıza ait özel bilgiler bunlara herkesin
ulaşmasını istemiyorsunuz sadece belli alanları seçerek oluşturacağınız
tablo ile verilerinizin güvenliğini sağlayabilirsiniz.
Bir view oluştururken alan isimlerini değiştirebiliriz, ancak zorunlu değildir.
CREATE VIEW TEMIZDUNYAVIEW(isim,soyisim,unvan)
AS
select ad,soyad,unvan_ad from personel
INNER JOIN gorevlendirme on gorevlendirme.personel_no=personel.personel_no
INNER JOIN proje ON proje.proje_no=gorevlendirme.proje_no
INNER JOIN unvan on unvan.unvan_no=personel.unvan_no
where proje_ad='TEMİZ DÜNYA'
Burada dikkat edilecek nokta , bu view içerisindeki verilerde bir
değişikilik yaparsanız kaynak tabloda etkilenir. Aynı şekilde kaynak tablo
üzerinde bir değişiklik yaparsanız view de etkilenir. Örneğin burdaki bir
personelin ismini değiştirirseniz personel tablosunda da isim değişcektir.
Fakat aynı işlemi Select ile oluşturmuş olduğumuz tabloda yapacaksak
olursak kaynak tablo etkilenmez.
Her birimdeki en yüksek maaş alan perosnelin adını,soyadını ve maaşını
veren sorgu yazmak istersek :
select ad,soyad,maas from personel
where personel_no in
( select personel_no from personel where maas in
( select max(maas) from personel group by birim_no))
select birim_no,max(maas) from personel group by birim_no
Yukarıdaki sorgu hem uzun hem de istediğimiz yanıtı vermemektedir. Başka
bir birimde diğer birimin en yüksek maaşına denk birisi olursa bize yanlış
sonuç verecektir. Bunun yerine view kullanırsak daha doğru bir yanıt
alabiliriz.
create view enYuksekMaaslarView (birim,maas)
as
select birim_no,max(maas) from personel group by birim_no
select ad,soyad,[Link],birim_no from personel,enYuksekMaaslarView
where [Link]=personel.birim_no and
[Link]=[Link]
View’de alan isimlerinin değiştirmek için:
alter view enYuksekMaaslarView (birimno,maas)
as
select birim_no,max(maas) from personel group by birim_no
View silmek için : drop view enYuksekMaaslarView
View isimini değiştirmek için :EXEC sp_rename 'enYuksekMaaslarView',
'enYuksekMView'
Tabloya Hesaplanmış Sutun Ekleme
Aşağıdaki tabloda birim fiyatı va adet alanlarına girilen değerlere göre
tutar alanı otomotik olarak eklenecektir.
create table satis
( urun varchar(15),
bf int,
adet int,
tutar as (bf*adet)
)
Aşağıda bu tabloda girilen değerlere göre sonuçlar listelenmiştir.
Listeye Sıra Numarası Eklemek
select ROW_NUMBER() OVER(ORDER BY AD) AS RN, AD,SOYAD from personel
Değişken Tanımlama
DECLARE @DegiskenAdı tip[(boyut)] = değer
SET @DegiskenAdı = değer
DECLARE @Sayi INT = 3;
PRINT 'Atadığımız deger';
PRINT @Sayi
SET @Sayi = 5;
PRINT 'Atadığımız değer';
PRINT @Sayi;
GO
Birden fazla değişkeni tek satırda tanımlamak için :
DECLARE @Ad NVARCHAR(20), @Yas INT;
SELECT @Ad = 'ismail', @Yas = 31;
PRINT 'isim:';
PRINT @Ad;
PRINT 'Yaş:';
PRINT @Yas;
SELECT 'yas: '+LTRIM(STR(@Yas,10)) as Num1
Select sorgusundan veri çekme işlemi
En yüksek maaş alan kişiyi bu yöntenm ile bulalım :
DECLARE @enYuksekMaas INT = 0;
select @enYuksekMaas=max(maas) from personel
print @enYuksekMaas
select ad,soyad,maas from personel where maas=@enYuksekMaas
Değişkene aşağıdaki gibi de değer atanabilir :
DECLARE @enYuksekMaas INT = 0;
SELECT @enYuksekMaas = (select max(maas) from personel)
print @enYuksekMaas
Tablo tipli değişkenler :
DECLARE @tableAdı TABLE (kolon1 veritipi, kolon2 veritipi)
DECLARE @tbl TABLE (bNo int, ad varchar(20) )
INSERT INTO @tbl(bNo,ad )VALUES
(1,'Tarık'),
(2,'Can')
SELECT * FROM @tbl
Bir birimdeki en yüksek maaş alan kişileri aşağıdaki şekilde bulmak
istersek farklı birimlerde aynı maaşı alan kişiler olursa hatalı sonuç
alınmış olur.
select ad,birim_no from personel where maas in(select max(maas) from
personel group by birim_no)
Tablo tipli değişkenleri kullanarak doğru sonuç elde edebiliriz :
DECLARE @tblMaas TABLE (bNo int, M int )
INSERT INTO @tblMaas(bNo,M )
select birim_no, max(maas) from personel
group by birim_no
SELECT * FROM @tblMaas
SELECT ad,birim_no,maas from personel,@tblMaas
where bNo=birim_no and maas=M
CTE – Common Table Expressions – Ortak Tablo İfadeleri
CTE yani common table expressions Türkçe olarak ise ortak tablo ifadeleri
ilk defa Microsoft SQL 2005 versiyonu ile karşımıza çıktı. CTE ile aslında
sorgularımıza bir ön sorgu katabiliyoruz. Genelde çok ileri teknik
sorgulamalarda kullanılan geçici bir datasettir.
Bir tablo ya da view değildir herhangi bir veri içermezler.
Kendi kendini çağırabilir ve aynı sorgu içerisinde birden fazla
çalıştırılabilirler.
Daha çok recursive işlemlerde kullanılırlar.
Common Table Expression’larda table ve view yapılarından farklı
olarak primary key, unique, not null, default. gibi constraint
ifadeleri desteklenmez.
Common Table Expression’lar yalnızca SELECT işlemlerinde değil
INSERT, UPDATE ve DELETE işlemlerinde de kullanılabilir.
Kendi indexleri yoktur. İçeriğindeki tabloların indexlerini
kullanırlar.
Sadece çalıştığı sorgu bloğunda geçerlidir.
Farklı tablolarda bulunan bilgi içeriklerinin birbiriyle
karşılaştırılması gibi karmaşık işlerde kullanılabilir.
WITH vermiş olduğumuz CTE adi AS (SELECT listelenecek kolonlar FROM tablo1)
WITH denemeCTE(ad,soyad,maas) AS (SELECT ad,soyad,maas FROM personel)
select * from denemeCTE
Ancak CTE tanımlandıktan hemen sonra kullanılmalıdır. Aksi takdirde hata
alınır.
Örnek :
WITH denemeCTE(ad,soyad,maas) AS (SELECT ad,soyad,maas FROM personel)
DECLARE @a int,@b int
set @a=5
set @b=7
select @a+@b
select * from denemeCTE
IF..ELSE YAPISI
IF Boolean_ifade
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]
DECLARE @ortMaas INT;
select @ortMaas=avg(maas) from personel
IF @ortMaas>2200
PRINT 'ORTALAMA MAAS ASGARÝ ÜCRETTEN YÜKSEK'
ELSE
PRINT 'ORTALAMA MAAS DÜÞÜK'
IF DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday')
SELECT 'Hafta Sonu';
ELSE
SELECT 'İş Günü';
IIF Kullanımı;
IIF ( boolean_expression, true_value, false_value )
SELECT IIF(500<1000, 'DOĞRU', 'YANLIŞ');
--Arge biriminin mi ortalama maaşı daha yükek yoksa kalite biriminin mi
ortalama mmaaşı daha yüksek
declare @argeOrtMaas INT, @kaliteOrtMaas INT
SELECT @argeOrtMaas=avg(maas) from personel inner join birim
on personel.birim_no=birim.birim_no
where birim_ad='ARGE'
print @argeOrtMaas
SELECT @kaliteOrtMaas=avg(maas) from personel inner join birim
on personel.birim_no=birim.birim_no
where birim_ad='KALİTE'
print @kaliteOrtMaas
SELECT IIF(@kaliteOrtMaas<@argeOrtMaas,'KALİTE BİRİMİ DAHA YÜKSEK','ARGE BİRİMİ
DAHA YÜKSEK')
Case ve When/Then Kullanımı
CASE
WHEN karşılaştırılacak değer 1 THEN şart sağlanırsa geri dönücek olan değer
WHEN karşılaştırılacak değer 2 THEN şart sağlanırsa geri dönücek olan değer
ELSE Hiçbir şart sağlanmazsa geri dönücek değer END AS dönüş değerlerinin
sütununa verilecek isim
SELECT AD,SOYAD,MAAS,
CASE
WHEN MAAS<4200 THEN '%20 ZAM YAPILACAK'
WHEN MAAS>4200 THEN '%15 ZAM YAPILACAK'
ELSE '%18 ZAM YAPILACAK'
END AS 'DURUM' FROM PERSONEL
--Personel isimlerinin yanına cinsiyetlerini ERKEK veya KADIN olarak yazan
sorgu
select ad,soyad,
case
when cinsiyet='E' then 'ERKEK'
when cinsiyet='K' then 'KADIN'
END AS 'CİNSİYET'
FROM personel
--10 yıldan daha fazla şirkette çalışan personel için KIDEMLİ PERSONEL
--daha az çalışan için YENİ PERSONEL yazan sorgu
SELECT ad,soyad,
case
when DATEDIFF(year, baslama_tarihi, GETDATE()) >10 then 'KIDEMLİ PERSONEL'
when DATEDIFF(year, baslama_tarihi, GETDATE())<10 then 'YENİ PERSONEL'
END AS 'KIDEM DURUMU'
FROM personel
While Döngüsü
WHILE şart
BEGIN
Tekrarlanması istenilen kod bloğu
END
Örnek: 10'dan geriye doğru yazdıran kod
DECLARE @Sayac TINYINT
SET @Sayac=10
WHILE (@Sayac>0)
BEGIN
PRINT @Sayac
SELECT @Sayac=@Sayac-1
END
--ilk göreve başlayan personelin yıl sayısı ile 0 arasındaki sayıların
toplamını veren sorguyu yazın
declare @enCokYil INT,@toplam INT
set @toplam=0
select top 1 @enCokYil=datediff(year,baslama_tarihi,getdate()) from personel
order by baslama_tarihi
WHILE @enCokYil>0
BEGIN
set @toplam=@toplam+@enCokYil
SET @enCokYil=@enCokYil-1
END
print @toplam
Break Komutu
DECLARE @Sayac INT
SET @Sayac=0
WHILE (@Sayac<10) BEGIN SELECT @Sayac=@Sayac+1 IF(@Sayac*@Sayac>10)
BEGIN
PRINT 'Sayı 10 değerini geçti.'
BREAK --döngüden çık
END
END
Continue Komutu:
CONTINUE kendisinden sonraki gelen ifadeyi yok sayar.
Örnek:
DECLARE @Sayi int=0
WHILE (@Sayi<=10)
BEGIN
SET @Sayi=@Sayi+1
IF(@Sayi%2=0)
CONTINUE
PRINT @Sayi
END
PRINT 'Tek Sayılar'
GOTO KOMUTU
Etiket:
komutlar
GOTO Etiket
DECLARE @X INT=1;
WAY:
PRINT @X;
SET @X += 1;
IF @X<=10 GOTO WAY;
TRY CATCH Kullanımı
BEGIN TRY
Hataya olabilecek kod bloğu
END TRY
BEGIN CATCH
Eğer hata olursa hatanın yakalandığı kısım.
END CATCH
BEGIN TRY
PRINT 3/0;
END TRY
BEGIN CATCH
PRINT 'Catch bloğunun içi';
PRINT ERROR_NUMBER();
PRINT ERROR_MESSAGE();
END CATCH
PRINT 'Catch bloğunun dışı'
PRINT ERROR_NUMBER()
GO
BEGIN TRY
DROP TABLE X
END TRY
BEGIN CATCH
PRINT 'Catch bloğunun içi';
PRINT ERROR_NUMBER();
PRINT ERROR_MESSAGE();
END CATCH
PRINT 'Catch bloğunun dışı'
PRINT ERROR_NUMBER()
GO
Store Procedure
Store procedure dilimizde saklı alt yordam veya saklı işlem grubu olarakta
ifade edilmektedir. Stored procedure’lerin en önemli özellikleri veritabanı
içinde saklanmalarıdır. Derlenmesi için başlangıçta çalışır ve daha sonraki
kullanımlarda derlenmez. Bu da bize artı zaman kazandırır ve etkili bir
performans sunar. Stored procedure’ler C,C#, Java ya da başka programlama
dillerindeki fonksiyonlar gibi parametreler içermektedir. Bir özelliği daha
ise; oluşturulacak bir prosedürün içinde declare, set, if ,try catch gibi
deyimlerin de kullanılmasıdır.
CREATE PROCEDURE [Procedure İsmi]
(
-- girilecek parametre değerleri buraya yazılıcak
)
WITH { RECOMPILE | ENCRYPTION }
AS
BEGIN
-- BEGIN END Kullanılması zorunlu degildir.
END
Copy
CREATE PROC [Procedure İsmi]
(
--girilecek parametre değerleri buraya yazılıcak
)
AS
RECOMPILE ifadesi Stored procedure her çalıştırmada (execute) yeniden
derlenecek anlamına gelir.
ENCRYPTION ifadesi yazılan kodun şifrelenmesidir. Şifrelenmiş kodu sadece o
prosedürü yaratan ve system admin olan görebilir.
Bütün çalışanları birim ve ünvanları ile listeleycek bir saklı yordam
yazalım :
CREATE PROCEDURE calisanListele
AS
BEGIN
SELECT AD,SOYAD,unvan_ad,birim_ad from personel
inner join unvan on personel.unvan_no=unvan.unvan_no
inner join birim on personel.birim_no=birim.birim_no
order by ad
END
GO
Kullanımı :
exec calisanListele
Parametreli saklı yordam :
CREATE PROCEDURE calisanListeleBirim
@birimIstenen nvarchar(30)='ARGE'
AS
BEGIN
SELECT AD,SOYAD,unvan_ad,birim_ad from personel
inner join unvan on personel.unvan_no=unvan.unvan_no
inner join birim on personel.birim_no=birim.birim_no
WHERE birim_ad=@birimIstenen
order by ad
END
GO
Kullanımı :
exec calisanListeleBirim 'TEKNiK'
Yukarıdaki calisanListeleBirim saklı yordamına parametre yollamazsanız
default değer olarak ‘ARGE’ degerini alarak ARGE biriminde çalışanları
listeler.
Örneğin :
exec calisanListeleBirim
Saklı yordamlarda değişiklik
yapmak için ALTER komutu
kullanılır :
Yukarıdaki saklı yordama unvan olarak ‘İK UZMANI’ değerini default değer
olarak ekleyelim.
ALTER PROCEDURE calisanListeleBirim
@birimIstenen nvarchar(30)='ARGE',
@unvanIstenen nvarchar(30)='İK UZMANI'
AS
BEGIN
SELECT AD,SOYAD,unvan_ad,birim_ad from personel
inner join unvan on personel.unvan_no=unvan.unvan_no
inner join birim on personel.birim_no=birim.birim_no
WHERE birim_ad=@birimIstenen and unvan_ad=@unvanIstenen
order by ad
END
GO
Proje tablosuna yeni bir proje ekleyen saklı yordam yazalım :
CREATE PROC SP_projeEkle
(
@projeNo int,
@projeAd nvarchar(20),
@baslamaTarihi date,
@planlananBitisTarihi date
)
WITH ENCRYPTION
AS
IF EXISTS(SELECT * FROM [Link] WHERE proje_no=@projeNo)
BEGIN
PRINT 'Sistemde id numarası mevcuttur!'
END
ELSE
BEGIN
INSERT INTO [Link] VALUES
(@projeAd,@baslamaTarihi,@planlananBitisTarihi)
END
Kullanımı :
Exec SP_projeEkle 7,"ÇALIŞINCA OLUYOR",'2018-01-01','2019-04-05'
Output Parametresi :
create proc pr_HesapMakinasý
(
@sayi1 int,
@sayi2 int,
@islem smallint,
@sonuc int output
)
as
if @islem is not null
if (@islem=0)
select @sonuc= (@sayi1+@sayi2)
else if (@islem=1)
select @sonuc=(@sayi1-@sayi2)
else if (@islem=2)
select @sonuc=(@sayi1*@sayi2)
else if (@islem=3)
select @sonuc=(@sayi1/@sayi2)
else
select @sonuc=0
Kullanımı :
declare @sonuc int
exec pr_HesapMakinasi 7,6,2,@sonuc out
select @sonuc
Saklı Yordam içinde Return ifadesi :
create proc pr_Toplama
(
@sayi1 int,
@sayi2 int
)
as
return (@sayi1+@sayi2)
declare @sonuc int
exec @sonuc=pr_Toplama 5,2
select @sonuc
CREATE PROCEDURE [dbo].[asgariUcrettenFazlaAlanlarinSayisi]
@asgariUcret int=3800
AS
BEGIN
RETURN (SELECT count(*) from personel where maas>@asgariUcret)
END
declare @sonuc int
exec @sonuc=asgariUcrettenFazlaAlanlarinSayisi
select @sonuc
Bakılcak :
Use master
GO
--0 = Yerel Baðlantý Ýzni,
--1 = Uzak Baðlantý Ýzni
sp_configure 'remote admin connections', 0
GO
RECONFIGURE
GO
Kullanıcı Tanımlı Fonksiyonlar
SQL Server içersinde SUM, COUNT, AVG gibi standart tanımlı hazır
fonksiyonlar vardır. Bu fonksiyonlar dışında kullanıcılar kendi ihtiyaçları
doğrultusunda fonksiyonlar yazabilirler. Store Procedure’lerden farklı
olarak bu fonksiyonlar içersinde DML işlemleri( Update, Delete, Insert gibi
işlemler ) yapı[Link] yerine bir sorgu sonucunda elde edilmiş değerler
gönderebiliriz. Ayrıca Store Procedure’ler içinde geçici tablolar
kullanılabilirken kullanıcı tanımlı fonksiyonlarda kullanılamazlar.
Kullanıcı tanımlı fonksiyonlardaki diğer bir fark geriye değer döndürmek
için OUTPUT deyimi yerine RETURN TYPE adlı bir yapı mevcuttur.
Geriye Tek Değer Döndüren(Scalar Values) Fonksiyonlar
CREATE FUNCTION FONKSIYON_ISMI
([{@PARAMETRE VIRI_TIPI}
[=DEFAULT] [READONLY]}]
)
RETURNS SCALAR_VERI_TIPI
[WITH SECENEKLER]
AS
BEGIN
FONKSIYONUN GERCEKLESTIRECEGI ISLEMLER
RETURN SCALAR_DEGER
END
FONKSIYON_ISMI: Oluşturulacak fonksiyonun ismini belirtir. Aynı isme sahip
ikinci fonksiyon olamaz.
@PARAMETRE: Fonksiyona dışarıdan gelecek değerleri belirler. @ işareti ile
başlamak zorundadır.
VERI_TIPI: Parametreler için kullanılacak veri tipini belirler
DEFAULT: Parametreler için kullanılacak varsayılan değerlerdir.
READONLY: Fonksiyonlara gelen değerlerin fonksiyon içerisinde
değiştirilmesini önlemek için kullanılır.
RETURNS: Scalar fonksiyondan dönecek değerin veri tipini belirlemek için
kullanılır.
WITH: Saklı yordamlarda olduğu gibi ENCRYPTION gibi seçenekler bulunur.
Ayrıca SCHEMABINDING ile tablolarda yapısal değişiklik yapılması
engellenir.
SCALAR_DEGER: Fonksiyondan dönecek olan scalar değeri belirler.
Örnek olarak iki sayıyı toplayan bir fonksiyon yazalım :
CREATE FUNCTION TOPLA(@S1 int, @S2 int)
RETURNS INT
AS
BEGIN
RETURN @S1+@S2;
END
GO
Kullanımı :
SELECT [Link](5,17)
SELECT [Link](5,7),[Link](25,17)
Alınan birim numrasına göre ilgili personelin adını ve soyadını
birleştirerek aralarına * işareti koyarak yan yana yazan bir fonksiyon
yapalım.
CREATE FUNCTION birimdeCalisanlar(@birim int)
RETURNS varchar(max)
AS
BEGIN
DECLARE @personel varchar(max);
set @personel=' ';
select @personel=@personel+' '+ ad+' '+soyad+'*' from personel where
birim_no=@birim
return @personel;
END
GO
select [Link](1)
Tablo Sonuçlu(Table Valued) Fonksiyonlar
CREATE FUNCTION FONKSIYON_ISMI
([{@PARAMETRE VIRI_TIPI}
[=DEFAULT] [READONLY]}]
)
RETURNS TABLE
[WITH SECENEKLER]
AS
RETURN (SELECT ifadesi)
Gönderilen maas miktarından daha fazla maaş alanları tablo şeklinde veren
fonksiyon yazalım :
CREATE FUNCTION fazlaAlanlar(@asgari int)
RETURNS TABLE
AS
RETURN(SELECT AD,SOYAD,MAAS FROM PERSONEL WHERE MAAS>@asgari)
GO
SELECT * FROM [Link] (2800)
Çoklu İfade ile Tablo Sonuçlu(Multistatement Table-Valued) Fonksiyonlar
Geri döndürülecek tablo sonucu, fonksiyon içerisinde istenilen şekilde
düzenlenebilen fonksiyonlara denir.
CREATE FUNCTION FONKSIYON_ISMI
([{@PARAMETRE VIRI_TIPI}
[=DEFAULT] [READONLY]}]
)
RETURNS @DEGISKEN_TABLO TABLE(TABLO SÜTUN ADLARI VE VERI TIPLERİ TANIMLARI)
[WITH SECENEKLER]
AS
BEGIN
FONKSIYONUN GERCEKLESTIRECEGI ISLEMLER VE DEGISKEN_tABLO INSERT
ISLEMLERI
RETURN
END
Belirtilen maaş miktarından daha az alan personelin %20 zam yapılmış halini
hesaplayarak döndüren fonksiyonu yazalım :
CREATE FUNCTION azAlanlar(@asgari int)
RETURNS @GECICI TABLE(A VARCHAR(25),S VARCHAR(25),YENI_MAAS MONEY)
AS
BEGIN
INSERT @GECICI(A,S,YENI_MAAS) SELECT AD,SOYAD,MAAS FROM PERSONEL WHERE
MAAS<@asgari
UPDATE @GECICI SET YENI_MAAS=YENI_MAAS*1.20
RETURN
END
GO
SELECT * FROM azAlanlar(5000)