Mert Özen Her Satırda Daha İleri

Blog

Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.

Seriler
18 yazı bulundu
SQL Nedir? İlişkisel Model, ANSI/ISO SQL Standardı ve T-SQL Lehçesi
Veritabanı SERİ 01

SQL Nedir? İlişkisel Model, ANSI/ISO SQL Standardı ve T-SQL Lehçesi

SQL bir ürün değil, Codd'un ilişkisel modeline dayanan ve ISO/IEC 9075 ile tanımlanan declarative bir dil; SQL Server onun T-SQL lehçesini konuşur. Table, row, column ve key kavramlarını, döngü yerine set-based düşünmeyi logical read sayılarıyla, DDL/DML/DCL/TCL ailelerini ve FETCH FIRST'ün SQL Server, PostgreSQL ve MySQL'deki farklı davranışını gerçek çıktılarla gösteriyoruz.

8 Kas 2026 13 dk 4
SQL Lab'ı: SQL Server 2025'i Docker'da Çalıştırmak, VS Code MSSQL Eklentisi ve Bookstore Örnek Veritabanı
Veritabanı SERİ 02

SQL Lab'ı: SQL Server 2025'i Docker'da Çalıştırmak, VS Code MSSQL Eklentisi ve Bookstore Örnek Veritabanı

SQL Server 2025'i mcr.microsoft.com/mssql/server:2025-latest image'ıyla, parolayı environment variable'da tutarak ve volume ile Docker'da çalıştırıyor; sqlcmd, VS Code mssql eklentisi ve SSMS 22 ile bağlanıyor, seri boyunca kullanacağımız 10 table'lık Bookstore veritabanını yüklüyoruz. Edition seçimi, Apple Silicon'da Rosetta emülasyonu ve TrustServerCertificate'in yalnız lab için olduğu da işleniyor.

8 Kas 2026 11 dk 3
SQL Veri Tipleri ve CREATE TABLE: Sayılar, Metin, Tarih/Saat ve Collation'daki Türkçe İ Tuzağı
Veritabanı SERİ 03

SQL Veri Tipleri ve CREATE TABLE: Sayılar, Metin, Tarih/Saat ve Collation'daki Türkçe İ Tuzağı

Para için DECIMAL, insan dilindeki metin için NVARCHAR (ya da UTF-8 collation'lı VARCHAR), zaman için UTC'de DATETIME2 seç; Türkçe veride Latin1 collation UPPER('i')'yi 'I' yapar ve 'ince' araması İnce Memed'i bulamaz. FLOAT toplam hatasını, VARCHAR'da sessizce kaybolan İ ve ğ harflerini, DATETIME'ın 23:59:59.999'u ertesi güne yuvarlamasını, collation çakışması hatasını ve kendi schema'nla CREATE TABLE'ı gerçek çıktılarla gösteriyoruz.

8 Kas 2026 14 dk 3
Constraint'ler ve Şema Değişikliği: PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, DEFAULT ve ALTER TABLE
Veritabanı SERİ 04

Constraint'ler ve Şema Değişikliği: PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, DEFAULT ve ALTER TABLE

Constraint'ler, veriye hangi yoldan yazılırsa yazılsın uygulanan kurallardır; SQL Server'da UNIQUE column tek NULL kabul eder, SQL:2023'ün NULLS NOT DISTINCT seçeneği yok, çözüm filtered unique index. İsimli constraint'leri, IDENTITY ile SEQUENCE farkını, ON DELETE CASCADE ile NO ACTION'ı, CHECK'in NULL'ı geçirmesini, ALTER TABLE ile güvenli şema değişikliğini ve WITH NOCHECK'in constraint'i untrusted yapıp planı nasıl bozduğunu gösteriyoruz.

8 Kas 2026 14 dk 3
SELECT, WHERE ve ORDER BY: Mantıksal Sorgu İşleme Sırası, TOP ve OFFSET/FETCH
Veritabanı SERİ 05

SELECT, WHERE ve ORDER BY: Mantıksal Sorgu İşleme Sırası, TOP ve OFFSET/FETCH

SQL sorguyu FROM, WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, TOP sırasıyla değerlendirir; bu yüzden SELECT'teki alias WHERE'de görünmez ama ORDER BY'da görünür. SELECT * ve DISTINCT'in bedelini, ORDER BY'sız sıranın garanti olmadığını, TOP WITH TIES'ı, OFFSET/FETCH ile sayfalamada tie-breaker olmadan bir index eklemenin bile sayfayı değiştirdiğini ve keyset pagination'ı gösteriyoruz.

8 Kas 2026 12 dk 3
NULL ve Predicate'ler: Üç Değerli Mantık, LIKE, IN, BETWEEN ve COALESCE
Veritabanı SERİ 06

NULL ve Predicate'ler: Üç Değerli Mantık, LIKE, IN, BETWEEN ve COALESCE

SQL'de karşılaştırmanın üç sonucu var: TRUE, FALSE ve UNKNOWN; bu yüzden = NULL hiçbir row bulmaz, NOT bir nullable column'da NULL row'ları da eler ve NOT IN listesindeki tek bir NULL sonucu boşaltır. COALESCE ile ISNULL'ın tip farkını, NULLIF ile sıfıra bölme korumasını, LIKE'ta escape ve baştaki %'nin index'e etkisini ve BETWEEN'in tarih aralığında son günü kaçırmasını gerçek çıktılarla gösteriyoruz.

8 Kas 2026 14 dk 3
Scalar Function'lar ve CASE: String, Tarih/Saat, Tip Dönüşümü ve Sargability
Veritabanı SERİ 07

Scalar Function'lar ve CASE: String, Tarih/Saat, Tip Dönüşümü ve Sargability

Scalar function'lar kullanışlıdır ama WHERE'de column'un üzerinde kullanılınca sorguyu sargable olmaktan çıkarır: 200.000 row'da YEAR()/MONTH() filtresi 402, aynı ayı yarı açık aralıkla soran sorgu 21 logical read yaptı. CONCAT/CONCAT_WS, LEN ile DATALENGTH, CAST/CONVERT/TRY_CAST, nvarchar parametrenin CONVERT_IMPLICIT ile index'i kaybettirmesi, DATEDIFF'in sınır sayması ve CASE'in tip ve ELSE tuzaklarını gösteriyoruz.

8 Kas 2026 13 dk 4
SQL JOIN'ler 1: INNER JOIN, LEFT/RIGHT/FULL OUTER JOIN ve ON ile WHERE Farkı
Veritabanı SERİ 08

SQL JOIN'ler 1: INNER JOIN, LEFT/RIGHT/FULL OUTER JOIN ve ON ile WHERE Farkı

Join'ler Venn diyagramı değil satır eşleştirmesidir: INNER JOIN eşleşen çiftleri, LEFT/RIGHT/FULL OUTER JOIN ayrıca korunan taraftaki eşleşmeyen row'ları NULL ile tutar. LEFT JOIN'in sağ table'ını WHERE'de filtrelemek join'i sessizce INNER'a çevirir; planda bunu Inner Join olarak görüyoruz. Yorumsuz kitaplar, siparişsiz müşteriler, FULL OUTER JOIN ile stok mutabakatı ve one-to-many join'in row'ları çoğaltmasını gerçek çıktılarla inceliyoruz.

8 Kas 2026 12 dk 4
SQL JOIN'ler 2: Self Join, Non-Equi Join, Semi/Anti Join ve CROSS APPLY ile LATERAL
Veritabanı SERİ 09

SQL JOIN'ler 2: Self Join, Non-Equi Join, Semi/Anti Join ve CROSS APPLY ile LATERAL

Aynı siparişin kalemlerini ve ödemelerini birlikte join'lemek toplamları çarpar (fan-out); çözüm önce gruplamak sonra join'lemek. CROSS JOIN ile rapor iskeleti, self join ile kategori ağacı, aralıkla non-equi join, EXISTS ile semi join, NOT EXISTS ile anti join (planı LEFT JOIN … IS NULL ile aynı) ve her müşterinin son üç siparişi için T-SQL CROSS/OUTER APPLY ile PostgreSQL ve MySQL'deki standart LATERAL'ı gerçek çıktılarla gösteriyoruz.

8 Kas 2026 13 dk 3
GROUP BY ve Aggregate Function'lar: HAVING, Conditional Aggregation, GROUPING SETS ve ROLLUP
Veritabanı SERİ 10

GROUP BY ve Aggregate Function'lar: HAVING, Conditional Aggregation, GROUPING SETS ve ROLLUP

GROUP BY row'ları gruplara çökertir, aggregate'ler NULL'ı yok sayar ve SQL Server'da tam sayı column'un AVG'si tam sayı döner. COUNT(*) ile COUNT(column) farkını, WHERE ile HAVING'in yerini, STRING_AGG'yi, CASE ile conditional aggregation'ı, PIVOT karşılaştırmasını ve ROLLUP, CUBE, GROUPING SETS ile GROUPING()'i Bookstore verisinde gerçek çıktılarla gösteriyoruz.

8 Kas 2026 14 dk 4
Subquery'ler ve Set Operator'leri: Correlated Subquery, EXISTS, NOT IN Tuzağı ve UNION/INTERSECT/EXCEPT
Veritabanı SERİ 11

Subquery'ler ve Set Operator'leri: Correlated Subquery, EXISTS, NOT IN Tuzağı ve UNION/INTERSECT/EXCEPT

Subquery bir sorgunun sonucunu başka bir sorguda kullanır; NOT IN ise listede tek bir NULL varsa hiç row döndürmez. Scalar subquery ve 512 hatasını, IN/ANY/ALL'u, correlated subquery'yi, derived table'ı, EXISTS ile NOT EXISTS'i ve UNION, UNION ALL, INTERSECT, EXCEPT'i Bookstore verisinde gerçek çıktı, logical read ve plan karşılaştırmasıyla anlatıyoruz.

8 Kas 2026 14 dk 4
CTE, View ve Recursive Sorgular: WITH ile Okunabilir SQL ve Hiyerarşik Veri
Veritabanı SERİ 12

CTE, View ve Recursive Sorgular: WITH ile Okunabilir SQL ve Hiyerarşik Veri

CTE sorguyu isimli adımlarla yukarıdan aşağıya yazdırır ama SQL Server'da materialize edilmez; her referans yeniden çalışır. CTE zincirlerini, view'ı, SELECT * tuzağını, SCHEMABINDING ve WITH CHECK OPTION'ı, kategori ağacını gezen recursive CTE'yi, döngü korumasını ve MAXRECURSION'ı Bookstore verisinde gerçek çıktı ve logical read'lerle gösteriyoruz.

8 Kas 2026 18 dk 6
Blog Haritası