Author Archive

SQL’de Mantıksal ve Karşılaştırma Operatörleri

SQL (Structured Query Language), veritabanlarından bilgi almak ve manipüle etmek için temel bir araçtır. Bu gücün merkezinde, verileri belirli koşullara göre filtrelememizi ve işlememizi sağlayan mantıksal ve karşılaştırma operatörleri bulunur. Bu operatörler, karmaşık sorgular oluşturarak sadece ihtiyaç duyduğumuz bilgilere erişmenin anahtarıdır. Etkili veritabanı yönetimi ve analizinde vazgeçilmez bir rol oynarlar.

SQL Karşılaştırma Operatörleri

Karşılaştırma operatörleri, bir sorguda iki ifadeyi karşılaştırarak bir koşulun doğru mu, yanlış mı yoksa bilinmeyen mi olduğunu belirlemek için kullanılır. Genellikle WHERE yan tümcesinde yer alırlar ve sorgu sonuçlarını daraltmak için temel bir mekanizmadır. Bu operatörler, sayısal, metinsel ve tarihsel değerleri karşılaştırmak için kullanılabilir.

Temel Karşılaştırma Operatörleri

  • = (Eşittir): İki değerin birbirine eşit olup olmadığını kontrol eder.
  • != veya <> (Eşit Değildir): İki değerin birbirine eşit olup olmadığını kontrol eder (farklı olup olmadıklarını).
  • > (Büyüktür): Sol taraftaki değerin sağ taraftaki değerden büyük olup olmadığını kontrol eder.
  • < (Küçüktür): Sol taraftaki değerin sağ taraftaki değerden küçük olup olmadığını kontrol eder.
  • >= (Büyük Eşittir): Sol taraftaki değerin sağ taraftaki değerden büyük veya eşit olup olmadığını kontrol eder.
  • <= (Küçük Eşittir): Sol taraftaki değerin sağ taraftaki değerden küçük veya eşit olup olmadığını kontrol eder.

Örnekler:

Aşağıdaki örneklerde, basit bir Urunler tablosu üzerinden bu operatörlerin nasıl kullanıldığını inceleyelim:


-- Fiyatı 50.00 olan ürünleri listele
SELECT UrunAdi, Fiyat FROM Urunler WHERE Fiyat = 50.00;

-- Fiyatı 100.00 olmayan ürünleri listele
SELECT UrunAdi, Fiyat FROM Urunler WHERE Fiyat != 100.00; -- Veya Fiyat <> 100.00;

-- Stok miktarı 20'den fazla olan ürünleri listele
SELECT UrunAdi, StokMiktari FROM Urunler WHERE StokMiktari > 20;

-- Fiyatı 30.00'dan az olan ürünleri listele
SELECT UrunAdi, Fiyat FROM Urunler WHERE Fiyat < 30.00;

-- Stok miktarı 10 veya daha fazla olan ürünleri listele
SELECT UrunAdi, StokMiktari FROM Urunler WHERE StokMiktari >= 10;

-- Fiyatı 75.00 veya daha az olan ürünleri listele
SELECT UrunAdi, Fiyat FROM Urunler WHERE Fiyat <= 75.00;

SQL Mantıksal Operatörler

Mantıksal operatörler, bir sorguda birden fazla koşulu birleştirmek veya mevcut bir koşulu tersine çevirmek için kullanılır. Bu operatörler, karmaşık filtreleme mantıkları oluşturarak daha spesifik veri setlerine ulaşmayı mümkün kılar. Boolean değerler (DOĞRU/YANLIŞ) üzerinde çalışırlar.

Temel Mantıksal Operatörler

  • AND: İki koşulun da doğru olması durumunda genel koşul doğru olur.
  • OR: İki koşuldan en az birinin doğru olması durumunda genel koşul doğru olur.
  • NOT: Bir koşulun mantıksal tersini alır; koşul doğruysa yanlış, yanlışsa doğru yapar.

Örnekler:

Yukarıdaki örnek tablomuzu kullanarak mantıksal operatörlerin kullanımına bakalım:


-- Kategori 'Elektronik' olan VE Fiyatı 50.00'dan yüksek olan ürünleri listele
SELECT UrunAdi, Kategori, Fiyat FROM Urunler WHERE Kategori = 'Elektronik' AND Fiyat > 50.00;

-- Kategori 'Giyim' olan VEYA Stok Miktarı 5'ten az olan ürünleri listele
SELECT UrunAdi, Kategori, StokMiktari FROM Urunler WHERE Kategori = 'Giyim' OR StokMiktari < 5;

-- Kategori 'Gıda' OLMAYAN tüm ürünleri listele
SELECT UrunAdi, Kategori FROM Urunler WHERE NOT Kategori = 'Gıda'; -- Veya Kategori != 'Gıda';

Diğer Önemli Karşılaştırma ve Mantıksal Operatörler

SQL, daha spesifik senaryolar için ek operatörler sunar. Bunlar, karşılaştırma ve mantıksal işlevleri genişleterek daha güçlü ve okunabilir sorgular yazmamızı sağlar.

  • BETWEEN: Belirli bir aralıktaki değerleri kontrol eder (dahil).
  • IN: Bir sütunun bir listedeki değerlerden herhangi birine eşit olup olmadığını kontrol eder.
  • LIKE: Bir sütunun belirli bir desene uyup uymadığını kontrol eder (metin aramaları için).
  • IS NULL / IS NOT NULL: Bir sütunun boş (NULL) olup olmadığını kontrol eder.

Örnekler:


-- Fiyatı 20.00 ile 80.00 arasında olan ürünleri listele (20 ve 80 dahil)
SELECT UrunAdi, Fiyat FROM Urunler WHERE Fiyat BETWEEN 20.00 AND 80.00;

-- Kategori 'Elektronik' veya 'Ev Gereçleri' olan ürünleri listele
SELECT UrunAdi, Kategori FROM Urunler WHERE Kategori IN ('Elektronik', 'Ev Gereçleri');

-- Ürün adında 'Bilgisayar' kelimesi geçen ürünleri listele
SELECT UrunAdi FROM Urunler WHERE UrunAdi LIKE '%Bilgisayar%'; -- % herhangi bir karakter dizisini temsil eder

-- Stok Miktarı NULL olan ürünleri listele (yani stok bilgisi girilmemiş)
SELECT UrunAdi, StokMiktari FROM Urunler WHERE StokMiktari IS NULL;

-- Stok Miktarı NULL olmayan ürünleri listele
SELECT UrunAdi, StokMiktari FROM Urunler WHERE StokMiktari IS NOT NULL;

Operatör Önceliği ve Parantez Kullanımı

Birden fazla mantıksal ve karşılaştırma operatörü içeren karmaşık sorgularda, SQL'in bir operatör önceliği kuralı vardır. Genellikle, NOT operatörü en yüksek önceliğe sahipken, ardından AND ve sonra OR gelir. Bu öncelik sırası, sorgunuzun nasıl değerlendirileceğini etkiler.

Belirli bir değerlendirme sırasını zorlamak veya varsayılan önceliği geçersiz kılmak için parantezler () kullanılır. Parantez içindeki ifadeler her zaman önce değerlendirilir, bu da sorgu mantığınızı daha okunabilir ve öngörülebilir hale getirir.

Örnek:


-- Hatalı örnek (öncelik hatası olabilir):
-- SELECT UrunAdi FROM Urunler WHERE Kategori = 'Elektronik' OR Kategori = 'Aksesuar' AND Fiyat > 100;
-- Bu sorgu, 'Aksesuar' kategorisindeki ve Fiyatı > 100 olanlar ile 'Elektronik' kategorisindeki tüm ürünleri getirecektir.

-- Doğru kullanım (parantezlerle önceliği belirtmek):
SELECT UrunAdi, Kategori, Fiyat FROM Urunler 
WHERE (Kategori = 'Elektronik' OR Kategori = 'Aksesuar') AND Fiyat > 100;
-- Bu sorgu, Kategori 'Elektronik' VEYA 'Aksesuar' olan ürünlerden, Fiyatı 100'den büyük olanları getirecektir.

Özetle, SQL'deki mantıksal ve karşılaştırma operatörleri, veritabanı sorgularının kalbini oluşturur. Bu operatörler, milyonlarca satır arasından belirli kriterlere uyan verileri hızla ayıklamamızı, karmaşık koşulları birleştirmemizi ve istenmeyen bilgileri dışarıda bırakmamızı sağlar. Etkin bir SQL kullanıcısı olmak için bu operatörleri derinlemesine anlamak ve doğru şekilde uygulamak hayati önem taşır; bunlar, veri analizi ve raporlamanın temelini oluşturur.


SQL’de Veri Sorgulama (SELECT)

SQL’de veri sorgulama, bir veritabanından bilgi çekmenin temelini oluşturur. SELECT deyimi, bu sürecin kalbidir ve istediğimiz veriyi, belirli koşullara göre seçmemizi sağlar. Bu güçlü komut sayesinde, tablolarımızdaki milyonlarca kayıttan sadece ihtiyacımız olanları hızlı ve etkin bir şekilde alabiliriz. Veri analizi, raporlama ve uygulama geliştirme için vazgeçilmez bir araçtır.

Temel SELECT Deyimi: Veri Çekmeye Giriş

SELECT deyimi, bir veritabanı tablosundan veya birden fazla tablodan veri almak için kullanılır. En basit haliyle, bir tablodaki tüm sütunları veya belirli sütunları seçmenize olanak tanır.

Tüm Sütunları Seçme

Bir tablodaki tüm sütunlardaki verileri almak için yıldız (*) operatörünü kullanırız. Bu, tablonun tüm yapısını ve içeriğini görmenin hızlı bir yoludur.

SELECT *
FROM Musteriler;

Bu sorgu, Musteriler tablosundaki her sütundaki tüm kayıtları döndürecektir.

Belirli Sütunları Seçme

Genellikle, bir tablonun tüm sütunlarına değil, sadece belirli bilgilere ihtiyacımız olur. Bu durumda, almak istediğiniz sütun adlarını virgülle ayırarak belirtiriz.

SELECT MusteriAdi, Sehir, Ulke
FROM Musteriler;

Bu sorgu, Musteriler tablosundan yalnızca MusteriAdi, Sehir ve Ulke sütunlarını getirecektir.

Verileri Filtreleme: WHERE Yan Tümcesi

WHERE yan tümcesi, SELECT deyiminin en güçlü bileşenlerinden biridir ve sorgu sonuçlarını belirli kriterlere göre filtrelemenizi sağlar. Yalnızca belirtilen koşulları karşılayan satırlar döndürülür.

Karşılaştırma Operatörleri

Verileri filtrelemek için çeşitli karşılaştırma operatörleri kullanılır:

  • = (Eşittir)
  • <> veya != (Eşit Değildir)
  • > (Büyüktür)
  • < (Küçüktür)
  • >= (Büyük veya Eşittir)
  • <= (Küçük veya Eşittir)
SELECT MusteriAdi, Sehir
FROM Musteriler
WHERE Ulke = 'Almanya';

Bu sorgu, sadece ülkesi ‘Almanya’ olan müşterileri getirecektir.

Mantıksal Operatörler: AND, OR, NOT

Daha karmaşık filtreleme koşulları oluşturmak için mantıksal operatörler kullanılır:

  • AND: Tüm koşullar doğruysa doğru döner.
  • OR: Koşullardan herhangi biri doğruysa doğru döner.
  • NOT: Koşulu tersine çevirir.
SELECT MusteriAdi, Sehir, Ulke
FROM Musteriler
WHERE Ulke = 'Almanya' AND Sehir = 'Berlin';
SELECT MusteriAdi, Sehir, Ulke
FROM Musteriler
WHERE Ulke = 'Almanya' OR Ulke = 'Fransa';

Desen Eşleştirme: LIKE Operatörü

LIKE operatörü, belirli bir deseni içeren değerleri aramak için kullanılır. Joker karakterler (wildcard characters) ile birlikte kullanılır:

  • %: Sıfır veya daha fazla karakteri temsil eder.
  • _ (alt çizgi): Tek bir karakteri temsil eder.
SELECT MusteriAdi
FROM Musteriler
WHERE MusteriAdi LIKE 'A%'; -- 'A' ile başlayan isimler
SELECT MusteriAdi
FROM Musteriler
WHERE MusteriAdi LIKE '%an%'; -- 'an' içeren isimler

Diğer Faydalı Filtreleme Operatörleri

  • IN: Belirtilen değer listesi içinde olanları seçer.
  • SELECT MusteriAdi, Sehir
    FROM Musteriler
    WHERE Sehir IN ('Berlin', 'Londra', 'Paris');
  • BETWEEN: Belirli bir aralıkta olan değerleri seçer (dahil).
  • SELECT UrunAdi, Fiyat
    FROM Urunler
    WHERE Fiyat BETWEEN 100 AND 500;
  • IS NULL / IS NOT NULL: Sütun değeri boş (NULL) olup olmadığını kontrol eder.
  • SELECT MusteriAdi, Telefon
    FROM Musteriler
    WHERE Telefon IS NULL;

Sonuçları Sıralama: ORDER BY Yan Tümcesi

ORDER BY yan tümcesi, SELECT deyiminden dönen sonuç kümesini belirli bir sütun veya sütunlara göre artan (ASC – varsayılan) veya azalan (DESC) sıraya göre sıralar.

SELECT MusteriAdi, Sehir, Ulke
FROM Musteriler
ORDER BY Ulke ASC, Sehir DESC;

Bu sorgu, önce ülkeye göre artan, ardından aynı ülkedeki şehirleri azalan sıraya göre sıralayacaktır.

Sonuç Sayısını Sınırlandırma: LIMIT / TOP Yan Tümcesi

Büyük veri kümeleriyle çalışırken, tüm sonuçları almak yerine yalnızca ilk birkaç satırı görmek isteyebilirsiniz. Bu amaçla LIMIT (MySQL, PostgreSQL) veya TOP (SQL Server) kullanılır.

-- MySQL/PostgreSQL
SELECT UrunAdi, Fiyat
FROM Urunler
ORDER BY Fiyat DESC
LIMIT 10;
-- SQL Server
SELECT TOP 10 UrunAdi, Fiyat
FROM Urunler
ORDER BY Fiyat DESC;

Her iki sorgu da en pahalı 10 ürünü listeler.

Verileri Gruplama ve Özetleme: GROUP BY ve Aggregate Fonksiyonları

GROUP BY yan tümcesi, aynı değere sahip satırları bir veya daha fazla sütuna göre gruplandırır. Bu, genellikle COUNT(), SUM(), AVG(), MIN(), MAX() gibi aggregate (toplama) fonksiyonlarıyla birlikte kullanılır.

SELECT Ulke, COUNT(MusteriID) AS ToplamMusteri
FROM Musteriler
GROUP BY Ulke
ORDER BY ToplamMusteri DESC;

Bu sorgu, her ülkedeki müşteri sayısını sayar ve en çok müşterisi olan ülkeden başlayarak listeler.

Grupları Filtreleme: HAVING Yan Tümcesi

WHERE yan tümcesi bireysel satırları filtrelerken, HAVING yan tümcesi GROUP BY ile oluşturulan grupları filtrelemek için kullanılır.

SELECT Ulke, COUNT(MusteriID) AS ToplamMusteri
FROM Musteriler
GROUP BY Ulke
HAVING COUNT(MusteriID) > 5;

Bu sorgu, sadece 5’ten fazla müşterisi olan ülkeleri ve müşteri sayılarını listeler.

Birden Fazla Tablodan Veri Sorgulama: JOIN İşlemleri

Veritabanları genellikle ilişkisel yapıdadır ve bilgiler birden fazla tabloda saklanır. JOIN deyimleri, bu tabloları birleştirerek ilgili verileri tek bir sonuç kümesinde almanızı sağlar. Örneğin, INNER JOIN, iki tabloda da eşleşen kayıtlara sahip satırları döndürür.

SELECT M.MusteriAdi, S.SiparisTarihi, S.ToplamTutar
FROM Musteriler M
INNER JOIN Siparisler S ON M.MusteriID = S.MusteriID
WHERE S.SiparisTarihi > '2023-01-01';

Bu örnek, 2023’ten sonra sipariş veren müşterilerin adlarını ve sipariş bilgilerini birleştirerek gösterir.

SELECT deyimi, SQL’in en temel ve en güçlü araçlarından biridir. Basit sorgulardan karmaşık analizlere kadar, veritabanından bilgi çekmenin her aşamasında kritik bir rol oynar. WHERE, ORDER BY, GROUP BY gibi yan tümcelerle birleştiğinde, kullanıcıların spesifik ihtiyaçlarına göre özelleştirilmiş veri kümeleri oluşturma esnekliği sunar. Veri odaklı dünyamızda, bu komutta ustalaşmak, her geliştirici ve analist için paha biçilmez bir beceridir.


SQL’de Veri Ekleme, Güncelleme ve Silme (INSERT, UPDATE, DELETE)

Veritabanı yönetimi, sadece mevcut verileri sorgulamaktan ibaret değildir; aynı zamanda bu verilerin yaşam döngüsünü de kapsar. SQL’deki Veri Manipülasyon Dili (DML) komutları, bir veritabanının dinamik yapısını korumanın temelini oluşturur. `INSERT`, `UPDATE` ve `DELETE` komutları, verileri etkili bir şekilde eklemek, mevcut kayıtları değiştirmek ve gereksiz bilgileri ortadan kaldırmak için vazgeçilmez araçlardır. Bu komutlara hakim olmak, her veri profesyonelinin temel becerilerinden biridir.

Veri Ekleme: INSERT Komutu

INSERT komutu, bir tabloya yeni kayıtlar (satırlar) eklemek için kullanılır. Bu, bir veritabanının büyümesini ve güncel kalmasını sağlayan ilk adımdır. Yeni verilerin eklenmesi, genellikle uygulamanızdaki yeni bir kullanıcının kaydı, bir ürünün envantere eklenmesi veya bir işlem kaydının oluşturulması gibi senaryolarda karşımıza çıkar.

Temel INSERT Sözdizimi

INSERT komutunu kullanmanın en yaygın yolu, eklenecek sütunları belirtmek ve ardından ilgili değerleri sağlamaktır:

INSERT INTO tablo_adi (sutun1, sutun2, sutun3, ...)
VALUES (deger1, deger2, deger3, ...);

Örnek:

INSERT INTO Musteriler (MusteriID, Ad, Soyad, Sehir)
VALUES (1, 'Ayşe', 'Yılmaz', 'İstanbul');

Bu örnekte, Musteriler tablosuna yeni bir müşteri kaydı eklenir. Belirtilen sütunlara karşılık gelen değerler sırasıyla atanır.

Tüm Sütunlara Veri Ekleme

Eğer tablonun tüm sütunlarına, tanımlandıkları sırayla veri ekliyorsanız, sütun adlarını belirtmek zorunda kalmazsınız. Ancak bu yöntem, tablonun yapısı değiştiğinde (yeni bir sütun eklendiğinde) hata yapma riskini artırabilir ve okunabilirliği düşürebilir:

INSERT INTO tablo_adi
VALUES (deger1, deger2, deger3, ...);

Örnek:

INSERT INTO Urunler
VALUES (101, 'Klavye', 250.00, 50, 'Elektronik');

Bu komut, Urunler tablosunun tüm sütunlarına (varsayımsal olarak UrunID, UrunAdi, Fiyat, StokAdedi, Kategori) sırasıyla değerler ekler.

Başka Bir Sorgudan Veri Ekleme

Bazen, bir tablodan belirli verileri alıp başka bir tabloya eklemek isteyebilirsiniz. Bu, INSERT INTO ... SELECT yapısıyla gerçekleştirilir:

INSERT INTO hedef_tablo (sutun1, sutun2, ...)
SELECT sutunA, sutunB, ...
FROM kaynak_tablo
WHERE kosul;

Örnek:

INSERT INTO EskiMusteriler (MusteriID, Ad, Soyad)
SELECT MusteriID, Ad, Soyad
FROM Musteriler
WHERE KayitTarihi < '2020-01-01';

Bu örnek, Musteriler tablosundan belirli bir tarihten önce kaydolan müşterileri seçerek, bu verileri EskiMusteriler tablosuna ekler.

Veri Güncelleme: UPDATE Komutu

UPDATE komutu, bir veya daha fazla kaydın mevcut değerlerini değiştirmek için kullanılır. Bu, bir kullanıcının adresini değiştirmesi, bir ürünün fiyatının güncellenmesi veya bir siparişin durumunun değiştirilmesi gibi senaryolarda kritik öneme sahiptir.

Temel UPDATE Sözdizimi

UPDATE komutu, hangi tablonun güncelleneceğini, hangi sütunların hangi değerlerle değiştirileceğini (SET yan tümcesi) ve hangi kayıtların güncelleneceğini (WHERE yan tümcesi) belirtir:

UPDATE tablo_adi
SET sutun1 = yeni_deger1, sutun2 = yeni_deger2, ...
WHERE kosul;

WHERE yan tümcesi, güncellenecek satırları filtrelemek için hayati öneme sahiptir. Eğer WHERE yan tümcesini kullanmazsanız, tablodaki *tüm* kayıtlar güncellenecektir, ki bu genellikle istenmeyen bir durumdur.

Örnek:

UPDATE Urunler
SET Fiyat = 275.00, StokAdedi = 45
WHERE UrunID = 101;

Bu komut, UrunID‘si 101 olan ürünün fiyatını ve stok adedini günceller.

Birden Fazla Satırı Güncelleme

WHERE yan tümcesi, birden fazla satırı etkileyecek şekilde de yazılabilir:

UPDATE Calisanlar
SET Maas = Maas * 1.10
WHERE Departman = 'Satış';

Bu örnekte, ‘Satış’ departmanındaki tüm çalışanların maaşı %10 artırılır.

Başka Bir Tablodan Veri ile Güncelleme

Bazı veritabanı sistemleri (örneğin SQL Server, MySQL), birleştirme (JOIN) veya alt sorgu (subquery) kullanarak başka bir tablodaki verilere göre güncelleme yapmaya izin verir:

-- SQL Server/MySQL Benzeri Syntax
UPDATE A
SET A.Kolon = B.Deger
FROM TabloA A
JOIN TabloB B ON A.OrtakKolon = B.OrtakKolon
WHERE A.Durum = 'Beklemede';
-- Standart SQL (Alt Sorgu ile)
UPDATE TabloA
SET Kolon = (SELECT Deger FROM TabloB WHERE TabloB.OrtakKolon = TabloA.OrtakKolon)
WHERE Durum = 'Beklemede';

Bu tür senaryolar, daha karmaşık veri tutarlılığı gerektiren durumlarda kullanılır.

Veri Silme: DELETE Komutu

DELETE komutu, bir veya daha fazla kaydı bir tablodan kalıcı olarak kaldırmak için kullanılır. Bu, gereksiz verileri temizlemek, eski kayıtları arşivlemek veya bir kullanıcının hesabını silmek gibi durumlarda gereklidir.

Temel DELETE Sözdizimi

DELETE komutu, hangi tablodan silineceğini ve hangi satırların silineceğini (WHERE yan tümcesi) belirtir:

DELETE FROM tablo_adi
WHERE kosul;

WHERE yan tümcesi, silinecek satırları filtrelemek için UPDATE komutunda olduğu gibi kritik öneme sahiptir. WHERE yan tümcesi olmadan DELETE komutu çalıştırılırsa, tablodaki *tüm* kayıtlar silinecektir.

Örnek:

DELETE FROM Musteriler
WHERE MusteriID = 1;

Bu komut, MusteriID‘si 1 olan müşteri kaydını Musteriler tablosundan siler.

Birden Fazla Satırı Silme

WHERE yan tümcesi, birden fazla satırı hedefleyecek şekilde de kullanılabilir:

DELETE FROM Siparisler
WHERE SiparisTarihi < '2023-01-01' AND Durum = 'Tamamlandı';

Bu örnek, 2023 yılından önce tamamlanmış tüm siparişleri Siparisler tablosundan siler.

Tüm Satırları Silme

Eğer tablodaki tüm satırları silmek istiyorsanız, WHERE yan tümcesini atlayabilirsiniz:

DELETE FROM tablo_adi;

Örnek:

DELETE FROM GeciciVeriler;

Bu komut, GeciciVeriler tablosundaki tüm kayıtları siler. Bu işlem, genellikle daha az kaynak tüketen ve daha hızlı çalışan TRUNCATE TABLE komutu ile karıştırılmamalıdır. DELETE her bir satırı loglarken ve geri alınabilirken, TRUNCATE TABLE veriyi sayfa bazında siler, daha az loglama yapar ve kimlik sütunlarını sıfırlar; bu nedenle genellikle geri alınamaz.

Sonuç

SQL’deki INSERT, UPDATE ve DELETE komutları, bir veritabanının dinamik doğasını şekillendiren temel DML operasyonlarıdır. Veri ekleme, değiştirme ve silme yeteneği, uygulamaların gerçek dünya ihtiyaçlarını karşılamasını sağlar. Bu komutları doğru ve dikkatli bir şekilde kullanmak, veritabanının bütünlüğünü, tutarlılığını ve performansını korumak için kritik öneme sahiptir. Her SQL kullanıcısı için bu komutlara hakim olmak, veri yönetimi becerilerinin ayrılmaz bir parçasıdır.


SQL’de Veritabanı ve Tablo Düzenleme (ALTER DATABASE / ALTER TABLE)

SQL veritabanı yönetiminde, mevcut yapıları değiştirmek sıkça karşılaşılan bir ihtiyaçtır. Veritabanının veya tabloların ilk oluşturulduğu haliyle kalması nadirdir; iş gereksinimleri zamanla evrilir. İşte bu noktada ALTER DATABASE ve ALTER TABLE komutları devreye girer. Bu güçlü SQL ifadeleri, veri kaybını en aza indirerek veritabanı şemalarını dinamik olarak güncellemenizi sağlar, sistemlerinizi güncel ve verimli tutar.

Veritabanı Yapılarını Düzenleme: ALTER DATABASE

ALTER DATABASE komutu, bir veritabanının genel özelliklerini, dosya gruplarını, dosya yollarını, kurtarma modelini veya diğer yapısal ayarlarını değiştirmek için kullanılır. Bu komut, bir veritabanının adını değiştirmek veya sistem performansını ve kullanılabilirliğini etkileyen özelliklerini ayarlamak gibi geniş kapsamlı değişiklikler yapmaya olanak tanır.

Veritabanı Adı Değiştirme

Bir veritabanının adını değiştirmek, genellikle sistemler arası geçişlerde veya isimlendirme standartlarını güncellemek gerektiğinde uygulanır. Bu işlem, veritabanı kapalı konumdayken yapılmalıdır.


-- SQL Server için örnek
ALTER DATABASE EskiVeritabaniAdi MODIFY NAME = YeniVeritabaniAdi;

-- MySQL için örnek
RENAME DATABASE EskiVeritabaniAdi TO YeniVeritabaniAdi;

Veritabanı Seçeneklerini Değiştirme

Kurtarma modeli, uyumluluk düzeyi, erişim modu (salt okunur, tek kullanıcı vb.) gibi birçok veritabanı seçeneği ALTER DATABASE ile değiştirilebilir.


-- Bir veritabanının kurtarma modelini basit olarak değiştirme (SQL Server)
ALTER DATABASE VeritabaniAdi
SET RECOVERY SIMPLE;

-- Veritabanını tek kullanıcı moduna alma (SQL Server)
ALTER DATABASE VeritabaniAdi
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE; -- Bağlantıları hemen sonlandırır

-- Veritabanını çoklu kullanıcı moduna geri alma
ALTER DATABASE VeritabaniAdi
SET MULTI_USER;

Veritabanı Dosyalarını Yönetme

Veritabanı dosyalarının boyutunu, maksimum boyutunu veya otomatik büyütme ayarlarını değiştirmek de ALTER DATABASE ile mümkündür. Bu, disk alanı yönetimi ve performans optimizasyonu için kritik öneme sahiptir.


-- Bir veri dosyasının boyutunu ve otomatik büyüme ayarlarını değiştirme (SQL Server)
ALTER DATABASE VeritabaniAdi
MODIFY FILE (NAME = VeriDosyaAdi,
             SIZE = 2GB,
             MAXSIZE = 10GB,
             FILEGROWTH = 256MB);

-- Yeni bir veri dosyası ekleme
ALTER DATABASE VeritabaniAdi
ADD FILE (NAME = YeniVeriDosyasi,
          FILENAME = 'D:\SQLData\YeniVeriDosyasi.ndf',
          SIZE = 1GB,
          MAXSIZE = 5GB,
          FILEGROWTH = 128MB);

Tablo Yapılarını Düzenleme: ALTER TABLE

Genel Bakış

ALTER TABLE, SQL’de en sık kullanılan düzenleme komutlarından biridir. Mevcut bir tablonun yapısını değiştirmek, yani sütun eklemek, silmek, değiştirmek, kısıtlamalar eklemek veya kaldırmak için kullanılır. Bu komut, yazılım geliştirme sürecindeki gereksinim değişikliklerine hızlıca uyum sağlamak veya bir veritabanının evrimini yönetmek için hayati öneme sahiptir.

Sütun İşlemleri

Sütun Ekleme: ADD COLUMN

Mevcut bir tabloya yeni bir sütun eklemek için kullanılır. Eklenen sütun, varsayılan bir değerle veya boş (NULL) olarak doldurulabilir.


ALTER TABLE Musteriler
ADD COLUMN Eposta VARCHAR(100) UNIQUE;

ALTER TABLE Urunler
ADD COLUMN StokAdedi INT NOT NULL DEFAULT 0;

Sütun Silme: DROP COLUMN

Bir tablodan mevcut bir sütunu ve bu sütuna ait tüm verileri silmek için kullanılır. Bu işlem geri alınamaz olduğundan, dikkatli bir şekilde uygulanmalıdır.


ALTER TABLE Musteriler
DROP COLUMN TelefonNumarasi;

-- Eğer sütunda kısıtlamalar varsa, önce kısıtlamaların silinmesi gerekebilir (veritabanına göre değişir)
-- SQL Server'da kısıtlamayı otomatik siler

Sütun Veri Tipi veya Boyutunu Değiştirme: ALTER COLUMN

Bir sütunun veri tipini, boyutunu veya boş geçilebilirlik (NULL/NOT NULL) özelliklerini değiştirmek için kullanılır. Bu işlem, mevcut verilerin yeni tipe uygun olup olmadığını kontrol eder. Uygun olmayan durumlarda hata verebilir veya veri kaybına neden olabilir.


-- VARCHAR sütunun boyutunu büyütme
ALTER TABLE Urunler
ALTER COLUMN UrunAdi VARCHAR(200);

-- Sütunun veri tipini ve NULL özelliğini değiştirme (PostgreSQL/Oracle)
ALTER TABLE Siparisler
ALTER COLUMN SiparisTarihi TYPE TIMESTAMP NOT NULL;

-- SQL Server için syntax
ALTER TABLE Siparisler
ALTER COLUMN SiparisTarihi DATETIME NOT NULL;

Sütun Adı Değiştirme

Bir sütunun adını değiştirmek için veritabanı sistemine göre farklı komutlar kullanılabilir. Çoğu modern RDBMS, ALTER TABLE RENAME COLUMN syntax’ını desteklerken, SQL Server gibi bazıları özel saklı yordamlar kullanır.


-- PostgreSQL / Oracle için örnek
ALTER TABLE Musteriler
RENAME COLUMN Eposta TO MusteriEpostasi;

-- SQL Server için örnek (sp_rename saklı yordamı kullanılır)
EXEC sp_rename 'Musteriler.Eposta', 'MusteriEpostasi', 'COLUMN';

Kısıtlama İşlemleri

Tabloların veri bütünlüğünü sağlamak için kısıtlamalar (constraints) kullanılır. ALTER TABLE ile bu kısıtlamalar eklenebilir veya kaldırılabilir.

Kısıtlama Ekleme: ADD CONSTRAINT

Yeni birincil anahtar (PRIMARY KEY), dış anahtar (FOREIGN KEY), benzersiz (UNIQUE), kontrol (CHECK) veya varsayılan değer (DEFAULT) kısıtlamaları eklemek için kullanılır.


-- Birincil Anahtar Ekleme
ALTER TABLE Siparisler
ADD CONSTRAINT PK_Siparisler PRIMARY KEY (SiparisID);

-- Dış Anahtar Ekleme
ALTER TABLE SiparisKalemleri
ADD CONSTRAINT FK_SiparisKalemleri_Siparisler FOREIGN KEY (SiparisID)
REFERENCES Siparisler (SiparisID);

-- Benzersiz Kısıtlama Ekleme
ALTER TABLE Kullanicilar
ADD CONSTRAINT UQ_KullaniciAdi UNIQUE (KullaniciAdi);

-- Kontrol Kısıtlaması Ekleme (yaşın 18'den büyük olmasını sağlama)
ALTER TABLE Calisanlar
ADD CONSTRAINT CK_CalisanYas CHECK (Yas >= 18);

-- Varsayılan Değer Kısıtlaması Ekleme
ALTER TABLE Urunler
ADD CONSTRAINT DF_UrunFiyati DEFAULT 0.00 FOR Fiyat;

Kısıtlama Silme: DROP CONSTRAINT

Bir tablodan mevcut bir kısıtlamayı, kısıtlama adını kullanarak kaldırmak için kullanılır.


ALTER TABLE Musteriler
DROP CONSTRAINT UQ_MusteriEpostasi;

ALTER TABLE SiparisKalemleri
DROP CONSTRAINT FK_SiparisKalemleri_Siparisler;

Tablo Adı Değiştirme: RENAME TABLE

Bir tablonun adını değiştirmek için kullanılır. Bu da veritabanına göre farklı syntax’lara sahip olabilir.


-- PostgreSQL / MySQL / Oracle için örnek
ALTER TABLE EskiTabloAdi
RENAME TO YeniTabloAdi;

-- SQL Server için örnek
EXEC sp_rename 'EskiTabloAdi', 'YeniTabloAdi';

Özetle, ALTER DATABASE ve ALTER TABLE komutları SQL veritabanı yönetiminin temel taşlarındandır. Bu komutlar, zamanla değişen iş ihtiyaçlarına uyum sağlamak için mevcut veritabanı ve tablo yapılarını güvenli bir şekilde düzenleme esnekliği sunar. Ancak, bu işlemlerin dikkatlice planlanması ve test edilmesi büyük önem taşır; zira yanlış uygulamalar veri bütünlüğünü olumsuz etkileyebilir. Doğru kullanıldığında, dinamik ve ölçeklenebilir veritabanı sistemlerinin anahtarıdırlar.


SQL’de Veritabanı ve Tablo Oluşturma (CREATE DATABASE / CREATE TABLE)

Veritabanları, modern uygulamaların ve işletmelerin kalbinde yer alır; tüm verilerin düzenli ve erişilebilir bir şekilde saklanmasını sağlar. SQL, bu veritabanlarını ve içindeki tabloları oluşturmanın temel dilidir. Bu makalede, bir veritabanının yapısını oluşturan ilk adımlar olan CREATE DATABASE ve CREATE TABLE komutlarını ayrıntılı olarak inceleyeceğiz. Doğru yapılandırma, verimlilik ve veri bütünlüğü için hayati önem taşır.

SQL’de Veritabanı Oluşturma: CREATE DATABASE

Veritabanı, ilgili verilerin bir araya getirildiği ve yönetildiği mantıksal bir konteynerdir. Uygulamanızın tüm verileri (kullanıcılar, ürünler, siparişler vb.) bu veritabanı içinde depolanır. SQL’de yeni bir veritabanı oluşturmak için CREATE DATABASE komutu kullanılır. Bu komut, belirtilen ada sahip boş bir veritabanı yapısı oluşturur.

Sözdizimi ve Örnek

CREATE DATABASE komutunun sözdizimi oldukça basittir:

CREATE DATABASE veritabani_adi;

Örneğin, bir e-ticaret uygulaması için bir veritabanı oluşturmak istediğinizde:

CREATE DATABASE ECommerceDB;

Bu komut, ECommerceDB adında boş bir veritabanı oluşturacaktır. Veritabanı oluşturulduktan sonra, üzerinde tablolar oluşturmak veya veri eklemek gibi işlemler yapabilmek için onu seçmeniz (aktif hale getirmeniz) gerekir. Bu işlem USE komutu ile gerçekleştirilir:

USE ECommerceDB;

Artık tüm SQL komutlarınız (tablo oluşturma, veri ekleme, sorgulama vb.) ECommerceDB veritabanı bağlamında çalışacaktır.

Tabloları Anlamak ve Yapılandırmak

Veritabanları içindeki veriler, satır ve sütunlardan oluşan tablolarda organize edilir. Her tablo belirli bir varlığı (örneğin, “Kullanıcılar” veya “Ürünler”) temsil eder ve sütunlar bu varlığın özelliklerini (örneğin, kullanıcının adı, ürünün fiyatı) tanımlar. Her satır ise o varlığın tek bir kaydını ifade eder. Bir tablonun sütunlarını tanımlarken, her sütun için bir veri tipi ve gerektiğinde kısıtlamalar belirtmek esastır.

Veri Tipleri

Veri tipleri, bir sütunda hangi tür verinin depolanacağını (metin, sayı, tarih vb.) belirler. Doğru veri tipi seçimi, depolama verimliliği ve veri tutarlılığı açısından önemlidir. Yaygın kullanılan bazı veri tipleri şunlardır:

  • INT: Tam sayılar için kullanılır (örneğin, kullanıcı ID’si, ürün adedi).
  • VARCHAR(boyut): Değişken uzunlukta karakter dizileri için. boyut, saklanabilecek maksimum karakter sayısını belirtir (örneğin, isimler, e-posta adresleri).
  • TEXT: Uzun metin blokları için (örneğin, ürün açıklamaları, yorumlar).
  • DATE: Tarih değerleri için (örneğin, ‘YYYY-MM-DD’).
  • DATETIME / TIMESTAMP: Tarih ve saat değerleri için.
  • DECIMAL(p, s): Ondalıklı sayılar için. p toplam basamak sayısını, s ondalık noktadan sonraki basamak sayısını belirtir (örneğin, fiyatlar, para birimleri).
  • BOOLEAN / TINYINT(1): Doğru/yanlış veya evet/hayır değerleri için.

Tablo Kısıtlamaları (Constraints)

Kısıtlamalar, bir tablodaki verilerin doğruluğunu ve bütünlüğünü sağlamak için kurallar koyar. Bu kurallar, hatalı veya tutarsız veri girişini engeller.

  • NOT NULL: Bu sütunun boş (NULL) değerler içeremeyeceğini belirtir. Bu, o sütuna her zaman bir değer girilmesi gerektiği anlamına gelir.
  • UNIQUE: Bu sütundaki tüm değerlerin benzersiz olması gerektiğini garanti eder. Yani, hiçbir iki satırın bu sütunda aynı değere sahip olamaz.
  • PRIMARY KEY: Tablodaki her satırı benzersiz bir şekilde tanımlayan bir sütun veya sütun kombinasyonudur. NOT NULL ve UNIQUE özelliklerini otomatik olarak içerir. Bir tabloda yalnızca bir tane PRIMARY KEY olabilir ve bu, tablolar arası ilişkilerin kurulmasında temel bir rol oynar.
  • FOREIGN KEY: Başka bir tablodaki birincil anahtara (PRIMARY KEY) referans veren bir sütundur. İki tablo arasındaki bağlantıyı kurarak referans bütünlüğünü sağlar. Örneğin, bir sipariş tablosundaki kullanici_id, kullanıcılar tablosundaki kullanici_id‘ye bir FOREIGN KEY olarak bağlanabilir.
  • DEFAULT değer: Eğer bir sütun için değer belirtilmezse, bu DEFAULT değerin kullanılacağını belirtir.
  • CHECK koşul: Bir sütuna girilebilecek değerler için belirli bir koşulun sağlanmasını zorunlu kılar (örneğin, yaşın 18’den büyük olması).

SQL’de Tablo Oluşturma: CREATE TABLE

Bir veritabanı içinde tablo oluşturmak için CREATE TABLE komutu kullanılır. Bu komut, tablonun adını, her bir sütunun adını, veri tipini ve herhangi bir kısıtlamayı belirtmenizi gerektirir.

Genel Sözdizimi

CREATE TABLE tablo_adi (
    sutun1_adi VERI_TIPI KISITLAMA(LAR),
    sutun2_adi VERI_TIPI KISITLAMA(LAR),
    ...
    sutunN_adi VERI_TIPI KISITLAMA(LAR),
    PRIMARY KEY (birincil_anahtar_sutunu_veya_sutunlari),
    FOREIGN KEY (yabanci_anahtar_sutunu) REFERENCES diger_tablo(referans_sutunu)
);

Örnek: “Kullanıcılar” ve “Siparişler” Tabloları Oluşturma

Öncelikle, daha önce oluşturduğumuz ECommerceDB veritabanını seçelim:

USE ECommerceDB;

Şimdi bir “Kullanıcılar” tablosu oluşturalım:

CREATE TABLE Kullanicilar (
    kullanici_id INT PRIMARY KEY AUTO_INCREMENT, -- Otomatik artan birincil anahtar (MySQL)
    ad VARCHAR(50) NOT NULL,
    soyad VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    sifre_hash VARCHAR(255) NOT NULL,
    kayit_tarihi DATE DEFAULT CURRENT_DATE
);

Bu örnekte:

  • kullanici_id: Her kullanıcıyı benzersiz bir şekilde tanımlayan birincil anahtar. AUTO_INCREMENT, yeni kayıt eklendikçe ID’nin otomatik olarak artmasını sağlar (MySQL için; diğer RDBMS’lerde IDENTITY veya SERIAL gibi karşılıkları vardır).
  • ad, soyad, email, sifre_hash: NOT NULL kısıtlaması ile bu alanların boş bırakılamayacağını belirtir.
  • email: UNIQUE kısıtlaması sayesinde her kullanıcının farklı bir e-posta adresine sahip olması sağlanır.
  • kayit_tarihi: Eğer bir tarih belirtilmezse, DEFAULT CURRENT_DATE sayesinde otomatik olarak geçerli tarihi alır.

Şimdi de “Siparişler” tablosunu oluşturalım ve “Kullanıcılar” tablosu ile ilişkilendirelim:

CREATE TABLE Siparisler (
    siparis_id INT PRIMARY KEY AUTO_INCREMENT,
    kullanici_id INT NOT NULL,
    siparis_tarihi DATETIME DEFAULT CURRENT_TIMESTAMP,
    toplam_tutar DECIMAL(10, 2) NOT NULL CHECK (toplam_tutar > 0),
    FOREIGN KEY (kullanici_id) REFERENCES Kullanicilar(kullanici_id)
);

Bu örnekte:

  • siparis_id: “Siparişler” tablosunun birincil anahtarı.
  • kullanici_id: “Kullanıcılar” tablosundaki kullanici_id‘ye referans veren bir FOREIGN KEY. Bu kısıtlama, yalnızca mevcut bir kullanıcının sipariş verebilmesini sağlar ve iki tablo arasında güçlü bir referans bütünlüğü bağlantısı kurar.
  • siparis_tarihi: Değer belirtilmezse otomatik olarak geçerli tarih ve saati alır.
  • toplam_tutar: DECIMAL(10, 2) ile ondalıklı sayıları saklar (toplam 10 basamak, ondalık kısmından sonra 2 basamak) ve CHECK (toplam_tutar > 0) kısıtlaması ile sipariş tutarının sıfırdan büyük olmasını zorunlu kılar.

Bu örnekler, CREATE TABLE komutunun veri tipleri ve kısıtlamalarla birlikte nasıl kullanıldığını ve tablolar arası ilişkilerin FOREIGN KEY ile nasıl kurulduğunu açıkça göstermektedir. Bu sayede, hem veri depolama yapısı oluşturulur hem de verilerin doğruluğu ve ilişkisel bütünlüğü garanti altına alınır.

SQL’deki CREATE DATABASE ve CREATE TABLE komutları, herhangi bir veri yönetim sisteminin temelini oluşturur. Bu komutlar sayesinde veritabanı yapısını tanımlayabilir, verilerinizi organize edebilir ve bütünlüğünü sağlayabilirsiniz. Doğru veri tipleri ve kısıtlamalar kullanarak güçlü ve güvenilir bir veri mimarisi inşa etmek, uygulamanızın performansını ve gelecekteki ölçeklenebilirliğini doğrudan etkiler. Bu temel adımları atarak, veri tabanınızın üzerine inşa edeceğiniz diğer tüm işlemleri sağlam bir temel üzerine oturtmuş olursunuz.


SQL’e Giriş: Nedir, Ne İşe Yarar?


Veri, günümüz dijital dünyasının kalbi ve işleyişini sağlayan temel unsurdur. Şirketler, uygulamalar ve sistemler sürekli olarak büyük miktarda veri üretmekte ve bu veriyi depolamak, yönetmek ve anlamlandırmak zorundadır. İşte bu noktada SQL devreye girer. SQL, ilişkisel veritabanı yönetim sistemleriyle etkileşim kurmak için tasarlanmış güçlü ve standart bir programlama dilidir. Verilerinizi sorgulamanın, manipüle etmenin ve yönetmenin anahtarıdır.

SQL Nedir?

SQL, açılımıyla Structured Query Language (Yapısal Sorgulama Dili), ilişkisel veritabanlarını yönetmek ve manipüle etmek için kullanılan standart bir programlama dilidir. İlk olarak 1970’li yılların başlarında IBM tarafından geliştirilen ve Edgar F. Codd’un ilişkisel modeline dayanan SQL, veritabanları ile iletişim kurmanın evrensel aracı haline gelmiştir. SQL’in temel amacı, bir veritabanından veri almak, veritabanına veri eklemek, mevcut verileri güncellemek veya silmek gibi işlemleri gerçekleştirmektir. Unutulmamalıdır ki SQL bir veritabanı değildir; aksine, MySQL, PostgreSQL, SQL Server, Oracle ve SQLite gibi çeşitli ilişkisel veritabanı yönetim sistemleri (RDBMS) ile konuşmak için kullanılan bir dildir.

SQL Ne İşe Yarar ve Neden Önemlidir?

SQL’in temel işlevi, veritabanları içindeki verileri etkili bir şekilde yönetmektir. Bu işlevsellik, veri tanımlama, veri işleme, veri kontrolü ve işlem kontrolü gibi dört ana kategoriye ayrılabilir:

1. Veri Tanımlama Dili (Data Definition Language – DDL)

DDL komutları, veritabanı yapısını ve şemasını oluşturmak, değiştirmek veya silmek için kullanılır. Bu, veritabanı objelerinin (tablolar, indeksler, görünümler vb.) tanımlanmasını sağlar.

  • CREATE: Yeni bir veritabanı, tablo, görünüm veya indeks oluşturmak için kullanılır.
    CREATE TABLE Calisanlar (
        CalisanID INT PRIMARY KEY,
        Ad VARCHAR(50),
        Soyad VARCHAR(50),
        DepartmanID INT
    );
  • ALTER: Mevcut bir tablonun yapısını değiştirmek (sütun eklemek, silmek, veri tipini değiştirmek) için kullanılır.
    ALTER TABLE Calisanlar ADD COLUMN Maas DECIMAL(10, 2);
  • DROP: Mevcut bir tablo, görünüm veya veritabanını silmek için kullanılır.
    DROP TABLE Calisanlar;

2. Veri İşleme Dili (Data Manipulation Language – DML)

DML komutları, veritabanındaki verileri sorgulamak, eklemek, güncellemek veya silmek için kullanılır. Bu, kullanıcıların gerçek veri içeriğiyle etkileşim kurmasını sağlar.

  • SELECT: Veritabanından veri almak için kullanılır. En sık kullanılan SQL komutudur.
    SELECT Ad, Soyad FROM Calisanlar WHERE DepartmanID = 101;
  • INSERT INTO: Bir tabloya yeni kayıtlar eklemek için kullanılır.
    INSERT INTO Calisanlar (CalisanID, Ad, Soyad, DepartmanID, Maas) VALUES (1, 'Ayşe', 'Yılmaz', 101, 60000.00);
  • UPDATE: Mevcut bir tablodaki verileri değiştirmek için kullanılır.
    UPDATE Calisanlar SET Maas = 65000.00 WHERE CalisanID = 1;
  • DELETE FROM: Bir tablodan kayıtları silmek için kullanılır.
    DELETE FROM Calisanlar WHERE CalisanID = 1;

3. Veri Kontrol Dili (Data Control Language – DCL)

DCL komutları, veritabanı erişim izinlerini ve yetkilerini yönetmek için kullanılır. Bu, veritabanı güvenliğini sağlamak için kritik öneme sahiptir.

  • GRANT: Kullanıcılara veya rollere belirli veritabanı ayrıcalıkları vermek için kullanılır (örneğin, bir tabloya SELECT veya INSERT izni vermek).
    GRANT SELECT ON Calisanlar TO kullanici_adi;
  • REVOKE: Daha önce verilmiş ayrıcalıkları geri almak için kullanılır.
    REVOKE SELECT ON Calisanlar FROM kullanici_adi;

4. İşlem Kontrol Dili (Transaction Control Language – TCL)

TCL komutları, bir veritabanı işlemindeki değişiklikleri yönetmek için kullanılır. İşlemler, bir dizi SQL komutunun mantıksal bir birimi olarak kabul edilir ve ya hepsi başarılı olur ya da hiçbiri olmaz (atomiklik).

  • COMMIT: Bir işlemdeki tüm değişiklikleri kalıcı olarak kaydetmek için kullanılır.
    COMMIT;
  • ROLLBACK: Bir işlemdeki tüm değişiklikleri geri almak ve veritabanını işlemin başlangıç durumuna döndürmek için kullanılır.
    ROLLBACK;
  • SAVEPOINT: Bir işlemin içinde geri döndürülebilecek belirli bir noktayı tanımlamak için kullanılır.

SQL’in önemi, günümüzün veri odaklı dünyasında veri toplama, depolama, analiz etme ve raporlama yeteneğinden kaynaklanmaktadır. Web uygulamalarından finans sistemlerine, sağlık hizmetlerinden bilimsel araştırmalara kadar her alanda merkezi bir rol oynar. Büyük veri analizi, iş zekası, yapay zeka ve makine öğrenimi gibi alanlarda dahi SQL becerileri temel bir gerekliliktir.

SQL Nasıl Çalışır?

SQL, genellikle bir istemci-sunucu mimarisi üzerinde çalışır. Bir kullanıcı veya uygulama (istemci), SQL sorgularını veritabanı sunucusuna gönderir. Veritabanı sunucusu, sorguyu alır, bir sorgu işlemcisi (query processor) aracılığıyla ayrıştırır, optimize eder ve yürütür. Sunucu, sorgunun sonucunu veritabanından alır ve istemciye geri gönderir. Bu süreç, verilerin hızlı ve etkin bir şekilde erişilebilir olmasını sağlar.

SQL, ilişkisel veritabanlarının temel taşıdır ve veriyi yönetmek, analiz etmek ve ondan değer elde etmek isteyen herkes için vazgeçilmez bir beceridir. Veri tanımlamasından manipülasyonuna, güvenlik yönetiminden işlem kontrolüne kadar geniş bir yelpazede yetenekler sunar. Dijitalleşen dünyada veri okuryazarlığı ve SQL bilgisi, sadece geliştiriciler için değil, aynı zamanda iş analistleri, veri bilimcileri ve yöneticiler için de kritik bir avantaj sağlamaktadır.



C# dilinde CI/CD: GitHub Actions veya Azure DevOps Pipeline entegrasyonu

C# projelerinizde geliştirme süreçlerini hızlandırmak ve yazılım kalitesini artırmak için Sürekli Entegrasyon (CI) ve Sürekli Teslimat/Dağıtım (CD) uygulamaları kritik öneme sahiptir. Bu otomasyon süreçleri, kod değişikliklerinin otomatik olarak derlenmesini, test edilmesini ve dağıtılmasını sağlayarak manuel hataları minimize eder ve ekiplerin daha hızlı, güvenilir yazılımlar sunmasına yardımcı olur. GitHub Actions ve Azure DevOps Pipelines, C# tabanlı uygulamalar için bu CI/CD hedeflerine ulaşmada önde gelen platformlardır.

CI/CD’nin C# Projelerindeki Önemi

C# dilinde geliştirilen web uygulamaları, masaüstü uygulamaları veya mikro hizmetler için CI/CD, yazılım yaşam döngüsünün ayrılmaz bir parçasıdır. Her kod değişikliğinde otomatik olarak tetiklenen bir derleme ve test süreci, hataların erken aşamada tespit edilmesini sağlar. Bu, geliştirme maliyetlerini düşürür ve son üründeki hata oranını azaltır. Ayrıca, dağıtım süreçlerinin otomatikleştirilmesi, üretim ortamına daha sık ve güvenilir güncellemeler yapılabilmesine olanak tanır. Güvenlik taramaları, kod kalitesi analizleri gibi ek adımların pipeline’a entegrasyonu, yazılımın genel güvenilirliğini ve sürdürülebilirliğini artırır. Bu otomasyon sayesinde geliştiriciler, altyapı yönetiminden ziyade iş mantığına odaklanabilirler.

GitHub Actions ile C# CI/CD Entegrasyonu

GitHub Actions, doğrudan GitHub repository’nizle entegre çalışan güçlü bir otomasyon platformudur. C# projeleriniz için CI/CD süreçlerini basit ve esnek YAML dosyalarıyla tanımlayabilirsiniz.

Temel Kavramlar

  • Workflow (İş Akışı): Bir veya daha fazla iş (job) içeren, belirli bir olay (örneğin, `push` veya `pull_request`) tetiklendiğinde çalışan otomatikleştirilmiş süreç.
  • Job (İş): Bir sanal makine (runner) üzerinde çalışan bir dizi adımdan (step) oluşur. Bağımsız olarak veya diğer işlere bağımlı olarak çalışabilir.
  • Step (Adım): Bir komutu çalıştıran veya bir eylemi (action) yürüten tek bir görev.
  • Action (Eylem): Önceden tanımlanmış, tekrar kullanılabilir bir görev (örneğin, `checkout` deposunu klonlama, `setup-dotnet` .NET SDK’yı kurma).

C# Projeleri İçin Yapılandırma

C# projeleri genellikle `dotnet` CLI komutları kullanılarak derlenir ve test edilir. GitHub Actions içerisinde bu komutları kolayca çalıştırabilirsiniz.


name: C# CI/CD

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Setup .NET
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: '6.0.x' # Veya projenizin kullandığı sürüm
    - name: Restore dependencies
      run: dotnet restore
    - name: Build
      run: dotnet build --no-restore
    - name: Test
      run: dotnet test --no-build --verbosity normal
    - name: Publish (Opsiyonel)
      run: dotnet publish -c Release -o ./publish
    - name: Upload a Build Artifact (Opsiyonel)
      uses: actions/upload-artifact@v3
      with:
        name: my-app
        path: ./publish

Bu örnekte, `main` branch’ine yapılan her `push` veya `pull_request` işlemi bir iş akışını tetikler. İş akışı, .NET SDK’yı kurar, bağımlılıkları geri yükler, projeyi derler ve testleri çalıştırır. İsteğe bağlı olarak, yayımlanan çıktılar bir derleme artefaktı olarak saklanabilir.

Dağıtım Senaryoları

GitHub Actions ile C# uygulamalarını farklı ortamlara dağıtabilirsiniz:

  • Azure App Service: `azure/webapps-deploy@v2` gibi hazır action’lar kullanarak uygulamanızı doğrudan Azure App Service’e dağıtabilirsiniz.
  • Docker Registry: Uygulamanızı bir Docker imajına dönüştürüp GitHub Container Registry (GHCR) veya Azure Container Registry (ACR) gibi bir kayıt defterine gönderebilirsiniz.
  • NuGet Paket Yönetimi: Bir .NET kütüphanesi geliştiriyorsanız, `dotnet pack` ile bir NuGet paketi oluşturup, sonra `nuget push` komutu ile NuGet.org veya özel bir NuGet sunucusuna yayınlayabilirsiniz.

Azure DevOps Pipelines ile C# CI/CD Entegrasyonu

Azure DevOps, hem proje yönetimi (Boards), sürüm kontrolü (Repos), test planları (Test Plans) hem de CI/CD (Pipelines) gibi tüm ALM (Application Lifecycle Management) araçlarını tek bir platformda sunar.

Temel Kavramlar

  • Pipeline (İş Hattı): Bir veya daha fazla aşamadan (stage) oluşan, otomatikleştirilmiş bir süreç. YAML veya Classic Editor (görsel) kullanılarak tanımlanabilir.
  • Stage (Aşama): Mantıksal olarak ilgili işleri (job) gruplar. Örneğin, “Build”, “Test”, “Deploy” aşamaları olabilir.
  • Job (İş): Bir veya daha fazla görevden (task) oluşan, bir agent üzerinde çalışan bir birim.
  • Task (Görev): Bir eylem gerçekleştiren önceden tanımlanmış bir adım (örneğin, `.NET Core` taskı, `Visual Studio Build` taskı).
  • Agent: İşleri yürüten bir sanal makine veya fiziksel sunucu. Microsoft tarafından barındırılan agent’lar veya kendi barındırdığınız agent’lar kullanılabilir.

C# Projeleri İçin Yapılandırma

Azure DevOps Pipelines, C# projeleri için geniş bir görev yelpazesi sunar.


trigger:
- main

pool:
  vmImage: 'windows-latest' # veya 'ubuntu-latest'

variables:
  buildConfiguration: 'Release'

stages:
- stage: Build
  displayName: Build and Test
  jobs:
  - job: BuildJob
    steps:
    - task: DotNetCoreCLI@2
      displayName: 'Restore NuGet Packages'
      inputs:
        command: 'restore'
        projects: '**/*.csproj'

    - task: DotNetCoreCLI@2
      displayName: 'Build Project'
      inputs:
        command: 'build'
        projects: '**/*.csproj'
        arguments: '--configuration $(buildConfiguration)'

    - task: DotNetCoreCLI@2
      displayName: 'Run Tests'
      inputs:
        command: 'test'
        projects: '**/*.csproj'
        arguments: '--configuration $(buildConfiguration) --no-build'

    - task: DotNetCoreCLI@2
      displayName: 'Publish Application'
      inputs:
        command: 'publish'
        projects: '**/*.csproj'
        publishWebProjects: true
        arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)'
        zipAfterPublish: true

    - publish: $(Build.ArtifactStagingDirectory)
      artifact: drop

Bu YAML pipeline’ı, `main` branch’ine yapılan her `push` işleminde tetiklenir. NuGet paketlerini geri yükler, projeyi derler, testleri çalıştırır ve uygulamayı yayımlar. Yayımlanan çıktı (artifact), dağıtım aşamasında kullanılmak üzere `drop` adıyla saklanır. `DotNetCoreCLI@2` gibi task’lar, `dotnet` komutlarını kapsülleyen ve kullanımı kolaylaştıran özel görevlerdir.

Dağıtım Senaryoları

Azure DevOps Pipelines, Azure ekosistemiyle derin entegrasyon sunar:

  • Azure App Service Dağıtımı: `AzureWebApp@1` görevi ile uygulamanızı kolayca Azure App Service’e dağıtabilirsiniz.
  • Azure Kubernetes Service (AKS): Kubernetes manifest dosyalarını uygulayarak veya Helm grafikleri kullanarak AKS’e dağıtım yapabilirsiniz.
  • Artifact Yönetimi: Azure Artifacts ile NuGet, npm, Maven gibi paketleri depolayabilir ve yönetebilirsiniz.
  • On-Premise Dağıtımlar: Kendi barındırdığınız (self-hosted) agent’lar aracılığıyla şirket içi sunuculara veya özel ağlardaki hedeflere dağıtım yapabilirsiniz.

GitHub Actions ve Azure DevOps Pipelines Arasındaki Seçim

Her iki platform da C# projeleri için kapsamlı CI/CD yetenekleri sunar, ancak bazı farklılıklar seçiminizde etkili olabilir:

  • GitHub Actions:
    • GitHub üzerinde geliştirilen açık kaynak projeler veya zaten GitHub’ı ana sürüm kontrol sistemi olarak kullanan ekipler için doğal bir seçimdir.
    • Basit, olay odaklı iş akışları oluşturmak kolaydır.
    • Geniş bir topluluk tarafından geliştirilen hazır Action’lar ek esneklik sunar.
    • GitHub CodeSpaces gibi diğer GitHub hizmetleriyle sorunsuz entegrasyon.
  • Azure DevOps Pipelines:
    • Azure ekosistemiyle derin entegrasyon arayan kurumsal müşteriler için idealdir.
    • Azure Boards (proje yönetimi), Azure Repos (sürüm kontrolü) ve Azure Test Plans gibi diğer DevOps araçlarıyla tek bir çatı altında bütünleşik bir deneyim sunar.
    • Gelişmiş kurumsal özellikler, onay süreçleri, dağıtım ağ geçitleri ve kendi barındırılan agent’lar için daha güçlü destek.
    • Classic Editor ile YAML bilmeyen ekipler için görsel bir pipeline oluşturma imkanı.

Her iki platform da YAML tabanlı pipeline tanımını destekler, bu da CI/CD süreçlerinin sürüm kontrolüne alınmasını ve “pipeline as code” yaklaşımını benimsemeyi kolaylaştırır. Hangi platformun seçileceği, mevcut altyapınız, ekip tercihleri ve projenizin gereksinimlerine bağlıdır.

Sonuç

C# projeleri için CI/CD, yazılım geliştirme süreçlerini modernize etmenin ve hızlandırmanın temel taşıdır. İster GitHub Actions’ın esnekliği ve topluluk odaklı yapısından faydalanın, ister Azure DevOps Pipelines’ın kurumsal düzeydeki entegre ALM çözümlerini tercih edin, her iki platform da güçlü otomasyon yetenekleri sunar. Uygulamanızın kalitesini artırmak, manuel hataları azaltmak ve hızlı teslimatlar sağlamak için bu araçları etkili bir şekilde kullanarak, C# projelerinizin başarısını önemli ölçüde yükseltebilirsiniz. Seçiminiz ne olursa olsun, otomasyon yolculuğunuzda önemli bir adım atmış olacaksınız.


C# dilinde Azure veya AWS üzerinde C# uygulamaları

C# dilinde geliştirilen uygulamaların bulut bilişim dünyasındaki yeri gün geçtikçe önem kazanmaktadır. Microsoft’un güçlü .NET ekosistemi sayesinde C# geliştiricileri, uygulamalarını Azure veya AWS gibi önde gelen bulut platformlarına kolayca taşıyabilmektedir. Bu makale, C# uygulamalarını bu platformlarda barındırmanın sunduğu fırsatları, teknik yaklaşımları ve kullanılan başlıca hizmetleri detaylı bir şekilde inceleyecektir. Bulutun esnekliğinden ve ölçeklenebilirliğinden faydalanarak modern, yüksek performanslı ve güvenli uygulamalar geliştirmek için C# dilinin gücünü keşfedin.

C# ve .NET’in Bulut Bilişimdeki Yeri

C# ve .NET ekosistemi, Microsoft tarafından geliştirilen ve sürekli güncellenen güçlü bir platformdur. Özellikle .NET Core’un (şimdi sadece .NET olarak anılıyor) açık kaynak ve platformlar arası desteğiyle, C# uygulamaları Windows’un ötesine geçerek Linux ve macOS gibi farklı işletim sistemlerinde de çalışabilmektedir. Bu esneklik, bulut ortamlarında uygulama geliştirme ve dağıtımı için C#’ı ideal bir seçenek haline getirir. Yüksek performans, güvenlik, zengin kütüphane desteği ve geniş geliştirici topluluğu, C#’ın kurumsal düzeydeki uygulamalardan mikroservislere, API’lerden sunucusuz fonksiyonlara kadar geniş bir yelpazede tercih edilmesinin ana nedenleridir.

Bulut bilişim, uygulamaların ölçeklenebilirlik, maliyet etkinliği, erişilebilirlik ve yönetim kolaylığı gibi faydalarından dolayı günümüzün modern yazılım mimarilerinin temelini oluşturur. C# geliştiricileri, Azure veya AWS gibi lider bulut sağlayıcılarının sunduğu zengin hizmet setlerinden faydalanarak uygulamalarını daha hızlı geliştirebilir, dağıtabilir ve yönetebilirler.

Azure Üzerinde C# Uygulamaları Geliştirme

Microsoft Azure, C# ve .NET uygulamaları için doğal bir ev ortamı sunar. Geniş hizmet yelpazesi ve .NET ekosistemiyle derin entegrasyonu sayesinde Azure, C# geliştiricileri için oldukça popüler bir tercihtir.

Azure Uygulama Hizmetleri

  • Azure App Service: Web uygulamaları, API’ler ve mobil arka uçlar için yönetilen bir PaaS (Platform as a Service) hizmetidir. C# ile yazılmış ASP.NET Core uygulamalarınızı minimum yapılandırma ile kolayca dağıtabilir, otomatik ölçeklendirme ve sürekli dağıtım (CI/CD) özelliklerinden faydalanabilirsiniz.
  • Azure Functions: Sunucusuz (Serverless) mimari için tasarlanmış, olay tabanlı (event-driven) bir bilgi işlem hizmetidir. C# ile küçük, tek amaca yönelik fonksiyonlar yazabilir, bunları HTTP istekleri, zamanlayıcılar, kuyruk mesajları veya diğer Azure hizmetleri tarafından tetikleyebilirsiniz. Bu, maliyet etkinliği ve otomatik ölçeklendirme sağlar.

Kapsayıcı (Container) Temelli Çözümler

  • Azure Kubernetes Service (AKS): Kapsayıcılı uygulamaları dağıtmak ve yönetmek için endüstri standardı Kubernetes’i Azure’da yönetilen bir hizmet olarak sunar. C# uygulamalarınızı Docker kapsayıcılarına paketleyip AKS üzerinde ölçeklenebilir ve dayanıklı mikroservis mimarileri oluşturabilirsiniz.
  • Azure Container Apps: Kapsayıcılı mikroservisler için sunucusuz bir platformdur. Daha az Kubernetes bilgisi gerektirir ve özellikle HTTP tabanlı API’ler ve arka plan işleri için idealdir.

Veri Tabanları ve Depolama

  • Azure SQL Database: Yönetilen bir ilişkisel veri tabanı hizmetidir ve SQL Server ile tamamen uyumludur. C# uygulamalarınız için güçlü ve ölçeklenebilir bir veri depolama çözümü sunar.
  • Azure Cosmos DB: Küresel olarak dağıtılmış, çok modelli bir NoSQL veri tabanıdır. Farklı API’leri (SQL, MongoDB, Cassandra vb.) destekler ve C# uygulamalarınız için düşük gecikmeli, yüksek performanslı çözümler sağlar.
  • Azure Storage: Blob, dosya, kuyruk ve tablo depolama hizmetleri sunar. C# uygulamalarınızdan statik dosyaları, mesaj kuyruklarını veya yapılandırılmış NoSQL verileri depolamak için kullanılabilir.

Mesajlaşma ve Entegrasyon

  • Azure Service Bus: Güvenilir ve ölçeklenebilir bir kurumsal mesajlaşma hizmetidir. C# uygulamaları arasında asenkron iletişimi ve iş akışlarını sağlar.
  • Azure Event Hubs: Büyük veri akışlarını (stream processing) işlemek için tasarlanmış bir olay alım hizmetidir. IoT senaryoları ve gerçek zamanlı veri analizleri için C# ile entegre edilebilir.

Geliştirme ve Dağıtım (DevOps)

  • Azure DevOps: Kaynak kontrolünden sürekli entegrasyona (CI) ve sürekli dağıtıma (CD) kadar tüm uygulama yaşam döngüsünü destekleyen bir dizi hizmet sunar. C# projeleriniz için otomatik derleme, test ve dağıtım süreçleri oluşturmanızı sağlar.

AWS Üzerinde C# Uygulamaları Geliştirme

Amazon Web Services (AWS), bulut bilişim alanında pazar liderlerinden biridir ve .NET geliştiricileri için güçlü bir platform sunar. AWS, uzun yıllardır .NET’i desteklemektedir ve C# uygulamalarınızı barındırmak için birçok esnek seçenek sunar.

Sanallaştırma ve Yönetilen Servisler

  • Amazon EC2 (Elastic Compute Cloud): Sanal sunucular (VM’ler) sunar. C# uygulamalarınızı kendi Windows veya Linux tabanlı EC2 örnekleriniz üzerinde barındırabilir, ortam üzerinde tam kontrol sağlayabilirsiniz.
  • AWS Elastic Beanstalk: C# ASP.NET Core uygulamaları da dahil olmak üzere web uygulamalarını ve hizmetlerini hızlı bir şekilde dağıtmak ve yönetmek için kullanılan bir PaaS hizmetidir. Temel altyapıyı sizin yerinize yönetir, böylece geliştiriciler kod yazmaya odaklanabilir.
  • AWS Lambda: AWS’nin sunucusuz bilgi işlem hizmetidir. C# dilinde yazılmış fonksiyonlarınızı olaylara yanıt olarak çalıştırabilir, sunucu yönetimi endişesi olmadan yüksek ölçeklenebilirlik ve maliyet etkinliği elde edebilirsiniz.

Kapsayıcı (Container) Temelli Çözümler

  • Amazon ECS (Elastic Container Service) / Amazon EKS (Elastic Kubernetes Service): Kapsayıcılı uygulamaları dağıtmak ve ölçeklendirmek için yönetilen kapsayıcı orkestrasyon hizmetleridir. ECS daha AWS’ye özgü bir yaklaşıma sahipken, EKS standart Kubernetes’i yönetilen bir hizmet olarak sunar. C# mikroservislerinizi bu platformlarda çalıştırabilirsiniz.

Veri Tabanları ve Depolama

  • Amazon RDS (Relational Database Service): MySQL, PostgreSQL, SQL Server gibi popüler ilişkisel veri tabanları için yönetilen bir hizmettir. C# uygulamalarınız için kolayca ölçeklenebilir ve yüksek erişimli ilişkisel veri tabanları sağlayabilir.
  • Amazon DynamoDB: Düşük gecikmeli, ölçeklenebilir bir NoSQL veri tabanı hizmetidir. Yüksek performans gerektiren C# uygulamaları için idealdir.
  • Amazon S3 (Simple Storage Service): Nesne depolama hizmetidir. C# uygulamalarınızdan statik dosyaları, yedeklemeleri veya büyük veri setlerini depolamak için kullanılabilir.

Mesajlaşma ve Entegrasyon

  • Amazon SQS (Simple Queue Service): Tamamen yönetilen bir mesaj kuyruğu hizmetidir. C# uygulamaları arasında asenkron iletişimi ve mikroservis entegrasyonunu destekler.
  • Amazon SNS (Simple Notification Service): Mesajları çok sayıda aboneye veya son noktaya dağıtmak için kullanılan bir yayın-abone (pub/sub) hizmetidir. C# uygulamalarınızdan olay bildirimleri göndermek için kullanılabilir.

Geliştirme ve Dağıtım (DevOps)

  • AWS CodeCommit, CodeBuild, CodeDeploy, CodePipeline: AWS’nin CI/CD süreçleri için entegre hizmetleridir. C# projeleriniz için otomatik derleme, test ve dağıtım hattı oluşturmanızı sağlar.

Azure ve AWS Arasında Seçim Yapmak

C# uygulamalarınızı dağıtırken Azure veya AWS arasında seçim yapmak, genellikle projenin özel gereksinimlerine, mevcut geliştirici ekibinin uzmanlığına, maliyet faktörlerine ve mevcut kurumsal stratejilere bağlıdır.

  • Mevcut Uzmanlık: Ekibinizde Azure veya AWS konusunda mevcut bir uzmanlık varsa, bu platformu tercih etmek öğrenme eğrisini azaltır ve daha hızlı başlangıç sağlar.
  • Hizmet Entegrasyonu: Microsoft ürünleri (örneğin SQL Server, Active Directory) ile yoğun entegrasyona ihtiyaç duyan projeler için Azure doğal olarak daha uyumlu olabilir. AWS ise çok çeşitli açık kaynak ve üçüncü taraf teknolojileriyle geniş entegrasyon sunar.
  • Maliyet: Her iki platformun da karmaşık fiyatlandırma modelleri vardır. Uygulamanızın kaynak tüketimini tahmin ederek ve her iki platformdaki ilgili hizmetlerin maliyetlerini karşılaştırarak en uygun çözümü bulmak önemlidir. Maliyet optimizasyonu, bulutta sürekli bir süreçtir.
  • Ölçeklenebilirlik ve Performans: Her iki platform da yüksek ölçeklenebilirlik ve performans sunar. Seçim, genellikle belirli bir hizmetin performans karakteristikleri veya coğrafi dağıtım gereksinimleri gibi ince ayrıntılara dayanır.
  • Hybrid Cloud Stratejileri: Şirketinizin bir hibrit bulut stratejisi varsa (hem şirket içi hem de bulut ortamlarını kullanma), her iki sağlayıcının da hibrit çözümleri bulunur (Azure Stack, AWS Outposts) ve bu faktör bir tercih sebebi olabilir.

Ortak Zorluklar ve En İyi Uygulamalar

C# uygulamalarını bulutta geliştirirken ve yönetirken bazı ortak zorluklar ve bunların üstesinden gelmek için en iyi uygulamalar bulunmaktadır:

  • Maliyet Optimizasyonu: Bulutun en büyük avantajlarından biri esneklik olsa da, kaynakların verimli kullanılmaması maliyetleri artırabilir. Kullanılmayan kaynakları kapatmak, doğru boyutlandırma yapmak, sunucusuz mimarileri kullanmak ve rezervasyon örneklerinden faydalanmak maliyetleri düşürmeye yardımcı olur.
  • Güvenlik: Bulut güvenliği ortak bir sorumluluktur. Uygulama düzeyinde güvenlik önlemleri (kimlik doğrulama, yetkilendirme), ağ güvenliği (güvenlik grupları, ağ ACL’leri), veri şifrelemesi ve düzenli güvenlik denetimleri kritik öneme sahiptir.
  • İzleme ve Günlüğe Kaydetme: Uygulamalarınızın performansını, sağlığını ve olası sorunlarını izlemek için kapsamlı izleme ve günlüğe kaydetme çözümleri (Azure Monitor, AWS CloudWatch) kullanmak hayati öneme sahiptir.
  • Otomasyon ve Altyapı Olarak Kod (IaC): Altyapının kod olarak yönetilmesi (Terraform, Azure Resource Manager şablonları, AWS CloudFormation) hata oranını azaltır, tutarlılığı artırır ve dağıtım süreçlerini hızlandırır.
  • Sürekli Entegrasyon ve Sürekli Dağıtım (CI/CD): Otomatikleştirilmiş CI/CD pipeline’ları, C# uygulamalarınızın hızlı ve güvenilir bir şekilde buluta dağıtılmasını sağlar.

C# uygulamalarını Azure ve AWS üzerinde barındırmak, geliştiricilere sınırsız ölçeklenebilirlik, yüksek erişilebilirlik ve maliyet etkinliği gibi birçok avantaj sunar. Her iki platform da .NET ekosistemiyle derin entegrasyon sağlayarak sunucusuzdan kapsayıcılara, yönetilen veri tabanlarından mesajlaşma servislerine kadar geniş bir hizmet yelpazesi sunar. Doğru stratejiler ve hizmet seçimleriyle C# geliştiricileri, modern bulut mimarileri oluşturarak iş gereksinimlerini en verimli şekilde karşılayabilir, geleceğin teknolojilerine yön verebilirler.


C# dilinde gRPC ile yüksek performanslı servis iletişimi

Günümüzün dağıtık sistem mimarilerinde servisler arası verimli ve yüksek performanslı iletişim kritik bir öneme sahiptir. Özellikle mikroservis tabanlı uygulamalarda, servislerin birbirleriyle hızlı ve güvenilir bir şekilde konuşabilmesi, genel sistem performansını ve kullanıcı deneyimini doğrudan etkiler. Bu bağlamda, Google tarafından geliştirilen açık kaynaklı bir Uzak Prosedür Çağrısı (RPC) çerçevesi olan gRPC, C# geliştiricilerine yüksek performanslı servis iletişimi için güçlü bir çözüm sunmaktadır.

gRPC Nedir ve Neden Yüksek Performanslıdır?

gRPC (gRPC Remote Procedure Call), modern, yüksek performanslı ve açık kaynaklı bir RPC çerçevesidir. Geleneksel HTTP/JSON tabanlı REST API’lere kıyasla birçok avantaj sunar. gRPC’nin temel performansı, iki ana bileşenden gelir:

  • HTTP/2 Protokolü: gRPC, temelde HTTP/2 protokolünü kullanır. HTTP/2, tek bir TCP bağlantısı üzerinden çoklu akış (multiplexing), başlık sıkıştırma (HPACK) ve sunucu itme (server push) gibi özellikler sunarak, gecikmeyi azaltır ve bant genişliği kullanımını optimize eder. Bu sayede, aynı anda birden fazla isteğin eş zamanlı olarak işlenmesi ve daha az bağlantı overhead’i mümkün olur.
  • Protocol Buffers (Protobuf): gRPC, veri serileştirme için Protocol Buffers’ı (Protobuf) tercih eder. Protobuf, XML veya JSON gibi metin tabanlı serileştirme formatlarına göre çok daha kompakt, verimli ve hızlı bir ikili serileştirme formatıdır. Verilerin sıkıştırılmış, ikili formda gönderilmesi, ağ trafiğini önemli ölçüde azaltır ve serileştirme/seri kaldırma işlemlerini hızlandırır. Bu da özellikle yüksek hacimli veri transferlerinde büyük bir performans kazancı sağlar.

Bu iki temel özellik sayesinde gRPC, düşük gecikme süresi, yüksek verim ve gelişmiş ölçeklenebilirlik sunarak, özellikle mikroservisler ve gerçek zamanlı uygulamalar için ideal bir iletişim çözümü haline gelir.

gRPC’nin Temel Bileşenleri ve C# Entegrasyonu

gRPC’nin temel yapısı ve C# ile nasıl entegre olduğu aşağıdaki bileşenlerle açıklanabilir:

1. Protocol Buffers (.proto Dosyaları)

gRPC’de servis kontratları ve mesaj yapıları .proto dosyaları kullanılarak tanımlanır. Bu dosyalar, hem servislerin hangi yöntemleri sunacağını hem de bu yöntemlerin hangi veri tipleriyle iletişim kuracağını belirler. Örneğin, basit bir “Merhaba” servisi için .proto dosyası şöyle görünebilir:

syntax = "proto3";

option csharp_namespace = "GrpcServer";

package greet;

// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}

Bu dosya, bir Greeter servisi ve SayHello adlı bir yöntem tanımlar. HelloRequest ve HelloReply ise bu yöntem için girdi ve çıktı mesaj yapılarıdır. C# projenize bu .proto dosyasını eklediğinizde, Grpc.Tools paketi otomatik olarak sunucu ve istemci tarafında kullanılacak soyut sınıfları ve veri modellerini oluşturur.

2. C# ile gRPC Servis Uygulaması (Sunucu)

Oluşturulan .proto dosyasından türetilen soyut sınıfı (örneğin Greeter.GreeterBase) miras alarak kendi servis implementasyonumuzu yazabiliriz. ASP.NET Core ile gRPC servisleri oluşturmak oldukça kolaydır. Bir sunucu tarafı C# uygulaması şu adımları izler:

  1. Yeni bir ASP.NET Core gRPC projesi oluşturulur.
  2. .proto dosyası proje dosyasına eklenir ve derleme sırasında C# kodunun oluşturulması sağlanır.
  3. Oluşturulan soyut servisi miras alan bir sınıf (örneğin GreeterService) oluşturulur ve servis mantığı bu sınıf içinde yazılır.

Basit bir GreeterService örneği:

using Grpc.Core;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace GrpcServer
{
    public class GreeterService : Greeter.GreeterBase
    {
        private readonly ILogger<GreeterService> _logger;

        public GreeterService(ILogger<GreeterService> logger)
        {
            _logger = logger;
        }

        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        {
            _logger.LogInformation($"Saying hello to {request.Name}");
            return Task.FromResult(new HelloReply
            {
                Message = $"Hello {request.Name}"
            });
        }
    }
}

Bu servis, gelen HelloRequest‘teki ismi alarak bir karşılama mesajı döndürür. Son olarak, Program.cs (veya eski projelerde Startup.cs) içinde gRPC servisi Kestrel sunucusuna eklenir:

// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc(); // gRPC servislerini ekle

var app = builder.Build();

app.MapGrpcService<GreeterService>(); // Servisi endpoint olarak tanımla
app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client.");

app.Run();

3. C# ile gRPC İstemci Uygulaması

İstemci tarafında da benzer şekilde .proto dosyasından üretilen kodlar kullanılır. Bir C# istemcisi şu adımları izler:

  1. Yeni bir konsol uygulaması veya başka bir C# projesi oluşturulur.
  2. .proto dosyası proje dosyasına eklenir ve istemci kodu üretilir.
  3. GrpcChannel oluşturulur ve bu kanal üzerinden servis istemcisi (stub) elde edilir.

Basit bir gRPC istemci örneği:

using Grpc.Net.Client;
using GrpcServer; // Sunucu projesindeki Protobuf tarafından oluşturulan namespace

Console.WriteLine("gRPC Client Started!");

// gRPC kanalını oluşturun (sunucu adresini belirtin)
using var channel = GrpcChannel.ForAddress("https://localhost:7077"); // Sunucu portunuza göre değişir

// Greeter servisi için istemci oluşturun
var client = new Greeter.GreeterClient(channel);

// SayHello metodunu çağırın
var reply = await client.SayHelloAsync(
    new HelloRequest { Name = "World" });

Console.WriteLine("Greeting: " + reply.Message);
Console.ReadKey();

Bu istemci kodu, sunucudaki GreeterService‘e bir istek gönderir ve aldığı cevabı konsola yazdırır.

C# Ortamında gRPC’nin Avantajları

C# ve .NET ekosistemi, gRPC ile yüksek performanslı servis iletişimi geliştirmek için birçok avantaj sunar:

  • ASP.NET Core Entegrasyonu: gRPC, ASP.NET Core ile derinlemesine entegredir. Kestrel web sunucusu üzerinde doğal olarak çalışır ve ASP.NET Core’un tüm modern özelliklerinden (bağımlılık enjeksiyonu, konfigürasyon, loglama, middleware vb.) faydalanır.
  • Gelişmiş Araç Desteği: Visual Studio ve .NET CLI, gRPC proje şablonları ve Protobuf dosyalarının otomatik kod üretimi için güçlü araç desteği sunar, bu da geliştirme sürecini hızlandırır.
  • Yüksek Performans: C# dilinin JIT derlemesi, Async/Await mekanizmaları ve .NET’in optimize edilmiş çalışma zamanı (CLR) sayesinde, gRPC servisleri C# ortamında son derece yüksek performans sergiler.
  • Çapraz Platform Desteği: .NET 5+ ile birlikte C# gRPC uygulamaları Windows, Linux ve macOS dahil olmak üzere çeşitli platformlarda sorunsuz bir şekilde çalışabilir.
  • Güvenlik ve İzlenebilirlik: TLS/SSL ile güvenli iletişim, zengin loglama ve metrik toplama entegrasyonları sayesinde gRPC servisleri güvenli ve izlenebilir bir şekilde çalıştırılabilir.

Pratik Uygulama Senaryoları

gRPC’nin C# ile birlikte kullanılabileceği bazı pratik senaryolar şunlardır:

  • Mikroservis Mimarileri: Farklı dillerde yazılmış mikroservisler arasında hızlı ve verimli iletişim sağlamak için idealdir.
  • Gerçek Zamanlı Uygulamalar: Chat uygulamaları, oyun sunucuları, IoT cihazları ve canlı veri akışları gibi düşük gecikme süresi gerektiren senaryolarda çift yönlü akış (bi-directional streaming) yetenekleri sayesinde üstün performans sunar.
  • Mobil ve Web İstemcileri ile İletişim: gRPC-Web kullanarak web tarayıcılarından veya mobil uygulamalardan gRPC servisleriyle iletişim kurmak mümkündür, bu da performanstan ödün vermeden zengin kullanıcı deneyimleri sunar.
  • Düşük Bant Genişliği Ortamları: Protobuf’un kompakt veri formatı sayesinde, kısıtlı ağ kaynaklarına sahip ortamlarda (örneğin mobil ağlar) daha verimli iletişim sağlar.

Sonuç

C# ile gRPC, modern dağıtık sistemlerde yüksek performanslı servis iletişimi için oldukça güçlü ve esnek bir çözümdür. HTTP/2 ve Protocol Buffers’ın sağladığı hız, verimlilik ve düşük gecikme avantajları, C# dilinin ve .NET ekosisteminin sunduğu güçlü geliştirme araçları ve entegrasyon yetenekleriyle birleştiğinde, ölçeklenebilir ve sağlam uygulamalar inşa etmek için ideal bir platform sunar. Bu kombinasyon, özellikle mikroservisler, gerçek zamanlı uygulamalar ve yüksek veri hacimli sistemler için geleceğin iletişim standardını temsil etmektedir.


C# dilinde ML.NET ile Yapay Zeka ve Makine Öğrenmesi

Günümüzün hızla değişen dijital dünyasında yapay zeka (YZ) ve makine öğrenmesi (ML), işletmelerden bireysel geliştiricilere kadar geniş bir yelpazede yenilikçi çözümler sunuyor. Bu güçlü teknolojileri .NET ekosistemiyle birleştirmek isteyen C# geliştiricileri için Microsoft’un açık kaynaklı ML.NET framework’ü önemli bir köprü görevi görüyor. ML.NET, mevcut C# becerilerini kullanarak tahmine dayalı modeller oluşturma, veri analizi yapma ve akıllı uygulamalar geliştirme imkanı sunar.

ML.NET Nedir ve Neden Önemlidir?

ML.NET, .NET geliştiricilerinin özel makine öğrenmesi modelleri oluşturmak, eğitmek ve uygulamalarına entegre etmek için kullanabileceği açık kaynaklı, çapraz platform bir makine öğrenmesi framework’üdür. Geleneksel olarak makine öğrenmesi Python gibi dillerle ilişkilendirilse de ML.NET, C# dilinde güçlü ve performanslı makine öğrenmesi yetenekleri sunarak bu algıyı değiştirmiştir. Bu sayede, .NET ekosistemine hakim geliştiricilerin yeni bir dil öğrenme zorunluluğu olmadan yapay zeka projelerine dahil olmasını sağlar.

ML.NET’in en büyük avantajlarından biri, C# projeleriyle sorunsuz entegrasyonudur. Mevcut kurumsal uygulamalarınıza doğrudan makine öğrenmesi yetenekleri ekleyebilir, veri odaklı kararlar almanıza yardımcı olacak modeller geliştirebilirsiniz. Ayrıca, performans açısından optimize edilmiş arka uç algoritmaları sayesinde büyük veri setleriyle çalışırken bile yüksek verimlilik sunar.

ML.NET ile Makine Öğrenmesi Süreci

ML.NET kullanarak bir makine öğrenmesi modeli oluşturma süreci genellikle belirli adımları içerir. Bu adımlar, veri hazırlığından model eğitimine ve değerlendirmeye kadar mantıksal bir akış izler:

  1. Veri Yükleme ve Hazırlık: Makine öğrenmesi modellerinin temelini veriler oluşturur. ML.NET, CSV dosyaları, veritabanları veya bellek içi koleksiyonlar gibi çeşitli kaynaklardan veri yüklemeyi destekler. Veriler genellikle `IDataView` arayüzü aracılığıyla işlenir. Bu adımda, eksik değerlerin doldurulması, aykırı değerlerin tespiti ve veri tiplerinin dönüştürülmesi gibi ön işleme adımları kritik öneme sahiptir. Örneğin, bir fiyat tahmin modelinde, ürün adı gibi kategorik verileri sayısal formatlara dönüştürmek gerekebilir.
  2. Veri Dönüşümleri (Feature Engineering): Ham verilerin doğrudan model eğitiminde kullanılması her zaman en iyi sonucu vermez. ML.NET, metin verilerini sayısal vektörlere dönüştürme (`FeaturizeText`), kategorik verileri tek sıcak kodlamaya çevirme (`OneHotEncoding`), sayısal değerleri normalleştirme (`NormalizeMinMax`) gibi çeşitli veri dönüşüm (transform) operasyonları sunar. Bu dönüşümler, modelin daha iyi öğrenmesini sağlayacak “özellikler” (features) oluşturur.
  3. Model Eğitimi: Hazırlanmış verilerle makine öğrenmesi modeli eğitilir. ML.NET, sınıflandırma (örneğin, ikili sınıflandırma, çoklu sınıflandırma), regresyon (örneğin, sayısal değer tahmini), kümeleme, anomali tespiti ve tavsiye sistemleri gibi farklı makine öğrenmesi görevleri için çeşitli algoritmalar sunar. Örneğin, bir spam e-posta tespit uygulaması için `SdcaLogisticRegressionBinaryTrainer` gibi bir ikili sınıflandırma algoritması kullanılabilirken, ev fiyat tahmini için `FastTreeRegressionTrainer` gibi bir regresyon algoritması tercih edilebilir.
  4. Model Değerlendirmesi: Eğitilen modelin ne kadar iyi performans gösterdiğini anlamak için değerlendirme yapılır. Bu, genellikle modelin hiç görmediği bir test veri seti üzerinde tahminler yaparak ve bu tahminleri gerçek değerlerle karşılaştırarak yapılır. ML.NET, doğruluk (accuracy), kesinlik (precision), geri çağırma (recall), F1 skoru, R-kare (R-squared) gibi çeşitli metrikler sunar. Bu metrikler, modelin güçlü ve zayıf yönlerini anlamanıza yardımcı olur.
  5. Model Kullanımı (Tahmin): Eğitilen ve değerlendirilen model, artık yeni, bilinmeyen veriler üzerinde tahminler yapmak için kullanılabilir. ML.NET’in `PredictionEngine` yapısı, tek bir veri örneği üzerinde hızlı tahminler yapmayı kolaylaştırır. Model bir kez eğitildiğinde, kaydedilebilir ve daha sonra farklı uygulamalarda yüklenerek kullanılabilir.

ML.NET’in Desteklediği Makine Öğrenmesi Görevleri ve Uygulama Alanları

ML.NET, geniş bir yelpazede makine öğrenmesi görevlerini destekler ve bu da onu çeşitli sektörlerde uygulanabilir kılar:

  • Sınıflandırma: Veri noktalarını belirli kategorilere ayırmak için kullanılır.
    • İkili Sınıflandırma: E-postanın spam olup olmadığı, müşterinin ürünü satın alıp almayacağı gibi iki kategoriye ayırma.
    • Çoklu Sınıflandırma: Bir resmin farklı hayvan türlerinden hangisi olduğunu belirleme, haber makalesinin konusunu sınıflandırma gibi ikiden fazla kategoriye ayırma.
  • Regresyon: Sayısal bir değeri tahmin etmek için kullanılır. Örneğin, ev fiyat tahmini, borsa hareketlerinin tahmini, satış tahmini.
  • Kümeleme: Veri noktalarını benzer özelliklere göre gruplamak için kullanılır. Müşteri segmentasyonu, belge kümeleme.
  • Anomali Tespiti: Normal davranıştan sapan veri noktalarını belirlemek için kullanılır. Siber güvenlikte dolandırıcılık tespiti, sistem arızası tahmini.
  • Tavsiye Sistemleri: Kullanıcının geçmiş davranışlarına veya benzer kullanıcıların tercihlerine göre ürün, film veya içerik önermek için kullanılır.
  • Görüntü İşleme: ML.NET, TensorFlow ve ONNX modelleriyle entegrasyonu sayesinde görüntü sınıflandırma, nesne algılama gibi görevlerde de kullanılabilir. Bu, geliştiricilerin derin öğrenme modellerini C# uygulamalarına kolayca dahil etmesini sağlar.

Bu yetenekler sayesinde ML.NET, finansal tahminlerden sağlık hizmetlerinde tanı koymaya, e-ticarette kişiselleştirilmiş öneriler sunmaktan üretimde kalite kontrole kadar birçok alanda değerli çözümler üretme potansiyeli taşır.

ML.NET Model Oluşturma Araçları: Model Builder ve CLI

ML.NET’i kullanmanın en doğrudan yolu API’ler aracılığıyla kod yazmak olsa da, Microsoft geliştiricilerin işini kolaylaştırmak için iki önemli araç sunar:

  • ML.NET Model Builder: Visual Studio için bir uzantıdır ve kod yazmaya gerek kalmadan makine öğrenmesi modelleri oluşturmanızı sağlar. Veri setinizi seçer, tahmin etmek istediğiniz görevi (sınıflandırma, regresyon vb.) belirtirsiniz ve Model Builder sizin için uygun ML.NET algoritmalarını deneyerek en iyi modeli bulur. Sonrasında, bu modeli C# kodu olarak projenize ekler veya doğrudan kullanılabilecek bir API endpoint’i oluşturur. Bu, makine öğrenmesine yeni başlayanlar veya hızlı prototipleme yapmak isteyenler için harika bir başlangıç noktasıdır.
  • ML.NET CLI (Command-Line Interface): Komut satırı üzerinden ML.NET modelleri oluşturmanıza, eğitmenize ve değerlendirmenize olanak tanır. Özellikle otomatikleştirilmiş süreçlerde veya Visual Studio kullanmak istemeyen geliştiriciler için esneklik sunar.

Sonuç

C# dilinde yapay zeka ve makine öğrenmesi projeleri geliştirmek isteyen .NET geliştiricileri için ML.NET, güçlü ve erişilebilir bir çözümdür. Mevcut beceri setlerini kullanarak akıllı uygulamalar oluşturma, veri odaklı kararlar alma ve iş süreçlerini optimize etme imkanı sunar. ML.NET’in sunduğu kapsamlı algoritmalar, kolay entegrasyon yetenekleri ve geliştirici dostu araçlar sayesinde, C# ile makine öğrenmesinin gücünü keşfetmek hiç bu kadar kolay olmamıştı.


© 2002 kiziltas.com - Kamil KIZILTAŞ. Her hakkı saklıdır.