Veri Tabanı Dersi SQL/TSQL Komutları

Değerli öğrencilerim merhaba. Veri tabanı dersinde yazdığımız örneklerin tamamını burada paylaşıyorum. Kendi notlarınızla karşılaştırır, defterlerinize yazdığınız notlarda hatalar varsa aşağıdaki örneklere bakarak gerekli düzenlemeleri yaparsınız.

Öğrenciliğin doğası gereği derse gelip, örnekleri yapıp, örneklerin üzerine kendi ifadelerinizle notlar almış olmalısınız. Yazılan ifadelerin ne işe yaradığını, gerekli açıklamaları kendiniz yazmış olmalısınız. Yine de yazdığım bu örneklerin üzerine müsait oldukça daha ayrıntılı açıklamalar yazmaya çalışacağım.  Hepinize başarılar dilerim...  

          ::--::--:: SQL: Structured Query Language ::--::--::
SQL (Structured Query Language), veritabanlarına erişmek ve yönetmek için kullanılan yapısal sorgulama dilidir. SQL, verilerin depolanması, güncellenmesi, silinmesi ve sorgulanması gibi birçok işlemi gerçekleştirmek için kullanılabilir.

SQL, ilişkisel veritabanları için özel olarak tasarlanmıştır ve verilerin düzenli bir şekilde depolanmasına, organize edilmesine ve aranmasına yardımcı olur. SQL, önceden tanımlanmış bir dizi komut (SELECT, INSERT, UPDATE, DELETE vb.) kullanarak veritabanlarına erişir.

SQL, hem büyük ölçekli işletmelerin hem de küçük işletmelerin kullanabileceği bir teknolojidir. Birçok programlama dili ve veritabanı sistemi, SQLi desteklemektedir. SQL, kullanımı kolay, öğrenmesi kolay ve çok yönlü bir programlama dilidir ve birçok veritabanı yönetim sisteminin temelini oluşturur.


         ::--::--:: T-SQL ::--::--::
T-SQL (Transact-SQL), Microsoft SQL Server veritabanı yönetim sistemi tarafından kullanılan bir sorgu dili ve programlama dili olarak hizmet verir. T-SQL, SQL standartlarına ek olarak, 
programlama özellikleri sağlar.

T-SQL, birçok özellik sunar, örneğin:

* Veritabanı işlemlerini gerçekleştirmek için SQL sorguları kullanır
* Prosedürler, fonksiyonlar, tetikleyiciler, saklama prosedürleri ve diğer programlama nesneleri ile yapılandırılmış programlama sağlar
* Değişkenler, koşullu ifadeler, döngüler ve diğer kontrol yapıları sağlar
* Dizinleme, tablo ve dizeler gibi bir dizi veri türü sağlar
* T-SQL sorguları, veritabanı yönetim sistemi tarafından kullanılan özel bir yöntemle optimize edilebilir, bu nedenle yüksek performans elde edilir.
* T-SQL, Microsoft SQL Server veritabanı yönetim sistemi ile birlikte kullanıldığında, veritabanı işlemlerini gerçekleştirmek için güçlü bir araçtır. Aynı zamanda, T-SQL ile yazılan uygulamalar, yüksek performans ve güvenilirlik ile karakterizedir.

      ::--::--:: PL/SQL - Oracle tarafından geliştirilmiştir. ::--::--::
PL/SQL (Procedural Language/Structured Query Language), Oracle veritabanı yönetim sistemi tarafından kullanılan bir programlama dilidir. PL/SQL, Oracle veritabanı yönetim sistemi ile birlikte kullanıldığında, veritabanı işlemlerinin gerçekleştirilmesi için yüksek düzeyde özelleştirilmiş bir programlama dilidir.


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 */

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

::--::--:: SQL Server Veri Tipleri ::--::--::
bit:   0 ve 1 verisini tutmak için... true/false  (cinsiyet, medeni durum..)

binary:  (ikilik sistem). 8000byte a kadar binary veri alabilir.

varbinary 

char(n): alfanümerik veriler için... 

-- ÖRNEK: ad char(15)

varchar(n): alfanümerik veriler için... 


-- ÖRNEK: ad varchar(15)

nvarchar(n) : alfanümerik veriler için... 

datetime:  1753 - 9999 

smalldatetime:  1900 - 2079

image:  resim, sunu, excel dosyalarını ikili formatta saklayabildiğimiz...

int:   -2milyar küsur ile +2milyar arası tam sayıları tutar 

tinyint:  0 - 255 arası tam sayıları tutar 

bigint:  oldukça büyük bir tam sayı aralığı girişi iiçin kullanılır. 

uniqe-identifier: 16byte uzunluğunda hexadecimal (16lık sayı tabanı)

text:  çok uzun alfanümerik değerler için... 2GB

float(n):  ondalık sayılar için....

money / smallmoney  

decimal: 38 basamağa kadar tam sayı için.... virgüllü sayıları da tutar


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

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

create database veritabanı_adı
ON
Primary (Name=dosya_adı,
filename=fiziki_dosya_adı,  -- .mdf dosya 
size=dosya_boyutu,  --default 2MB
maxsize=maksimum_dosya_boyutu,
filegrowth=dosya_artış_miktarı) -- default 1MB
LOG ON 
(Name=dosya_adı,
filename=fiziki_dosya,   --.ldf dosya
size=dosya_boyutu,
maxsize=maks_dos_boyutu,
filegrowth=dos_art_miktarı)

--ÖRNEK 1:
create database deneme2

--ÖRNEK 2:
create database okul2
on
(name='okul2_dat',
filename='d:\okuldat2.mdf',
size=10,
maxsize=50MB,
filegrowth=5)
LOG ON
(name=okul2_log,
filename='d:\okullog2.ldf',
size=5MB,
maxsize=25MB,
filegrowth=5MB)

::--::--:: Create Table ::--::--::

create table tablo_adi(
sütun1 veritipi1,
sütun2 veritipi2,
...
sütunN veritipiN) 

--ÖRNEK 3:

use deneme2 -- tek sefere mahsus

create table personel(
pers_id int not null,
adi varchar(25),
soyadi varchar(30))


--ÖRNEK 4:

create table ogrenci(
ogr_no int NOT NULL Primary Key,
ad_soyad varchar(25),
yas tinyint)


--ÖRNEK 5:

create table personel2(
pers_id int,
ad_soyad varchar(50),
sehir varchar(15),
unique(pers_id))

--ÖRNEK 6:
create table ogrenci2(
ogr_no int identity(1,3) not null,  --SEED (1)  -- increment(3)
adi varchar(25),
soyadi varchar(30),
bolum nchar(50) DEFAULT 'Bilgisayar')

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

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

--ÖRNEK 9:
create table odeme(
id int,
bursiyer varchar(50),
burs int,
constraint chkburs CHECK (burs>=0 and burs<=3000))

--IN, NOT IN, LIKE Kullanımı
IN ifadesi yerine OR,
NOT IN ifadesi yerine AND

LIKE
% (yüzde işareti)  birden fazla karakteri ifade eder/gösterir.
_ (alt çizgi)  bir tek karakteri ifade eder.
[HARF] herhangi bir karakteri (kendisini ifade eder)
[^HARF] kendisi dışında (köşeli parantez içinde yazılanın haricinde)
[A-Z]   A ile Z arasında bir karakteri gösterir

--ÖRNEKLER 10:
ÖRN:  LIKE '%T%'   --> içinde T olanlar/geçenler
ÖRN: LIKE '_G%'  --> ikinci karakteri G olanlar
ÖRN: LIKE '_ _ N'  --> üç farfli son harfi N
ÖRN: LIKE '[SA]%'  -->ilk harfi/karakteri S veya A olanlar
ÖRN: LIKE '%[B-K]'   --> son karakteri B ile K arasında olan
ÖRN: LIKE '[2-8][4-7]'  --> ilk hanesi 2-8, ikinci hanesi 4-7 arasında
ÖRN: LIKE '[^B-N][^MOZ][A-K]'  -->   ilk karakteri B-N arasında olmayan,
ikinci karalteri M,O veya Z olmayan, üçüncü karalteri A-K arasında olan

--ÖRNEK 11:
use deneme2

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

ürün kodu : a089, a090, a011, a111 veya A900-A999

--ÖRNEK 12:
create table musteri(
mkod int not null Primary Key,
Mad varchar(50) not null,
msoyad varchar(50),
madres varchar(255),
mtel varchar(11),
mail varchar(100))

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

create table kiralama(
mkod int not null,
aracno int not null,
tarih smalldatetime,
constraint fk_mkod FOREIGN KEY (mkod) REFERENCES musteri (mkod),
constraint fk_aracno FOREIGN KEY (aracno) REFERENCES arac(aracno),
constraint pk_key PRIMARY KEY (mkod,aracno))

/* referans tabloda satır silindiğinde diğer tablolardan da silinmesi veya refereans 
tabloda veriler güncellendiğinde diğer tablolarda da güncellenmesi için:
ON DELETE CASCADE, ON UPDATE CASCADE */

--ÖRNEK 13:

create table ...
..
..
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))

::--::--:: ALTER ile veritabanı nesnelerinin özelliklerini değiştirme ::--::--::
- Tabloya sonradan sütun eklemek:

Alter table tabloadı ADD sütunadı özellik

--ÖRNEK 14:

ALTER TABLE kiralama ADD testtarihi smalldatetime not null

-- Tabloda istenen üstünu silmek için:
ALTER TABLE tabloadı DROP COLUMN sütunadı

--ÖRNEK 15:
alter table kiralama DROP COLUMN testtarihi

-- Tabloda sütun özelliklerini değiştirmek için:
ALTER TABLE tabloadı ALTER COLUMN sütunadı özellikleri

--Ö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:

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 DB veya tablo silme ::--::--::

Alter drop: db nesnelerinin özelliklerini silmek için...
drop : db nesnesi (tabloları veya db) silmek için...
Truncate - en garantili kayıt silme için
Delete

--ÖRNEK 19:
drop table gecici

--ÖRNEK 20:
drop database xyz   --xyz isimli db'yi siler

DML (Veri işleme dili)
Select - insert - update - delete

::--::--:: SELECT ile listeleme işlemleri ::--::--:: (Devamı ilerideki kısımlarda)

select sütunadı veya * from tabloadı where koşul

--ÖRNEK 21:
select * from personel


::--::--:: INSERT ile veri girişi ::--::--::
INSERT INTO tabloadı VALUES (değer1,değer2,değer3....) 

INSERT INTO tabloadı(sütun1,sütun3,sütunx..) VALUES (değer1,değer3,değerx...)

--ÖRNEK 22:
create table personel(
pers_id int not null,
ad varchar(25),
soyad varchar(50),
sehir varchar(20),
mail varchar(100),
maas int check (maas>0))

insert into personel values (1,'ali','can','van',Bu e-Posta adresi istenmeyen posta engelleyicileri tarafından korunuyor. Görüntülemek için JavaScript etkinleştirilmelidir.',25000)

--ÖRNEK 23:
insert into personel(pers_id,ad,mail) values (3,'ahmet',Bu e-Posta adresi istenmeyen posta engelleyicileri tarafından korunuyor. Görüntülemek için JavaScript etkinleştirilmelidir.')

select * from personel

--ÖRNEK 24: herkes istediği bir sütun NULL olacak şekilde kendi bilgilerini girsin.

insert into personel (pers_id, ad, soyad, mail, maas) 
VALUES (2,'Mehmet','Başaran',Bu e-Posta adresi istenmeyen posta engelleyicileri tarafından korunuyor. Görüntülemek için JavaScript etkinleştirilmelidir.', 50000)

insert into personel(pers_id,ad,soyad,mail)values(4,'utku','bolat',Bu e-Posta adresi istenmeyen posta engelleyicileri tarafından korunuyor. Görüntülemek için JavaScript etkinleştirilmelidir.')

insert into personel(pers_id,ad,mail,maas) values (4,'ibrahim',Bu e-Posta adresi istenmeyen posta engelleyicileri tarafından korunuyor. Görüntülemek için JavaScript etkinleştirilmelidir.',100000)

::--::--:: UPDATE ile veri güncelleme ::--::--::
UPDATE tabloadı set sütun1=değer1, sütun2=değer2, sütunx=değerx... where koşul

--ÖRNEK 25:
select * from personel

update personel set sehir='Bingöl' where pers_id=3

--ÖRNEK 26:
update personel set ad='Hakkı',soyad='Bulut' where maas>50000


--ÖRNEK 27:
update personel set maas=99999 where maas is null

--ÖRNEK 28:  Bu e-Posta adresi istenmeyen posta engelleyicileri tarafından korunuyor. Görüntülemek için JavaScript etkinleştirilmelidir. 
update personel set mail=Bu e-Posta adresi istenmeyen posta engelleyicileri tarafından korunuyor. Görüntülemek için JavaScript etkinleştirilmelidir.'  where pers_id>4 OR not mail like '%@%'

--ÖRNEK 29: 
update personel set sehir='Afyonkarahisar' where (maas>10000 and maas<50000) or soyad like '%n'

::--::--:: DELETE ve TRUNCATE ile veri silme işlemi ::--::--::
DELETE from tabloadı where koşul

--ÖRNEK 30:
delete from personel where ad  like 'c%'
select * from personel

--ÖRNEK 31:
delete from xyz  --xyz isimli tablodaki tüm veriler silinir

----TRUNCATE de veri silmek için kullanılır. Ancak daha temiz bir silme yapar.
truncate table xyz  


::--::--::--:: 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

::--::--:: 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

 

::--::--:: SELECT ile listeleme işlemleri ::--::--::

--ÖRNEK 32:
select * from kargo

--ÖRNEK 33:
select gon_ad,TC from kargo

--ÖRNEK 34:
select  *  from kargo where s_no>=4

--ÖRNEK 35:
select ucret from kargo where ucret>40 and ucret<85

--ÖRNEK 36:
select gon_ad,gon_soyad from kargo where gon_sube='izmir'

veya

select gon_ad,gon_soyad from kargo where gon_sube like 'izmir'

--ÖRNEK 37:
select *  from kargo where var_sube!='şırnak'

veya

select * from kargo where var_sube not like 'şırnak'

veya

select *  from kargo where not var_sube like 'şırnak'

veya

select * from kargo where var_sube<>'ŞıRNak'

--ÖRNEK 38:
select tc from Kargo where gon_sube='izmir' or gon_sube='trabzon'

veya

select tc from kargo where gon_sube IN  ('izmir','trabzon')

--ÖRNEK 39:
select gon_ad,gon_soyad from kargo where ucret<80 or gon_ad is NULL

--ÖRNEK 40:   adı üç harfli ikinci harf L VEYA soyadı G ile bitenler
select * from kargo where gon_ad like '_l_' or gon_soyad like '%g'

--ÖRNEK 41:
select tc,ucret from kargo where tc like '6%5' 


--ÖRNEK 42:

select orderID, shipname from orders


--ÖRNEK 43:

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


--ÖRNEK 44:

select * from customers where city LIKE 'London'

SELECT * FROM Customers WHERE city='London'


--ÖRNEK 45:

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


--ÖRNEK 46:

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


--ÖRNEK 47:

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


--ÖRNEK 48:

select * from customers where customerId LIKE 'N_R%' 


--ÖRNEK 49:

select * from customers where country='Germany' OR country='Italy'
 
 
::--::--::--:: distinct: tekrarlı satırları önlemek ::--::--::--::

--ÖRNEK 50:

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 51:

select * from musteri order by myasi


--ÖRNEK 52:

select * from musteri order by 3 DESC


--ÖRNEK 53:

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


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

--ÖRNEK 54:

select * from musteri order by myasi,madres DESC


--ÖRNEK 55:

select * from customers order by country ASC,contactname DESC


--ÖRNEK 56:

select * from customers order by 9 ASC,3 DESC


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

--ÖRNEK 57:

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

veya

--ÖRNEK 58:

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


--ÖRNEK 59:

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


--ÖRNEK 60:

alter table musteri alter column myasi float

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


--ÖRNEK 61:

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


--ÖRNEK 62:

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


--ÖRNEK 63:

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


--ÖRNEK 64:

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


--ÖRNEK 65:

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

veya

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


--ÖRNEKLER 66:
 
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 67:

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


--ÖRNEK 68:

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


--ÖRNEK 69:

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


--ÖRNEK 70:

select UPPER (sevk_adresi) from urunler2


--ÖRNEK 71:

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


--ÖRNEK 72:

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


--ÖRNEK 73:

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


--ÖRNEK 74:

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


--ÖRNEK 75:

select ABS(-0.45) as mutlak from urunler2

 

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


--ÖRNEK 77:

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


--ÖRNEK 78:

select SQRT(64)


--ÖRNEK 79:

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


--ÖRNEK 80:

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


--ÖRNEK 81:

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 82:

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


--ÖRNEK 83:

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


--ÖRNEK 84: 

select MAX(islem_tarihi) from urunler2


--ÖRNEK 85:

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


--ÖRNEK 86:

select COUNT(distinct sevk_adresi) from urunler2


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

SQL TRANSACTION yapıları, bir dizi işlemi bir arada çalıştırarak, bu işlemlerin bütünlüğünü ve tutarlılığını sağlar. Bir TRANSACTION, bir veya birden fazla SQL sorgusundan oluşur ve bu sorguları içeren bir mantıksal işlem birimidir.
TRANSACTION başlatıldıktan sonra, tüm işlemler bir arada çalıştırılır ve bu işlemlerden herhangi birinde hata oluşursa, TRANSACTION geri alınarak tüm işlemler önceki durumuna geri döndürülür. Bu, veritabanında tutarlılığı korur ve herhangi bir veri kaybını veya bütünlük ihlalini önler. Ayrıca, TRANSACTION yapıları, birden fazla kullanıcının aynı veriler üzerinde çalıştığı durumlarda, bir kullanıcının yaptığı değişikliklerin diğer kullanıcıların verilerini etkilemesini önler.

Özetle, TRANSACTION yapıları, veritabanındaki işlemleri atomik, tutarlı, izole edilmiş ve dayanıklı (ACID) şekilde yürütmek için kullanılır.


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

-- transaction_log: 
Bir SQL veritabanında yapılan tüm işlemlerin kaydedildiği bir dosyadır. Bu dosya, veritabanı yönetim sistemleri tarafından kullanılır ve veritabanındaki herhangi bir değişikliği kaydetmek için kullanılır. Transaction log, veritabanında yapılan tüm değişikliklerin bir kaydını tutar. Bu değişiklikler, veri ekleme, güncelleme, silme veya başka bir işlem olabilir. Transaction log aynı zamanda, veritabanındaki işlemleri geri alma veya geri yükleme işlemlerinde de kullanılır. Transaction log, veritabanı yöneticilerine, veritabanındaki herhangi bir değişikliği takip etme ve geri alma olanağı sağlar. Ayrıca, veritabanındaki işlemlerin güvenliğini arttırır ve veri kaybını önlemeye yardımcı olur. Özetle, transaction log, bir veritabanında yapılan tüm işlemlerin kaydedildiği bir dosyadır ve veritabanı yöneticilerine, veritabanındaki işlemleri takip etme ve geri alma olanağı sağlar. 

-- COMMIT: 
COMMIT, bir TRANSACTION bloğu içinde yapılan değişiklikleri veritabanına kalıcı olarak kaydetmek için kullanılan bir SQL komutudur. Bir TRANSACTION bloğu, bir veya birden fazla SQL sorgusundan oluşur ve bu sorguları içeren bir mantıksal işlem birimidir. Bu blok, veritabanında yapılan değişiklikleri geçici olarak saklar ve işlemlerin tutarlılığını korumak için kullanılır. COMMIT komutu, TRANSACTION bloğunda yapılan değişiklikleri veritabanına kalıcı olarak kaydeder. Yani, bir TRANSACTION bloğu içinde yapılan değişiklikler, COMMIT komutu çalıştırılmadan önce veritabanında kalıcı olarak kaydedilmezler.
COMMIT komutu ayrıca, TRANSACTION bloğunun sona erdiğini ve yapılan değişikliklerin kalıcı olarak kaydedilebileceğini belirtir. Böylece, COMMIT komutu işlemin tamamlanmasını sağlar ve veri tabanındaki verilerin bütünlüğünü korur.

-- ROLLBACK:
ROLLBACK, bir TRANSACTION bloğu içinde yapılan değişiklikleri geri almak için kullanılan bir SQL komutudur. ROLLBACK komutu, TRANSACTION bloğunda yapılan değişiklikleri geri alır ve veritabanındaki verileri TRANSACTION bloğunun başlangıcındaki duruma geri getirir. Yani, bir TRANSACTION bloğu içinde yapılan değişiklikler, ROLLBACK komutu çalıştırıldığında geri alınır ve veritabanındaki veriler önceki durumuna döndürülür.

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

commit/rollback transaction nokta_ismi

--ÖRNEK 87 :
use Northwind

Begin transaction
update Orders set ShipAddress='Gültepe' where ShipCountry='France'
update orders set ShipCity='İzmir' where ShipAddress='Gültepe'
select * from Orders where ShipCity='İzmir'
Rollback
select *  from orders

--ÖRNEK 88 :
Begin transaction
    save transaction nokta1
update Orders set ShipAddress='Gültepe' where ShipCountry='France'
update orders set ShipCity='İzmir' where ShipAddress='Gültepe'
select * from Orders where ShipCity='İzmir'
    rollback transaction nokta1
UPDATE Orders SET ShipCity ='Manisa' WHERE ShipCity = 'Reims'
select * from Orders
    rollback

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

DECLARE komutu, T-SQL de değişken tanımlamak için kullanılan bir komuttur.Bu komut ile değişkenlerin türü, adı ve varsayılan değeri belirtilir. DECLARE komutu aynı zamanda bir dizi değişkeni tanımlamak için de kullanılabilir.

* DECLARE @degisken_adi veri_tipi
* Yerel değişkenin önüne @ işareti gelir.
* Değişkene değer atamak için SET ya da SELECT kullanılır.
 set/select @degisken=atanan_değer
 
 declare @sayi int
 
 declare @karakter varchar(15)
 
 declare @sayi int,@karakter varchar(15)

--ÖRNEK 89 :
declare @sayi1 int, @sayi2 int, @toplam int
set @sayi1=35
set @sayi2=75
set @toplam=@sayi1+@sayi2
select @toplam as 'Toplam'

--ÖRNEK 90 :
declare @pahali money
select @pahali=max(Freight) from Orders
select @pahali as 'En yüksek fiyat'

::--::--::--:: Sistem Fonksiyonları ::--::--::--::
T-SQLde sistem fonksiyonları, veritabanı yönetimi ve sorgulama işlemleri için kullanılan önceden tanımlanmış işlevlerdir. Bu fonksiyonlar, SQL Server tarafından sağlanır ve sorgulama veya saklanmış prosedürler gibi farklı T-SQL kodları içinde kullanılabilir. T-SQLde sistem fonksiyonları, farklı kategorilere ayrılır ve her bir kategori farklı bir görevi yerine getirir. 
Bazı sistem fonksiyonu kategorileri şunlardır:

Dizgi Fonksiyonları: Metin işleme işlemleri için kullanılan fonksiyonlar.
Matematiksel Fonksiyonlar: Matematiksel işlemler için kullanılan fonksiyonlar.
Tarih ve Saat Fonksiyonları: Tarih ve saat işlemleri için kullanılan fonksiyonlar.
Dönüştürme Fonksiyonları: Veri türü dönüştürme işlemleri için kullanılan fonksiyonlar.
İfadeler ve Yönergeler: SQL Server hakkında bilgi sağlayan fonksiyonlar.
Sistem fonksiyonları, veritabanı yönetimi işlemleri için de kullanılabilir. Örneğin, OBJECT_ID() fonksiyonu, 
bir nesne adı belirtildiğinde ilgili nesnenin IDsini döndürür. DB_NAME() fonksiyonu, geçerli veritabanının 
adını döndürür. DATABASEPROPERTYEX() fonksiyonu, veritabanı özellikleri hakkında bilgi sağlar.

Sistem fonksiyonları, T-SQL kodunu daha okunaklı ve daha kolay anlaşılır hale getirir. Ayrıca, sorgu ve 
saklanmış prosedürlerde değişkenler veya parametreler gibi farklı T-SQL yapılarıyla birlikte kullanılabilirler.
Sistem fonksiyonlarının başına @@ işareti gelir. Tüm kullanıcılar için geçerli olan fonksiyonlardır.
Sql server hakkında tanımlanmış ve bilgi almak için kullanılan fonksiyonlar.

@@ERROR : T-SQLde kullanılan bir sistem değişkenidir ve son yürütülen SQL ifadesinde oluşan hata kodunu içerir. Bu değişken, bir SQL ifadesi işlendiğinde, özellikle INSERT, UPDATE veya DELETE ifadelerinde oluşan bir hata durumunda, hata kodunu yakalamak için kullanılır. @@ERROR değişkeni, hata kodunu saklar ve bu kod, kullanıcıya bir hata mesajı veya hata işleme kodu göstermek için kullanılabilir. 
Not: Bu fonksiyon hatanın sebebini doğrudan açıklamaz, yalnızca hata kodunu sağlar.

--ÖRNEK 91:

select 10/0
select @@ERROR

--ÖRNEK 92:

select * from sys.messages


-- ÖRNEK 93: 

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


@@SERVICENAME : T-SQLde kullanılan bir sistem değişkenidir ve SQL Server hizmetinin adını döndürür. Bu değişken, SQL Server hizmetinin adına ihtiyaç duyulduğunda kullanılır. Örneğin, bazı SQL Server özelliklerini yapılandırmak için, SQL Server Configuration Manager aracılığıyla SQL Server hizmetinin adını bilmek gerekebilir. @@SERVICENAME değişkeni, bu adı elde etmek için kullanılabilir.

--ÖRNEK 94:

select @@SERVICENAME
 
@@SERVERNAME : SQL Serverın adını döndürür. Örneğin, bir SQL Server örneğine bağlanmak veya bir SQL Serverdan bir başka SQL Servera bağlanmak için, SQL Server adını bilmek gerekebilir. @@SERVERNAME değişkeni, bu adı elde etmek için kullanılabilir. 

--ÖRNEK 95:

select @@SERVERNAME

@@VERSION : SQL Server sürümünün bilgisini döndürür. Bu değişken, bir SQL Server kurulumunun sürüm bilgisine ihtiyaç duyulduğunda kullanılır. Örneğin, bir uygulamanın, veritabanına erişirken, kullanılan SQL Server sürümüne uygun bir sorgu oluşturması gerekebilir. @@VERSION değişkeni, bu amaçla kullanılabilir.

--ÖRNEK 96:

select @@VERSION

Bu örnek SQL Server sürümünün bilgisini döndürür, örneğin "Microsoft SQL Server 2019 (RTM-CU14) 
(KB5005630) - 15.0.4138.2 (X64)" gibi. Bu bilgi, SQL Server sürümünü belirlemek veya sürüm bilgisini 
kullanarak SQL Server özelliklerini yaplandırmak için kullanılabilir.

@@LANGUAGE : T-SQLde kullanılan bir sistem değişkenidir ve kullanılan dilin adını döndürür.Bu değişken, bir SQL Server kurulumunun hangi dil ayarlarının kullanıldığına ihtiyaç duyulduğunda kullanılır. Örneğin, bir veritabanının, kullanılan dil ayarlarına uygun bir şekilde sorgulanması gerekebilir. @@LANGUAGE değişkeni, bu amaçla kullanılabilir.

--ÖRNEK 97:

select @@LANGUAGE as 'Kullanılan Dil'

Bu örnek/sorgu, kullanılan dilin adını döndürür, örneğin "us_english" veya "turkish". Bu bilgi, bir veritabanında kullanılan karakter kümesinin veya bir SQL Server özelliğinin doğru şekilde yapılandırılması için kullanılabilir.

@@LANGID : T-SQLde kullanılan bir sistem değişkenidir ve kullanılan dilin Microsoftun dil kimliği (LCID) numarasını döndürür. Bu değişken, bir SQL Server kurulumunun hangi dil ayarlarının kullanıldığına ihtiyaç duyulduğunda kullanılır. Örneğin, bir veritabanının, kullanılan dil ayarlarına uygun bir şekilde sorgulanması gerekebilir. @@LANGID değişkeni, bu amaçla kullanılabilir.

--ÖRNEK 98:

select @@LANGID

Bu sorgu, kullanılan dilin LCID numarasını döndürür, örneğin "1033" (ABD İngilizcesi) veya "1055" (Türkçe) gibi. Bu bilgi, bir veritabanında kullanılan karakter kümesinin veya bir SQL Server özelliğinin doğru şekilde yapılandırılması için kullanılabilir.

@@MAX_CONNECTIONS : SQL Servera aynı anda açılabilen maksimum bağlantı sayısını belirler. SQL Server, aynı anda birçok kullanıcının veritabanına erişebilmesine izin verir ve her bir kullanıcı bağlantı noktası aracılığıyla erişim sağlar. @@MAX_CONNECTIONS değişkeni, SQL Serverda aynı anda açılabilecek en fazla bağlantı sayısını belirler.

--ÖRNEK 99:

select @@MAX_CONNECTIONS

@@DATEFIRST : T-SQLde kullanılan bir sistem değişkenidir ve haftanın ilk gününü belirler. SQL Serverda, haftanın ilk günü varsayılan olarak Pazartesidir. Ancak bazı ülkelerde veya bölgelerde haftanın ilk günü farklıdır (örneğin, ABDde haftanın ilk günü Pazar). @@DATEFIRST değişkeni, haftanın ilk gününü belirler ve bu değişkenin değeri 1 ile 7 arasında değişir. 1, Pazartesiyi, 2, Salıyı, 3, Çarşambayı ve böyle devam eder.

@@ROWCOUNT : Son sorgunun etkilediği satır sayısını döndürür. @@ROWCOUNT değişkeni, sorgu sonrasında etkilenen satır sayısının öğrenilmesi gereken durumlarda oldukça faydalıdır. Örneğin, bir INSERT sorgusunun kaç satır eklediğini öğrenmek için kullanılabilir veya bir DELETE sorgusunun kaç satır sildiğini öğrenmek için kullanılabilir.

--ÖRNEK 100:

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

@@IDLE : SQL Serverdaki anlık durum bilgilerini sağlayan bir sistem değişkenidir. Bu değişken, SQL Serverın CPU ve bellek kullanımı, işlem sayısı, bekleyen işlem sayısı, bekleme süreleri ve diğer sistem performansı verileri gibi çeşitli bilgileri sağlar. @@IDLE değişkeni, SQL Serverın anlık durumunu gösterir ve ne kadar süredir boşta olduğunu döndürür. Bu değişkenin değeri, SQL Serverın ne kadar süredir boşta olduğuna bağlı olarak değişir ve bu bilgi, SQL Server performansının analizinde faydalı olabilir.


::--::--::--:: GO ile yığın oluşturma ::--::--::--::
T-SQL'de "GO" ifadesi, bir yığın (batch) işlemini sonlandırmak ve bir sonraki yığın işlemine geçmek için kullanılan bir ayırıcıdır. T-SQL'de yığın, birden fazla SQL ifadesinden oluşan ve bir arada çalıştırılabilen bir kod bloğudur.

Bir yığın, T-SQL editöründe veya bir SQL betiği dosyasında birden fazla SQL ifadesini içerebilir. T-SQLde yığın oluşturma mantığı, her yığın işleminin birbirinden bağımsız olarak çalıştırılabilmesini sağlamaktır. Yani, bir yığın işlemi başarılı bir şekilde tamamlandıktan sonra, bir sonraki yığın işlemi başlatılabilir.


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

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

--ÖRNEK 101:
declare @deger int
set @deger=30
go
select @deger

::--::--:: Print ile ekrana mesaj yazdırma ::--::--::

select 'deneme deneme'

print 'deneme deneme'

--ÖRNEK 102:
declare @sayi1 int, @sayi2 int,@sayi3 int
set @sayi1=22
set @sayi2=44
set @sayi3=@sayi1*@sayi2
print 'Toplam'
print '-------'
print @sayi3

::--::--::--:: TABLO Tipi DEĞİŞKEN ::--::--::--::
T-SQL tablo tipi değişken, bir tablo yapısına sahip ve T-SQL kodlarında geçici olarak kullanılabilen bir değişken türüdür. Tablo tipi değişkenleri, bir tablonun sütunlarının adları, veri tipleri ve sıralama özellikleri gibi bilgileri içerir. Bu değişkenler, T-SQL kodlarında geçici bir tablo gibi kullanılabilir.

Tablo tipi değişkenler, özellikle çok sayıda satırı veya birçok sütunu olan geçici verilerle çalışmak gerektiğinde faydalıdır. Bir tablo tipi değişkeni, bir T-SQL kodunda birçok işlem sırasında kullanılabilir ve sonunda işlem tamamlandığında yok olur. Bu sayede, veri tutmak için gereksiz yere fiziksel bir tablo oluşturulması veya silinmesi gerekmez.

--Kullanım Şekli: 
declare @degiskenismi TABLE (degisken1 veritipi,degisken2 veritipi)

--ÖRNEK 103:
declare @personel table(
no int identity(1,1),
ad_soyad varchar(100) not null,
yas int)
insert into @personel values ('Sude kalyoncu', 65)
insert into @personel values ('Mehmet Başaran', 22)
select * from @personel order by ad_soyad

--ÖRNEK 104:
create table kitap(
ktp_no int identity(1,1),
ktp_adi varchar(100),
yazar_adi varchar(25),
yazar_soyad varchar(50),
sayfa_sayisi int,
fiyat int)

insert into kitap values ('abc','ali','can',350,40)
insert into kitap values ('dsadf','alim','cincan',200,30)
insert into kitap values ('jgjgh','halil','baycan',400,55)
insert into kitap values ('trty','salim','caner',100,13)

select * from kitap

declare @yazar table(yazar_no int)
insert into @yazar values (1),(3),(4)

select ktp_no,ktp_adi,sayfa_sayisi from kitap where ktp_no IN (select * from @yazar)

::--::--::--:: OUTPUT işlemi ::--::--::--::
inserted : insert, update
deleted : delete,update

output alınacak_sütunlar into aktarılacak_yer

--ÖRNEK 105:

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

insert into kitap 
output inserted.yazar_adi,inserted.yazar_soyad,inserted.fiyat into @eklenenler
values ('mağaradakiler','cemil','meriç',355,60)
select * from @eklenenler

--ÖRNEK 106:
declare @silinenler table(
ad varchar(50),
fiyat money)

delete from kitap 
output deleted.ktp_adi,deleted.fiyat into @silinenler
where fiyat>55

select * from  @silinenler

::--::--::--:: IF ...ELSE yapısı ::--::--::--::
Bu yapı, T-SQL kodlarında koşullu ifadelerin kullanılmasını sağlar.If-else yapısı, belirli bir koşulu değerlendirir ve koşul doğruysa belirtilen kod bloğunu çalıştırır. Aksi takdirde, else bloğunda belirtilen kodlar çalıştırılır.

IF Koşul
    Koşula bağlı ifadeler/kodlar
ELSE IF  koşul
    Koşula bağlı kodlar
...
..
ELSE
    kodlar


* çalıştırılacak kodlar birden fazla satırdan oluşuyorsa BEGIN - END arasına yazılmalıdır.
* if koşulu içinde Select kullanılacaksa, sorgudan tek değer dönmelidir..

--ÖRNEK 107:
IF EXISTS (select * from kitap where ktp_no>10)
    print 'Kayıt Sayısı 10dan fazladır'
ELSE  
begin    
    select ktp_no,ktp_adi,yazar_adi from kitap where ktp_no<=10
    print 'Kayıt sayısı 10 veya daha azdır'
end

--ÖRNEK 108:
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ç_x
end

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

--ÖRNEK 109: 
select ktp_adi,yazar_adi,fiyat,'GÖRÜŞ'=
case
    when fiyat>40 then 'PAHALI'
    when fiyat>30 and fiyat<=40 then 'NORMAL'
    when fiyat>15 and fiyat<=30 then 'UCUZ'
    ELSE 'BEDAVA'
end
from kitap

::--::--:: WHILE döngüsü BREAK, CONTINUE yapısı ::--::--::
Koşul sağlandığı sürece (True değeri döndüğü sürece) kod/kodlar çalıştırılır.

WHILE koşul
Begin
    kodlar
end

* Tekrarlanmasını istediğimiz işlem tek satırdan oluşuyorsa Begin-End olmasa da olur

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


select 3 + 3
select 3 + '3'
select '3' + '3'
select '3' + 'B'
select 3 + 'B'

cast / convert : string ile diğer veri tiplerini birleştirme/dönüştürme

cast(değer AS yeniveritipi)
convert(yeniveritipi,değer)

--ÖRNEK 110:
1den 5e 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 111:
Kitap tablosundaki fiyat ortalaması 35TL üzeri olana kadar fiyatları %5 artıralım artıralım
select * from kitap

-- select avg(fiyat) from kitap

-- update kitap set fiyat=fiyat*5/100+fiyat

select 'Ortalama Fiyat =' + cast(avg(fiyat) as varchar(15)) from kitap 
while (select avg(fiyat) from kitap)<=57
begin
    update kitap set fiyat=fiyat*5/100+fiyat
    select ktp_adi,fiyat from kitap
end
select 'Yeni ortalama fiyat =' +cast(avg(fiyat) as varchar(15)) from kitap

--ÖRNEK 112: break kullanımı

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

--ÖRNEK 113: continue kullanımı1
declare @sayi int = 0
while (@sayi<10)
begin
    set @sayi = @sayi+1
    if @sayi = 8 continue;
    print cast(@sayi as varchar(15)) + 
        ' sayısının karesi = ' + 
        cast(@sayi*@sayi as varchar(15))
end

--ÖRNEK 114: continue kullanımı2

declare @sayac int
set @sayac=1

while @sayac<=10
begin
    if @sayac=8
        begin
        set @sayac=@sayac+1
        continue
        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 zaman kadar kodların çalışmasını erteler
Time: belirlenen zamanda kodları çalıştırır

--ÖRNEKLER 115:
waitfor time '21:19:00'  -- kodlar 21.19'da çalışır
waitfor delay '21:19:00'  -- kodlar 21 saat 19dk sonra çalışır

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

::--::--:: STORED PROCEDURE (SAKLI YORDAMLAR) ::--::--::
Yordamlar, bir veritabanı yönetim sistemi tarafından yürütülür ve SQL sorgularını, veri işleme işlevlerini, kontrol yapılarını ve diğer programlama öğelerini içerebilir. Stored Procedure, sıklıkla tekrarlanan görevleri otomatikleştirmek için kullanılır.

Stored Procedureler birkaç avantaj sağlar. Bunlar şunları içerir :

* Veritabanı işlemlerini gerçekleştirmek için optimize edilmiş bir yöntem sağlarlar. Çünkü Stored Procedureler, veritabanında saklandıkları için, veritabanı yönetim sistemi tarafından optimize edilebilirler. Bu, veritabanı işlemlerinin daha hızlı gerçekleştirilmesine ve daha az kaynak tüketilmesine neden olur.
* Güvenlik sağlarlar. Stored Procedureler, veritabanı yöneticisi tarafından izin verilen kullanıcılara açık olabilir. Bu, veritabanına yapılan erişimleri kontrol etmek ve veritabanı güvenliğini artırmak için kullanılabilir.
* Tekrar kullanılabilirler. Stored Procedureler, aynı görevi birçok kez gerçekleştirmek için kullanılabilirler. Bu, kod tekrarını azaltır ve uygulamaların daha düzenli hale gelmesini sağlar.

System Stored Procedure
Local Stored Procedure
Extended Stored Procedure

::--::--:: System Stored Procedure ::--::--::
System Stored Procedure, Microsoft SQL Serverda bulunan önceden tanımlanmış saklı prosedürlerdir. Bu prosedürler, veritabanı yönetimi ve diğer sistem düzeyi görevleri için kullanılabilirler. System Stored Procedureler, "sp_" ön adıyla başlayan adlarla tanımlanır ve sistem veritabanında saklanırlar.

System Stored Procedureler, kullanıcılar tarafından kullanılan normal Stored Procedurelerden farklıdır. Normal Stored Procedureler, uygulama özelliklerini veya iş mantığını uygularken, System Stored Procedureler, veritabanı yönetimi veya sistem düzeyi görevlerini gerçekleştirir.

Örnekler arasında, veritabanı yedekleme ve geri yükleme, veritabanı onarımı, kullanıcı hesapları yönetimi, veritabanı istatistiklerinin yeniden derlenmesi ve yeniden oluşturulması, depolama motoru ayarları ve diğer birçok görev yer alabilir.

--ÖRNEK 116:
select * from sys.messages

sp_addmessage 50002,16,'Otomatik artan sütun için değer girmişsiniz'

select * from sys.messages where message_id=50002

--ÖRNEK 117:
sp_addmessage 50002,16,'Değiştik gardaş',@with_log=TRUE,@replace='REPLACE'

--ÖRNEK 118:
sp_addtype sayi,int,'null'

aktif veri tabanında yeni veri tipi oluşturuyor

create table abc(
fiyat sayi,
ad varchar)

--ÖRNEK 119:
sp_configure 'user options',10

--ÖRNEK 120:
sp_configure 'remote access',0

--ÖRNEK 121:
sp_addlogin 'deneme5',123456
go
sp_adduser 'deneme5','xyz'

::--::--:: LOCAL STORE PROCEDURE ::--::--:: 
Local Stored Procedure, bir veritabanında tanımlanan ve veritabanı içinde saklanan özelleştirilmiş bir prosedürdür. Bu prosedürler, belirli bir veritabanı ile ilişkili olan uygulamalar tarafından kullanılabilir.

Local Stored Procedurlar, uygulama geliştiricilerinin veritabanı işlevlerini organize etmelerine ve yönetmelerine yardımcı olur. Bu prosedürler, veritabanı işlevlerini kolaylaştırabilir ve işlemleri daha hızlı hale getirebilir.

Local Stored Procedureler, veritabanı nesneleri olarak tanımlanırlar ve T-SQL dilinde yazılırlar. Bu prosedürler, parametreler aracılığıyla çeşitli işlevler gerçekleştirebilirler ve veritabanı işlemleri için uygun bir arayüz sağlarlar.

Local Stored Procedurler, uygulama güncellemelerinde ve veritabanı değişikliklerinde kullanılabilir. Bu prosedürler, veritabanı işlevlerini güncelleştirmek veya yeniden yapılandırmak için kolay bir yol sağlarlar.

create -- local proc oluşturmak için
alter -- değişiklik yapmak için (create kullanımı ile aynı kullanıma sahip)
execute / exec -- çalıştırmak için
drop -- silmek için

--ÖRNEK 122:
create procedure listele5
as
select *  from kitap where yazar_adi like '%h%'

exec listele5
listele5

--ÖRNEK 122:
alter procedure listele5
as
select * from kitap where yazar_adi like '%a%'

listele5

--ÖRNEK 123:
drop procedure listele5

::--::--:: NOCOUNT  ::--::--::
NOCOUNT, bir SQL sorgusunun sonuç kümesinde etkilenen satır sayısının gösterilip gösterilmeyeceğini belirleyen bir T-SQL ifadesidir. NOCOUNT komutu, bir SQL sorgusu çalıştırıldığında, işlem sırasında etkilenen satır sayısı hakkında bilgi veren ekstra bir satır döndürülmesini engeller. Bu özellik bazen performansı artırmak için kullanılabilir, çünkü etkilenen satır sayısının her sorgu sonucunda döndürülmesi gerekmeyebilir ve gereksiz yere ağ trafiği ve bellek kullanımına neden olabilir.

set nocount off --default olarak böyle zaten
set nocount on 

::--::--:: Store Procedure'lerde Çıkış Parametresi Kullanmak ::--::--::
Yordamlar istenilen işlemleri yaptıktan sonra elde ettiği sonucu yordamın çağrıldığı yere göndermek için çıkış parametresi kullanılır. 2 parametre var: RETURN ve OUTPUT

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 kullanılmalıdır.

--ÖRNEK 124:
create procedure toplam(@sayi1 int, @sayi2 int,@sonuc int output)
as
set @sonuc=@sayi1+@sayi2


declare @a int
exec toplam 75,85,@a output
print @a

--ÖRNEK 125:
create procedure carpma(@s1 int, @s2 int, @s3 int, @sonuc int output)
as
set @sonuc=@s1*@s2*@s3
print 'Sonuç = ' +cast(@sonuc as varchar(10))

declare @a int
exec carpma 5,10,15,@a output

--ÖRNEK 126:

create procedure kitapbul(@yazar varchar(41))
as
select * from kitap where yazar_adsoyad=@yazar

--test
kitapbul 'Cem'

--ÖRNEK 127:  
Aranılan kitap varsa kitap fiyatı / adeti artırılsın. kitap yoksa listeye eklensin

alter procedure kitap_bul (@kitap varchar(25))
as
if (select count(*) from kitap where ktp_adi = @kitap) > 0
update kitap set fiyat = fiyat + 5
else
insert into kitap (ktp_adi, fiyat) values (@kitap, 50)


::--::--:: Kullanıcı Tanımlı Fonksiyonlar ::--::--::

Standart fonksiyonlar --> avg,  sum, substring,min, max...

* KTF lar 1 veya daha fazla değeri geri döndürebilir.
* Yordamlarda olduğu gibi dışarıdan, birden fazla değer alabilir
* fonksiyonlar SQL ifadleri içinde yer alabilir

::--::--:: Scalar-Valued Functions ::--::--::

Scalar-valued function, tek bir değer döndüren ve parametreleri olan bir fonksiyondur. Bu tür fonksiyonlar, bir sorguda bir ifade olarak kullanılabilir ve geri döndürdüğü tek değer, diğer sorguların bir parçası olarak kullanılabilir.

Scalar-valued functions, bir SQL Server veritabanında oluşturulabilir ve genellikle bir dize işleme, matematiksel bir işlem veya bir tarih işlemi gerçekleştirmek gibi tek bir değerli hesaplamalar yapmak için kullanılır.

READONLY : fonksiyona gelen değerin fonksiyon içinde değiştirilmesini önler.
RETURNS : scaler fonksiyondan dönen değerin veri tipini belirler
WITH ENCRYPTION : fonksiyondan dönen bilgiyi gizler

WITH SCHEMABINDING : tablodaki yapısal değişikliği önler (table-valued)

Örneğin, aşağıdaki örnek, "Product" tablosundaki bir ürünün fiyatını iki katına çıkaran bir scalar-valued function kullanır :

CREATE FUNCTION DoublePrice(@ProductId int)
RETURNS money
AS
BEGIN
    DECLARE @Price money
    SELECT @Price = Price FROM Products WHERE ProductId = @ProductId
    RETURN @Price * 2
END

Bu scalar-valued function, "ProductId" parametresi ile çağrılabilir ve geri döndürdüğü değer, "Price" alanındaki 
değerin iki katıdır. Örneğin, aşağıdaki sorgu, "ProductId" 1 olan ürünün fiyatını iki katına çıkarır:

SELECT dbo.DoublePrice(1) as 'Yeni Fiyat'


--ÖRNEK 128:
create function buyuk_harf(@gelen varchar(max))
returns varchar(max)
as
begin
    return UPPER(@gelen)
end

--test
select dbo.buyuk_harf(yazar_adsoyad),fiyat from kitap

--ÖRNEK 129:
create function top_fiyat(@gelen varchar(max))
returns int
as
begin
    declare @toplam int
    select @toplam=sum(fiyat) from kitap where ktp_adi=@gelen
    return @toplam
end

--test
select dbo.top_fiyat('bu ülke')

select dbo.top_fiyat('fjgh')

::--::--:: TABLE-VALUED FUNCTIONS ::--::--:: 
Table-valued functions, bir SQL Server veritabanında oluşturulan ve bir tablo döndüren özel bir tür fonksiyondur. Bu tür fonksiyonlar, bir sorguda bir ifade olarak kullanılabilir ve sonuçlar diğer sorguların bir parçası olarak kullanılabilir.

Table-valued functions, özellikle birden fazla satır döndürmek isteyen hesaplamalar veya sorgular için kullanışlıdır. Bu tür fonksiyonlar, içsel olarak bir SELECT ifadesi içerir ve herhangi bir WHERE, GROUP BY veya ORDER BY de dahil edebilir.

Örneğin, aşağıdaki örnek, "OrderDetails" tablosundaki bir siparişin tüm ayrıntılarını içeren bir table-valued function kullanır :

CREATE FUNCTION GetOrderDetails (@OrderId int)
RETURNS TABLE
AS
RETURN
(
    SELECT * FROM OrderDetails WHERE OrderId = @OrderId
)

Bu table-valued function, "OrderId" parametresi ile çağrılabilir ve sonuç olarak "OrderDetails" tablosundan "OrderId" parametresine eşleşen tüm satırları döndürür. Örneğin, aşağıdaki sorgu, "OrderId" 1 olan siparişin tüm ayrıntılarını döndürür :

SELECT * FROM dbo.GetOrderDetails(1)


--ÖRNEK 130: 
create function ktpsayfa(@sayfa int)
returns table
as
return (select * from kitap where  sayfa_sayisi>@sayfa)

--test
select ktp_adi from dbo.ktpsayfa(300)

::--::--:: CURSOR (imleç) Kullanımı ::--::--::

İmleç hangi satırda ise o satırda işlem yapılması sağlanır. Cursor, Elde edilen kayıt kümesi içinde satır satır işlem yaptırır. SQL Serveri aşırı derecede yavaşlattığı için veri tabanlarında tavsiye edilmez. Bunlar yerine yordamlar (procedure) veya fonksiyonlar (functions) 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 / dinamic / keyset / fast_forward] --imleç türleri
[read_only / scroll_locks] --imleç türleri
FOR select ifadesi
 
--Kullanırken:
OPEN imleç_ismi  --verikümesinde gezinmez için
fetch next -- imleç bir sonraki satıra geçer
fetch prior -- bir önceki satıra geçer / gider
fetch last -- en sonki satıra gider
fetch first  --ilk satıra gider
fetch absolute n   -- n.satıra gider
fetch relative n -- son gidilen satırdan n satır sonraya gider
close  -- veri kümesinde yapılacak işlemler bitince kapatılır
-- imleci kapatmak imleci silmez. imleci (cursor) Deallocate kullanılır.
 
--ÖRNEK 132:
Northwind veritabanındaki "Customers" tablosundan tüm müşteri kimlikleri ve şirket adlarını seçerek bir cursor oluşturalım. Daha sonra, cursor kullanılarak, her bir müşterinin kimliği ve şirket adı PRINT komutuyla ekrana yazdırılsın. İşlemler bittikten sonra cursor kapatılıp ve bellekten kaldırılsın.
 
DECLARE @CustomerID NVARCHAR(5)
DECLARE @CompanyName NVARCHAR(40)
 
DECLARE customer_cursor CURSOR FOR
SELECT CustomerID, CompanyName FROM Customers
 
OPEN customer_cursor
 
FETCH NEXT FROM customer_cursor INTO @CustomerID, @CompanyName
 
WHILE @@FETCH_STATUS = 0
BEGIN
    -- İşlemler burada yapılır
    PRINT 'CustomerID: ' + @CustomerID + ', CompanyName: ' + @CompanyName
 
    FETCH NEXT FROM customer_cursor INTO @CustomerID, @CompanyName
END
 
CLOSE customer_cursor
DEALLOCATE customer_cursor
 
 
::--::--:: TRIGGER (Tetikleyici) Kullanımı ::--::--:: 
Bir işlem gerçekleştiğinde başka bir işlemin yapılması istendiği durumlarda kullanılırlar. insert, update, delete için trigger 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 (geri almak) için rollback kullanılır. İşlemi onaylamak için herhangi bir şey yapmaya gerek yoktur.
 
-- 3 tür trigger:
1- DDL tetikleyiciler
2- DML tetikleyiciler
3- Logon tetikleyiciler (SQL server 2005 SP2 ile kkullanılabilir)
 
::--::--:: 1- DDL TETİKLEYİCİLER ::--::--::
SQL DDL (Data Definition Language) tetikleyicileri, veritabanında yapısal değişiklikler yapıldığında (tablo ekleme, tablo değiştirme, tablo silme vb.) otomatik olarak çalışan özel saklı işlemlerdir. DDL tetikleyicileri, belirli bir DDL işlemi gerçekleştirildiğinde önceden tanımlanmış bir eylemi tetikler.
 
DDL tetikleyicileri, veritabanının yapısını izlemek, tutarlılığı sağlamak, veri bütünlüğünü kontrol etmek veya diğer özel işlemleri gerçekleştirmek gibi çeşitli amaçlarla kullanılabilir. Örneğin, bir tablo eklendiğinde otomatik olarak başka bir tabloya bir kayıt eklemek, bir tablo değiştirildiğinde ilişkili verileri güncellemek veya bir tablo silindiğinde ilişkili nesneleri temizlemek gibi senaryolar için DDL tetikleyicileri kullanılabilir.
 
DDL tetikleyicileri, veritabanı yönetim sistemi tarafından otomatik olarak çalıştırılır ve genellikle veritabanının veri bütünlüğünü sağlamak, iş kurallarını uygulamak veya veritabanı yapılarında otomatik değişiklikler yapmak için kullanılır.SQL DDL (Data Definition Language) tetikleyicileri, veritabanında yapısal değişiklikler yapıldığında (tablo ekleme, tablo değiştirme, tablo silme vb.) otomatik olarak çalışan özel saklı işlemlerdir. DDL tetikleyicileri, belirli bir DDL işlemi gerçekleştirildiğinde önceden tanımlanmış bir eylemi tetikler.
 
DDL tetikleyicileri, veritabanının yapısını izlemek, tutarlılığı sağlamak, veri bütünlüğünü kontrol etmek veya diğer özel işlemleri gerçekleştirmek gibi çeşitli amaçlarla kullanılabilir. Örneğin, bir tablo eklendiğinde otomatik olarak başka bir tabloya bir kayıt eklemek, bir tablo değiştirildiğinde ilişkili verileri güncellemek veya bir tablo silindiğinde ilişkili nesneleri temizlemek gibi senaryolar için DDL tetikleyicileri kullanılabilir.
 
--kullanım şekli:
create trigger trigger_ismi
ON (ALL SERVER / DATABASE)
[With Encryption]
(FOR / AFTER)
(create  / alter / drop / deny / revoke)
AS
(sql ifade)
-- FOR sonrası ifade _ (alt çizgi) ile yazılır
create_table, alter_table, drop_function, create_function
 
--ÖRNEK 133:
create trigger silme_engeli
on database
for  drop_table
as
begin
print 'Tablo silme işlemi engellendi'
rollback
end
 
--test
drop table abc
 
--ÖRNEK 134:
create trigger db_engeli
on all server
for create_database
as
begin
print 'Veritabanı oluşturulamaz'
Rollback
end
 
--test
create database denemejdekjbd
 
::--::--:: 2- DML TETİKLEYİCİLER ::--::--::
DML (Data Manipulation Language) tetikleyicileri, veritabanında INSERT, UPDATE veya DELETE gibi veri manipülasyonu işlemleri gerçekleştirildiğinde otomatik olarak çalışan özel saklı işlemlerdir. DML tetikleyicileri, belirli bir DML işlemi gerçekleştirildiğinde önceden tanımlanmış bir eylemi tetikler.
 
DML tetikleyicileri, veri değişikliklerini izlemek, işlem geçmişini takip etmek, veri bütünlüğünü sağlamak veya diğer özel işlemleri gerçekleştirmek gibi çeşitli amaçlarla kullanılabilir. Örneğin, bir tabloya yeni bir kayıt eklendiğinde, bir kayıt güncellendiğinde veya bir kayıt silindiğinde otomatik olarak başka bir tabloya veya tablolara bir etkileşim gerçekleştirmek veya loglama yapmak gibi senaryolar için DML tetikleyicileri kullanılabilir. 
 
-- İki tür DML Trigger vardır : After (for) ya da instead of
 
After tetikleyiciler işlemler gerçekleştikten sonra devreye girerler. Sadece tablolar için tanımlanırlar.
 
instead of tetikleyiciler belirlenen işlem gerçekleşeceği sırada devereye girerler. Mesela yeni kayıt eklenirken
bilgi kontrolü için kullanılabilir..
 
--Kullanım şekli:
create trigger trigger_ismi
on (table/view)
[with encryption]
(for / after / instead of)
(insert / update/ delete)
AS (sql ifade)
 
--NOt: create database, drop database, restore log, load log gibi komutlar trigger içinde kullanılamaz
 
--ÖRNEK 135:  
Kitap tablosuna bir kitap girişi yapıldığında aynı isimde bir kitabın olup olmadığını kontrol eden trigger yazalım. Kitap ismi aynı ise ekrana "Aynı isimde kitap var" yazsın ve tabloya eklemesin. Eğer kitap yoksa tabloya eklesin ve sadece eklenen kayıt listelensin.
 
CREATE TRIGGER kontrol
ON kitap
INSTEAD OF INSERT
AS
BEGIN
DECLARE @kitap_adi VARCHAR(255), @kitap_no int, @ad_soyad VARCHAR(200),@sayfa int,@fiyat int
SELECT @kitap_adi = ktp_adi,@kitap_no=ktp_no,@ad_soyad=yazar_adsoyad,@sayfa=sayfa_sayisi,@fiyat=fiyat FROM inserted
 
IF EXISTS(SELECT * FROM kitap WHERE ktp_adi = @kitap_adi)
BEGIN
PRINT 'Aynı isimde kitap var'
END
ELSE
BEGIN
INSERT INTO kitap values (@kitap_no,@kitap_adi,@ad_soyad,@sayfa,@fiyat)
SELECT * FROM inserted
END
END
 
--test
select * from kitap
insert into kitap values (40,'falan filan','İskender',200,45)
 
 
::--::--:: Tetikleyciler hakkında bilgi alma ::--::--::
 
sp_helptext : Sistem store prosedürüdür, SQL Server veritabanında bir nesnenin tanımını (definition) görüntülemek için kullanılır. Bu prosedür, bir saklı prosedür, işlev, tetikleyici, görüş veya kullanıcı tanımlı işlem hakkında bilgi almak için kullanılabilir.
 
sp_helptext prosedürünü kullanarak, belirli bir nesnenin T-SQL kodunu görebilirsiniz. Bu, veritabanı nesnesinin nasıl oluşturulduğunu veya tanımlandığını görmenizi sağlar. Özellikle, büyük ve karmaşık saklı prosedürler veya tetikleyiciler gibi nesneleri anlamak veya incelemek için faydalı olabilir.
 
--ÖRNEK 136:
sp_helptext 'kontrol'
 
 
sp_helptrigger : SQL Server veritabanında belirli bir tabloya veya tabloya bağlı olan tetikleyicilerin ayrıntılarını görüntülemek için kullanılır. Bu prosedür, tetikleyicinin adı, türü, etkinliği ve tetikleyiciyle ilişkili olan tablo gibi bilgileri döndürür.
 
--ÖRNEK 137: kitap tablosu ile ilişkili triggerlara bakalım 
sp_helptrigger kitap 
 
sp_depends : SQL Server veritabanında belirli bir nesneye bağımlı olan diğer nesnelerin listesini görüntülemek için kullanılır. Bağımlılık, bir nesnenin başka bir nesneye referans yapması veya bağlı olması durumunda meydana gelir. Bu prosedürünü kullanarak, belirli bir nesneye (tablo, saklı prosedür, fonksiyon, tetikleyici vb.) bağımlı olan diğer nesneleri tespit edebilirsiniz. Bu, veritabanındaki nesneler arasındaki ilişkileri anlamanıza yardımcı olur.
 
--ÖRNEK 138:
sp_depends kitap
 
::--::--:: INSERT tetikleyiciler ::--::--::
 
--ÖRNEK 139:
Bir alış veriş veritabanındaki URUNLER tablosu verilmiştir. Ayrıca müşterilerin almış oldukları ürünler SATISLAR (urun_kodu,miktar, musteri, tarih) tablosunda ve firmanın aldığı ürünler ALIMLAR (urun_kodu, miktar, cari, tarih) tablosunda tutulacaktır. Ürün satışı yapıldığında URUNLER tablosundan düşülmeli, ürün alındığında URUNLER tablosuna eklenmeli. 
Satışı yapılacak ürünün stoğu müşterinin istediğinden azsa "stok yetersiz" şeklinde uyarı versin.
 
create table urunler(
urun_kodu int identity(1,1) primary key,
urun_adi varchar(50),
fiyat money,
miktar bigint)
 
create table satislar(
urun_kodu int,
miktar bigint,
musteri varchar(50),
tarih smalldatetime)
 
create table alimlar(
urun_kodu int,
miktar bigint,
cari varchar(50),
tarih smalldatetime)
 
insert into urunler values ('a',15,150),('b',25,80),('c',50,500)
select * from urunler
 
--alımlar 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,'abc','03.05.2023')
 
select * from urunler
select * from alimlar
 
--satış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
 
--test 1
insert into satislar values (2,40,'ahmet','02.05.2023')
go 
select * from urunler
select * from satislar
 
--test 2
insert into satislar values (2,61,'ahmet','02.05.2023')
go 
select * from urunler
select * from satislar
 
::--::--::  DELETE Triggers / Tetikleyiciler  ::--::--::
Bir tablodan satır silindiğinde devreye giren tetikleyciler. Deleted geçici tablosu üzerinden kontrol yapar.
* Tablolar arası referans ilişkiler varsa önce onları kaldırıp o şekilde kullanmak gerekli.
* on delete cascade varsa bu tetikleyiciye gerek yok diyebiliriz.
 
--ÖRNEK 140:
 
select * from urunler
select * from alimlar
select * from satislar
 
create trigger urun_kodu_sil
on urunler
after delete
as
declare @urun_kodu int
if @@ROWCOUNT>0
begin
select @urun_kodu=urun_kodu from deleted
delete from alimlar where urun_kodu=@urun_kodu
delete from satislar where urun_kodu=@urun_kodu
end
 
---test
delete from urunler where urun_kodu=1
 
::--::--::  UPDATE Triggers / Tetikleyiciler  ::--::--::
Bir tablonun satırlarında değişiklik olduğu zaman devreye girmektedir. Update işlemi için hem inserted hem de deleted geçici tabloları kullanılır.
 
--ÖRNEK 141:
Kitaplar tablosundaki ISBN no değiştiğinde diğer tablolardaki ISBN de değişsin
select * from kitap
 
create trigger ISBN_guncelle
on kitap
after update
as
declare @eski_ISBN varchar(255)
declare @yeni_ISBN varchar(255)
IF @@ROWCOUNT>0
begin
--IF UPDATE(ISBN)
--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
--END
 
--ÖRNEK 142:
 
create trigger buyuk_harf_insert
on customers
instead of insert
as
begin
set nocount on;
declare @insertedcustomers table
(
CustomerID varchar(5),
CompanyName nvarchar(100),
ContactName nvarchar(50)
--diğer sütunlar eklenebilir
);
insert into @insertedcustomers (CustomerID,CompanyName,ContactName) 
select CustomerID,CompanyName,ContactName from inserted;
 
--müşteri harflerini büyük harfe dönüştürelim
UPDATE @insertedcustomers set CompanyName=UPPER(CompanyName),ContactName=UPPER(ContactName);
 
--güncellenmiş halini tabloya ekleyelim
insert into Customers (CustomerID,CompanyName,ContactName) 
select CustomerID, CompanyName, ContactName from @insertedcustomers
 
END
 
--test
insert into Customers(CustomerID,CompanyName,ContactName)
values ('ABC05','tmyo','ali veli')
 
select * from Customers
 
::--::--:: Tetikleyicinin Düzenlenmesi ::--::--:: 
alter trigger kullanımı create trigger ile aynıdır. Ancak create or alter trigger yazarsak böyle bir trigger varsa değiştirir yoksa sıfırdan bu trigger oluşturulur.
 
--ÖRNEK 142:
 
alter trigger silme_engeli
--create or alter trigger silme_engeli 
on database
for  drop_table
as
begin
print 'Tablo silme işlemi engellendi'
rollback
end
 
Burada trigger ismi değiştirilemez. Trigger isim değişikliği için SP_RENAME store procedure kullanılır.
 
--ÖRNEK 143:
exec sp_rename kontrol, kontrol_var --kontrol isimli trigger kontrol var şeklinde değiştirilir.
 
::--::--:: Tetikleyicinin Silinmesi ::--::--::
 
--ÖRNEK 144:
drop trigger kontrol 
 
--ÖRNEK 145:
drop trigger db_engeli on ALL SERVER
 
 
::--::--:: Tetikleyicinin Aktifleştirilmesi / Pasifleştirilmesi ::--::--::
 
--ÖRNEK 146: kitap tablosundaki tüm tetikleyiciler pasifleştirilir
alter table kitap disable trigger all 
 
--ÖRNEK 147:  kitap tablosundaki kontrol tetikleyicisi pasifleştirilir
alter table kitap disable trigger kontrol
 
--ÖRNEK 148:  kitap tablosundaki kontrol tetikleyicisi aktifleştirilir
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ı'

 

Bilgilendirme

www.aliosmangokcan.com sayfasına gösterdiğiniz ilgiden dolayı teşekkür ederim. İçeriklerle ilgili duygu ve düşüncelerinizi mail adresim üzerinden iletebilirsiniz...

 

İstatistikler

  • Kullanıcılar 1
  • Makaleler 111
  • Makale Görüntüleme 820380