SQL Server DML Komutlarına Hızlı Bakış

DML (Data Manipulation Language) komutları, tabloya veri ekleme, tablodan veri güncelleme, silme ve veri sorugulama işlemlerinde kullanılan komutlardır. Bu komutlar, yaptıkları işlemlerin baş harflerinin alınmasından oluşan CRUD kelimesi ile de tabir edilir. Bu komutlar;

  • Veri Girişi (INSERT)
  • Okuma (Select)
  • Güncelleme (UPDATE)
  • Silme (DELETE)

Makalemiz boyunca yapacağımız örnekler aşağıdaki tablo yapısı üzerinden ilerleyecektir.

Veri Gerişi (INSERT)

CRUD kelimesinin ilk harfinde geçen CREATE işlemidir. INSERT komutu ile tabloya veri girişi sağlanır. Temel kullanımı aşağıdaki gibidir.

INSERT INTO Tablo_Ad(col1, col2,...., coln) VALUES(deger1, deger2, ..., degern)

Tablo adından sonra gelen parantez içerinde veri ekleme işleminde değer atanacak kolonların adları ve VALUES anahtar kelimesinden sonra gelen parantezde ise bu kolonların sırası ile değerleri belirtilir.

Aşağıda öğretmenler tablosuna bazı veri girişi örneklerini inceleyelim.

INSERT INTO Ogretmenler(Isim, Soyisim, SicilNo, DogumTarihi) VALUES('Sait', 'ORHAN', '123456', '1989-06-28')

Bu örneğimizde kolonlara sırası ile aşağıdaki değerler atanmıştır.

Isim Sait
SoyIsim ORHAN
SicilNo 123456
DogumTarih 28.06.1989

Bu örnekte olduğu gibi bütün kolonlara değer atanacak ise tablo isminden sonra parantez içerisinde kolon isimlerini belirtmeye gerek yoktur. Böyle bir kullanımda da VALUES anahtar değerleri kolonların tablodaki sıralarına göre atanacaktır. Örnek kullanımı aşağıdaki gibidir.

INSERT INTO Ogretmenler VALUES('Sait', 'ORHAN', '123456', '1989-06-28')

Veri ekleme işleminde null değer alabilen kolonlara değer atanmadan da işlem yapılabilir. Örneğin aşağıdaki sorguda null değer alabilen DogumTarih kolonuna değer atanmamış şekilde tabloya kayıt girilmektedir.

INSERT INTO Ogretmenler(Isim, Soyisim, SicilNo) VALUES('Bilal', 'ORHAN', '123456789')

Bu sorgu kaydedilen satırın görüntüsü aşağıdaki gibi olur.

@@IDENTITY değeri tabloda otomatik olarak artan kolonun son atanan değerini verir.

Aynı anda birden fazla satır eklemek için de VALUES anahtar kelimesinden sonra satırları virgül ile ayrılarak eklenebilir.

INSERT INTO Ogretmenler(Isim, Soyisim, SicilNo) VALUES('Çetin', 'Güneş', '123456785'),('Ahmet', 'Yıldız', '123456780')

Veri Güncelleme (UPDATE)

CRUD kelimesindeki U harfinde belirtilen UPDATE işlemi tablodaki verilerin güncellenmesini sağlar. Tablodaki belli kolonların bütün değerlerini değiştirebileceği gibi WHERE anahtar kelimesi ile sadece belirtilen şartları sağlayan satırların değerleri de değiştirilebilir. Temel kullanım şekli aşağıdaki gibidir.

UPDATE Tablo_Ad SET col1 = deger1, col2 = deger2,... coln = degern WHERE sart

UPDATE komutunun kullanımında WHERE ile sadece değeri değiştirilmek istenen kolonlara ait şartlar verilmelidir. Herhangi bir şart belirtilmeden komut çalıştırılırsa tablodaki bütün değerleri değiştirir.

Aşağıdaki örnekte sadece Id değeri 7 olan satırın isim ve soy isim alanları güncelleniyor.

UPDATE Ogretmenler SET Isim = 'Mustafa', Soyisim = 'Yıldırım' WHERE Id = 7

Aşağıdaki komutta ise öğretmenler tablosundaki bütün isimler ve soy isimler Mustafa ve Yıldırım olarak değiştirilmektedir.

UPDATE Ogretmenler SET Isim = 'Mustafa', Soyisim = 'Yıldırım'

Veri Silme (DELETE)

CRUD kelimesindeki D harfinde belirtilen DELETE işlemi tablodaki verilerin silinmesini sağlar. Tablodaki belli tüm satırlar silinebileceği gibi WHERE anahtar kelimesi ile sadece belirtilen şartları sağlayan satırlar da silinebilir. Temel kullanım şekli aşağıdaki gibidir.

DELETE Tablo_Ad WHERE sart

DELETE komutunun kullanımında WHERE ile sadece silinmek istenen satırlara ait şartlar verilmelidir. Herhangi bir şart belirtilmeden komut çalıştırılırsa tablodaki bütün satırları.

Aşağıdaki örnekte sadece Id değeri 7 olan satır siliniyor.

DELETE Ogretmenler WHERE Id = 7

Aşağıdaki kullanımda ise öğretmenler tablosunun bütün içeriği silinmektedir.

DELETE Ogretmenler

Veri Sorgulama (SELECT)

CRUD kelimesinde geçen R (READ) harfi ile ifade edilen işlemdir. Tablodan veri çekmek için kullanılır. Temel kullanımı aşağıdaki gibidir.

SELECT column1, column2, ...
FROM tablo_ad
WHERE sartlar

SELECT sorgusunda WHERE anahtar kelimesi ile bir şart verilmezse tablodan istenen kolonların bütün verilerini getirir. Örneğin aşağıdaki sorgu ile öğretmenler tablosunda yer alan bütün veriler listelenir.

SELECT sorgusunda bütün kolonlar alınacak ise SELECT ifadesinden sonra bütün kolonları yazmak yerine * işareti konarak da bütün kolonlar getirilebilir.

SELECT * FROM Ogretmenler

veya * yerine aşağıdaki gibi bütün kolonların adlarını yazmak da aynı sonucu getirecektir.

SELECT Id, Isim, Soyisim, SicilNo, DogumTarihi FROM Ogretmenler

SELECT işleminde bütün kolonlar alınabileceği gibi sadece ihtiyaç duyulan kolonları ihtiyaç duyulan sırada da alınması mümkündür. Örneğin aşağıdaki sorguda öğretmenlerin isim, soy isim, doğum tarihi ve son kolon olarak da tabloda olmamasına rağmen formül yazılarak anlık hesaplanan yaşları kolonu listelenmiştir.

SELECT Isim, Soyisim, DogumTarihi, DATEDIFF(YEAR, DogumTarihi ,GETDATE()) Yas FROM Ogretmenler

Aşağıdaki sorguda da aynı sorguyu sadece Id değeri 7 olan öğretmen için sorgulanıyor.

SELECT Isim, Soyisim, DogumTarihi, DATEDIFF(YEAR, DogumTarihi ,GETDATE()) Yas FROM Ogretmenler WHERE Id = 7

Sorgularda Birden Fazla Şartın Birleştirilmesi

Bazı sorgularda WHERE anahtar kelimesi ile verilen şartlarda birden fazla şart olabilmektedir. Bu durumda OR veya AND bağlaçları ile şartlar birleştirilir.

OR Veya anlamındadır. OR ile bağlanan şartlardan en az biri doğru olduğunda şart sağlanmış olur.
AND Ve anlamındadır. AND ile bağlanan şartların tümünün doğru olması durumunda şart sağlanmış olur.

Aşağıdaki sorguda Id değeri 7 olan veya sicil numarası 123456789 olan öğretmenler listelenmektedir.

SELECT * FROM Ogretmenler WHERE Id = 7 OR SicilNo = '123456789'




SQL Server Collations

SQL Server Collection ayarları verilerin karşılaştırma kuralları, büyük/küçük harf duyarlılığı ve aksanlı harflerin duyarlılık işlemlerinde kullanılan ayarlardır. Collection ayarlarından etkilenen veri türleri, metinsel ifade içeren char ve varchar veri türleridir.

SQL Server kurulumunda, yeni veri tabanı oluşturmada veya bir veri tabanı yedekten dönüldüğünde üzerinde çalışılacak verilerin büyük/küçük harf duyarlılığı, aksan duyarlılığı gibi durumlara toleransını bilmek sistemin hatasız çalışması üzerinde önemli bir şarttır. Bu durumda sisteme tanımlı collection ayarlarını bilmek sistemi ayarlamada kolaylık sağlayacaktır. sys.fn_helpcollations() fonksiyonu ile sistemde yüklü bütün collection listesine ulaşılabilir.

SQL Server, veri tabanı, kolon veya bir sorgu için collection ataması yapıldığında bu işlem veriler üzerinde yapılan sorgulama sonuçlarını değiştirir. Örneğin; Metinsel ifadelerin karşılaştırma, sıralama ve gruplama işlemleri bu ayardan etkilenen temel işlemlerdir.

Collection, verilerin kaydedilirken tutulduğu bit düzeyinde bilginin nasıl tutulacağını ve metinlerin sıralama ve karşılaştırma ayarlarını belirler. Bu ayarlar veri tabanı düzeyinde belirtilenebileceği gibi her kolona ayrı collection’da atanabilir. Collection’nın bu özelliğinden dolayı farklı collection ayarına sahip iki veri tabanı üzerinde çalıştırılan aynı sorguların sonuçları farklılık gösterebilir. Böyle bir durumla karşılaşmamak için mümkün olduğu sürece kurum içerisinde kullanılacak collection ile ilgili bir standart geliştirilmelidir.

SQL Server collection ayarlanırken kullanılan özellikler aşağıdaki tabloda göründüğü gibidir;

Case-sensitive (_CS) Büyük/küçük harf ayrımını yapar. Bu seçenek seçili iken küçük harfler büyük harflerden önce sıralanır. Bu seçenek seçili değil iken büyük / küçük harfler karşılaştırma ve sıralamada eşit sayılır. Seçili olmayan hali _CI ile ifade edilir.
Accent-sensitive (_AS) Aksanlı ve aksansız harfleri ayırt eder. Bu seçenek seçili iken ‘a’ ve ‘â’ harfleri eşit sayılmaz. Bu seçenek seçili değil iken ise karşılaştırma ve sıralama işlemlerinde ‘a’ ve ‘â’ gibi harfler eşit sayılır. Seçili olmayan hali _AI ile ifade edilir.
Kana-sensitive (_KS) Hiragana ve Katakana Japon karakterlerini ayırt eder.
Width-sensitive (_WS) Özellikle matematiksel ifade içeren metinlerde tam ve yarım yazılan karakterleri ayır eder. Örneğin; Seçili iken: E=mc2ve E=mc2 ifadeleri eşit sayılmazken, seçili olmadığı durumda da bu iki ifade eşit kabul edilir.
Variation-selector-sensitive (_VSS) Japoncaya özgü bazı karakterlerin ayırt edilmesini sağlar.
Binary (_BIN) SQL Server tablolarındaki verileri, her karakter için tanımlanan bit kalıplarına göre sıralar ve karşılaştırır. İkili sıralama düzeni büyük / küçük harfe ve aksan yapısına duyarlıdır. Aynı zamanda en hızlı şekilde sıralamayı sağlar.
Binary-code point (_BIN2)1 Unicode verileri için Unicode kod noktalarını temel alarak SQL Server tablolarındaki verileri sıralar ve karşılaştırır. Unicode olmayan veriler için, İkili kod noktası ikili türlerle aynı karşılaştırmaları kullanır.
UTF-8 (_UTF8) UTF-8 kodlu verilerin SQL Server üzerinde saklanmasını sağlar.

Collation Seviyeleri

SQL Server üzerinde dört seviyede collation ayarı tutulabilmektedir. Bu seviyeler;

  • Sunucu seviyesinde
  • Veri tabanı seviyesinde
  • Kolon seviyesinde
  • Sorgu seviyesinde

Sunucu Seviyesinde

SQL Server kurulumu sırasında seçilir ve diğer bütün veri tabanı ve kullanıcıların varsayılan collection ayarı olur.

Kurulumdan sonra bu ayar değiştirilmek istenirse öncelikle bütün veri tabanlarının nesneleri ve verilerini dışarı aktardıktan sonra master veri tabanının rebuild işlemine tabi tutulması gerekmektedir. master veri tabanı rebuild edildikten sonra veri tabanları ve veriler tekrardan içeri aktarılır. Bütün bir sunucu seviyesinde collection ayarını değiştirmek yerine veri tabanı oluştururken veri tabanı seviyesinde de collection ayarı seçilebilir.

SELECT CONVERT(varchar, SERVERPROPERTY('collation'));

Yukarıdaki kod ile sunucunun mevcut collection ayarı sorgulanabilir.

Sunucu Colletion Ayarının Değiştirilmesi

Sunucu colletion ayarını değiştirmek için aşağıdaki adımlar izlenir;

  1. Veri tabanları ve nesnelerini yeniden oluşturmak için gerekli scriptler alınır.
  2. Veri tabanlarındaki bütün veriler dışarı alınır. (export)
  3. Bütün kullanıcı veri tabanları silinir.
  4. master veri tabanı yeni colletion ayarına göre rebuild edilir. Bu işlem için aşağıdaki setup komutu ile yapılabilir.

Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName
/SQLSYSADMINACCOUNTS=accounts /[ SAPWD= StrongPassword ]
/SQLCOLLATION=CollationName

5. Veri tabanları ve nesneleri scriptler yardımı ile yeniden oluşturulur.

6. Veriler tekrar içeri alınır. (import)

Veri Tabanı Seviyesinde Collection

Veri tabanı oluşturulurken seçilir. Veri tabanı oluşturma sırasında seçilmezse varsayılan olarak sunucu seviyesinde seçilen collection seçilir. Veri tabanı oluşturulma veya değiştirilme işlemlerinde COLLATE komutu ile seçilebilir.

Sunucu seviyeside colletion değiştirilmeden sistem veri tabanlarına ait colletion ayararı değiştirilemez.

Veri tabanı colletion ayarı, veri tabanına ait bütün bilgilerde geçerli olur. Bir veri tabanına ait colletion ayarı değiştirildiğinde geçici tablolarla çalışan sorgularında hata alınabilmektedir. Alınan bu hatanın sebebi, geçici tabloların tempbd veri tabanında tutulmasında dolayıdır. Bu tür alınabilecek hataların önüne geçmek için COLLATE komutu ile sorgu düzeyinde colletion ayarı yapılmalıdır.

Veri tabanı oluşturulurken colletion ayarının belirtilmesi ve oluşturulan veri tabanına ait bilgilerin sorgulanması;

USE master;  
GO  
CREATE DATABASE TestDb  
COLLATE Latin1_General_100_CS_AS_SC;  
GO  
  
--Veri tabanı bilgilerinin alınması.  
SELECT name, collation_name  
FROM sys.databases  
WHERE name = N'TestDb';  
GO

Aşağıdaki örnek kodda olduğu gibi veri tabanına ait colletion ayarı değiştirilebilir. Veri tabanı seviyesinde yapılan colletion ayar değişikliği kolon seviyesinde yapılmış olan ayarları etkilememektedir.

ALTER DATABASE myDB COLLATE Greek_CS_AI;

Aşağıdaki kod ile de belli bir veri tabanına ait colletion ayarına ulaşılabilir.

SELECT CONVERT (VARCHAR(50), DATABASEPROPERTYEX('database_name','collation'));

Kolon Seviyesinde Colletion Ayarı

Tablo oluşturulurken COLLATE komutu ile her bir kolonun colletion ayarı ayrı ayrı olarak ayarlanabilir, ayarlanmaz ise veri tabanına ait colletion ayarı varsayılan olarak seçilir.

ALTER TABLE ile mevcutta olan kolonların ayarları değiştirilebilir.

ALTER TABLE tabloAd ALTER COLUMN kolonAd NVARCHAR(10) COLLATE Greek_CS_AI;

Sorgu Bazlı Colletion Ayarı

Sorgu bazlı colletion ayarında sorgu çalışma zamanında COLLATE komutu ile ayarlanır. Özellikle ORDER BY işlemlerinde kullanılır.

SELECT isim FROM urunler ORDER BY name COLLATE Latin1_General_CS_AI;

Collation ayarı veri tabanında sorguların doğru sonuç döndürmesi için önemli olduğu kadar performans için de önemli olduğundan daha projelerin kavramsal çalışmalarında karar verilmesi gereken bir konudur.




SQL Server Veri Tabanı Snapshot Alma

Snapshot ifadesi genel olarak anlık sistemin anlık fotoğrafı olarak tanımlanabilir. Snapshot alma amacı, sistemin anlık görüntüsünü alıp sonradan sistemi önceki haline döndürmek gerekmesi durumunda döndüre bilmektir. Snapshot alındıktan sonra anlık görüntü için bir fark dosyası oluşturulur. Bu andan itibaren veri tabanında bir değişiklik yapıldığında verinin snapshot alındığı andaki hali bu fark dosyasına yazılır ve alınan bu snapshot veri tabanına bir select sorgusu geldiğinde veri değişmemişse orijinal veri tabanından, veri değişti ise önceki halini tutan snapshot veri tabanından sorgu çekilir.

SQL Server Management Studio görsel olarak snapshot alma işlemini desteklemediğinden işlemlerin T-SQL kodu ile yapılması gerekmektedir. Oluşturulan snapshotlar SSMS’de “Database Snapshots” bölümünü altında yer alır.

Oluşturulan bu snapshot veri tabanları salt okunur veri tabanlarıdır ve sadece select cümleciğini desteklerler.

Snapshot veri tabanı üzerinde UPDATE işlemi ve alınan hata

SSMS Database Snapshots

Snapshot almak için yazılması gereken T-SQL kodu aşağıdaki gibidir.

CREATE DATABASE snapshot_olarak_olusturulacak_dbAd

ON

(

NAME =Mantıksal_dosya_ad,

FILENAME ='olusturulacak_dosya_tam_ad'

)

AS SNAPSHOT OF kaynak_dbAd

Aşağıdaki kodda da AdventureWorks veri tabanının bir snapshotunun alınmasını görüyoruz.

CREATE DATABASE AdventureWorks_dbss1800 ON  
( NAME = AdventureWorks2017,
FILENAME =   
'C:\Db\AdventureWorks_data_1800.ss' )  
AS SNAPSHOT OF AdventureWorks2017;  
GO  

Aşağıda snapshot alındıktan sonra değiştirilen verinin orijinal veri tabanından ve aynı verinin snapshot veri tabanından sorgulanması ve sonucunu görüyoruz.

--Snapshot alındıktan sonra değiştirilen veri sorgusu
select 'Orijinal Veri', FirstName, LastName from AdventureWorks2017.[Person].[Person] where BusinessEntityID = 1

--Snapshot alındıktan sonra değiştirilen verinin snapshot veri tabanından sorgusu
select 'Snapshot Veri', FirstName, LastName from AdventureWorks_dbss1800.[Person].[Person] where BusinessEntityID = 1

Sistemde Var Olan Snapshotları Görmek için sys.databases kataloğundan source_database_id değeri NULL olmayan veri tabanları sorgulanır.

select * from sys.databases where source_database_id is not null

Veri tabanının snapshot zamanında ki durumuna dönmek için de aşağıdaki kodu kullanabiliriz. Snapshot verisine dönebilmek için veri tabanına kullanıcıların bağlı olmaması gerekmektedir. Kullanıcıların bağlı olması durumunda geri dönme sırasında aşağıdaki hata alınır.

USE master;  
-- AdventureWorks2017 veri tabanını AdventureWorks_dbss1800 zamanına döndürme  
RESTORE DATABASE AdventureWorks2017 from   
DATABASE_SNAPSHOT = 'AdventureWorks_dbss1800';  
GO  

Geri dönüş olduktan sonra az önce değiştirdiğimiz veriyi asıl veri tabanından sorgulayıp sonucu görelim.

Yazımızı bitirmeden snapshot veri tabanları konusunda söylememiz gereken son bir konu da, snapshotların kendi başlarına bir veri tabanı olmadıkları ve sistemde yaşamaları kaynak veri tabanlarının sistemde yaşıyor olması gerekliliğidir.




SQL Server Birden Fazla Tabloyu Beraber Sorgulama

İlişkisel veri tabanı sistemlerinin (RDMS) hedeflerinden biri de veri tekrarını azaltmak ve performansı üst düzeyde tutmaktır. Bu sebeple tekrar eden veriler tablolara ayrılarak ilgili yerlere verilerin refensı verilir. Örneğin bir sipariş tablosunda veriler temel olarak aşağıdaki iki şekilde tutulabilir.

  • Her sipariş satırına ürünün bilgileri ve müşteri bilgilerini girmek
  • Müşteri bilgilerini ve ürün bilgilerini kendilerine has tablolarda tutup sipariş tablosuna sadece ilgili müşteri ve ürünün referans kolonlarını vermek.

İlk seçenekte oluşacak örnek bir sipariş tablosu aşağıdaki gibi olur.

Sipariş No Müşteri Adı Müşteri Soyadı Müşteri Tel Müşteri Adres Ürün Adı Sipariş Tarihi Sipariş Miktarı
1 Tolga Yalçın 5539152030 İpragaz Mah. Veli Çakmak Cad. No:72 Bebek Arabası 21.10.2018 1
2 Çetin Songur 5475245555 Mevalana Mah. İkbal Cad. No:32 Tabak 22.12.2018 1
3 Tolga Yalçın 5539152030 İpragaz Mah. Veli Çakmak Cad. No:72 Tava 25.12.2018 1
4 Tolga Yalçın 5539152030 İpragaz Mah. Veli Çakmak Cad. No:72 Çanta 30.12.2018 2
5 Çetin Songur 5475245555 Mevalana Mah. İkbal Cad. No:32 Şemsiye 02.01.2019 3
6 Tolga Yalçın 5539152030 İpragaz Mah. Veli Çakmak Cad. No:72 Kitap 05.01.2019 1

Tabloda da görülebileceği gibi birinci seçenekte müşteri bilgisi sürekli bir tekrarda dönüyor. Bunun yerine ikinci seçenekte belirtildiği gibi müşteri bilgileri ayrı tabloda tutulursa yapı aşağıdaki gibi olur.

No Adı Soyadı Telefon Adres
1 Tolga Yalçın 5539152030 İpragaz Mah.
Veli Çakmak Cad. No:72
2 Çetin Songur 5475245555 Mevalana Mah. İkbal Cad. No:32

Müşteri No Ürün Adı Tarih Miktar
1 Bebek Arabası 21.10.20.18 1
2 Tabak 22.12.2018 1
1 Tava 25.12.2018 1
1 Çanta 30.12.2018 2
2 Şemsiye 02.01.2019 3
1 Kitap 05.01.2019 1

Görüldüğü üzere ilgili kayıtlar kendi tablolarında tutulup gerekli yerlere referans numaraları verilirse sipariş tablosunda veri tekrarı engellenmiş olur. Bu şekilde olduğunda müşteri bilgilerinde oluşacak bir değişiklik için bütün sipariş tablosunu dolaşmak yerine sadece müşteri tablosundan kaydı değiştirmek yeterli olacaktır. Referans konusunu Tablo Seviyesinde Veri Bütünlüğü isimli yazımızda bulabilirsiniz.

Veriler tek tabloda iken bir SELECT * FROM ile alınabiliyor iken birden fazla tabloda tutulduğunda JOIN komutlarından faydalanmak gerekmektedir. JOIN komutları birden fazla tablo üzerinde sorgulama yaparak istenen sonuç kümesini sunar.

JOIN komutları üç başlıkta toplanır. Bunlar;

  • INNER JOIN
  • OUTER JOIN
    • LEFT OUTER JOIN
    • RIGHT OUTER JOIN
    • FULL OUTER JOIN
  • CROSS JOIN

JOIN TEMEL YAPISI

Join işleminin temel yapısı aşağıdaki gibidir:

SELECT kolon1, kolon2, kolon3...
FROM Tablo1 [JOIN TÜRÜ] Tablo2 ON [JOIN şartı]

INNER JOIN

INNER JOIN sadece iki tabloda da eşleşen kayıtlar olması durumunda kaydı getirir. Örneğin müşteri ve sipariş tabloları INNER JOIN ile sorgulandığında siparişi olmayan müşteri, sipariş tablosunda eşleşen kaydı olmadığından sonuç ekranına gelmeyecektir. Örnek bir INNER JOIN sorgusu ve sonuç kümesi:

SELECT m.Ad, m.Soyad, m.Telefon, m.Adres, s.UrunAd, s.Adet, s.Tarih
FROM Musteriler m INNER JOIN Siparisler s ON m.Id = s.MusteriId

INNER JOIN

OUTER JOIN

LEFT OUTER JOIN

LEFT OUTER JOIN, join kelimesinin solunda kalan tabloyu referans alarak bütün kayıtları getiri. Join kelimesinin sağında kalan tabloda eşleşen kayıt yok ise ilgili kolona NULL değer döner.

SELECT m.Ad, m.Soyad, m.Telefon, m.Adres, s.UrunAd, s.Adet, s.Tarih
FROM Musteriler m LEFT JOIN Siparisler s ON m.Id = s.MusteriId

LEFT JOIN

Göründüğü gibi son satırda ilgili müşteriye ait sipariş olmadığından değerler NULL olarak dönüyor.

RIGHT OUTER JOIN

RIGHT OUTER JOIN, join kelimesinin sağında kalan tabloyu referans alarak bütün kayıtları getiri. Join kelimesinin solunda kalan tabloda eşleşen kayıt yok ise ilgili kolona NULL değer döner.

SELECT m.Ad, m.Soyad, m.Telefon, m.Adres, s.UrunAd, s.Adet, s.Tarih
FROM Musteriler m right JOIN Siparisler s ON m.Id = s.MusteriId

RIGHT JOIN

FULL OUTER JOIN

FULL OUTER JOIN, her iki tablodan da bütün kayıtları getirir, eşleşmeyen kayıtların karşılıklarını NULL değer olarak döner.

SELECT m.Ad, m.Soyad, m.Telefon, m.Adres, s.UrunAd, s.Adet, s.Tarih
FROM Musteriler m FULL JOIN Siparisler s ON m.Id = s.MusteriId

FULL JOIN

CROSS JOIN

CROSS JOIN, matematikteki kartezyen çarpımı gibi çalışır ve sol tabloya karşılık sağdaki bütün kayıtları getirir. Diğer join türlerinden farklı olarak ON şartı kullanılmaz. Örneğin sol tabloda üç, sağ tabloda 8 kayıt var ise sonuç kümesinde 3 * 8 = 24 kayıt döner.

SELECT m.Ad, m.Soyad, m.Telefon, m.Adres, s.UrunAd, s.Adet, s.Tarih
FROM Musteriler m cross JOIN Siparisler s 

CROSS JOIN




T-SQL Kodları ile SQL Server Şema Yapısını İnceleme

Proje geliştirme aşamalarında olmasa da SQL Server yönetim işlemlerinde gerek server gerek veri tabanı ve tablolar düzeyinde sistemde yer alan nesnelerin listesi ve özelliklerini sorgulama ihtiyacı doğabilmektedir.

SQL Server da çalışması sırasında üzerinde barındırdığı nesneleri ve bu nesnelere ait özellikle üzerinde ilgili tablolarda bulundurmaktadır. Bu tablolar üzerinde uygun T-SQL komutları çalıştırılarak bu bilgilere ulaşılabilir.

Veri Tabanı Listesini Alma

master veri tabanı üzerinde aşağıdaki kod çalıştırılarak sistemde yer alan veri tabanı bilgileri elde edilebilir. select * ile sorgu çalıştırılarak daha fazla bilgi elde edilebilir.

select name, database_id, create_date, compatibility_level, collation_name from sys.databases

Veri Tabanı İçerisinde Yer Alan Tablo Listesini Alma

Tablo listesi alınacak veri tabanı üzerinde aşağıdaki iki sorgudan biri çalıştırılarak tablo listesi alınabilir.

select * from sys.tables
select * from INFORMATION_SCHEMA.TABLES

Ekran görüntüsünde yer alan sonuç kümelerinde üstte sys.tables tablosudan, altta da INFRMATION_SCHEMA.TABLES görünümünden alınan sonuçlar görünmektedir.

Tablo İçerisinde Yer Alan Kolon Listesini Alma

Tablo içerisinde yer alan kolonlar aşağıdaki iki şekilde de alınabilir.

  • sys.all_columns tablosu üzerinden almak için sys.tables sorgusunda bulunan ilgili tabloya ait object_id değerine göre filtreleme yapılması gerekmektedir. Filtreleme yapılmazsa bütün veri tabanını içerinde yer alan bütün kolonları döndürür.
  • INFORMATION_SCHEMA.COLUMNS görüntüsü üzerinden alabilmek için TABLE_NAME ve TABLE_SCHEMA değerlerine göre sonucun filtrelenmesi gerekmektedir. Filtreleme yapılmazsa bütün veri tabanını içerinde yer alan bütün kolonları döndürür.

Aşağıdaki sorgularda tablo sonuç ekranında da görünen tblSiparisDetay tablosu için sorgulama yapılmaktadır.

select * from sys.all_columns where object_id = 133575514
select * from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tblSiparisDetay' AND TABLE_SCHEMA = 'DBO'

Tablo Üzerinde Yer Alan Anahtar Alan ve Yabancıl Anahtarları Listeleme

Anahtar alanları tablo üzerinde veri bütünlüğünü sağlamada en önemli unsurlar olarak karşımıza çıkmaktalar. Aşağıdaki sistem tabloları ve görüntülerinden anahtar alanlar elde edilebilir.

  • sys.key_constraints : Tablo üzerinde yer alan anahtar alanları listeler. Filtreleme olarak ilgili tablonun object_id değerini bu tablonun parent_object_id alanına filtre şartı olarak verilir.
  • sys.foreign_keys: Tablo üzerinde tanımlı yabancıl anahtarları listeler. Filtreleme olarak ilgili tablonun object_id değerini bu tablonun parent_object_id alanına filtre şartı olarak verilir.
  • INFORMATION_SCHEMA.TABLE_CONSTRAINTS: Tablo üzerinde yer alan anahtar alanları ve yabancıl anahtarları beraber listeler. Filtreleme işlemi için ilgili tablo ve şema isimlerini TABLE_SCHEMA ve TABLE_NAME alanlarına filtre şartı olarak verilir.

select * from sys.key_constraints where parent_object_id = 133575514
select * from sys.foreign_keys where parent_object_id = 133575514
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where TABLE_SCHEMA = 'dbo' and TABLE_NAME = 'tblSiparisDetay'

Tablo İçerisinde Kolonlar Üzerinde Yer Alan Zorlayıcı Şartların Listelenmesi

Zorlayıcı şartlar kolon seviyesinde veri bütünlüğünü sağlayan yapılardır. Aşağıdaki kod yardımı ile tablo içerisinde yer alan zorlayıcı şartlar listelenebilir.

select t.name tablo, ac.name kolon, dc.*
from sys.all_columns ac
inner join
sys.tables t
on ac.object_id = t.object_id
inner join
sys.schemas s on t.schema_id = s.schema_id
inner join
sys.default_constraints dc on ac.default_object_id = dc.object_id
where t.object_id = 85575343

Tablo Üzerinde Yer Alan Triggerların Listelenmesi

Trigger yapıları tablo içerinde oluşan hareketlere bağlı olarak otomatik tetiklenen ve yapılan harekete bağlı olarak ilgili işlemleri otomatik yapan yapılardır. Aşağıdaki kod yardımı ile tablo üzerinde tanımlı triggerlar listelenebilir. sp_helptext stored procedürüne de ilgili trigegr adı verilerek kodları elde edilebilir.

select * from sys.triggers t
join sys.trigger_events te on t.object_id = te.object_id
where t.parent_id = 85575343

exec sp_helptext 'bakmadanSiparisSilinmez'

Tablo Üzerine Tanımı Indexlerin Listelenmesi

Indexler tablo üzerinde veri bütünlüğü ve performans sağlayan yapılardandır. Aşağıdaki kod yardımı ile tablo üzerinde tanımlanan indexler listelenebilir. Filtreleme şartı olarak ilgili tablonun object_id değeri verilir.

select * from sys.indexes i
join sys.index_columns ic on i.index_id = ic.index_id and i.object_id = ic.object_id
join sys.all_columns ac on ic.column_id = ac.column_id and ic.object_id = ac.object_id
where i.object_id = 85575343

Temel nesne sorgularını bu şekilde gözden geçirdikten sonra yapısı tablo ile aynı olan VIEW sorguları da tablo sorguları ile aynı şekilde yapılabilmektedir. Fark olarak view listesi almak için sys.views tablosunda sorgular çalıştırılır.

Veri tabanı yönetiminde her ne kadar küçük ayrıntı olarak görünse de yönetici ihtiyaç duyduğu bilgileri bu şekilde alabildiği sürece sistemine max düzeyde hâkim olabilmektedir.




T-SQL Gerçek Ad ve Soyadlarından Rastgele Veri Üretmek

Kimi zaman test ortamlarında kullanılmak üzere rastgele oluşturulmuş verilere ihtiyaç duyulmaktadır. Bu ihtiyaçların başında da rastgele oluşturuluş kullanıcı listesidir. Bu yazımızda kullanıcıların adı ve soyadlarını bir kolonda tutan (FullName) veri tabanı için rastgele ad soyad listesi ve bu ad soyad listesinden faydalanarak kullanıcı adları ve mail adresleri oluşturacağız.

Bu işlem için adımlarımız şöyle olacak;

Mevcut gerçek verileri tutmak için bir geçici tabloyu ve gerekli değişkenleri oluşturacağız.

drop table if exists #Names

create table #Names(
userName nvarchar(100) null,
[Name] nvarchar(200),
[Surname] nvarchar(200)
)

declare @n nvarchar(200)  -- ad
declare @sn nvarchar(200) -- soyad
declare @un nvarchar(200) -- kullanıcı adı
declare @id int -- gerçek verinin Id değeri
declare @max int -- gerçek verinin satır sayısı

Rastgele sayı üretimi için aralığı tespit etmek için gerçek verinin satır sayısı @max değişkenine atanır.

select @max = COUNT(*) from Users

Gerçek veriden ad soyad alanı sorgulanarak SUBSTRING ve CHARINDEX fonksiyonları yardımı ile ilk boşluk karakterinden ad soyad (FullName) alanı ad ve soyad alanlarına ayrıştırılıp oluşturulan geçici tabloya eklenir. TRIM fonksiyonu ile de soyadın başında oluşan boşluk karakterleri silinir.

insert into #Names([Name], [Surname])
select SUBSTRING(FullName,0, CHARINDEX(' ', FullName)), 
SUBSTRING(FullName,CHARINDEX(' ', FullName),200)
from Users  where CHARINDEX(' ', FullName) > 1

update #Names set [Surname] = TRIM([Surname])

Geçici tabloya ad soyadlar alındıktan sonra CURSOR yardımı ile gerçek tablo baştan sona dönülerek her satırın Id değeri alınır ve her satırda ORDER BY NEWID() işlemi ile rastgele bir ad ve soyad seçilir. Ad ve soyad seçildikten sonra adın ilk harfi, soyadın tamamı ve sonuna 1 – @max değişkeni arasında rastgele bir sayı ile birleştirilerek kullanıcı adı oluşturulur. Kullanıcı adı oluşturulurken kullanıcı adının daha önce oluşmuş olma ihtimaline karşılık while exists (select UserName from Users where UserName = @un) döngüsü ile oluşturulan kullanıcı adında bir kullanıcı adı var olduğu sürece yenisini oluşturulur. REPLACE fonksiyonu ile de kullanıcı adındaki Türkçe karakterler silinir. Soyadı seçerken de where CHARINDEX(‘ ‘, [Surname]) = 0 şartı ile sadece tek soyadı olanlar arasından seçim yapılır.

--SQL CURSOR KULLANIMI

	DECLARE crs CURSOR FOR
	
	SELECT Id FROM Users -- Cursur de işlenecek veriler ve listeyi select sorgusu ile çekiyoruz .

	OPEN crs -- Cursor ü açıyoruz

	FETCH NEXT FROM crs INTO @id -- Select sorgusunda gelen sütunlar sırasına göre değişkenlere atanır Örn : @id = Id

	WHILE @@FETCH_STATUS =0
		BEGIN
			
			select @n = [Name] from #Names order by NEWID()
			select @sn = [Surname] from #Names where CHARINDEX(' ', [Surname]) = 0 order by NEWID()
			set @un = lower(SUBSTRING(@n,1,1)+@sn+CONVERT(varchar, CONVERT(int, RAND()*@max+1)))
			set @un = REPLACE(@un,'ç', 'c')
			set @un = REPLACE(@un,'ı', 'i')
			set @un = REPLACE(@un,'ğ', 'g')
			set @un = REPLACE(@un,'ö', 'o')
			set @un = REPLACE(@un,'ş', 's')
			set @un = REPLACE(@un,'ü', 'u')

			while exists (select UserName from Users where UserName = @un)
			begin
				set @un = lower(  SUBSTRING(@n,1,1)+@sn+CONVERT(varchar, CONVERT(int, RAND()*@max+1)))
				set @un = REPLACE(@un,'ç', 'c')
				set @un = REPLACE(@un,'ı', 'i')
				set @un = REPLACE(@un,'ğ', 'g')
				set @un = REPLACE(@un,'ö', 'o')
				set @un = REPLACE(@un,'ş', 's')
				set @un = REPLACE(@un,'ü', 'u')
			end
			
			update Users set FullName = @n + ' ' + @sn, UserName = @un where Id = @id

			FETCH NEXT FROM crs INTO @id
 
		END

	CLOSE crs -- Cursor ü kapatıyoruz.

	DEALLOCATE crs -- Cursor ile işimiz bittiğinde sistemden tamizlememiz için DEALLOCATE etmemiz gerekmektedir.

Son işlem olarak kullanıcı adlarının sonuna ilgili domain adı eklenerek mail adresleri oluşturulur.

update Users set Email = UserName + '@domain.com'

Bütün kod: https://github.com/saitorhan/T-SqlExamples/blob/master/randomnames.sql




SQL Server String Fonksiyonları

Yazılımın her alanında olduğu gibi SQL Server üzerinde de en sık yapılan işlemler string işlemleridir. Bu yazımızda SQL Server içerisinde kullanılan string fonksiyonlarını işliyor olacağız.

ASCII

Parametre olarak aldığı stringin ilk harfinin ASCII karşılığını verir.

SELECT ASCII('ABC') AS A, ASCII('B') AS B,   
ASCII('a') AS a, ASCII('b') AS b,  
ASCII(1) AS [1], ASCII(2) AS [2];

CHAR

ASCII fonksiyonunun tersine parametre olarak aldığı int değerinin karakter karşılığını vermektedir.

SELECT CHAR(65), CHAR(66), CHAR(97), CHAR(98), CHAR(49), CHAR(50)

CHAR fonksiyonu kullanılarak yeni satır, tab, satır başı gibi kontrol karakterleri de insert dilebilir. Örneğin aşağıdaki örnekte kişinin adı ve soyadı araya enter karakteri eklenerek alt alta yazıyor.

DECLARE @N NVARCHAR(40)
SET @N = 'Sait' + CHAR(13) + 'ORHAN'
PRINT @N

CHARINDEX

Verilen iki parametreden ilk verilen değeri ikinci parametre içerisinde arar ve bulduğu ilk indeksi verir. Üçüncü parametre de isteğe bağlı ve verilmesi durumunda verilen indekten sonrası için arar. Aranan değer bulunmaz ise 0 değerini döner.

select CHARINDEX('HAN', 'Sait ORHAN')
select CHARINDEX('HAN', 'Sait ORHAN', 7)

CONCAT 

Parametre olarak aldığı string değerlerini birleştirir.

SELECT CONCAT ( 'Bugün ', 'Günlerden ', 25, '/', '09' ) AS Tarih;

CONCAT_WS

Concat fonksiyonu ile aynı şekilde çalışır ancak fark olarak stringleri birleştirirken araya ilk parametreyi koyar. Örneğin aşağıda yukarıdaki örneği “,” ile birleştiriyor.

SELECT CONCAT_ws (',', 'Bugün ', 'Günlerden ', 25, '/', '09' ) AS Tarih;

LEFT

İki parametre alır. İlk parametre bir string değer alır, ikinci parametre olarak bir int değer alır. Sonuç olarak int değeri kadar harfi stringin solundan döndürür.

SELECT LEFT('SAİT ORHAN', 3), LEFT('SAİT ORHAN', 4), LEFT('SAİT ORHAN', 6), LEFT('SAİT ORHAN', 7)

LEN

Parametre olarak aldığı string değerin uzunluğunu döndürür.

SELECT LEN('SAİT ORHAN')
------------Sonuç
-- 10

LOWER

Parametre olarak aldığı stringin tümünü küçük harfe çevirerek dödürür.

SELECT lower('SAİT ORHAN')
------------Sonuç
-- sait orhan

LTRIM

Parametre olarak aldığı stringin solunda olan bütün boşlukları kaldırır.

SELECT LTRIM('     SAİT ORHAN      ')

PATINDEX

İlk parametrede aldığı paterni ikinci parametrede verilen strin içerisinde arar ve bulduğu ilk indeki döndürür. Bulamazsa 0 döner.

select PATINDEX('%R_A%', 'SAİT ORHAN')
select PATINDEX('%R%', 'SAİT ORHAN')
select PATINDEX('SA%', 'SAİT ORHAN')
select PATINDEX('%AN', 'SAİT ORHAN')

REPLACE

Üç parametre alır. İkinci parametrede verilen string değeri birinci parametrede verilen string içerisinde arar ve üçüncü parametrede verilen değer ile değiştirir. Örneğin aşağıdaki örnekte “sai1orhan1” string değerinde geçen “1”leri “2” olarak değiştiriyor.

SELECT REPLACE('sai1orhan1', '1', '2')
--Sonuç
-- sai2orhan2

REPLICATE

Birinci parametrede verilen string değerini ikinci parametrede verilen sayı kadar tekrar ederek döner.

SELECT REPLICATE('12', 3)
--Sonuç
-- 121212

REVERSE

Verilen string değeri ters çevirir.

SELECT REVERSE('123456789')
--Sonuç
-- 987654321

RIGHT

LEFT fonksiyonu ile aynı çalışır. Farkı metni sağdan alıyor olmasıdır.

RTRIM

LTRIM fonksiyonu ile aynı çalışır. Farkı stringin sağındaki boşlukları siliyor olmasıdır.

SPACE

Parametre olarak aldığı sayı değeri kadar boşluk döndürür.

SELECT 'SAİT' + SPACE(7) + 'ORHAN'
SELECT 'SAİT' + SPACE(16) + 'ORHAN'
SELECT 'SAİT' + SPACE(2) + 'ORHAN'

STRING_AGG

Select sorgusunda birinci parametre olarak kendisine verilen kolon değerini ikinci parametrede verilen karakter ile bölerek gösterir. Aşağıdaki örnekte Code alanını arasına “,” koyarak gösteriyor

SELECT STRING_AGG(Code, ',') from DocsTypes
--Sonuç
-- EN,FR,KA,LS,OR,PL,PR,PS,SE,ST,TL,TS

STRING_SPLIT

Birinci parametrede verilen metni ikinci parametrede verilen karaktere göre ayrıştırır. Geriye value adında kolon barındıran ve satırlarında karaktere göre ayrıştırma sonucunu tutan bir tablo döner.

SELECT * from STRING_SPLIT('Bu metin boşluk karakterine göre ayrıştırılacak', ' ')

SUBSTRING

String içerisinden belli bir bölümü döndürür. Üç parametre alır. İlk parametrede işlem yapılacak string değeri, ikinci parametrede alınacak alt parçanın başladığı index değeri ve son parametre olarak da alınacak alt parçanın uzunluğunu alır.

SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 1, 4)
SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 5, 10)
SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 25, 1000)

--Sonuç
-- Bu m
-- etin boşlu
-- ine göre ayrıştırılacak

TRIM

LTRIM ve RTRIM ile aynı çalışır. Farkı stringin hem sağ hem solundan boşlukları siliyor olmasıdır.

UPPER

LOWER ile aynı çalışır. Verilen stringin tamamını büyük harfe çevirir.




SQL 'IN' ve 'NOT IN' Operatörleri

SQL dilinde sorgulama yapılırken bir değeri belli değerler arasından herhangi birine eşit olabileceği istendiği durumda değerler OR şartı ile birbirine bağlanır. “WHERE Id = 4 OR Id = 10 OR Id = 37” gibi… Değerlerin az olduğu durumlarda bu şekilde yazılabilir ancak değerlerin sayısının arttığı veya bu değerlerin aşağıdaki örnekte olduğu gibi kodun yazıldığı zamanda belli olmaması durumunda bu şekilde OR şartı ile bağlama hem zahmetli hem performans olarak sorgu optimizasyonunu olumsuz etkilemektedir.

Kolon değerinin bir liste içerisinden herhangi bir değere eşit olması istenen durumda IN operatörü kullanılabilir. Listede herhangi bir değere eşit olması istenilmeyen durumda da NOT IN operatörü kullanılır.

Konumuzu en iyi şekilde basit bir örnek ile açıklayabiliriz.

Örnek Senaryo Tabloları

Yukarıdaki tablo şemasında;

  • Users tablosu, kullanıcı listesini
  • Groups tablosu, gruplar tablosunu
  • UserGroups tablosu, kullanıcıların üye oldukları grupları n – n ilişkisi içerisinde tutar.

Sorumuz şu: Hiç bir gruba üye olmayan kullanıcıların listesini veren SQL scriptini yazınız.

select Id, UserName, FullName
from Users
where Id NOT IN (select UserId from UserGroups)

Bu sorgu çalışırken öncelikle UserGroups tablosundan her hangi bir gruba üye olan kullanıcıların UserId değerlerini alır, daha sonra Users tablosundan Id değeri UserGroups tablosundan alınan UserId değerlerinin içerisinde olmayan kullanıcıları getirir.

select * from UserGroups
where UserId IN (1,3,6,87,45,332)

Bu sorguda da UserId değeri “1,3,6,87,45,332” değerlerinden herhangi birine eşit olan kayıtlar gelecektir.

Şimdi de sorguyu biraz daha karmaşıklaştırarak “YÖNETİCİLER” grubuna üye olan kullanıcılardan başka gruba da üye olanların listesini ve üye oldukları grupların listesini çekeceğiz.

select 
u.Id UserId, 
g1.Id GroupId, 
u.FullName, 
g1.Name 
from UserGroups ug1 join Groups g1 on ug1.GroupId = g1.Id 
join Users u on ug1.UserId = u.Id
where UserId IN (
select UserId from UserGroups ug join Groups g on ug.GroupId = g.Id 
where g.Name = 'YÖNETİCİLER'
) and g1.Name != 'YÖNETİCİLER'




SQL Server Diskte Kalan Boş Alan Tespiti

SQL Server üstlendiği rol gereği sürekli veri kaydı alan bir sistem ve üzerinde kurulu olduğu disk boyutunun belli aralıklarla kontrol edilmesi gerekmektedir. Yazımızda SQL Server veri tabanlarının üzerinde kurulu bulunduğu disklerin boş alanının tespit edilmesini üç yöntem ile inceliyor olacağız.

Birinci Yöntem

Bu yöntem ile sunucuda bulunan bütün disklerin boş alanı MB cinsinden sorgulanır.

EXEC MASTER..xp_fixeddrives

İkinci Yöntem

Bu yöntem de üzerinde veri tabanı dosyalarının olduğu disklerin boş alanı sorgulanıyor. Örnekte “C” ve “E” disklerinde veri tabanı dosyaları bolunuyor, bu sebeple yukarıdaki örnekte görünen “D” diski ile ilgili bilgi bulunmamaktadır.

SELECT DISTINCT dovs.logical_volume_name AS LogicalName,
dovs.volume_mount_point AS Drive,
CONVERT(INT,dovs.available_bytes/1048576.0) AS FreeSpaceInMB
FROM sys.master_files mf
CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.FILE_ID) dovs
ORDER BY FreeSpaceInMB ASC
GO

Üçüncü Yöntem

Bu yöntem ikinci yöntem ile aynı çalışmaktadır. Fark olarak her bir veri tabanı ve üzerinde bulunduğu diskin boyutunu farkı satırda vermektedir.

SELECT DISTINCT DB_NAME(dovs.database_id) DBName,
dovs.logical_volume_name AS LogicalName,
dovs.volume_mount_point AS Drive,
CONVERT(INT,dovs.available_bytes/1048576.0) AS FreeSpaceInMB
FROM sys.master_files mf
CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.FILE_ID) dovs
ORDER BY FreeSpaceInMB ASC
GO




SQL Server Veri Tabanının MySql Üzerine Taşınması

SQL Server piyasa da en sık kullanılan veri tabanlarının başında gelmektedir. Ancak özellikle SQL Server‘ın ücretli olması sebebi ile zamanla kullanıcılar sistemlerini MYSQL gibi ücretsiz bir veri tabanı sistemine geçirmek isteyebiliyorlar. Bu noktada eski verilerin ne olacağı, yeni sisteme nasıl taşınacağı problemi ortaya çıkmaktadır.

Veri taşıma işlemi için ücretli alternatifler olmasının yanında MYSQL‘in kendi içerinde de dahili gelen veri taşıma aracı bulunmaktadır. Aşağıdaki YouTube videomuzda bu işlemin nasıl yapıldığını işlemeye çalışıyoruz.