0% found this document useful (0 votes)
23 views27 pages

Sirket SQL

Uploaded by

sefamusa37
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
23 views27 pages

Sirket SQL

Uploaded by

sefamusa37
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

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)

You might also like