www.aliosmangokcan.com

Değerli öğrencilerim merhaba. Veritabanı dersinde yazdığımız örneklerin tamamını burada paylaşıyorum. Sizler derste zaten örnekleri yazıp üzerine gerekli notları almış olsanız da müsait oldukça ben de yazdığım bu örneklerin üzerine daha ayrıntılı açıklamalar yazmaya çalışacağım. Kendi notlarınızla karşılaştırır, hatalar varsa gerekli düzenlemeleri yaparsınız. Hepinize başarılar dilerim...

'sql komutları','sql örnekleri','t-sql komutları','t-sql örnekleri', 'dml komutları', 'dcl komutları','data defination language', 'data maniplation language', 'data control language', 'select örnekleri', 'sql select komutu', 'sql create komutu', 'sql alter komutu', 'sql drop komutu', 'sql insert komutu','sql update komutu', 'sql delete komutu', 'sql revoke komutu', 'sql grant komutu', 'sql deny komutu', 'sql açıklama satırı', 'sql store procedure', 'sql triggers', 'sql yordamlar', 'sql tetikleyiciler', 'sql functions', 'sql fonksiyonlar', 'sql if-else yapısı', 'sql when-then yapısı'

/* SQL: Structured Query Language
PL/SQL - Oracle tarafından geliştirilmiştir.
T-SQL - Microsoft ve sysbase tarafından geliştirilmiştir */


SQL yapısal olarak 3 gruba ayrılır:

--1- DDL (Data Defination Language / Veri Tanımlama Dili)

CREATE - aLTER - DROP

--2- DML (Data maniplation lang. / Veri İşleme dili)

SELECT - INSERT - UPDATE - DELETE

--3- DCL (DATA control lang. / Veri kontrol dili)

REVOKE - GRANT - DENY

-----------------------------------------

/* açıklama açıklama...
www.aliosmangokcan.com
bu alan açıklama/yorum satırlarını gösterir */

--------------------------------------

::--::--::--:: CREATE komutu ::--::--::--::

--Veritabanı ve tablo oluşturmak için kullanılır.

create database veritabanı_adı
PRIMARY ON
(name=dosya_adı,
filename=fiziki_dosya_adı,
size=dosya_boyutu,
maxsize=maksimum_dosya_boyutu,
filegrowth=dosya_artış_miktarı)
LOG ON
(name=dosya-adı,
filename=fiziki_dosya_adı,
size=boyut,
maxsize=maks.boyut,
filegrowth=dosya_artış_mik)

-- ÖRNEK 1:

create database okul
ON
(name='okul_dat',
filename='d:\okuldat.mdf',
size=10,
maxsize=50,
filegrowth=5)
LOG ON
(name='okul_log',
filename='d:\okullog.ldf',
size=5MB,
maxsize=25MB,
filegrowth=2MB)


-- ÖRNEK 2:

use okul


-- ÖRNEK 3:
create table ogrenci(
ogr_no int NOT NULL Primary Key,
ogr_adi varchar(30),
bolum varchar(50))


-- ÖRNEK 4:
create table personel(
pers_id int not null,
adi varchar(30),
sehir varchar(50),
unique (pers_id))


-- ÖRNEK 5:
create table ogrenci2 (
ogr_no int identity(1,3) not null,
ad char(20))


-- ÖRNEK 6:
create table ogrenci3(
ogr_no int not null,
ad nchar(35),
sehir varchar(50) DEFAULT 'İzmir')


-- ÖRNEK 7:
create table notlar(
ogr_no int not null,
ders_kodu varchar(25) not null,
vize int,
final int,
CONSTRAINT birlesikPK Primary Key (ogr_no,ders_kodu))


-- ÖRNEK 8:
create table notlar2 (
ogr_no int,
ders_kodu varchar(6) not null,
vize int CHECK (vize>=0),
final int CHECK (final>=0))


-- ÖRNEK 9:
create table notlar3(
ogr_no int,
vize int,
final int,
constraint chkvize CHECK (vize>=0 AND vize<=100),
constraint chkfinal CHECK (final>=0 AND final<=100))

::--::--::--:: IN, NOT IN, LIKE ::--::--::--::

IN ---> OR
NOT IN---> AND

-- LIKE
% birden fazla karakter için kullanılır
_ tek bir karakter için
[HARF] herhangi bir karakter kendisini ifade eder
[^HARF] herhangi bir karakter yerine gelmeyecek ifadeler için
[A-Z] a ile z arasında bir karakter

-- ÖRNEKLER 10:

LIKE '%A%' --> içinde A harfi olanlar

LIKE '%A' --> A harfi ile bitenler

LIKE '_ _ _ A' --> 4 harfli ve son harfi A olanlar

LIKE '[AC]%' --> ilk harfi A veya C olanlar/olmalı

LIKE '[A-C]%' --> ilk harfi A ile C arasında olanlar (A,B,C)

LIKE '[1-2][8-9]' --> 18 ile 29 arasındaki sayılar

LIKE '[^B-M][^MOZ][A-Z]' --> 3harften oluşan
1.harfi B ile M arasında olmayan
2.harfi M,O,Z olmayan
3.harfi A ile Z arasında olan

-- ÖRNEK 11:

create table urunler(
urun_kodu varchar(4) not null,
constraint chkkod CHECK (urun_kodu IN('A089', 'A090', 'A020','A100')
OR urun_kodu LIKE 'A9[0-9][0-9]'))

-- ÖRNEK 12:

create database araba1b

create table musteri(
mkod int not null Primary Key,
mad varchar(35) not null,
msoyad varchar(35) not null,
madres varchar(255),
mtel varchar(11),
mail varchar(100))

create table arac(
aracno int not null Primary Key,
model int not null,
constraint chkmodel CHECK (model LIKE '[1-2][9-0][0-2][0-1]'),
marka varchar(50),
plaka varchar(15),
fiyat int,
constraint chkfiyat CHECK (fiyat>=0 AND fiyat<=100000),
tarih smalldatetime)

create table kiralama(
mkod int not null,
aracno int not null,
tarih smalldatetime,
constraint fk_mkod Foreign Key (mkod) References musteri(mkod)
ON UPDATE CASCADE ON DELETE CASCADE,
constraint fk_aracno Foreign Key (aracno) References arac(aracno)
ON UPDATE CASCADE ON DELETE CASCADE,
constraint pk_key Primary Key (mkod,aracno))

-- ÖRNEK 13:
..
...
constraint fk_mkod Foreign Key (mkod) References musteri(mkod)
ON UPDATE CASCADE ON DELETE CASCADE,
...
..


::--::--::--:: ALTER ile db nesnesinin özelliğini değiştirme ::--::--::--::

--1- Tabloya sütun eklemeki için:

ALTER TABLE tabloadı ADD sütunadı özellikleri

 

-- ÖRNEK 14:

ALTER TABLE kiralama ADD testtarihi smalldatetime not null



--2- Tabloda istenen sütunu silmek için:

ALTER TABLE tabloadı DROP COLUMN sütunadı



-- ÖRNEK 15:

Alter Table kiralama DROP COLUMN testtarihi


--3- tablo sütun özelliklerini değiştirmek için:

alter table tabloadı ALTER COLUMN sütunadı özellikler

 

-- ÖRNEK 16:

alter table arac alter column plaka nvarchar(20)

 

-- ÖRNEK 17:

alter table musteri add myasi int

alter table musteri add check (myasi>0)

 

-- ÖRNEK 18: (constraint güncelleme)

alter table arac drop chkfiyat

alter table arac alter column fiyat float

Alter table arac ADD constraint chkfiyat CHECK (fiyat>=0 AND fiyat<=100000)


::--::--::--:: DROP ile tablo veya veritabanı silmek ::--::--::--::

Alter Drop

Drop

Truncate - en garantili kayıt silme için
Delete

-- ÖRNEK 19:

drop table abcd -- abcd tablosu silinir
drop database okulumuz

 

-- ÖRNEK 20:

truncate table ogrenci -- öğrenci tablosundaki tüm kayıtlar


::--::--::--:: DML (Data maniplation lang. / Veri İşleme dili) ::--::--::--::

SELECT - INSERT - UPDATE - DELETE



--- SELECT:

select sütunadı from tabloadı


-- ÖRNEK 21:

select mad,myasi from musteri

 

-- ÖRNEK 22:

select * from kiralama

/* Select ayrıntılı örnekleri dersin devamında yapılacak)
(32.ÖRNEKTEN İTİBAREN) */


::--::--::--:: INSERT ile veri girişi ::--::--::--::

1- insert into tabloadı values (deger1, deger2, deger3...)

2- insert into tabloadı (sütun1,sütun2...) values (değer1, değer2...)


-- ÖRNEK 23:

INSERT INTO musteri
values (1,'Muhammed', 'Talha', 'İzmir', '05358900718', This email address is being protected from spambots. You need JavaScript enabled to view it.', 20)

INSERT INTO musteri
values (2,'Doğuakan', 'Eroğlu', 'Adana', '05312300718', This email address is being protected from spambots. You need JavaScript enabled to view it.', 22)

select * from musteri


-- ÖRNEK 24:

INSERT INTO musteri (mkod, mad, msoyad) VALUES (3, 'Ali', 'Yılmaz')


::--::--::--:: UPDATE ile veri güncelleme ::--::--::--::

update tabloadı SET sütun1=değer, sütun2=değer... where koşul

 

-- ÖRNEK 25:

select * from musteri

update musteri SET madres='Muğla',mtel='0545454', mail=This email address is being protected from spambots. You need JavaScript enabled to view it.'
where mad='Ali'

 

-- ÖRNEK 26:

update musteri SET madres='Adıyaman' where mkod>5 AND msoyad LIKE '%an'

 

-- ÖRNEK 27:

update musteri set mail=This email address is being protected from spambots. You need JavaScript enabled to view it.where not mail like '%@%'

 

-- ÖRNEK 28:
mail adresi NULL olanlara This email address is being protected from spambots. You need JavaScript enabled to view it.' adresini atayın, yaşı NULL olanları 25 yaşında yapın ;-)

 

::--::--::--:: DELETE ::--::--::--::

Delete from tabloadı where koşul


-- ÖRNEK 29:

Delete from musteri where mtel LIKE '%7'


-- ÖRNEK 30:

delete from musteri

 

::--::--::--:: DCL (DATA control lang. / Veri kontrol dili) ::--::--::--::

REVOKE - GRANT - DENY


GRANT: kullanıcının kayıt yapmasına ve SQL çalıştırmasına izin verir.

DENY: kullanıcıyı kısıtlar

REVOKE: izin ve kısıtlamaları kaldırır.


/* Grant {ALL veya izinler} ON {izin alanı} TO {kullanıcılar}
On ifadesi tablo için kullanılır
veritabnı düzeyinde işlem için TO yeterli */


veritabanı için: create database, create table, backup database, create view
tablo için: select, update, insert, delete
yordam için: execute


-- ÖRNEKLER 31:

GRANT select ON musteri ON taylan

GRANT ALL ON kiralama ON ergul, dogukan

grant create database TO ibrahim

deny create table TO ali

revoke update ON musteri FROM ali

revoke ALL from ali,veli

 

::--::--::--:: Ayrıntılı Select Örnekleri ::--::--::--::

-- ÖRNEKLER 32:

select * from products

select * from orders

select * from customers


-- ÖRNEK 33:

select orderID, shipname from orders


-- ÖRNEK 34:

SELECT orders.Shipname, customers.city from orders, customers


-- ÖRNEK 35:

select * from customers where city LIKE 'London'

SELECT * FROM Customers WHERE city='London'


-- ÖRNEK 36:

select * from customers where city='Madrid' OR region is NULL


-- ÖRNEK 37:

select customerID, address from customers where address LIKE '%er%'


-- ÖRNEK 38:

select * from customers where customerID LIKE 'FR%'
AND country IN ('Italy','Germany')


-- ÖRNEK 39:

select * from customers where customerId LIKE 'N_R%'


-- ÖRNEK 40:

select * from customers where country='Germany' OR country='Italy'


::--::--::--:: distinct: tekrarlı satırları önlemek ::--::--::--::

-- ÖRNEK 41:

select distinct madres from musteri


::--::--::--:: order by (ASC - DESC) ::--::--::--::

select * from tabloadı order by referanssütun ASC --(artan)

veya

select * from tabloadı order by referanssütun -- (artan)


-- ÖRNEK 42:

select * from musteri order by myasi


-- ÖRNEK 43:

select * from musteri order by 3 DESC


-- ÖRNEK 44:

select mkod,mad,msoyad from musteri order by 3 DESC


::--::--::--:: order by ile referans sütuna göre sıralama ::--::--::--::

-- ÖRNEK 45:

select * from musteri order by myasi,madres DESC


-- ÖRNEK 46:

select * from customers order by country ASC,contactname DESC


-- ÖRNEK 47:

select * from customers order by 9 ASC,3 DESC


::--::--::--:: sütunlar için takma isim kullanma ::--::--::--::

-- ÖRNEK 48:

select companyname AS "şirket",city AS "şehir" from customers

veya

-- ÖRNEK 49:

select companyname "şirket",city AS "şehir" from customers


-- ÖRNEK 50:

select mad "AD", myasi+5 "YENİ YAŞ",mail from musteri


-- ÖRNEK 51:

alter table musteri alter column myasi float

select mad 'AD', msoyad "SOYAD",myasi*0.5 "YARIM" from musteri


-- ÖRNEK 52:

select mad 'AD', msoyad "SOYAD",(myasi/2)+3 "YARIM" from musteri


-- ÖRNEK 53:

select mad 'AD', msoyad "SOYAD",myasi+((myasi*50)/100) "ZAMLI YAŞ" from musteri


-- ÖRNEK 54:

select mad+' '+msoyad AS "BİLGİLER" from musteri


-- ÖRNEK 55:

select * from musteri
where myasi>=23 AND myasi<=28 AND madres='Ağrı' AND mkod>2 order by 3 --msoyad Artan


-- ÖRNEK 56:

select madres from musteri where madres NOT IN ('Ağrı') order by 1 DESC

veya

select madres from musteri where madres!='Ağrı'


-- ÖRNEKLER 57:

create table urunler2(
urun_no int identity(1,1) not null,
urun_adi varchar(100),
urun_fiyati float,
constraint chkfiyatt CHECK (urun_fiyati>=0 AND urun_fiyati<=1000),
urun_adedi int,
constraint chkadet CHECK (urun_adedi>=0 AND urun_adedi<=100),
islem_tarihi smalldatetime,
sevk_adresi varchar(50))


insert into urunler2 values ('Salça',3.25,100,'07.01.2019','İzmir')
insert into urunler2 values ('Pirinç',5.75,100,'06.02.2019','İzmir')
insert into urunler2 values ('Bulgur',3.30,90,'05.03.2019','Afyon')
insert into urunler2 values ('Zeytin Yağı',24.75,85,'04.04.2019','Konya')
insert into urunler2 values ('Ayçiçek Yağı',17.25,99,'03.05.2019','Aksaray')
insert into urunler2 values ('Makarna',1.77,98,'02.06.2019','Hakkari')
insert into urunler2 values ('Şehriye',1.22,100,'01.11.2019','Bursa')

select 3*5,3+5

select 3*5 "ÇARPIM",3+5 AS "TOPLAM"

select urun_fiyati+(urun_fiyati*0.25) AS "Yeni Fiyat" from urunler2

select * from urunler2

 

-- ÖRNEK 58:

select SUBSTRING (urun_adi,2,3) AS 'Kısaltma' from urunler2


-- ÖRNEK 59:

select SUBSTRING(sevk_adresi,1,1)+'.'+urun_adi "A.Soyad" from urunler2


-- ÖRNEK 60:

select RIGHT (sevk_adresi,1)+'.'+urun_adi AS 'Ad Soyad' from urunler2


-- ÖRNEK 61:

select UPPER (sevk_adresi) from urunler2


-- ÖRNEK 62:

select LOWER (urun_adi), UPPER(sevk_adresi) "Adres" from urunler2


-- ÖRNEK 63:

select urun_adi,LEN(urun_adi) As "uzunluk1",
urun_adedi,LEN(urun_adedi) as "uzunluk2" from urunler2


-- ÖRNEK 64:

select urun_adi,REPLACE(urun_adi,'Salça','baharat') 'Yeni' from urunler2


-- ÖRNEK 65:

select REVERSE(urun_adi) as 'ters isim' from urunler2


-- ÖRNEK 66:

select ABS(-0.45) as mutlak from urunler2

 

-- ÖRNEK 67:
select urun_adi,ROUND(urun_fiyati,1) as "yuvarlanmış" from urunler2


-- ÖRNEK 68:

select POWER (2,3) as "küp alma"


-- ÖRNEK 69:

select SQRT(64)


-- ÖRNEK 70:

select SUM(urun_adedi) 'Toplam Ürün' from urunler2


-- ÖRNEK 71:

select SUM(urun_fiyati) "Toplam" from urunler2
where islem_tarihi>='3.3.2019'


-- ÖRNEK 72:

select SUM(urun_adedi) "Toplam Ürün" from urunler2
where urun_no>2 AND urun_no<=7 AND sevk_adresi like '%a' OR sevk_adresi like '%i'


-- ÖRNEK 73:

select ROUND(AVG(urun_fiyati),2) as "ortalama fiyat" from urunler2


-- ÖRNEK 74:

select MAX(urun_Adedi),MIN(urun_fiyati) from urunler2


-- ÖRNEK 75:

select MAX(islem_tarihi) from urunler2


-- ÖRNEK 76:

select COUNT(urun_adi) as "Çeşit sayısı" from urunler2


-- ÖRNEK 77:

select COUNT(distinct sevk_adresi) from urunler2


::--::--::--:: Server Seviyesi Roller:

Bulkadmin: Bulk Insert yetkisine sahip olurlar. Başka bir veri kaynağından
veya EXCEL den veri çekme işlemleri için kullanılır.

DBcreator: Veritabanı Create, Alter, Drop, veya veritabanı restore edebilir.

Diskadmin: bu yetkiye sahip olanlar disk dosyalarını yöntebilir.

Processadmin: tüm processleri yönetebilir, görebilir veya KILL komutuyla processleri
sonlandırabilir.

Public: default yetkili kullanıcı. SQL e bağalanabilir,başka bir işlem yapamaz.

securityadmin: kullanıcı yetkilendirme işlemleri yapabilir. Grant, deny, revoke...
şifreleri sıfırlayabilir..

serveradmin: sunucu genelinde yapılandırma yapabilir, sunucuyu değiştirebilir, kapatabilir

setupadmin: stored procedure işlemleri, linked server ekleyebilir, kaldırabilir.

sysadmin: En yetkin rol. database yöneticileri dışındakilere verilmemeli.


::--::--::--:: veritabanı Seviyesi Roller ::--::--::--::

db_owner: veritabanı düzeyinde en yetkin rol.

db_securityadmin: bazı özel roller için yetkilendirme yapabilir, rol üyeliğini değiştirebilir.

db_accessadmin: win oturum açma, sql server açma işlemleri için veritabanına erişim ekleyebilir

db_backupoperator: bu role sahip olanlar db yi yedekleyebilir.

db_ddladmin: ddl komutlarını çalıştıraiblir.

db_datawriter: tablolara veri girişi yapabilir

db_datareader: veritabanındaki verileri okuyabilir

::--::--::--::::--::--::--::::--::--::--::::--::--::--::


::--::--::--:: TRANSACTION ::--::--::--::

/*
begin transaction
update hesaplar set bakiye=bakiye-1000 where hesap_no=1071
update hesaplar set bakiye=bakiye+1000 where hesap_no=1453*/

transaction_log
COMMIT
ROLLBACK

----------
save transaction noktaismi

commit/rollback transaction nokta_ismi


-- ÖRNEK 78:

select * from customers

Begin transaction
update customers set contactname='ali' where city='London'
update customers set city='izmir' where contactname='ali'
select * from customers where city='izmir'
Rollback


-- ÖRNEK 79:

begin transaction
save transaction nokta1
update customers set contactname='veli' where city='İzmir'
update customers set city='Londra' where contactname='veli'
select * from customers where city='Londra'
rollback transaction nokta1
update customers set country='Türkiye' where city='London'
select * from customers
rollback


::--::--::--:: T-SQL değişken tanımlama ::--::--::--::

yerel değişkenin önüne @ işareti gelir.

declare @sayi int

declare @karakter varchar(15)

declare @sayi int,@karakter varchar,(15)

::--::--::--:: değer atamak için:

set/select @degisken=atanan_değer


-- ÖRNEK 80:

declare @sayi1 int,@sayi2 int,@toplam int
set @sayi1=10
set @sayi2=20
set @toplam=@sayi1+@sayi2
select @toplam as TOPLAM


-- ÖRNEK 81:

select * from kitap

declare @pahali money
select @pahali=MAX(fiyat) from kitap
select @pahali as "En Yüksek Fiyat"


::--::--::--:: Sistem Fonksiyonları ::--::--::--::

s.f başına @@ işareti gelir. Tüm kullanıcılar için geçerli olan fonksiyonlar.
Sql server hakkında tanımlanmış ve bilgi almak için kullanılan fonksiyonlar.

@@error, @@servicename, @@servername, @@version, @@language, @@langid,
@@max_connections, @@datefirst, @@rowcount, @@idle (cpu boşta kalma süresi - milisn)

 

-- ÖRNEK 82:

select 10/0
select @@ERROR


-- ÖRNEK 83:

select * from sys.messages


-- ÖRNEK 84:

select 10/0
select * from master.dbo.sysmessages where ERROR=@@ERROR


-- ÖRNEK 85:

select @@SERVICENAME


-- ÖRNEK 86:

select @@SERVERNAME


-- ÖRNEK 87:

select @@VERSION


-- ÖRNEK 88:

select @@LANGUAGE as 'Kullanılan Dil'


-- ÖRNEK 89:

select @@LANGID


-- ÖRNEK 90:

select @@MAX_CONNECTIONS


-- ÖRNEK 91:

delete from personel where adi like '%a%'
select @@ROWCOUNT


::--::--::--:: GO ile yığın oluşturma ::--::--::--::

T-SQL ifadeler
..
GO -- Yığın1

T-SQL ifadeler
...
GO --Yığın2


-- ÖRNEK 92:

declare @deger int
set @deger=20
go
select @deger


::--::--::--:: PRINT ifadesi ::--::--::--::

--ÖRNEK 93:

select 'deneme deneme'

print 'deneme deneme'


-- ÖRNEK 94:

declare @sayi1 int,@sayi2 int,@toplam int
set @sayi1=10
set @sayi2=20
set @toplam=@sayi1+@sayi2
print 'Toplam'
print '------'
Print @toplam


::--::--::--:: TABLO Tipi DEĞİŞKEN ::--::--::--::

declare @degiskenismi TABLE (degisken1 veritipi,degisken2 veritipi)


-- ÖRNEK 95:

declare @personel table(
no int identity(1,1),
adsoyad varchar(60) not null,
telefon varchar(15))

insert into @personel values ('ali can','3579')
insert into @personel values ('veli koş','2468')

select * from @personel order by adsoyad


-- ÖRNEK 96:

select * from kitap

declare @yazar table(yazar_no int)
insert into @yazar values (2)
insert into @yazar values (4)
insert into @yazar values (6)

select yazar_adi,yazar_soyadi from kitap
where ktp_id IN (select * from @yazar)


::--::--::--:: OUTPUT işlemi ::--::--::--::

inserted: insert, update
deleted: delete,update

output alınacak_sütunlar into aktarılacak_yer


-- ÖRNEK 97:

declare @eklenenler table(
ad varchar(25),
soyad varchar(25),
fiyat money)

insert into kitap output inserted.yazar_adi,inserted.yazar_soyadi,
inserted.fiyat into @eklenenler values (11,'Veri tabanı-2',450,30,250,'ali','can')

insert into kitap output inserted.yazar_adi,inserted.yazar_soyadi,
inserted.fiyat into @eklenenler values (12,'Grafik-2',400,30,250,'veli','gel')

select * from @eklenenler

select * from kitap


-- ÖRNEK 98:

declare @silinenler table(
ad varchar(25),
soyad varchar(25),
fiyat money)

delete from kitap output deleted.yazar_adi,deleted.yazar_soyadi,
deleted.fiyat into @silinenler
where ktp_id>10

select * from @silinenler


::--::--::--:: IF ...ELSE yapısı ::--::--::--::

BEGIN-END

select koşul olacaksa, parantez içinde yazılmalı ve tek sonuç dönmeli

--
IF koşul
koşula bağlı kodlar
ELSE IF koşul
koşula bağlı kodlar
..
ELSE
kodlar


-- ÖRNEK 99:

IF EXISTS (select * from kitap where ktp_id>10)
Print 'Kitap sayısı 10 dan fazladır'
ELSE
select ktp_id,ktp_adi,fiyat from kitap where ktp_id<=10
print 'Kitap sayısı 10 ya da 10 dan azdır'

 

-- ÖRNEK 100:

declare @ktp_sayisi varchar(20)
select @ktp_sayisi=COUNT(*) from kitap

if (@ktp_sayisi<=5)
begin
print 'Kitap sayısı: '+@ktp_sayisi
print 'Kitap sayısı az'
end

else if (@ktp_sayisi>5 and @ktp_sayisi<=10)
begin
print 'Kitap sayısı: '+@ktp_sayisi
print 'Yeni kitaplar gerekli'
end

else
begin
print 'Kitap sayısı: '+@ktp_sayisi
print 'Kitap sayısı yeterli'
end

 

::--::--::--:: CASE ...WHEN-THEN yapısı ::--::--::--::

birden fazla koşul gerektiren durumlarda if-else yerine kullanılır

--1
case kontrol_edilecek_değer
when aldığı_değer1 then sonuç1
when aldığı_değer2 then sonuç2
..
ELSE sonuç_n
end


--2
case
when karşılaştırma1 then sonuç1
when karşılaştırma2 then sonuç2
..
else sonuç_n
end


--ÖRNEK 101:

select * from kitap order by fiyat

select ktp_adi,sayfa_sayisi,fiyat,'GÖRÜŞ'=
case
when fiyat>30 then 'PAHALI'
when fiyat>20 and fiyat<30 then 'NORMAL'
when fiyat>15 and fiyat<=20 then 'UCUZ'
ELSe 'BEDAVA'
end
from kitap


::--::--::--:: VİZE SONU ::--::--::--::


::--::--::--:: WHILE döngüsü BREAK, CONTINUE yapısı ::--::--::--::


Koşul sağlandığı sürece (True değeri sağlandıkça) kod/kodlar çalıştırılır.

While koşul
Begin
kodlar
End


Break: İstenilen işlem basamağında döngüden çıkar
Continue: bulunulan işlem basamağını atlayıp sonraki basamaktan devam eder.

Cast / Convert

select 5+5

select 5+'5'

select '5'+'5'

select 'B'+5


CAST(değer AS yeniveritipi)
CONVERT(yeniveritipi,değer)


--ÖRNEK 102:

--1'den 5'e kadar sayıların karesi

declare @sayac int
SET @sayac=1

while @sayac<=5
begin
Print cast(@sayac as varchar(10))+' karesi: '+
cast(@sayac*@sayac as varchar(10))
SET @sayac=@sayac+1
End


--ÖRNEK 103:
--kitap tablosundaki fiyat ortalamsı 35TL üzeri olana kadar fiyatları %5 artıralım artıralım

select 'ortalama fiyat= '+CAST(avg(fiyat) as varchar(20)) from kitap
while (select avg(fiyat) from kitap)<=35
begin
update kitap set fiyat=fiyat*5/100+fiyat
select ktp_adi,fiyat from kitap
end
select 'yeni fiyat= '+CAST(avg(fiyat) as varchar(20)) from kitap


--ÖRNEK 104:
-- 1'den 10'a kadar sayıların karesi alınsın (8 hariç), 8 olunca döngüden çıksın

declare @sayac int
SET @sayac=1

while @sayac<=10
begin
if @sayac=8
begin
set @sayac=@sayac+1
Break
end

Print cast(@sayac as varchar(10))+' karesi: '+
cast(@sayac*@sayac as varchar(10))
SET @sayac=@sayac+1
End

::--::--::--:: GOTO ::--::--::--::
koşulsuz dallanma için kullanılır

Etiket:
...
..
GOTO etiket

::--::--::--:: RETURN ::--::--::--::
koşulsuz olarak kodların çalışmasını sonlandırır

::--::--::--:: WAITFOR ::--::--::--::

delay: belirlenen zamana kadar kodları çalıştırmayı erteler
time: belirlenen zamanda kodları çalıştırır

 

--ÖRNEKLER 105:

waitfor time '11:51:00' --11.51'de kodlar çalışır
waitfor delay '11:51:00' -- kodlar 11 saat 51dk sonra çalışır


waitfor delay '00:00:20'
select * from kitap


::--::--::--:: STORED PROCEDURE (YORDAMLAR) ::--::--::--::

System Stored Procedure
Extended Stored Pr.
Local Stored Pr.

::--::--::--:: 1- SYSTEM stored procedure ::--::--::--::

sp_ ön eki ile tanımlı olan procedurler


--ÖRNEK 106:

select * from sys.messages

sp_addmessage 50001,16,'Otomatik artan sütun için değer girilmiştir.'


--ÖRNEK 107:

--Önceki örnekte eklenen mesajın güncellenmesi:

sp_addmessage 50001,16,'orgun 1b',@with_log=true,@replace='REPLACE'


--ÖRNEK 108:

sp_addtype sayisal,int,'null'


--ÖRNEK 109:

sp_configure 'user options',11


--ÖRNEK 110:

sp_configure 'remote access',0


--ÖRNEK 111:

sp_addlogin 'deneme5',12345
GO
sp_adduser 'deneme5','dogukan'


::--::--::--:: 3- LOCAL stored procedure ::--::--::--::

çalıştırmak için --> exec / execute
güncelleme için--> alter
silmek için--> drop

 

--ÖRNEK 112:

create procedure listele1
as
select * from kitap where yazar_adi like '%c%'
--
exec listele1


--ÖRNEK 113:

alter procedure listele1
as
select * from kitap where yazar_adi like '%e%' and ktp_id>5
--
exec listele1


--ÖRNEK 114:

drop procedure listele1


--ÖRNEK 115:
set nocount off (--veya on)


--ÖRNEK 116:

create procedure listele2
as
select model,marka from arac a1 inner join kiralama k1 on a1.tarih=k1.tarih
--
exec listele2


::--::--::--:: STORED PROCEDURE'LERDE ÇIKIŞ PARAMETRESİ KULLANMAK ::--::--::--::

Yordamlar istenilen işlemleri yaptıktan sonra elde ettiği sonucu yordamın çağrıldığı yere göndermek
için çıkış parametreleri kullanılır. (Yani yordamdan dönen değer)
Yordamlar geriye değer döndürmek için RETURN ve OUTPUT ifadelerini kullanır.

OUTPUT, yordamdan dönen değeri parametre olarak çağrıldğı yere gönderir. Yordam için yazılan
parametreler ve veri tiplerinden sonra OUTPUT ifadesi kullanılmalıdır. (--Bkz: ÖRNEK 117 ve 118)


--ÖRNEK 117:

create procedure topla(@sayi1 int,@sayi2 int,@sonuc int output)
as
set @sonuc=@sayi1+@sayi2

--test
declare @a int
exec topla 10,9,@a output
print @a


--ÖRNEK 118:

create procedure carpim(@s1 int,@s2 int,@s3 int,@sonuc int output)
as
set @sonuc=@s1*@s2*@s3
print 'Sonuç= '+cast(@sonuc as varchar(5))

--test
declare @a int
exec carpim 3,4,5,@a output


--ÖRNEK 119:

select * from kitap


create procedure kitapbul(@yazar varchar(25))
as
select * from kitap where yazar_adi=@yazar

--test
kitapbul 'ilber'


::--::--::--:: KULLANICI TANIMLI FONKSİYONLAR ::--::--::--::

Standart tanımlı fonksiyonlar--> sum, max, count...

K.T.F lar 1 veya daha fazla değeri (tablo) geri döndürebilir.
Yordamlarda olduğu gibi dışarıdan, birden fazla değer alabilir.

KTFlar view ve procedure lere benzer ama çok farklıdır.

Örneğin view dışarıdan değer almaz ama fonksiyonlar değer alır.
veya
fonksiyon ve procedure değer alır ve geri döndürebilir ama fonksiyonlar SQL ifadeleri
içinde yer alabilirken yordamlar kullanılamaz (istisnaslar var)

 

::--::--::--:: SCALAR-VALUED FUNCTION::--::--::--::
Geriye tek değer döndüren fonksiyonlar (Getdate() gibi)

READONLY: /*fonksyiona gelen değerin fonksiyon içerisinde değiştirilmesini önler.
Yani gelen değerin sadece okunabilir olmasını sağlar. */

RETURNS: --skaler fonksiyondan dönecek değerin veri tipini belirler

WITH ENCRYPTION dönen bilgiyi gizler / WITH SCHEMABINDING tablolardaki yapısal
değişikliği önler


--ÖRNEK 120:

create function buyuk_harf(@gelen varchar(max))
Returns varchar(max)
AS
Begin
Return UPPER(@gelen)
End

--test
select dbo.buyuk_harf(ktp_adi),yazar_adi from kitap


--ÖRNEK 121:

girilen soyada göre kitap adedi

create function top_fiyat(@gelen_soyad varchar(max))
returns int
as
begin
declare @toplam int
select @toplam=SUM(fiyat) from kitap where yazar_soyadi=@gelen_soyad
return @toplam
end

--test-1
select dbo.top_fiyat('Meriç')

--test-2
select dbo.top_fiyat('pala')

 

::--::--::--:: TABLE-VALUED FUNCTIONS ::--::--::--::
Geriye tablo içeriği döndüren fonksyionlar
Bu tür fonksiyonlarda begin-end bloğuna gerek yoktur

ANCAK Multistatement Table-Valued Functions olursa bunlarda begin-end gerekli.
(Çoklu ifade ile tablo sonuçlu fonksiyonlarda geri döndürülecek tablo sonucu
fonksiyon içerisinde düzenlenebilir)


--ÖRNEK 122:
belirtilen sayfa sayısından daha fazla sayfası olan kitapları listele

-- select * from kitap where sayfa_sayisi>250

create function kitap_sayfa(@sayfa int)
returns table
as
return (select * from kitap where sayfa_sayisi>@sayfa)

--test
select ktp_adi from dbo.kitap_sayfa(350)


::--::--::--:: CURSOR (İMLEÇ) KULLANIMI ::--::--::--::
İmleç hangi satırda ise o satırda işlem yapılmasını sağlar.
Yani elde edilen kayıt kümesinde satır satır işlem yaptırır.

SQL serveri aşırı derecede yavaşlattığı için veritabanlarında tavsiye edilmez
Bunlar yerine fonksiyonlar veya procedurler kullanılmalıdır.

T-SQL veri tipi olarak tanımlanmıştır ve SELECT ile birlikte kullanılır.

-- Kullanım Şekli

DECLARE imleç_ismi CURSOR
[forward_only / scroll] -- imleç türleri
[static / keyset / dynamic / fast_forward] -- imleç türleri
[read_only / scroll_locks / optimistic] -- imleç türleri
FOR select ifadesi


OPEN imleç_ismi -- veri kümesinde gezinmek için
fetch next: bir sonraki satıra geçer
fetch prior: bir önceki satıra geçer
fetch last: en son satıra geçer
fetch first: ilk satıra geçer
fetch absolute n: n.satıra geçer
fetch relative n: son gidilen satırdan n satır sonraya geçer
CLOSE --veri kümesinde yapılacak işlemler bitince kapatılır

-- kapatılan imleç hafızadan silinmez. DEALLOCATE ile sil.


::--::--::--:: TRIGGER (TETİKLEYİCİ) KULLANIMI ::--::--::--::

Bir işlem gerçekleştiğinde başka bir işlemin yapılması istendiğinde kullanılır.
insert, update, delete için olur ama select tabloda değişiklik yapmadığı için olmaz

Tetikleyici ve gerçekleşen işlem transaction olarak kabul görür. İşlemi reddetmek yani
geri almak için ROLLBACK kullanılır. İşlemi onaylamak için bir şey yapmaya gerek yoktur.

--3 tür trigger var:
1-DDL tetikleyiciler
2-DML tetikleyiciler
3-Logon tetikleyiciler (SQL Server 2005 SP2 ile kullanılabilir)

 

::--::--::--:: DDL TRIGGERS ::--::--::--::

Create trigger triggerismi
ON (ALL SERVER / DATABASE)
[WITH ENCRYPTION]
(FOR / AFTER)
(create / alter / drop/grant/deny/revoke)
AS
(sql ifade)

-- FOR sonrası ifade _ (alt çizgi) ile yazılır
create_table / alter_table / drop_function / create_funtion


--ÖRNEK 123:

create trigger silme_engeli
ON DATABASE
FOR DROP_TABLE
AS
BEGIN
Print 'Tablo silme işlemi yasaktır'
END

--test
drop table urunler

 

--ÖRNEK 124:

create trigger silme_ikaz
on database
for drop_table,alter_table
AS
BEGIN
declare @mesaj Varchar(max)
Set @mesaj='araba1x veritabanın elden gidiğğğ' +
select EVENTDATA().value('(/event_instance/tsqlcommand/commandtext)[1]','nvarchar(max)')
exec xp_sendmail This email address is being protected from spambots. You need JavaScript enabled to view it.',@mesaj
end

-- SQL mailin (database mailin) kurulu olması gerek


--ÖRNEK 125:

create trigger db_engeli
on all server
for create_database
as
print 'Veritabanı oluşturmaya izin verilmiyor'
ROLLBACK
GO


--test
create database denedene


::--::--::--:: DML TRIGGERS ::--::--::--::
Tablo ya da view üzerinde insert,update,delete işlemleri gerçekleşince
devreye girerler. AFTER (FOR) ya da INSTEAD OF türünde olabilirler.

AFTER Tetikleyiciler: ilgili işlem gerçekleştikten sonra devreye girer.
insert,update,delete sonrası işlemler için oluşturulabilir.
SADECE tablolar için tanımlanabilirler.

INSTEAD OF Tetikleyiciler: belirlenen işlem gerçekleşeceği sırada
devreye girerler. Mesela yeni kayıt eklerken girilen bilginin kontrolü...

DML tetikleyiciler gerçekleşen işlemleri kontrol etmek için inserted/deleted
geçici tablolarını kullanır. Tablodaki etkilenen sütunlarla aynı bilgilere
sahiptirler.


--Kullanım Şekli:
create trigger trigger_ismi
on (table/view)
[with encryption]
(for / after / instead of)
(insert / update / delete)
AS (sql ifadesi)

--NOT:
Tetikleyici içerisinde alter database, create database, drop database,
disk resize, load database, load log, restore database, restore log
ifadeleri kullanılamaz


--ÖRNEK 126:
create trigger kontrol
on kitap
for insert
as
declare @kitap_adi varchar(255)
select @kitap_adi=ktp_adi from inserted
if exists(select * from kitap where ktp_adi=@kitap_adi)
begin
print 'Aynı isimde kitap var zaten'
rollback
end

--test
select * from kitap
insert into kitap values (15,'Şah ve Sultan',200,20,20,'cemil','meriç')

 

::--::--::--:: Tetikleyiciler Hakkında Bilgi Alma ::--::--::--::
Bu iş için çeşitli system procedurleri var:

sp_helptext: tetikleyicinin içeriğini gösterir
(with_encryption kullanılmamışsa)

 

--ÖRNEK 127:
sp_helptext kontrol

sp_helptrigger: tablo üzerinde tanımlı tetikleyicileri gösterir

 

--ÖRNEK 128:
sp_helptrigger kitap

sp_depends: tetikleyicinin etkilediği sütun ve tablo bilgilerini verir

 

--ÖRNEK 129:
sp_depends kontrol

 

::--::--::--:: INSERT Tetikleyiciler ::--::--::--::

--ÖRNEK 130:
Bir alşveriş sitesinin veritabanındaki URUNLER tablosu verilmiştir.
Ayrıca müşterilerin almış olduğu ürünler
SATISLAR (urun_kodu,miktar,musteri,tarih) tablosunda ve
firmanın aldığı ürünler ALIMLAR (urun_kodu,miktar, cari,tarih)
tablosunda tutulmaktadır.

Ürün satışı olunca satılan ürün miktarı URUNLER tablosunun toplam
miktarından düşülmeli, alım yapıldığında alım miktarı URUNLER
tablosunun miktarına eklenmelidir. Ayrıca satışı yapılan miktar
ürün miktarından fazla ise satışa izin vermeyecek tetikleyici oluştur.

 

create table urunler(
urun_kodu int identity(1,1) primary key,
urun_adi nvarchar(50),
fiyat money,miktar bigint)

create table satislar(
urun_kodu int, miktar bigint,
musteri nvarchar(50),tarih smalldatetime)

create table alimlar(
urun_kodu int,miktar bigint,
cari nvarchar(50), tarih smalldatetime)

--
insert into urunler values ('A',15,150)
insert into urunler values ('B',50,80)
insert into urunler values ('C',25,125)

--ALIMLAR tablosu için trigger

create trigger stok_kontrol
on alimlar
after insert
as
declare @a_miktar bigint
declare @u_kod int
select @a_miktar=miktar,@u_kod=urun_kodu from inserted
update urunler set miktar=miktar+@a_miktar
where urun_kodu=@u_kod

--test

insert into alimlar values (1,5,'C1','01.01.2021')
go
select * from urunler
go

--SATIŞLAR tablosu için trigger
create trigger stok_kontrol_satis
on satislar
after insert
as
declare @satis_miktar bigint
declare @stok_miktar bigint
declare @u_kod int

select @satis_miktar=miktar, @u_kod=urun_kodu from inserted
select @stok_miktar=miktar from urunler where urun_kodu=@u_kod

if (@satis_miktar>@stok_miktar)
begin
print 'Yetersiz stok miktarı'
rollback
end
else
update urunler set miktar=miktar-@satis_miktar where urun_kodu=@u_kod

--test1:

insert into satislar values (2,10,'M1','01.01.2021')
go
select * from urunler
go

--test2:
insert into satislar values (2,75,'M1','01.01.2021')
go
select * from alimlar urunler
go


::--::--::--:: DELETE Tetikleyiciler ::--::--::--::
Bir tablodan satır silinince devreye girerler. Silinen satırlar DELETED
geçici tablosunda tutulduğu için kontroller bu tablo üzerinden yapılır.
TRUNCATE ile silinenler bu tabloya yansımayacağı için ROLLBACK kullanılır.

ON DELETE CASCADE kulanılmışsa bu tetikleyiciye gerek yok.

Tablolar arası referans ilişki varsa çalışmaz. Önce referans ilişkiler kaldırılmalı.

--ÖRNEK 131:
URUNLER tablosunda tanımlı urun_kodu bilgisi
ALIMLAR ve SATIŞLAR tablolarında da kullanılmaktadır.

URUNLER tablosundan silinen ürünün ürün kodunu bularak
diğer tablolarda da silen tetikleciyi yazın.


create trigger urun_kodu_sil
on urunler
after delete
as
declare @urun_kod int
if @@ROWCOUNT>0
begin
select @urun_kod=urun_kodu from deleted
delete from alimlar where urun_kodu=@urun_kod
delete from satislar where urun_kodu=@urun_kod
end

-- test
select * from urunler
select * from alimlar
select * from satislar

delete from urunler where urun_kodu=1

 

::--::--::--:: UPDATE Tetikleyiciler ::--::--::--::

Bir tablonun içerdiği satırlar üzerinde değişiklik yapıldığında
devreye girmektedir. Update işlemi için hem INSERTED hem de
DELETED geçici tabloları kullanılır. Güncellenen satırın eski
durumu DELETED tablosunda, yeni durumu INSERTED tablosunda yer alır.

Update tetikleyiciler özellikle birbiriyle ilişkili tablolardaki
güncellemelerde kullanılır.

Update tetikleyici herhangi bir sütunda güncelleme yapıldığında
devreye girmektedir. Eğer BELİRLİ SÜTUNLARDA yapılan güncellemeler
için işlem yapılması isteniyorsa IF UPDATE(sütun_ismi) kullanılır.

--ÖRNEK 132:
/*KİTAPLAR talosundaki ISBN bilgisi değiştirildiğinde ilişkili olduğu
tablolarda da ISBN bilgisini değiştirecek tetikleyicinin yazılması.*/

Create Trigger ISBN_guncelle
ON Kitaplar
After Update
AS
Declare @eski_ISBN varchar(255)
declare @yeni_ISBN varchar(255)
IF @@ROWCOUNT>0
begin
select @eski_ISBN=ISBN from deleted
select @yeni_ISBN=ISBN from inserted
update kategori set ISBN=@yeni_ISBN where ISBN=@eski_ISBN
update yazarlar set ISBN=@yeni_ISBN where ISBN=@eski_ISBN
end

/*Yazılan trigger kitaplar tablosunda yapılan tüm güncellemeler
için çalışacaktır. Sadece ISBN bilgisinin güncelleştirmesinde
tetikleme yapmak için IF UPDATE (ISBN) ifade kullanılmalı.*/

Create Trigger ISBN_guncelle
ON Kitaplar
After Update
AS
Declare @eski_ISBN varchar(255)
declare @yeni_ISBN varchar(255)
IF @@ROWCOUNT>0
begin
IF UPDATE(ISBN)-- ilave satır
BEGIN --ilave satır
select @eski_ISBN=ISBN from deleted
select @yeni_ISBN=ISBN from inserted
update kategori set ISBN=@yeni_ISBN where ISBN=@eski_ISBN
update yazarlar set ISBN=@yeni_ISBN where ISBN=@eski_ISBN
END --ilave satır
end


::--::--::--:: INSTEAD OF Tetikleyiciler ::--::--::--::

Bu tetikleyiciler insert,delete ve UPDATE işlemleri tabloya
yansıtılmadan önce ve constraint ifadeler devreye girmeden
önce tetiklenir. Ama tablo üzerinde yapılan değişiklikler
INSERTED ve DELETED geçici tablolarına yansır. Tablodaki
değişiklik öncesi yapılacak işlemler için kullanılır.

AFTEr tetikleyicilerde olduğu gibi CASCADE UPDATE / DELETE
türü ilişkiler varsa tetikleyiciler çalışmaz.


::--::--::--:: Tetikleyicinin Düzenlenmesi ::--::--::--::

--ÖRNEK 133: (BKZ: ÖRNEK 125)
--db_engeli isimli tetikleyicinin güncellenmesi/düzenlenmesi

alter trigger db_engeli
on all server
for create_database
as
print 'Veritabanı oluşturmak yasaktır'
ROLLBACK
GO

-- SP_RENAME: sql server üzerinde tanımlı nesnelerin adını
değiştirmek için kullanılan procedure, tetikleyici ismi
değiştirmek için de kullanılır.

--ÖRNEK 134:
--kontrol isimli tetikleyicinin kontrol_var olarak değiştirilmesi

exec sp_rename kontrol,kontrol_var


::--::--::--:: Tetikleyicinin Silinmesi ::--::--::--::

--ÖRNEK 135:
--kontrol isimli tetikleyicinin silinmesi

drop trigger kontrol


--ÖRNEK 136:
-- aktif veritabanındaki silme_engeli isimli tetikleyicinin silinmesi

drop trigger silme_engeli ON DATABASE


--ÖRNEK 137:
--sql sunucudaki db_engeli isimli tetikleyicinin silinmesi

drop trigger db_engeli ON ALL SERVER


::--::--::--:: Tetikleyicinin Pasifleştirilmesi / Aktifleştirilmesi ::--::--::--::

--ÖRNEK 138:
--kitap tablosundaki tüm tetikleyicilerin pasifleştirilmesi
alter table kitap
disable trigger all

--ÖRNEK 139:
--kitap tablosundaki kontrol isimli tetikleyicinin pasifleştirilmesi

alter table kitap
disable trigger kontrol

--ÖRNEK 140:
--kitap tablosundaki kontrol isimli tetikleyicinin aktifleştirilmesi

alter table kitap
enable trigger kontrol

TAGS: 'sql komutları','sql örnekleri','t-sql komutları','t-sql örnekleri', 'dml komutları', 'dcl komutları','data defination language', 'data maniplation language', 'data control language', 'select örnekleri', 'sql select komutu', 'sql create komutu', 'sql alter komutu', 'sql drop komutu', 'sql insert komutu','sql update komutu', 'sql delete komutu', 'sql revoke komutu', 'sql grant komutu', 'sql deny komutu', 'sql açıklama satırı', 'sql store procedure', 'sql triggers', 'sql yordamlar', 'sql tetikleyiciler', 'sql functions', 'sql fonksiyonlar', 'sql if-else yapısı', 'sql when-then yapısı'