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 (Yapısal Sorgulama Dili), veri tabanlarını yönetmek ve sorgulamak için kullanılan bir dildir. Verilerin depolanması, güncellenmesi, silinmesi ve sorgulanması gibi işlemleri gerçekleştirmeye olanak tanır.
İlişkisel veritabanları için tasarlanan SQL, verilerin düzenli şekilde saklanmasını, organize edilmesini ve erişilmesini sağlar. SELECT, INSERT, UPDATE, DELETE gibi önceden tanımlı komutlarla veri tabanlarına erişim sağlar.
Büyük ve küçük ölçekli işletmeler tarafından yaygın olarak kullanılan SQL,
birçok programlama dili ve veri tabanı sistemi tarafından desteklenir.
Kullanımı kolay ve esnek bir yapıya sahip olup, birçok veri tabanı yönetim sisteminin temelini oluşturur.
::--::--:: T-SQL ::--::--::
T-SQL (Transact-SQL), Microsoft SQL Server tarafından kullanılan bir sorgulama
ve programlama dilidir. SQL standartlarına ek olarak, gelişmiş programlama özellikleri sunar.
T-SQLin başlıca özellikleri:
* SQL sorgularıyla veritabanı işlemlerini gerçekleştirir.
* Prosedürler, fonksiyonlar, tetikleyiciler ve saklı prosedürler gibi programlama nesneleriyle yapılandırılmış programlama imkanı sağlar.
* Değişkenler, koşullu ifadeler, döngüler ve kontrol yapıları içerir.
* Dizinleme, tablolar ve dizeler gibi çeşitli veri türlerini destekler.
* Veritabanı yönetim sistemi tarafından optimize edilerek yüksek performans sağlar.
* Microsoft SQL Server ile güçlü bir entegrasyona sahip olan T-SQL, güvenilir ve yüksek performanslı uygulamalar geliştirmek için etkili bir araçtır.
::--::--:: PL/SQL - Oracle tarafından geliştirilmiştir. ::--::--::
PL/SQL (Procedural Language/Structured Query Language), Oracle veritabanı yönetim sistemi için geliştirilmiş bir programlama dilidir. SQLin yeteneklerini genişleterek, prosedürel programlama özellikleri sunar. (Prosedürel programlama, bir programın adım adım işleyişini belirleyen, işlev (fonksiyon) ve prosedürler kullanarak kodu organize eden bir programlama tekniklerinin bütünüdür)
Oracle ile entegre çalışan PL/SQL, veri tabanı işlemlerini yüksek düzeyde özelleştirmeye olanak tanır. Depolanan prosedürler, fonksiyonlar, tetikleyiciler ve paketler gibi yapılandırılmış programlama araçlarıyla güçlü ve güvenilir uygulamalar geliştirilmesini sağlar.
-- 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 ::--::--::
-- Mantıksal ve İkili Veri Tipleri
bit : 0 veya 1 değerlerini saklar (true/false).
Genellikle cinsiyet, medeni durum gibi veriler için kullanılır.
binary(n) : Sabit uzunlukta ikili (binary) veri saklar, maksimum 8000 byte.
varbinary(n | max) : Değişken uzunlukta ikili veri saklar, maksimum 2GB.
-- Karakter ve Metin Veri Tipleri
char(n) : Sabit uzunlukta alfanümerik veri saklar. (Örnek: char(15))
varchar(n | max) : Değişken uzunlukta alfanümerik veri saklar. (Örnek: varchar(15))
nvarchar(n | max) : Unicode destekli, değişken uzunlukta alfanümerik veri saklar.
text : Uzun metin verileri saklamak için kullanılır (maksimum 2GB).
(Yerine VARCHAR(MAX) tercih edilmelidir.)
--Sayısal Veri Tipleri
int : -2,147,483,648 ile 2,147,483,647 arasında tam sayılar.
tinyint : 0 ile 255 arasında tam sayılar.
smallint : -32,768 ile 32,767 arasında tam sayılar.
bigint : -9 kentilyon ile +9 kentilyon arasında geniş aralıklı tam sayılar.
decimal(p, s) / numeric(p, s) : 38 basamağa kadar hassas ondalıklı sayılar saklar.
(Örnek : decimal(10,2))
float(n) : Hassasiyet belirlenebilen kayan noktalı sayılar.
money / smallmoney : Para birimi değerleri saklar.
--Tarih ve Zaman Veri Tipleri
datetime : 1 Ocak 1753 - 31 Aralık 9999 tarih aralığını saklar.
smalldatetime : 1 Ocak 1900 - 6 Haziran 2079 tarih aralığını saklar.
--Özel Veri Tipleri
image : Resim, sunum, Excel dosyaları gibi ikili verileri saklar.
(Yerine VARBINARY(MAX) tercih edilmelidir.)
uniqueidentifier : 16 byte uzunluğunda, benzersiz kimlikler (GUID) saklar.
::--::--:: CREATE komutu ::--::--::
Veri tabanı 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 kutuphane
on
(name='kutuphane_dat',
filename='d:\kutuphane.mdf',
size=10,
maxsize=50MB,
filegrowth=5)
LOG ON
(name=okul2_log,
filename='d:\kutuphanelog.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%' --> ilk 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 ogrenci (
ogrno INT PRIMARY KEY, -- PK sütunu, NOT NULL belirtmeye gerek yok
ad VARCHAR(50) NOT NULL,
soyad VARCHAR(50),
adres VARCHAR(255),
telefon VARCHAR(11),
email VARCHAR(100) );
CREATE TABLE kitap (
kitapno INT PRIMARY KEY, -- PK sütunu, NOT NULL belirtmeye gerek yok
basim_yili INT NOT NULL,
yazar VARCHAR(50),
kitap_adi VARCHAR(100),
fiyat INT,
CONSTRAINT chk_fiyat CHECK (fiyat >= 0 AND fiyat <= 5000),
yayin_tarihi SMALLDATETIME,
CONSTRAINT chk_basim_yili CHECK (basim_yili BETWEEN 1900 AND 2025)
);
CREATE TABLE odunc (
ogrno INT NOT NULL,
kitapno INT NOT NULL,
alis_tarihi SMALLDATETIME,
CONSTRAINT fk_ogrno FOREIGN KEY (ogrno) REFERENCES ogrenci (ogrno),
CONSTRAINT fk_kitapno FOREIGN KEY (kitapno) REFERENCES kitap (kitapno),
CONSTRAINT pk_odunc PRIMARY KEY (ogrno, kitapno)
);
/* 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_ogrno FOREIGN KEY (ogrno) REFERENCES ogrenci (ogrno)
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT fk_kitapno FOREIGN KEY (kitapno) REFERENCES kitap (kitapno)
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT pk_odunc PRIMARY KEY (ogrno, kitapno) )
::--::--:: 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 (DATA manuplation lang. / Veri işleme dili) ::--::--::--::
Select - insert - update - delete
::--::--:: SELECT ile listeleme işlemleri ::--::--::
select sütunadı veya * from tabloadı where koşul
--ÖRNEK 21:
select * from personel
--NOT : Select örneklerinin devamı için ÖRNEK 36 ve sonrasına bakınız.
::--::--:: 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 '%@%'
veya
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 mail not like '%@%'
--ÖRNEK 29:
update personel set sehir='Afyonkarahisar' where (maas>10000 and maas<50000) or soyad like '%n'
veya
update personel set sehir='Afyonkarahisar' where soyad like '%n' or maas between 9999 and 49999
--between sınırları dahil ediyor
::--::--:: 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 personel --personel tablosundaki tüm veriler silinir
--ÖRNEK 32:
truncate table personel --personel tablosundaki tüm veriler silinir
::--::--::--:: 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
---- veritbanı düzeyinde işlem yapmak için TO ifadesi yeterli
veritabanı için: create database, create table, backup database, create view
tablo için: select, update, insert, delete
yordam için: execute
--ÖRNEK 33:
grant select,update ON musteri TO şaban
grant ALL ON kiralama TO rabia,yavuz
grant create database TO mehmet,emin
--ÖRNEK 34:
deny create table TO mustafa,ali,ahmet,oya
/*Bu komut, belirtilen kullanıcılara, yeni bir tablo oluşturmayı yasaklar.
Bu kullanıcılar artık CREATE TABLE komutunu kullanarak yeni tablolar oluşturamayacaklardır.*/
--ÖRNEKLER 35:
revoke update On musteri from fatih
/*Bu komut, "musteri" tablosu üzerindeki "fatih" kullanıcısının UPDATE iznini geri çeker.
Artık "fatih" bu tablo üzerinde güncelleme işlemi gerçekleştiremeyecektir.*/
revoke ALL from selman,furkan,betül,meryem
::--::--:: 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.
::--::--::--:: Veri Tabanı Seviyesi Roller ::--::--::--::
db_owner: veri tabanı 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: veri tabanındaki verileri okuyabilir
::--::--:: SELECT ile listeleme işlemleri ::--::--::
örnekler genel olarak NORTWIND veri tabanı üzerinde uygulanmıştır
--ÖRNEK 36:
select * from customers
--ÖRNEK 37:
select contactname,city from customers
--ÖRNEK 38:
select * from customers where customerID LIKE '%v'
--ÖRNEK 39:
select employeeID, shipaddress from orders where employeeId>7
--ÖRNEK 40:
select orderID,shipregion,shipname from orders where orderID>10300 and orderID<10400
--ÖRNEK 41:
select * from orders where shipcountry='brazil'
veya
select * from orders where shipcountry like 'Brazil'
veya
select * from orders where shipcountry In ('Brazil')
--ÖRNEK 42:
select ShipCity from orders where ShipCountry not like 'İtaly'
veya
select ShipCity from orders where not ShipCountry like 'İtaly'
veya
select ShipCity from orders where shipcountry not in ('italy')
veya
select ShipCity from orders where not shipcountry in ('italy')
veya
select shipcity from orders where ShipCountry!= 'İtaly'
veya
select shipcity from orders where ShipCountry<>'İtaly'
--ÖRNEK 43:
select tc from Kargo where gon_sube='izmir' or gon_sube='trabzon'
veya
select tc from kargo where gon_sube IN ('izmir','trabzon')
--ÖRNEK 44:
select customerId, shipname from orders where customerId like '_A%'
or shipname like '%en%'
--ÖRNEK 45:
select gon_ad,gon_soyad from kargo where ucret<80 or gon_ad is NULL
--ÖRNEK 46: adı üç harfli ikinci harf L VEYA soyadı G ile bitenler
select * from kargo where gon_ad like '_l_' or gon_soyad like '%g'
--ÖRNEK 47:
select tc,ucret from kargo where tc like '6%5'
--ÖRNEK 48:
select shipcity,orderID,shipvia from orders
where shipcity='lyon' or shipcity='köln'
veya
select shipcity,orderId,ShipVia from orders
where shipcity IN ('lyon','köln')
--ÖRNEK 49:
select shipname,freight from orders where shipname like 'f%b' or (freight>=5 and freight<=55)
veya
select * from orders where Shipname= '[f-b]' or freight between 5 and 55
--ÖRNEK 50:
select * from customers where city LIKE 'London'
veya
SELECT * FROM Customers WHERE city='London'
--ÖRNEK 51:
select customers.customerID,orders.orderID from customers,orders
--ÖRNEK 52:
select * from customers where city='Madrid' OR region is NULL
--ÖRNEK 53:
select * from customers where customerID LIKE 'FR%'
AND country IN ('Italy','Germany')
--ÖRNEK 54:
select * from customers where customerId LIKE 'N_R%'
::--::--::--:: distinct: tekrarlı satırları önlemek ::--::--::--::
--ÖRNEK 55:
select distinct customerID from orders
--ÖRNEK 56:
select distinct shipcountry from orders where shipaddress like '%j%'
::--::--::--:: order by (ASC - DESC) ::--::--::--::
--ASC kullanımı
select * from tabloadı where koşul order by referans_sütun ASC -- artan (default)
veya
select * from tabloadı where koşul order by referans_sütun -- artan
--DESC kullanımı
select * from tabloadı where koşul order by ref_sütun DESC -- azalan
--ÖRNEK 57:
select shipaddress from orders order by shipaddress ASC
veya
select shipaddress from orders order by shipaddress
veya
select shipaddress from orders order by 1
--ÖRNEK 58:
select * from orders order by shipaddress DESC
veya
select * from orders order by 10 DESC
--ÖRNEK 59:
select shipcountry,shipcity,shipvia from orders order by shipcountry desc,shipcity asc
veya
select shipcountry,shipcity,shipvia from orders order by 1 desc,2
--ÖRNEK 60:
select shipcountry,shipcity,shipvia from orders order by 1 desc,2,3
::--::--::--:: sütunlar için takma isim kullanma ::--::--::--::
--ÖRNEK 61:
select shipcountry AS 'ülke' from orders
veya
select shipcountry 'ülke' from orders
veya
select shipcountry "ülke" from orders
--ÖRNEK 62:
select mad "AD", myasi+5 "YENİ YAŞ",mail from musteri
--ÖRNEK 63:
select shipcountry+'***'+shipcity 'adres' from orders
--ÖRNEK 64:
select employeeID "İŞÇİ NO",employeeID+employeeID*0.2 "ZAMLI İŞÇİ NO" from orders
--ÖRNEK 65:
select 3+5
select 3*5 as 'çarpım'
--ÖRNEK 66:
select mad 'AD', msoyad "SOYAD",(myasi/2)+3 "YARIM" from musteri
--ÖRNEK 67:
select orderID,shipname,customerID from orders
where freight>=50 and shipcountry IN ('spain','italy') or shipname LIKE '%o'
order by customerID
veya
select orderID,shipname,customerID from orders
where freight>=50 and (shipcountry='spain' or shipcountry='italy') or shipname LIKE '%o'
order by 3
--ÖRNEK 68:
select orderID 'sipariş no',shipname 'kargo',customerID 'müşteri no',orderID*5 'yeni' from orders
where freight>=50 and shipcountry IN ('spain','italy') or shipname LIKE '%o'
order by customerID
--ÖRNEK 69:
select * from musteri
where myasi>=23 AND myasi<=28 AND madres='Ağrı' AND mkod>2 order by msoyad --msoyad Artan
--ÖRNEK 70:
select plaka,madres from musteri where madres NOT IN ('Ağrı') order by plaka DESC
veya
select plaka,madres from musteri where madres!='Ağrı' order by 1 DESC
--ÖRNEKLER 71:
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 urun_fiyati+(urun_fiyati*0.25) AS "Yeni Fiyat" from urunler2
--ÖRNEK 72: substring
select SUBSTRING (urun_adi,2,3) AS '3 Harf' from urunler2
--ÖRNEK 73:
select substring(shipname,3,5) AS 'KISALTMA' from orders --3.karakterden itibaren 5 karakter al
--ÖRNEK 74:
select substring(shipcity,1,1)+'.'+shipcountry "AD SOYAD" from orders
--ÖRNEK 75: RIGHT / LEFT
select RIGHT(customerID,4),customerID from orders
--ÖRNEK 76:
select LEFT (sevk_adresi,1)+'.'+urun_adi AS 'Ad Soyad' from urunler2
--ÖRNEK 77: UPPER / LOWER
select lower(customerID), UPPER(shipaddress) from orders
--ÖRNEK 78: LEN
select urun_adi,LEN(urun_adi) As "uzunluk1",
urun_adedi,LEN(urun_adedi) as "uzunluk2" from urunler2
--ÖRNEK 79: REPLACE
select shipcountry,REPLACE(shipcountry,'USA','İzmir Gültepe') 'Yeni İsim' from orders
--ÖRNEK 80: REVERSE
select REVERSE(shipcountry) as 'ters isim' from orders
--ÖRNEK 81: ABS
select ABS(-0.45) as mutlak
--ÖRNEK 82: ROUND
select freight,ROUND(freight,1) as "yuvarlanmış" from orders
--ÖRNEK 83: POWER
select POWER (2,3) as "küp alma"
--ÖRNEK 84: SQRT
select SQRT(64)
--ÖRNEK 85: SUM
select SUM(freight) 'Toplam' from orders where shipcountry<>'Germany'
--ÖRNEK 86:
select SUM(urun_fiyati) "Toplam" from urunler2
where islem_tarihi>='3.3.2019'
--ÖRNEK 87:
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 88: AVG
select ROUND(AVG(urun_fiyati),2) as "ortalama fiyat" from urunler2
--ÖRNEK 89: MAX / MIN
select MAX(urun_Adedi),MIN(urun_fiyati) from urunler2
--ÖRNEK 90:
select MAX(orderdate) from orders
--ÖRNEK 91: COUNT
select COUNT(urun_adi) as "Çeşit sayısı" from urunler2
--ÖRNEK 92:
select COUNT(distinct shipcity) from orders
--ÖRNEK 93: RTRIM / LTRIM - Boşlukları kaldırmak
select RTRIM(shippostalcode) from orders
--ÖRNEK 94: CEILING (yukarı yuvarlama) - FLOOR (aşağı yuvarlama)
select freight,CEILING(freight),FLOOR(freight) from orders
--ÖRNEK 95: CURRENT_TIMESTAMP (güncel tarih ve saat bilgisi)
select CURRENT_TIMESTAMP
--ÖRNEK 96: GETDATE (güncel tarih ve saat bilgisi)
select GETDATE()
--ÖRNEKLER 97: DATEPART ile tarih-saat bilgisinden istenen kısmı alma
select datepart(year,getdate()) --yıl bilgisi aldık
select datepart(month,getdate()) -- ay bilgisi
select datepart(day,getdate()) --gün bilgisi
select datepart(week,getdate()) --hafta bilgisi
--ÖRNEKLER 98: DATEPART
select datepart(day,'2024-01-03') --gün bilgisi (3.gün)
select datepart(quarter,'2024-01-03') --yılın çeyreği bilgisi
--ÖRNEKLER 99: DATENAME
select datename(month,getdate()) --ay ismini aldık/öğrendik
select datename(weekday,getdate()) --gün ismini aldık
select datename(month,'2023-12-03') --ay ismini aldık/öğrendik
select datepart(minute,getdate()) --kaçıncı dk olduğumuzu listeledik
select datename(minute,getdate()) --kaçıncı dk olduğumuzu listeledik
--ÖRNEK 100:
Tablo ismi arasında boşluk olduğu için köşeli paranteze alarak listeleme yapıyoruz
select * from [Order Details]
::--::--::--:: VERİ TABANI - II ::--::--::--::
::--::--::--:: JOIN ::--::--::--::
JOIN ifadesi, iki veya daha fazla tabloyu belirli bir ortak sütuna (anahtar) göre birleştirmek için kullanılır.
INNER JOIN : Sadece iki tabloda da eşleşen kayıtları getirir. (DEFAULT olarak innerjoin)
Eğer iki tabloda da eşleşmeyen kayıtlar varsa, onları göstermez.
LEFT JOIN : Sol (ilk) tablodaki tüm kayıtları getirir.
Sağ (ikinci) tablodaki eşleşen kayıtları ekler, eşleşmeyenler için NULL döner.
RIGHT JOIN : Sağ (ikinci) tablodaki tüm kayıtları getirir.
Sol (ilk) tablodaki eşleşen kayıtları ekler, eşleşmeyenler için NULL döner.
FULL JOIN : Hem sol hem sağ tablodaki tüm verileri getirir.
Eşleşmeyen alanlar için NULL olur.
CROSS JOIN : İki tabloyu tüm kombinasyonlarla birleştirir (kartezyen çarpımı yapar).
--ÖRNEK 101: INNER JOIN
Customers tablosundaki müşteri bilgileri ile Orders tablosundaki siparişleri birleştirelim.
-- INNER JOIN sadece eşleşen kayıtları getirir. Yani sadece siparişi olan müşteriler listelenir
select * from customers
select * from orders
SELECT C.CustomerID, C.CompanyName, O.OrderID, O.OrderDate
FROM Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID;
--ÖRNEK 102: INNER JOIN
Orders ve Order Details tablolarını birleştirerek siparişlerdeki ürünleri getirelim.
SELECT O.OrderID, OD.ProductID, OD.UnitPrice, OD.Quantity
FROM Orders O INNER JOIN [Order Details] OD ON O.OrderID = OD.OrderID;
--ÖRNEK 103: INNER JOIN
Orders ve Order Details tablolarını birleştirerek siparişlerdeki ürünleri getirelim.
Sipariş*Miktar yaparak Toplam Fiyatı da listeletelim.
SELECT O.OrderID, OD.ProductID, OD.UnitPrice, OD.Quantity, (OD.UnitPrice * OD.Quantity) AS ToplamFiyat
FROM Orders O INNER JOIN [Order Details] OD ON O.OrderID = OD.OrderID;
--ÖRNEK 104: Ortak sütunu listeletmeden de sorgu çalışır ;)
Products ve Categories tablolarını birleştirerek her ürünün kategorisini görelim.
SELECT P.ProductID, P.ProductName, C.CategoryName
FROM Products P INNER JOIN Categories C ON P.CategoryID = C.CategoryID;
--ÖRNEK 105: RIGHT JOIN
SELECT O.OrderID, C.CustomerID, C.CompanyName
FROM Orders O RIGHT JOIN Customers C ON C.CustomerID = O.CustomerID
--832 kayıt var, aynı sorguyu inner join yapınca 830 kayıt. Çünkü sadece eşleşen kayıtlar gelir.
SELECT O.OrderID, C.CustomerID, C.CompanyName
FROM Orders O JOIN Customers C ON C.CustomerID = O.CustomerID;
--sağlaması
SELECT O.OrderID, C.CustomerID, C.CompanyName
FROM Orders O RIGHT JOIN Customers C ON C.CustomerID = O.CustomerID where orderID is NULL
--ÖRNEK 106: LEFT JOIN
Müşterilerin siparişleri olup olmadığını gösterelim.
Tüm müşteriler listelenir. Siparişi olmayan müşterilerde NULL olur.
SELECT C.CustomerID, C.CompanyName, O.OrderID
FROM Customers C LEFT JOIN Orders O ON C.CustomerID = O.CustomerID;
--ÖRNEK 107: AS kullanımına dikkat!
Products ve Suppliers tablolarını kullanarak ürünlerin tedarikçilerini listeleyelim.
SELECT P.ProductName AS ÜrünAdı, S.CompanyName AS Tedarikçi, S.Country AS ÜLKE
FROM Products P LEFT JOIN Suppliers S ON P.SupplierID = S.SupplierID;
--ÖRNEK 108: FULL JOIN
SELECT C.CustomerID, C.CompanyName, O.OrderID, O.OrderDate
FROM Customers C FULL JOIN Orders O ON C.CustomerID = O.CustomerID;
* Siparişi olan müşteriler listelenir.
* Siparişi olmayan müşteriler de görünür.
* Müşterisi olmayan siparişler de görünür.
* INNER olsaydı NULL olanlar hiç görünmeyecekti
--ÖRNEK 109: CROSS JOIN
SELECT C.CustomerID, C.CompanyName, P.ProductName
FROM Customers C CROSS JOIN Products P;
* Müşteriler ve ürünler tüm kombinasyonlarla listelenir.
* Örneğin 10 müşteri × 5 ürün = 50 satır döner.
--ÖRNEK 110: CROSS JOIN
SELECT C.CustomerID, C.CompanyName, S.ShipperID, S.CompanyName AS Shipper
FROM Customers C CROSS JOIN Shippers S;
::--::--::--:: GROUP BY Kullanımı ::--::--::--::
SQLde GROUP BY ifadesi, aynı değere sahip satırları bir grupta toplamak için kullanılır. Genellikle aggregate (toplulaştırma) fonksiyonlarıyla (COUNT, SUM, AVG, MIN, MAX) birlikte çalışır.
* Verileri kategori, ürün, müşteri gibi ortak bir kritere göre gruplamak için kullanılır.
* Her grup için toplam, ortalama, minimum veya maksimum değerler hesaplanabilir.
--ÖRNEK 111:
Products tablosunda her kategori için kaç ürün olduğunu bulalım.
select * from products where categoryID=1
veya
select count(*) from products where categoryID=2 -- tüm ID'lere karşılık değerler uzun uzun bakılabilir
--group by ile çözüm:
SELECT CategoryID, COUNT(ProductID) AS ToplamUrun
FROM Products GROUP BY CategoryID
--ÖRNEK 112:
Kategori ve tedarikçiye göre toplam ürün sayısını bulalım
(Her kategori ve tedarikçi kombinasyonu için ürün sayısını hesaplamış olacağız)
Örneğin 1.kategoriden hangi tedarikçiden kaç ürün alınmış
select * from products
SELECT CategoryID, SupplierID, COUNT(ProductID) ToplamUrun
FROM Products GROUP BY CategoryID, SupplierID
/* GROUP BY ile Where / Having Kullanımı
WHERE → GROUP BY işleminden önce çalışır ve SATIRLARI filtreler (aggregate fonksiyon kullanılamaz).
HAVING → GROUP BY işleminden sonra çalışır ve GRUPLARI filtreler (aggregate fonksiyon kullanılabilir).
*/
--ÖRNEK 113:
-- WHERE, GROUP BY işleminden önce çalışır ve satırları filtreler.
Fiyatı 20den büyük olan ürünleri alıp, ardından kategoriye göre gruplayalım
SELECT CategoryID, COUNT(ProductID) AS ToplamUrun
FROM Products WHERE UnitPrice > 20 GROUP BY CategoryID;
--ÖRNEK 114:
-- HAVING, GROUP BY işleminden sonra çalışır ve grupları filtreler.
Tüm kategorileri gruplayıp, toplam ürün sayısı 10dan fazla olanları filtreleyelim.
SELECT CategoryID, COUNT(ProductID) AS ToplamUrun
FROM Products GROUP BY CategoryID HAVING COUNT(ProductID) > 10;
--ÖRNEK 115: Group By ile Join Kullanımı
Hangi müşteri kaç sipariş vermiş, en çok sipariş verenleri sıralayalım.
select * from Customers
select * from Orders
SELECT C.CustomerID, C.CompanyName, COUNT(O.OrderID) AS TümSiparişler
FROM Customers C JOIN Orders O ON C.CustomerID = O.CustomerID
GROUP BY C.CustomerID, C.CompanyName ORDER BY TümSiparişler DESC
--ÖRNEK 116:
Her bir kategorideki (Categories) toplam ürün sayısını (Products) listeleyelim.
SELECT C.CategoryName, COUNT(P.ProductID) AS ToplamUrun
FROM Products P JOIN Categories C ON P.CategoryID = C.CategoryID
GROUP BY C.CategoryName ORDER BY ToplamUrun DESC
--ÖRNEK 117:
SELECT S.SupplierID, S.CompanyName, COUNT(P.ProductID) AS UrunSayisi
FROM Products P FULL JOIN Suppliers S ON P.SupplierID = S.SupplierID
GROUP BY S.SupplierID, S.CompanyName HAVING COUNT(P.ProductID) >= 2
ORDER BY UrunSayisi DESC
Yazılan bu sorgu ile:
-> COUNT(P.ProductID) ile her tedarikçinin kaç ürün sağladığı hesaplanır.
->-> HAVING ifadesiyle sadece 2 veya daha fazla ürün sağlayan tedarikçiler filtrelenir.
->->-> FULL JOIN sayesinde ürünsüz tedarikçiler veya tedarikçisiz ürünler de tabloya alınmış olur;
ancak HAVING ile ürün sayısı<2 olanlar elenir.
--ÖRNEK 118:
/* Her müşteri için, her yıl ne kadar harcama yaptığını bul
ve bu toplam tutara göre Altın, Gümüş, Bronz sınıfına ayır.
Yalnızca 10.000 TL üzerinde harcayanları listele.*/
SELECT
C.CompanyName AS MusteriAdi, YEAR(O.OrderDate) AS SiparisYili,
SUM(OD.UnitPrice * OD.Quantity * (1 - OD.Discount)) AS ToplamTutar,
CASE
WHEN SUM(OD.UnitPrice * OD.Quantity * (1 - OD.Discount)) >= 20000 THEN 'Altın'
WHEN SUM(OD.UnitPrice * OD.Quantity * (1 - OD.Discount)) >= 15000 THEN 'Gümüş'
ELSE 'Bronz'
END AS MusteriDegerlendirme
FROM Orders O JOIN Customers C ON O.CustomerID = C.CustomerID
JOIN [Order Details] OD ON O.OrderID = OD.OrderID
GROUP BY C.CompanyName, YEAR(O.OrderDate)
HAVING SUM(OD.UnitPrice * OD.Quantity * (1 - OD.Discount)) > 10000
ORDER BY ToplamTutar DESC;
--AÇIKLAMA:
YEAR(O.OrderDate) : -- Siparişin verildiği yıl (tarihten sadece yıl kısmı alınır).
OD.UnitPrice * OD.Quantity * (1 - OD.Discount): -- Her sipariş satırının net tutarı (iskonto düşülmüş hali).
SUM(...): -- Bu net tutarların toplamı → Yani müşteri o yıl ne kadar harcama yapmış?
HAVING SUM(...) > 10000 : -- Yalnızca toplam alışveriş tutarı 10.000'den büyük olan müşteri–yıl çiftleri gösterilir. (filtreleme gruplandıktan sonra yapıldığı için HAVING kullanılır, WHERE değil).
::--::--::--:: TRANSACTION ::--::--::--::
SQLde TRANSACTION, bir veya birden fazla SQL sorgusunu tek bir mantıksal işlem birimi olarak çalıştırarak veri bütünlüğünü ve tutarlılığını sağlar.
Bu yapı, özellikle birden fazla kullanıcının aynı verilerle çalıştığı durumlarda tutarsızlıkları ve veri kaybını önlemek için önemlidir.
TRANSACTION mekanizması, ACID (Atomicity, Consistency, Isolation, Durability) prensiplerine dayanarak güvenilir veri yönetimi sağlar.
Bir TRANSACTION başladığında :
* Tüm işlemler tamamlanırsa değişiklikler kalıcı olur (COMMIT).
* Herhangi bir hata oluşursa işlemler iptal edilerek önceki duruma geri döndürülür (ROLLBACK).
-- transaction_log:
Transaction Log, SQL veri tabanında gerçekleşen tüm işlemlerin kaydedildiği bir dosyadır. Veri ekleme, güncelleme, silme gibi değişiklikleri takip eder ve bu kayıtlar sayesinde işlemler gerektiğinde geri alınabilir veya geri yüklenebilir. Bu log dosyası, veri güvenliğini artırır ve olası veri kayıplarını önlemeye yardımcı olur.
----------
save transaction noktaismi
commit/rollback transaction nokta_ismi
--ÖRNEK 119:
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 120:
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
--ÖRNEK 121:
Northwind veritabanı üzerinde employees tablosundaki çalışan pozisyonunu değiştirelim.İşlem gerçekleştiyse "Başarılı", gerçekleşmediyse "başarısız" yazdırıp iptal edelim
use northwind
select * from employees
declare @employee_id INT = 1;
declare @new_title NVARCHAR(50) = 'Bilgisayarcı';
Begin transaction
update Employees SET Title = @new_title where EmployeeID = @employee_id;
IF @@rowcount >0
begin
print 'Değişiklik başarılı'
commit transaction
end
else
begin
print 'Değişiklik başarısız'
rollback transaction
end
::--::--:: T-SQL değişken tanımlama ::--::--::
DECLARE komutu, T-SQL de değişken tanımlamak için kullanılan bir komuttur.
* Yerel değişkenin önüne @ işareti gelir.
* Değişkene değer atamak için SET ya da SELECT kullanılır.
Genel kullanım şekli :
DECLARE @degisken_adi veri_tipi
set/select @degisken=atanan_değer
declare @sayi int
declare @karakter varchar(15)
declare @sayi int,@karakter varchar(15)
--ÖRNEK 122:
declare @sayi1 int, @sayi2 int, @toplam int
set @sayi1=35
set @sayi2=75
set @toplam=@sayi1+@sayi2
select @toplam as 'Toplam'
--ÖRNEK 123:
declare @pahali money
select @pahali=max(Freight) from Orders
select @pahali as 'En yüksek fiyat'
--ÖRNEK 124:
select * from products
declare @minfiyat money
declare @maxfiyat money
set @minfiyat = 10.00
set @maxfiyat = 50.00
select productname, unitprice from products
where unitprice between @minfiyat and @maxfiyat
and unitsInstock >0 order by unitprice desc
-- CAST / CONVERT Kullanımı --
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 125: --EK olarak "Select TOP X" kullanımı var örnekte
DECLARE @EnPahaliUrunAdi NVARCHAR(100), @EnPahaliFiyat MONEY;
SELECT TOP 1
@EnPahaliUrunAdi = ProductName,
@EnPahaliFiyat = UnitPrice
FROM Products ORDER BY UnitPrice DESC;
PRINT 'En Pahalı Ürün: ' + @EnPahaliUrunAdi;
PRINT 'Fiyatı: ' + CAST(@EnPahaliFiyat AS VARCHAR);
--ÖRNEK 126:
DECLARE @SiparisSayisi INT, @ToplamTutar MONEY;
-- Toplam sipariş sayısını al
SELECT @SiparisSayisi = COUNT(*) FROM Orders;
-- Tüm siparişlerin toplam tutarını hesapla
SELECT @ToplamTutar = SUM(Freight) FROM Orders;
PRINT 'Toplam Sipariş Sayısı: ' + CAST(@SiparisSayisi AS VARCHAR);
PRINT 'Toplam Sipariş Tutarı: ' + CAST(@ToplamTutar AS VARCHAR);
::--::--::--:: Sistem Fonksiyonları ::--::--::--::
T-SQL de sistem fonksiyonları, SQL Server tarafından sağlanan ve veritabanı
yönetimi ile sorgulama işlemlerini kolaylaştıran önceden tanımlanmış işlevlerdir.
Bu fonksiyonlar sorgular, saklı yordamlar ve diğer T-SQL kodları içinde kullanılabilir.
Farklı görevleri yerine getiren bu fonksiyonlar çeşitli kategorilere ayrılmıştır :
-- Dizgi Fonksiyonları:
Metin işleme işlemleri için kullanılır.
(Örn: LEN(), SUBSTRING(), REPLACE())
-- Matematiksel Fonksiyonlar:
Sayısal işlemler için kullanılır.
(Örn: ABS(), CEILING(), ROUND())
-- Tarih ve Saat Fonksiyonları:
Tarih ve saat bilgileriyle çalışır.
(Örn: GETDATE(), DATEADD(), DATEDIFF())
-- Dönüştürme Fonksiyonları:
Veri türü dönüşümlerini sağlar.
(Örn: CAST(), CONVERT())
-- Sistem Fonksiyonları:
SQL Server hakkında bilgi verir.
(Örn: @@VERSION, DB_NAME(), OBJECT_ID())
Sistem fonksiyonları, SQL Server yönetimi ve performans takibi için de önemlidir.
Örneğin:
OBJECT_ID('TabloAdi'): Belirtilen nesnenin ID değerini döndürür.
DB_NAME(): Geçerli veritabanının adını verir.
DATABASEPROPERTYEX('VeritabanıAdi', 'Durum'): Veritabanının özellikleri hakkında bilgi sağlar.
-- Önemli Sistem Değişkenleri
Sistem değişkenleri, SQL Server hakkında anlık bilgi sağlayan ve
tüm kullanıcılar tarafından erişilebilen özel değişkenlerdir.
İşte bazı önemli sistem değişkenleri :
-- Hata Yönetimi
@@ERROR : Son yürütülen SQL ifadesinde oluşan hata kodunu döndürür.
--ÖRNEK 127:
SELECT 10 / 0 -- Hata oluşturur
SELECT @@ERROR -- Hata kodunu döndürür
-- Sunucu Bilgileri
@@SERVERNAME : SQL Server örneğinin adını döndürür.
@@SERVICENAME : SQL Server hizmet adını getirir.
@@VERSION : SQL Server sürüm bilgilerini verir.
--ÖRNEK 128:
SELECT @@SERVERNAME AS 'Sunucu Adı', @@SERVICENAME AS 'Servis Adı', @@VERSION AS 'Sürüm'
-- Dil ve Bölgesel Ayarlar
@@LANGUAGE: Geçerli dilin adını döndürür.
@@LANGID: Geçerli dilin Microsoft LCID (Language Code Identifier) değerini döndürür.
--ÖRNEK 129:
SELECT @@LANGUAGE AS 'Kullanılan Dil', @@LANGID AS 'Dil Kimliği'
-- Bağlantı ve Performans Bilgileri
@@MAX_CONNECTIONS: SQL Server a aynı anda bağlanabilecek maksimum bağlantı sayısını verir.
@@DATEFIRST: Haftanın ilk gününü belirler (1: Pazartesi, 7: Pazar).
@@ROWCOUNT: Son yürütülen sorgunun etkilediği satır sayısını döndürür.
--ÖRNEK 130:
DELETE FROM personel WHERE adi LIKE '%a%'
SELECT @@ROWCOUNT AS 'Etkilenen Satır Sayısı'
-- Diğer Kullanışlı Sistem Fonksiyonları
SESSION_USER: Geçerli oturumun kullanıcı adını döndürür.
SUSER_NAME(): Geçerli oturumun güvenlik kimliğini döndürür.
HOST_NAME(): SQL Servera bağlanan istemcinin bilgisayar adını getirir.
--ÖRNEK 131:
SELECT SESSION_USER AS 'Kullanıcı', SUSER_NAME() AS 'Güvenlik Kimliği',
HOST_NAME() AS 'İstemci Bilgisayarı'
--ÖRNEK 132:
SQL Serverdaki hata ve sistem mesajlarını içeren sys.messages sistem görünümündeki
tüm kayıtları listelemek için kullanılır.
select * from sys.messages
-- ÖRNEK 133:
select 10/0
select * from master.dbo.sysmessages where ERROR=@@ERROR
--ÖRNEK 134:
select @@MAX_CONNECTIONS
::--::--::--:: 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-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 135:
declare @deger int
set @deger=30
go
select @deger
::--::--:: Print ile ekrana mesaj yazdırma ::--::--::
--ÖRNEK 136:
select 'aliosmangokcan.com'
print 'aliosmangokcan.com'
--ÖRNEK 137:
declare @sayi1 int, @sayi2 int,@sayi3 int
set @sayi1=22
set @sayi2=44
set @sayi3=@sayi1*@sayi2
print 'Çarpım'
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 138:
declare @personel table(
no int identity(1,1),
ad_soyad varchar(100) not null,
yas int)
insert into @personel values ('Mehmet Akif', 65)
insert into @personel values ('Oktay Sinanoğlu', 22)
select * from @personel order by ad_soyad
--ÖRNEK 139:
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 ('Bu Ülke','Cemil','Meriç',350,40)
insert into kitap values ('Dünya Nöbeti','Alev','Alatlı',200,30)
insert into kitap values ('Mimarlık ve Felsefe','Dücane','Cündioğlu',400,55)
insert into kitap values ('Yakın Tarihin Gerçekleri','İlber','Ortaylı',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 140:
kitap tablosuna yeni bir kitap kaydı ekleyip ve eklenen bu kaydın "ad" ve "fiyat" bilgilerini @eklenenler geçici tablosuna çıkış olarak alınız. @eklenenler değişkeni ve kitap tablosunun içeriğini listeletiniz.
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 141:
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 142:
"kitap" tablosundaki fiyat değerlerine bağlı olarak :
Eğer fiyatı 5 ten küçük bir kitap varsa, "Bedava kitap var" mesajını yazdırın;
aksi halde, fiyatı 10 dan büyük veya eşit olan kitapların fiyatlarını seçip
"Kitap fiyatları pahalı" mesajını yazdırın.
if exists (select * from kitap where fiyat<5)
Print 'Bedava kitap var'
else
begin
select fiyat from kitap where fiyat>=10
print 'Kitap fiyatları pahalı'
end
--ÖRNEK 143:
declare @ktp_sayisi varchar(10)
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 'Kitap sayısı yeterli'
end
else
begin
print 'Kitap sayısı : '+ @ktp_sayisi
print 'Kitap sayısı fazla'
end
--ÖRNEK 144: Önceki örneğin nortwhwind versiyonu
DECLARE @urun_sayisi varchar(10)
SELECT @urun_sayisi = COUNT(*) FROM Products
IF (@urun_sayisi <= 10)
BEGIN
PRINT 'Ürün Sayısı : ' + @urun_sayisi
PRINT 'Ürün sayısı az'
END
ELSE IF (@urun_sayisi > 10 AND @urun_sayisi <= 50)
BEGIN
PRINT 'Ürün Sayısı : ' + @urun_sayisi
PRINT 'Ürün sayısı yeterli'
END
ELSE
BEGIN
PRINT 'Ürün Sayısı : ' + @urun_sayisi
PRINT 'Ürün sayısı fazla'
END
--ÖRNEK 145:
DECLARE @CustomerID NVARCHAR(5);
DECLARE @TotalAmount DECIMAL(10,2);
DECLARE @Status NVARCHAR(20);
-- Kontrol edilecek müşteri ID'si
SET @CustomerID = 'ALFKI';
-- Toplam sipariş tutarını hesapla
SELECT @TotalAmount = SUM(OD.UnitPrice * OD.Quantity)
FROM Orders O JOIN [Order Details] OD ON O.OrderID = OD.OrderID
WHERE O.CustomerID = @CustomerID;
-- IF-ELSE yapısı ile müşteri durumunu belirle
IF @TotalAmount >= 10000
SET @Status = 'VIP Müşteri';
ELSE
SET @Status = 'Standart Müşteri';
-- Sonucu göster
SELECT @CustomerID AS MüşteriID, @TotalAmount AS ToplamSiparişTutarı, @Status AS MüşteriDurumu;
::--::--::--:: 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 146:
Kitap tablosundaki kitap adı, yazar adı, fiyat sütunları listelenirken,
GÖRÜŞ isimli bir sütunda case-when-then kullanılarak aşağıda belirtilen
şartlara göre fiyat görüşleri listelensin. Şartlar :
--aşağıdaki değerler temsilidir. Herkes kendi tablosundaki değerlere göre ayarlama yapsın.
100TL den fazla ise pahalı,
50 - 100TL ise normal,
10 - 50TL ise ucuz,
10dan az ise bedava yazsın.
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
--ÖRNEK 147: Önceki örneğin Northwind uyarlaması
select customerID, ShipName, Freight, 'GÖRÜŞ'=
case
when freight >500 then 'PAHALI'
when freight>300 and freight<=500 then 'NORMAL'
when freight>100 and freight<=300 then 'UCUZ'
ELSE 'BEDAVA'
end
from orders
::--::--:: 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
--ÖRNEK 148:
1den 10a kadar olan sayıların karesini alalım
declare @sayac int
set @sayac=1
while @sayac<=10
begin
print cast(@sayac as varchar(10)) + ' karesi : ' + cast(@sayac*@sayac as varchar(10))
set @sayac=@sayac+1
end
--ÖRNEK 149:
Kitap tablosundaki fiyat ortalaması 57TL ü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 150: Önceki örneğin northwind versiyonu
SELECT 'Ortalama Fiyat = ' + CAST(AVG(UnitPrice) AS VARCHAR(15)) AS OrtalamaFiyat
FROM Products;
-- 2. Ortalama 500'den küçük olduğu sürece fiyatları %3 artır
WHILE (SELECT AVG(UnitPrice) FROM Products) <= 500
BEGIN
UPDATE Products
SET UnitPrice = UnitPrice * 1.03; -- %3 zam
SELECT ProductName, UnitPrice FROM Products
END
-- 3. Yeni ortalamayı yazdıralım
SELECT 'Yeni Ortalama Fiyat = ' + CAST(AVG(UnitPrice) AS VARCHAR(15)) AS YeniOrtalama FROM Products
--ÖRNEK 151: 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
--veya
declare @sayac int
set @sayac=1
while @sayac<=10
begin
print cast (@sayac as varchar(10)) + ' karesi : '+ cast(@sayac*@sayac as varchar(10))
set @sayac=@sayac+1
if @sayac=8 break
end
--ÖRNEK 152: continue kullanımı1
1den 10a kadar sayıların karesi alınır, 8 hariç
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
--ÖRNEK 153: continue kullanımı2
1den 10a kadar sayıların karesi alınır, 8 hariç
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
::--::--::--:: 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 154:
waitfor time '14:53:00' -- kodlar 14.53'te çalışır
waitfor delay '14:53:00' -- kodlar 14 saat 53dk 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.
3 çeşit Stored Procedure var :
-- 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 155:
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 156:
sp_addmessage 50002,16,'Yeni mesajı buraya yazdık',@with_log=TRUE,@replace='REPLACE'
--ÖRNEK 157:
sp_addtype sayi,int,'null'
aktif veri tabanında yeni veri tipi oluşturuyor
--test
create table abc(
fiyat sayi,
ad varchar)
--ÖRNEK 158:
sp_configure 'user options',10
--ÖRNEK 159:
sp_configure 'remote access',0
--ÖRNEK 160:
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 store procedure 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 161:
create procedure listele
as
select * from kitap where yazar_adi like '%h%'
exec listele
listele
--ÖRNEK 162:
alter procedure listele
as
select * from kitap where yazar_adi like '%a%'
listele
--ÖRNEK 163:
drop procedure listele
::--::--:: 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 164:
create procedure toplam(@sayi1 int, @sayi2 int,@sonuc int output)
as
set @sonuc=@sayi1+@sayi2
--test
declare @a int
exec toplam 75,85,@a output --output opsiyonel ;)
print @a
--ÖRNEK 165:
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))
--test
declare @a int
exec carpma 5,10,15,@a output
--ÖRNEK 166:
create procedure kitapbul(@yazar varchar(41))
as
select * from kitap where yazar_adsoyad=@yazar
--test
kitapbul 'Cemil'
--ÖRNEK 167:
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)
--ÖRNEK 168: önceki örneğin Northwind uyarlaması
Products tablosunda bir ürün adı (ProductName) aranır.
Varsa : Fiyatı (UnitPrice) 5 birim artırılır.
Yoksa : Yeni bir ürün olarak eklenir.
CREATE PROCEDURE urun_bul (@urun varchar(40))
AS
BEGIN
IF (SELECT COUNT(*) FROM Products WHERE ProductName = @urun) > 0
-- Ürün varsa fiyatı 5 birim artır
UPDATE Products
SET UnitPrice = UnitPrice + 5
WHERE ProductName = @urun;
ELSE
-- Ürün yoksa yeni ürün ekle
INSERT INTO Products (ProductName, UnitPrice, Discontinued)
VALUES (@urun, 50, 0);
END
--test
-- Mevcut bir ürünü kontrol et ve işle
EXEC urun_bul 'Chai';
select * from products where productname='Chai'
-- Yeni bir ürün ekle (Yoksa)
select * from products where productname='Uzem'
EXEC urun_bul 'Uzem';
::--::--:: EXTENDED STORED PROCEDURE ::--::--::
Genişletilmiş Saklı Yordamlar, SQL Server dışındaki DLL dosyaları (genellikle C/C++ ile yazılmıştır) aracılığıyla çalışan sistem tabanlı fonksiyonlardır. Artık modern sistemlerde pek önerilmeseler de bazıları halen xp_ ön ekiyle kullanılabilir.
Not1: xp_cmdshell varsayılan olarak devre dışıdır. Aşağıdaki komutlarla etkinleştirilir :
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
Not2: xp_cmdshell kullanımı sistem üzerinde tam yetkili işlem yapılmasına izin verdiği için, SQLServer yöneticisi (sysadmin) dışında kimseye açılmamalıdır.
-- ÖRNEK 169: xp_cmdshell ile dış komut çalıştırma
Komut satırında çalışan işlemi SQL üzerinden çalıştır
EXEC xp_cmdshell 'dir C:\'
--ÖRNEK 170: Bilgisayar adını alma
EXEC xp_cmdshell 'hostname'
-- ÖRNEK 171: Ping ile bağlantı testi
EXEC xp_cmdshell 'ping www.google.com'
--ÖRNEK 172: Kullanıcı adını alma (whoami)
EXEC xp_cmdshell 'whoami'
-- ÖRNEK 173: WHILE döngüsü ile zamanlanmış ping işlemi
DECLARE @i INT = 1;
WHILE @i <= 3
BEGIN
PRINT 'Ping denemesi: ' + CAST(@i AS VARCHAR)
EXEC xp_cmdshell 'ping www.aliosmangokcan.com -n 1' -- sadece 1 ping atar
SET @i = @i + 1
WAITFOR DELAY '00:00:02' -- 2 saniye bekle
END
-- ÖRNEK 174: Extended SP içeren Stored Procedure tanımlama
CREATE PROCEDURE sistem_bilgi_getir
AS
BEGIN
PRINT 'Sunucu adı:';
EXEC xp_cmdshell 'hostname';
PRINT 'Oturum açan kullanıcı:';
EXEC xp_cmdshell 'whoami';
END
-- Test et
EXEC sistem_bilgi_getir
::--::--:: 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 ifadeleri 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)
--ÖRNEK 175:
"Product" tablosundaki bir ürünün fiyatını iki katına
çıkaran bir scalar-valued function kullanımına örnek :
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:
--test
SELECT dbo.DoublePrice(1) as 'Yeni Fiyat'
--ÖRNEK 176:
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 177:
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
--fonksiyonun test edilmesi
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.
--ÖRNEK 178:
"OrderDetails" tablosundaki bir siparişin tüm ayrıntılarını
içeren bir table-valued function kullanımı :
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 :
--test
SELECT * FROM dbo.GetOrderDetails(1)
--ÖRNEK 179:
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 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 180:
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 @musteriID NVARCHAR(5)
DECLARE @sirket NVARCHAR(40)
DECLARE imlec CURSOR FOR
SELECT CustomerID, CompanyName FROM Customers
OPEN imlec
FETCH NEXT FROM imlec INTO @musteriID, @sirket
WHILE @@FETCH_STATUS = 0
BEGIN
-- İşlemler burada yapılır
PRINT 'Müşteri (CustomerID): ' + @musteriID + ', Şirket Adı: ' + @sirket
FETCH NEXT FROM imlec INTO @musteriID, @sirket
END
CLOSE imlec
DEALLOCATE imlec
--ÖRNEK 181:
Bir önceki Cursor örneğinin yaptığı işlemi yapan bir t-sql örneğidir.
DECLARE @musteriID NVARCHAR(5)
DECLARE @sirket NVARCHAR(40)
DECLARE @rowCount INT = 1
SELECT TOP 1 @musteriID = CustomerID, @sirket = CompanyName FROM Customers
ORDER BY CustomerID
WHILE @rowCount > 0
BEGIN
IF @musteriID IS NOT NULL AND @sirket IS NOT NULL
BEGIN
-- İşlemler burada yapılır
PRINT 'Müşteri (CustomerID): ' + @musteriID + ', Şirket Adı: ' + @sirket
END
SELECT TOP 1 @musteriID = CustomerID, @sirket = CompanyName FROM Customers
WHERE CustomerID > @musteriID
ORDER BY CustomerID
SELECT @rowCount = @@ROWCOUNT
END
::--::--:: 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 herhangibir ş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.
--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 182:
create trigger silme_engeli
on database
for drop_table
as
begin
print 'Tablo silme işlemi engellendi'
rollback
end
--test
drop table abc
--ÖRNEK 183:
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 184:
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)
--ÖRNEK 185:
CREATE TRIGGER kontrol
ON Products
INSTEAD OF INSERT
AS
BEGIN
DECLARE @ProductName NVARCHAR(40), @SupplierID INT,
@CategoryID INT, @QuantityPerUnit NVARCHAR(20),
@UnitPrice MONEY, @UnitsInStock SMALLINT, @UnitsOnOrder SMALLINT,
@ReorderLevel SMALLINT, @Discontinued BIT
SELECT @ProductName = ProductName,
@SupplierID = SupplierID, @CategoryID = CategoryID,
@QuantityPerUnit = QuantityPerUnit, @UnitPrice = UnitPrice,
@UnitsInStock = UnitsInStock, @UnitsOnOrder = UnitsOnOrder,
@ReorderLevel = ReorderLevel, @Discontinued = Discontinued
FROM inserted
IF EXISTS(SELECT * FROM Products WHERE ProductName = @ProductName)
BEGIN
PRINT 'Aynı isimde bir ürün var zaten'
END
ELSE
BEGIN
INSERT INTO Products (ProductName, SupplierID, CategoryID, QuantityPerUnit,
UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued)
SELECT ProductName, SupplierID, CategoryID, QuantityPerUnit,
UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued
FROM inserted
END
END
select * from products
insert into products values ('laptop',1,2,155,35000,50,0,10,1)
::--::--:: 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 186:
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 187: 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 188:
sp_depends kitap
::--::--:: INSERT tetikleyiciler ::--::--::
--ÖRNEK 189:
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 190:
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 191:
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 192:
Customers tablosuna yeni kayıt eklenmek istendiğinde,
bu kayıtlar otomatik olarak büyük harfe çevrilerek tabloya eklenir.
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
-- ÖRNEK 193:
Eğer Employees tablosundaki bir çalışanın LastName değeri değişirse, EmployeeLog adında özel bir tabloya bu değişiklik log olarak yazılsın.
--önce bir log tablosu oluşturalım
CREATE TABLE EmployeeLog (
LogID int identity primary key,
EmployeeID int,
OldLastName varchar(50),
NewLastName varchar(50),
ChangeDate datetime default getdate() );
-- Önce varsa eski trigger'ı sil
IF EXISTS (SELECT * FROM sys.triggers WHERE name = 'trg_LastName_Update')
DROP TRIGGER trg_LastName_Update;
GO
-- Trigger oluştur
CREATE TRIGGER trg_LastName_Update
ON Employees
AFTER UPDATE
AS
BEGIN
-- Sadece LastName güncellenmişse ve bir satır varsa
IF UPDATE(LastName)
BEGIN
INSERT INTO EmployeeLog (EmployeeID, OldLastName, NewLastName)
SELECT d.EmployeeID, d.LastName, i.LastName
FROM deleted d
JOIN inserted i ON d.EmployeeID = i.EmployeeID
WHERE d.LastName <> i.LastName;
END
END
--test
UPDATE Employees SET LastName = 'Smith' WHERE EmployeeID = 5
select * from employees
--kontrol
SELECT * FROM EmployeeLog
::--::--:: 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 194:
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 195:
exec sp_rename kontrol, kontrol_var
--kontrol isimli trigger kontrol var şeklinde değiştirilir.
::--::--:: Tetikleyicinin Silinmesi ::--::--::
--ÖRNEK 196:
drop trigger kontrol
--ÖRNEK 197:
drop trigger db_engeli on ALL SERVER
::--::--:: Tetikleyicinin Aktifleştirilmesi / Pasifleştirilmesi ::--::--::
--ÖRNEK 198:
kitap tablosundaki tüm tetikleyiciler pasifleştirilir
alter table kitap disable trigger all
--ÖRNEK 199:
alter table kitap disable trigger kontrol
--ÖRNEK 200:
alter table kitap enable trigger kontrol
::--::--:: View (Hayali Tablolar) ::--::--::
Görünüm (view), veritabanı sistemlerinde kullanılan ve belirli bir SQL
sorgusunun sonucunu sanal bir tablo olarak saklayan bir veritabanı
nesnesidir. Görünümler, tabloların içeriğini özetlemek, birleştirmek
veya filtrelemek için kullanılır ve gerçek tablo gibi sorgulanabilirler,
ancak verilerinin kendisi fiziksel olarak saklanmaz.
create view view_adı
as
sql_sorgusu
-- view oluştururken order by kullanılamaz ama view ile listeleme yapılırken
--order by kullanılabilir
--ÖRNEK 201:
select * from Products
select * from categories
select productname, unitprice, categoryname
from products inner join Categories on products.CategoryID = Categories.CategoryID
--yukarıdaki sorguyu view'e dönüştürelim:
create view pro_cat
as
select productname, unitprice, categoryname
from products inner join Categories on products.CategoryID = Categories.CategoryID
--test
select * from pro_cat
--ÖRNEK 202:
select * from [Orders Qry] order by 2 desc --hazır view
--ÖRNEK 203:
Customers ve Orders tablolarını kullanarak bir VIEW oluşturalım.
CREATE VIEW musteri_siparis AS
SELECT CompanyName, OrderID, OrderDate, ShipCountry, CustomerID
FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
select productname, unitprice, categoryname
from products inner join categories on products.categoryID = categories.categoryID
--test
select * from musteri_siparis
--ÖRNEK 204:
Bu view, Northwind veritabanındaki "Customers", "Orders", "Order Details" ve
"Products" tablolarını birleştirir. Görünümde müşteri bilgileri, sipariş
bilgileri ve sipariş edilen ürünlerin detayları yer almaktadır.
CREATE VIEW CustomerOrders AS
SELECT
Customers.CustomerID,
Customers.CompanyName,
Orders.OrderID,
Orders.OrderDate,
Orders.ShippedDate,
[Order Details].ProductID,
Products.ProductName,
[Order Details].UnitPrice,
[Order Details].Quantity,
[Order Details].Discount
FROM
Customers
INNER JOIN
Orders ON Customers.CustomerID = Orders.CustomerID
INNER JOIN
[Order Details] ON Orders.OrderID = [Order Details].OrderID
INNER JOIN
Products ON [Order Details].ProductID = Products.ProductID;
--test
SELECT * FROM CustomerOrders
--ÖRNEK 205:
CREATE VIEW OrderDetails AS
SELECT
Orders.OrderID,
Orders.OrderDate,
Orders.ShippedDate,
Customers.CustomerID,
Customers.CompanyName,
Customers.ContactName,
Customers.Country,
Employees.EmployeeID,
Employees.FirstName,
Employees.LastName
FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
--AÇIKLAMA:
1. JOIN : Orders tablosundaki CustomerID ile Customers tablosundaki CustomerID değerlerini eşleştirir. Böylece her siparişin hangi müşteri tarafından verildiği bulunur.
2. JOIN : Orders tablosundaki EmployeeID ile Employees tablosundaki EmployeeID değerlerini eşleştirir. Böylece her siparişin hangi çalışan tarafından işlendiği bulunur.
--test
SELECT * FROM OrderDetails
/* www.aliosmangokcan.com */
/* Bu e-Posta adresi istenmeyen posta engelleyicileri tarafından korunuyor. Görüntülemek için JavaScript etkinleştirilmelidir. */
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ı'