TEMEL SQL KOMUTLARI VE BILGILERI
Merhabalar Bu yazımda temel sql komutlarından başlayarak sql de sıklıkla kullanılan çoğu komut hakkında kısa ve açıklayıcı bilgilere değineceğim , uzun bir yazı olacak kısa kısa ama fazla bilgiler olan bir not alma yazısı gibi olacak , faydalı olması dileğiyle .
SQL SELECT
Veri tabanındaki tablolardan verileri okumaya yarar .
SELECT * FROM tablo_adi – Yıldız (*) ile tablodaki tüm sütunları görüntüleriz.
-- SELECT * FROM Ogrenciler --www.salihseker.com --
Sadece belirli sütunları listelemek için istenen sütunların adları yazılır.
-- SELECT OgrenciId , Email FROM Ogrenciler --www.salihseker.com --
[raw] [/raw]
SQL DISTINCT
-- SELECT DISTINCT OgrenciId , Email FROM Ogrenciler --www.salihseker.com --
DISTINCT ifadesi tablodaki belirtilen alanda bulunan kayıtlardan birer örnek alır. Çiftleyen satır varsa sadece 1 tanesini ekrana yazdırır.
SQL WHERE
Sql cümlemizde şart belirlememize yarar Örn :
-- SELECT * FROM Ogrenciler WHERE Email = 'salihseker35@gmail.com' --www.salihseker.com --
Email i ‘salihseker35@gmail.com olanları listele .
SQL AND ve OR
AND operatörü birinci durumla beraber ikinci durumunda olduğu zaman kullanılır. OR operatörü ise birinci durum veya ikinci durumun gerçekleşmesi durumunda kullanılır . (AND = VE , OR = VEYA)
-- SELECT * FROM Ogrenciler WHERE Email = 'salihseker35@gmail.com' AND OgrenciNo = 11111 --www.salihseker.com --
Email = ‘salihseker35@gmail.com’ ve OgrenciNo = 11111 olan listeyi getirir.
-- SELECT * FROM Ogrenciler WHERE Email = 'salihseker35@gmail.com' OR OgrenciNo = 33333 --www.salihseker.com --
Email = ‘salihseker35@gmail.com’ VEYA OgrenciNo = 33333 olan listeyi getirir.
[raw] [/raw]
SQL ORDER BY
ORDER BY ifadesi kayıtları belirtilen alanda büyükten küçüğe veya küçükten büyüğe göre sıralar. ASC (ascending) parametresi ile küçükten büyüğe, DESC (descending) parametresi ile büyükten küçüğe göre sıralar.
-- SELECT * FROM Ogrenciler ORDER BY OgrenciId ASC --www.salihseker.com --
-- SELECT * FROM Ogrenciler ORDER BY OgrenciId DESC --www.salihseker.com --
SQL INSERT INTO
Birinci yöntem: Bu yöntemde direk tablo adı belirterek sadece değerleri yazmak surtiyle kayıt ekleyebiliriz. Ancak burada dikkat edeceğimiz nokta eklenecek değer tablomuzdaki alan sırasına göre olmalıdır
INSERT INTO [tablo adı](alan adları) VALUES (veriler)
-- INSERT INTO Ogrenciler VALUES (2,'TEST ADI',44444,'TEST@TEST.COM') --www.salihseker.com --
Ogrenci İd si otomatik artan olduğu için insert ederken ekleyemeyiz.
İkinci yöntem: Bu yöntemde ise eklenecek alanları ve değerleri kendimiz belirtiriz. Burada dikkat edilmesi gereken şey; yazdığımız alan adının sırasına göre değerleri eklememiz olacaktır , insert işlemlerinde tavsiye edilen şlem buduru , ileride tablolara eklenecek yeni bir alan olursa bu şekilde kullanılan insertlerde problem yaşamazsınız.
-- INSERT INTO Ogrenciler(AdiSoyadi,Email,OgrenciNo) VALUES ('testadi 2','test2@mail.com',55555) --
Burada göreceğiniz gibi tabloya ekleme işleminde insert komutunda verdiğim sıra ile değerlerin eklemesini yaptım.
[raw] [/raw]
SQL INSERT INTO SELECT KULLANIMI
Bu yöntem ile tek tek insert eklemek yerine bir tabloya select çekerek birden fazla satırı tek seferde insert edeceğiz , select ten gelen tabloyu insert edeceğiz.
Örnek için : Yeni_Ogrenciler adında bir tablo oluşturdum , Ogrenciler tablomdan tek farkı Kayit_Tarihi adında yeni bir sütunum var , Ogrenciler tablosundaki verilerin tamamını Yeni_Ogrenciler Tablosuna tek seferde insert edeceğim , kayıt tarihi bilgisinide GETDATE() fonksyonu ile şu anki tarihi eklemesini sağlayacağım.
Öncelik olarak ekleme yapacağım select ifadesini yazıyorum.
-- SELECT AdiSoyadi , OgrenciNo , Email , GETDATE() FROM Ogrenciler --
-- INSERT INTO Yeni_Ogrenciler ( AdiSoyadi , OgrenciNo , Email ,Kayit_Tarihi ) SELECT AdiSoyadi , OgrenciNo , Email , GETDATE() FROM Ogrenciler --
Select sorgumuzdan gelen tablomuzu toplu olarak insert ettik
SQL UPDATE
Güncelleme işlemi içiin update komutunu kullanıyoruz.
-- UPDATE Tablo_adi SET alan1 = yeni_deger1 , alan2 = yeni_deger2 WHERE Koşul UPDATE Ogrenciler SET AdiSoyadi = 'Süleyman ŞEKER' , Email = 'suleymanseker@gmail.com' WHERE OgrenciNo = '11111' --www.salihseker.com --
SQL DELETE
Tablodan satır silmek için Delete komutu kullanılır.
-- DELETE FROM Tablo_adi WHERE Koşul --www.salihseker.com DELETE FROM Ogrenciler WHERE OgrenciNo = '11111' --
[raw] [/raw]
TRUNCATE TABLE Kullanım Biçimi
Eğer tablomuzu değil de sadece içindeki kayıtları silmek istiyorsak yani tablomuzun içini boşaltmak istiyorsak aşağıdaki kodu kullanabiliriz:
-- TRUNCATE TABLE tablo_adi --Örn : TRUNCATE TABLE Yeni_Ogrenciler --www.salihseker.com --
SQL SELECT TOP
SELECT TOP ile belirtilen kadar kayıt seçilir.
-- SELECT TOP 3 * FROM Ogrenciler --www.salihseker.com --
YÜZDE OLARAK
-- SELECT TOP 25 Percent * FROM Ogrenciler --www.salihseker.com --
SQL LIKE
Where koşulu ile birlikte kullanılan bir koşul ifadesidir , ‘%’ yüzde işareti ile birlikte kullanılır .
Örneklerle açıklayacak olursak :
-- SELECT * FROM Ogrenciler WHERE Email LIKE 't%' --t harfi ile başlayan email adresleri olan kayıtları listeler. SELECT * FROM Ogrenciler WHERE Email LIKE '%gmail.com' --www.salihseker.com --gmail.com ile biten email adresleri olan kayıtları listeler. SELECT * FROM Ogrenciler WHERE Email LIKE '%mail%' --www.salihseker.com --Email alanında mail içeren kayıtları listeler. SELECT * FROM Ogrenciler WHERE Sehir LIKE 'İ%' SELECT * FROM Ogrenciler WHERE Bolum NOT LIKE '%Yönetici%' SELECT * FROM Ogrenciler WHERE Sehir LIKE 'İzmi_' --www.salihseker.com --Bu kod Sehir alanının İzmi ile başlayan ve son harfi ne olursa olsun farketmeyen kayıtları seçer. SELECT * FROM Personel WHERE Adi_soyadi LIKE '[S,A]%' --www.salihseker.com --Bu kod Adi_soyadi alanındaki ilk harfi S veya A ile başlayan kayıtları seçer. --
SQL IN Kullanımı
IN operatörü belirtilen tek bir alanda birden fazla değeri aramak için kullanılır.
-- SELECT * FROM Ogrenciler WHERE Sehir IN ( 'İstanbul','Kocaeli') --www.salihseker.com --
[raw] [/raw]
SQL BETWEEN Kullanımı
Between operatörü ile bir alanda belirtilen aralıktaki değerleri aramak için kullanılır.
-- SELECT * FROM Ogrenciler WHERE Not_Ortalama BETWEEN 45 AND 80 SELECT AdiSoyadi, Sehir FROM Ogrenciler WHERE Sehir BETWEEN 'A' AND 'K' SELECT AdiSoyadi, Sehir FROM Ogrenciler WHERE Sehir NOT BETWEEN 'A' AND 'K' --
Bu kod ile Sehir alanındaki kayıtlardan A ile K harfi arasındaki harflerden herhangi bir harf ile başlamayan kayıtlar seçilmektedir. NOT kelimesi yapılan işlemin olumsuz yani şartlara uymayan halini işler.
SQL AS Alias Kullanımı
AS ifedesi ile uzun ve kullanımı zor olan tablo veya alan adlarına geçici olarak kısa isimler vererek bunları kodlamalarımızda kullanabiliriz
-- SELECT AdiSoyadi AS [Ögrenci Adı], Sehir AS [Bulundugu Sehir ]FROM Ogrenciler --
Köşeli PARANTEZ [ ]
Verilecek olan geçici ad eğer boşluk içeriyorsa köşeli parantez içinde yazılır. Tablodaki alan adlarında Türkçe karakter kullanımına izin verilmemektedir. Bu tip durumlarda AS ifadesi ile geçici bir isim verip yazdığımız uygulamada kullanabiliriz.
Tabloların ve verilerin arasına As koymadan sadece boşluk bıraktığımız dada AS Gibi çalışır.
SQL INNER JOIN
İki adet tablomuzdaki kayıtları belli bir kritere göre birleştirmek için INNER JOIN komutu kullanılır.
NOT: INNER JOIN yerine sadece JOIN kullanılabilir.
-- SELECT * FROM Ogrenciler ORG INNER JOIN Yeni_Ogrenciler YORG ON ORG.OgrenciId = YORG.OgrenciId --
SQL LEFT JOIN
Burada asıl olan birinci tablodaki kayıtlardır. İkinci tablodan sadece birinci tabloda olan kayıtlar alınır. İkinci tabloda olupta birinci tabloda olmayan alanların değeri boş (NULL) olarak gelecektir.
-- SELECT alan_ad(lari) FROM tablo1 LEFTJOIN tablo2 ON tablo1.alan_adi=tablo2.alan_adi SELECT * FROM Ogrenciler ORG LEFT JOIN Yeni_Ogrenciler YORG ON ORG.OgrenciId = YORG.OgrenciId --www.salihseker.com --
SQL RIGHT JOIN
-- SELECT alan_ad(lari) FROM tablo1 RIGHTJOIN tablo2 ON tablo1.alan_adi=tablo2.alan_adi SELECT * FROM Ogrenciler ORG RIGHT JOIN Yeni_Ogrenciler YORG ON ORG.OgrenciId = YORG.OgrenciId --www.salihseker.com --
SQL FULL JOIN
FULL JOIN ile iki adet tablomuzdaki kayıtları belli bir kritere göre birleştirebiliriz.
-- SELECT * FROM Ogrenciler ORG FULL JOIN Yeni_Ogrenciler YORG ON ORG.OgrenciId = YORG.OgrenciId --www.salihseker.com --
[raw] [/raw]
SQL UNION
UNION ile iki adet tablomuzdaki seçeceğimiz alanları birleştirerek tek bir tablo alanıymış gibi kullanabiliriz.
-- SELECT Sehir FROM Personel UNION SELECT Sehir FROM Ogrenciler --www.salihseker.com --
İki tablodaki şehirleri birleştirerek tek tabloada gösterir çift kayıtlar tekrarlanmaz
Eğer tekrarlayan kayıtların alınması isteniyorsa UNION ALL kullanılmalıdır.
Dikkat edilmesi gerekenler , birleştirilen alanların sütun sayısı ve data_tipleri aynı olmalıdır.
SQL SELECT INTO
Tablo kopyalayıp yeni bir tablo oluşturur
SELECT INTO ifadesi ile bir tablodaki verileri alıp yeni bir tablo oluşturup içine kopyalayabiliriz. Sonuçta veritabanında yeni bir tablo oluşturulacağı için veritabanı üzerinde işlem yapan kullanıcının yeni bir tablo oluşturma yetkisine sahip olması gerekmektedir.
SELECT alan_ad(lari) INTO yeni_tablo_adi [IN hedef_database] FROM tablo1
NOT 1: Eğer yeni oluşturacağımız tablo aynı veritabanı içindeyse [IN hedef_database] ifadesi kullanılmaz. Eğer farklı bir veritabanı içine kopyasını alacaksak o zaman IN operatörü ile hedef veritabanını belirtmemiz gerekir.
NOT 2: Select Into yapısı ile yeni oluşturulacak olan tabloya, mevcut tablomuzdaki alanlar veri tipleri ve içindeki verilerle birlikte aynen kopyalanır. Eğer alan adını mevcut isminden farklı bir isimle oluşturmak istersek o zaman AS yapısı kullanabiliriz.
-- SELECT id,ad_soyad AS isim,yasadigi_sehir AS sehir INTO personel_yedek FROM personel --www.salihseker.com --
NOT 3: Eğer tablo içindeki verileri hariç tutup, sadece alan adları ve veri tiplerini almak istersek WHERE 1=0 eklememiz gerekir.
-- SELECT id,ad_soyad,sehir INTO personel_yedek FROM personel WHERE 1=0 --
[raw] [/raw]
CREATE DATABASE
CREATE DATABASE veritabani_adi
CREATE TABLE
CREATE TABLE
(
alan_adi1 veri_tipi(boyut),
alan_adi2 veri_tipi(boyut),
alan_adi3 veri_tipi(boyut),
….
)
-- CREATE TABLE [dbo].[Ogrenciler]( [OgrenciId] [int] IDENTITY(1,1) NOT NULL, [AdiSoyadi] [nvarchar](50) NULL, [OgrenciNo] [nvarchar](50) NULL, [Email] [nvarchar](50) NULL, [Sehir] [nvarchar](20) NULL ) ON [PRIMARY] --www.salihseker.com --
Mssql de tablonun create scriptini otomatik oluşturmak için tablo üzerine sağ tıklayıp Script Table as –> Create To –> New query diyerek creat scripti otomatik alınabilir.
CAST ve CONVERT
veri tipleri dönüşümünde SQL’de kullanabileceğimiz iki deyim var, CAST ve CONVERT. Kullanımları oldukça basit :
-- CAST(deger AS yeniVeriTipi) CONVERT(yeniVeriTipi, deger) --www.salihseker.com SELECTCAST(BusinessEntityIDASNVARCHAR)+' - '+FirstName+' '+LastNameAS Kimlik Bilgileri" FROMPerson.Person --
Person.Person tablosunda BusinessEntityID alanını Nvarchar tipinde CAST ettim ve bunu sırası ile -, FirstName, boşluk ve LastName ile toplayıp Kimlik Bilgileri kolonu altında listeledim.
-- SELECTCONVERT(NVARCHAR(10),BusinessEntityID) +' - '+FirstName+' '+LastName AS "Kimlik Bilgileri" FROMPerson.Person --
Genelde tercih edilen CAST’tır çünkü ANSI SQL-99 standardı ile uyumludur.
GO KOMUTU
GO komutu öncesinde yazilmis olan tüm sql ifadelerini veya bir önceki GO ifadesine kadar olan tüm sql ifadelerini tek bir execution plan dahilinde SQL Servera gönderir. SQL Server GO komutunu scriptiservera göndermek için bir isaret olarak algilar.
-- DECLARE @Mesaj VARCHAR(30) SELECT @Mesaj ='www.salihseker.com' GO-- @Mesaj degiskeni GO komutundan sonra geçerliligini kaybeder --www.salihseker.com --
GO komutundan sonra bir sayi belirterek birden fazla ayni sorguyu çalistirabiliriz.
-- INSERT INTO #tablo(deger) SELECT SUM(deger)FROM #tablo GO 10 --10 kez tekrarlanılacak --
Dikkat edilmesi gereken noktalar:
- GO komutu diger T-SQL komutlari ile ayni asatirdakullanilamaz
- GO komutundan önce tanimlanan bir degisken GO komutundan sonra kullanilamaz. Çünkü daha önceki kod yigininin sona erdigini belirtmektedir.
- Kodun sonunda GO kullanilmadiği veya tüm sorgu bitmediği sürece komutlar sunucuya gönderilmez.
[raw] [/raw]
SQL DEĞİŞKEN TANIMLAMA
-- DECLARE @DegiskenAdı tip[(boyut)] = değer SET @DegiskenAdı = değer DECLARE @Sayi INT= 3 PRINT'Sayi : ' PRINT @Sayi SET @Sayi= 5 PRINT'Sayi : ' PRINT @Sayi PRINT 'Sayi : ' + CAST(@Sayi AS NVARCHAR(MAX)) --Select ile birden fazla değişkene atama işlemi DECLARE @Ad NVARCHAR(20), @Yas INT; SELECT @Ad ='Salih', @Yas = 27; PRINT'İsim:'; PRINT @Ad; PRINT'Yaş:'; PRINT @Yas; PRINT 'İsim: ' + @Ad + ' Yaş: ' + CAST(@Yas AS NVARCHAR(MAX)) --
BEGIN…END BLOK KULLANIMI :
BEGIN…END blokları: BEGIN ve END arasında yazılan SQL ifadelerinin bir bütün olarak algılanmasını sağlar. BEGIN…END arasına yazılan SQL kodlarını bir blok olarak çalıştırır.
IF…ELSE KULLANIMI :
IF…ELSE blokları: Eğer o anki durum için ilk alternatif doğruysa SQL Server ilk ifadeyi çalıştırır, ikinci ifade doğruysa ikinci ifade çalıştırır.
-- DECLARE @SAYI INT = 10 IF(@SAYI > 10) BEGIN PRINT 'Sayı 10 dan büyüktür.' END ELSE BEGIN PRINT 'Sayı 10 veya 10 dan küçüktür.' END --
EXISTS ve NOT EXISTS ifadeleride alt sorgudan getirilen değerlerin içerisinde bir değerin olması veya olmaması durumunda işlem yapılmasını sağlar.
-- IF EXISTS (SELECT TOP 1 1 FROM Ogrenciler WHERE AdiSoyadi = 'Salih ŞEKER') BEGIN PRINT 'KAYIT VAR' END ELSE BEGIN PRINT 'KAYIT YOK' END --www.salihseker.com --
Kodun açıkllaması şu şekildedir , IF EXISTS ten sonreki parantezin içinde yazılan select sorgusundan eğer sonuç döner ise işlemi yap dönmez ise ELSE blogundaki işlemi yap demektir.
SELECT TOP 1 dememizin sebebi birden fazla kayıt varsa sadece 1 tanesini getirsin maksat sorgunun daha hızlı çalışmasını sağlamak.
[raw] [/raw]
STORED PROCEDURE KULLANIMI
Store Procedure ler kısacası sql de birden fazla işlemin tanımlandığı ve yazılma amacına göre geriye değer döndüren veya döndürmeyen SQL objeleridir . SP ler giriş parametresi alabilir veya almayabilir , eğer giriş parametrelerine ilk değer ataması yapılmaz ise SP kullanıldığında giriş değerlerine değer atanması zorunlu olacaktır , yoksa hata alınır.
SP lerin içerisinde İNSERT , UPDATE , SELECT işlermler yapılabilir , farklı SP ler çalıştırılabilir , bu işlemlerin hepsi veya 1 tanesini yapmak mümkündür geriye birden fazla Dataset döndürebilir (birden fazla tablo döndürebilir).
SP oluşturmak için CREATE PROCEDURE prosedür_adı , düzenlemek için ALTER PROCEDURE prosedür_adı , silmek için DROP PROCEDURE prosedür_adı şeklinde kullanılır.
Örnek bir SP tanımı yapalım :
-- CREATE PROCEDURE OGRENCI_EKLE ( @ADI NVARCHAR(MAX), @SOYADI NVARCHAR(MAX), @OGRENCI_NO NVARCHAR(MAX), @EMAIL NVARCHAR(MAX) = '', @SEHIR NVARCHAR (MAX) = '' ) AS INSERT INTO Ogrenciler (AdiSoyadi , OgrenciNo , Email , Sehir ) VALUES (@ADI + ' ' + @SOYADI , @OGRENCI_NO , @EMAIL , @SEHIR ) --www.salihseker.com --
Yukarıda yazılı sp de Ogrenciler tablosuna insert etme işlemi yapan bir SP tanımladık . burada göreceğiniz gibi ADI , SOYADI ve OGRENCI_NO parametreleri ne ilk değer ataması yapılmadığı için OGRENCI_EKLE SP sini kullanmak istediğimizde bu alanlar kesinlikle gönderilmelidir , EMAIL ve SEHIR parametreleri ilk değer atamaları ‘’ olarak yapılmıştır bu alanlara değer göndermez isek insert işleminde boşluk olarak insert edilecektir.
Tanımladığımız Store procedure ü kullanmak için EXEC komutu ile parametreler gönderilir.
Örn :
-- EXEC OGRENCI_EKLE @ADI = 'DENEME',@SOYADI = 'SP',@OGRENCI_NO = '9999' ,@EMAIL = 'A@A.COM',@SEHIR = 'istanbul' --www.salihseker.com --VEYA EXEC OGRENCI_EKLE @ADI = 'DENEME',@SOYADI = 'SP',@OGRENCI_NO = '9999' --www.salihseker.com --Sonucu görmek için SELECT * FROM Ogrenciler --www.salihseker.com --
[raw] [/raw]
VİEW KULLANIMI
View‘ler sorguları basitleştirmek, erişim izinlerini düzenlemek, farklı sunuculardaki eşdeğer verileri karşılaştırmak veya bazı durumlarda sorgu süresini kısaltmak için kullanılan, gerçekte olmayan Select ifadeleri ile tanımlanmış sanal tablolardır. İçerisinde veri bulunmaz. Sadece tabloların görünümleridir. Kullanıcıların bazı kritik tabloların sadece belli sütunlarını veya satırlarını göstermesi gerektiği durumlarda kullanılabilir.
CREATE VIEW view_adi
AS
SELECT sütun_adları FROM base _tablo_adı
-- CREATE VIEW DENEME AS SELECT OgrenciId ,AdiSoyadi ,OgrenciNo FROM Ogrenciler --www.salihseker.com -- oluşan view in sonucunu göremek için SELECT * FROM DENEME --
VİEW LARDA NE YAPILMAZ
Yukarıda söylediğim gibi aslında viewlerin yapamadıkları daha fazla.
- Order By kullanamazsınız.
- İsimsiz kolon bırakamazsınız. Örneğin Sumfonsiyonunu kullanacaksınız As ile kesin bir isim vermek zorundasınız.
- Birden fazla sorgu yazamazsınız yani sadece bir select ile başlayan bir cümle yapabilirsiniz.
- T-SQL kullanamazsınız
- Insert, Update veya Delete kullanamazsınız
- Herhangi bir parametre yollayamazsınız.
[raw] [/raw]
FUNCTİON KULLANIMI
Fonksyonlar Sql işlemlerimiz kolaylaştırmak için ve sürekli olarak yapılan işlemleri tekrar tekrar kod yazmamak için kullanılır . Örnek olarak toplama yapan bir fuction oluşturalım , iki adet sayı giriş parametresi olarak tanımlayacağız ve toplamını sonuç olarak vereceğiz.
Örn :
-- Örn : CREATE FUNCTION FN_TOPLAMA(@SAYI1 INT,@SAYI2 INT) RETURNS INT -- RETURN DEĞERININ INT OLACAĞI BELİRTİLİYOR AS BEGIN DECLARE @TOPLAM INT SET @TOPLAM = @SAYI1+ @SAYI2 RETURN @TOPLAM END --www.salihseker.com --Tanımladığımız fuctionun kullanımı : SELECT dbo.FN_TOPLAMA(25,15) --www.salihseker.com --
SONUÇ :
Tablo sütunlarını Düzenleme , Değiştirme :
-- -- Tabloya yeni bir sütun ekleme ALTER TABLE tablo_adı ADD sutun_adi data_tipi -- Örn : ALTER TABLE Ogrenciler ADD Sehir nvarchar(max) -- Tablodan Sütun silmek ALTER TABLE tablo_adı DROP COLUMN sutun_adi; -- Örn : ALTER TABLE Ogrenciler DROP COLUMN Sehir -- Tablodaki sütunu düzenlemek ALTER TABLE tablo_adı ALTER COLUMN sutun_adi data_tipi; -- Örn : ALTER TABLE Ogrenciler ALTER COLUMN Sehir nvarchar(20); --
[raw] [/raw]
SQL CURSOR KULLANIMI
Cursor’lar bir veri grubu (tablo) üzerinde satır satır işlem yapabilmeyi sağlar . birnevi for döngüsü gibi çalışır , belirtilen select sorgusundan gelen verileri satır satır döndürür ve cursor içinde tanımlanan işlemi yapar . satır satır işlem yapıldığı için yapılan işlemlerde yavaşlığa neden olabilir bu nedenle nerede ve ne zaman kullanılacağına dikkat edilmelidir.
Örnek bir cursor tanımlayalım :
Yapacağımız işlemler :
- Cursor için kullanacağımız paramatreleri ve data tiplerini tanımlayacağız (@AD_SOYAD_C, @OGRENCI_NO_C v.s.)
- Cursorde işlem yapacağımız verileri select sorgusu ile getiriyoruz ve cursur a giriş yapılacak sütunlar belirtiliyor.
- Cursor açılır ve yapılıcak işlemler tanımlanır.
Cursor kapatılır ve DEALLOCATE ile sistemeden temizlernir.
-- DECLARE @AD_SOYAD_C NVARCHAR(MAX), @OGRENCI_NO_C NVARCHAR(MAX) -- Cursor de kullanacağımız parametreleri tanımlıyoruz. DECLARE CRS_OGRENCI CURSOR FOR SELECT AdiSoyadi , OgrenciNo FROM Ogrenciler -- Cursur de işlenecek veriler ve listeyi select sorgusu ile çekiyoruz . OPEN CRS_OGRENCI -- Cursor ü açıyoruz FETCH NEXT FROM CRS_OGRENCI INTO @AD_SOYAD_C, @OGRENCI_NO_C -- Select sorgusunda gelen sütunlar sırasına göre değişkenlere atanır Örn : @AD_SOYAD_C = @AdiSoyadi WHILE @@FETCH_STATUS =0 BEGIN PRINT @AD_SOYAD_C + ' ' + @OGRENCI_NO_C --SELECT , INSERT , UPDATE İŞLEMLERİ YAPILABİLİR -- www.salihseker.com FETCH NEXT FROM CRS_OGRENCI INTO @AD_SOYAD_C, @OGRENCI_NO_C END CLOSE CRS_OGRENCI -- Cursor ü kapatıyoruz. DEALLOCATE CRS_OGRENCI -- Cursor ile işimiz bittiğinde sistemden tamizlememiz için DEALLOCATE etmemiz gerekmektedir. --
Sonuç :
Salih ŞEKER 11111 Cüneyt Medet 22222 Ali Bulut 33333 TEST ADI 44444 testadi 2 55555 DENEME SP 9999 DENEME SP 9999
Tanımladığımız cursorda işlem olarak gelen veriyi print ile yazdırdık , bu alanda gelen veriler ile farklı işlemler yaptırabiliriz. UPDATE ,INSERT ,SELECT v.s. işlemler yapılabilir.
Evet , bu yazımızında sonuna geldik , yazının başında da bahsettiğim gibi not , hatırlatma olarak kullanılabilecek bir yazı oldu , faydalı olması dileğiyle 🙂
Herkese Kolay Gelsin. — Salih ŞEKER —
Merhaba,
Gerçekten çok düzenli bir kaynak olmuş. Sizinde bahsettiğiniz gibi bazen basit konuları da unutabiliyoruz. Bu yazınız sayenizde tekrar etmiş olacağız.
Teşekkürler