Bir müşteride üç saatlik bir kesintinin sebebini ararken, sonunda tek bir SELECT sorgusuna kadar indik. İndeks yokmuş, sorgu tüm tabloyu tek tek taramış, sistem de bu yükün altında çökmüş. O gün anladım ki bir uygulamanın ne kadar hızlı ya da güvenli olduğu çoğu zaman en çok da veritabanıyla nasıl konuştuğuna bağlıymış; bu konuşmanın dili de elli yıldır değişmedi: SQL.
Bu yazıda SQL’in nereden çıktığını, bugün neden hala bu kadar yaygın olduğunu, deklaratif bir dil olmasının ne anlama geldiğini, tablo/satır/sütun mantığını ve ACID özelliklerini anlatacağım. Sonunda da ilk tablomuzu oluşturup basit bir sorgu yazacağız.
SQL nereden çıktı?
Hikaye 1970’e, IBM’de çalışan İngiliz bilgisayar bilimci Edgar F. Codd’a dayanıyor. Codd, “A Relational Model of Data for Large Shared Data Banks” adlı makalesinde verilerin tablolar halinde düzenlenip aralarında matematiksel ilişkiler kurulabileceği bir teori ortaya attı. Bu teoriye dayanarak IBM’de çalışan Donald Chamberlin ve Raymond Boyce, 1974 ile 1979 arasında System R projesi kapsamında bir sorgu dili geliştirdi.
Dilin ilk adı SEQUEL’di, sonra yasal nedenlerle SQL olarak değiştirildi. İşin ilginç yanı şu: ilk ticari SQL ürününü IBM değil, o zamanki adıyla Relational Software olan Oracle piyasaya sürdü, hem de 1979’da. 1986’da ANSI, 1987’de de ISO tarafından standart haline getirildi ve bugün hala geliştiriliyor.
Bugün her yerde: MySQL’den Netflix’e

SQL’in en büyük avantajı, farklı veritabanı sistemlerinde neredeyse aynı söz dizimiyle çalışabilmesi. MySQL, PostgreSQL, Oracle, SQL Server, SQLite gibi popüler sistemlerin hepsi SQL’i temel alıyor. Facebook, Google, Netflix, Instagram, hatta bu yazının kaynağı olan videoyu barındıran YouTube bile arka planda SQL veritabanı kullanıyor.
En sevdiğim kısım şu: SQL öğrenmesi kolay ama ustalaşması zor bir dil. Basit bir sorguyla işe kolayca başlıyorsunuz, sonra büyük veri dünyasına doğru ilerlerken bir yerlerde performans sorunlarına takılabiliyorsunuz. Benim başımdaki hikaye tam olarak bu yüzden yaşanmıştı.
SQL’i özel kılan şey: ne istediğini söylemek yeter
SQL deklaratif bir dil, yani nasıl yapacağını değil, ne istediğini söylersiniz. Şu verileri istiyorum dersiniz, verinin nasıl bulunacağı veritabanının sorunu haline gelir. Bu yaklaşım hem kod yazmayı kolaylaştırır hem de performans optimizasyonunu büyük ölçüde otomatikleştirir.
Şöyle bir benzetme yapayım: bir restoranda garsona acılı bir şey istediğinizi söylemek gibi düşünün, hangi tarifin, hangi malzemeyle yapılacağı mutfağın işi. SQL’in temelinde de tüm veritabanı işlemlerinin can damarı olan CRUD, yani create, read, update, delete işlemleri var.
Tablo, satır, sütun: Excel’den tanıdık bir mantık
İlişkisel veritabanında veriler tablolar içinde saklanır. Her tablo satır ve sütunlardan oluşur, tıpkı bir Excel sayfası gibi düşünebilirsiniz. Her satır bir kayda karşılık gelir, sütunlar ise o verinin kategorisini ya da tipini belirtir.
Tablodaki her satırın benzersiz şekilde tanımlanması için primary key, yani birincil anahtar kullanılır; bu değerler birbirinden farklı olmak zorunda. Gereksiz veri tekrarını önlemek için veriler farklı tablolara bölünür, bu tabloları birbirine bağlamak içinse foreign key, yani yabancı anahtar devreye girer.
ACID: bankanız neden hiç şaşırmıyor?
SQL, ACID özelliklerini destekleyerek veri tutarlılığını garanti eder: atomicity, consistency, isolation, durability. Bölünmezlik ilkesine göre bir işlem ya tamamen gerçekleşir ya da hiç gerçekleşmez, yarıda kalmaz. Tutarlılık, her işlemin veritabanını bir geçerli durumdan başka bir geçerli duruma taşımasını sağlar.
Yalıtım sayesinde aynı anda çalışan işlemler birbirine karışmaz, her biri sanki tek başına çalışıyormuş gibi davranır. Dayanıklılık ise bir işlem tamamlandıktan sonra sistem çökse bile o işlemin kalıcı kalmasını garanti eder. Banka hesabınızdan para çekip ATM’in tam o anda kilitlenmesine rağmen bakiyenizin doğru görünmesinin sebebi bu dört ilke.
SQL’in beş kategorisi

SQL sorguları beş ana kategoriye ayrılır, her biri veritabanıyla farklı bir düzeyde ilişki kurar. Data Definition Language veritabanı yapısını oluşturur ya da değiştirir, neyi nereye koyacağımızın cevabı. Data Manipulation Language veritabanındaki verileri işler, veriyle ne yapacağımızın cevabı.
Data Control Language kullanıcı erişim haklarını yönetir, kim neye erişebilir sorusunu kontrol eder. Transaction Control Language veri işlemlerinin bütünlüğünü sağlar, işlemi kaydedelim mi yoksa geri mi alalım sorusuna cevap verir. Data Query Language ise tek amacı veri sorgulamak olan komutları kapsar, veriyi getirir ama değiştirmez.
Uygulamalı: ilk tablonuzu oluşturun
SQL ile ilk projenizi denemek için bilgisayarınıza MySQL, PostgreSQL ya da SQLite gibi ücretsiz bir veritabanı sistemi kurmanız yeterli. Kullanıcılar adında bir tablo oluşturmak için CREATE TABLE komutunu kullanıp içinde hangi veri alanlarının olacağını belirtirsiniz.
Ardından bu tabloya yeni bir kullanıcı eklemek için INSERT INTO komutunu, tablo içindeki veriyi sorgulamak içinse SELECT komutunu çalıştırmanız yeterli. Üç komut, elli yıllık bir dilin bütün ruhunu taşıyor.
Şimdilik bu kadar
- SQL, 1970’te Edgar Codd’un teorisiyle başladı, 1979’da Oracle’ın ilk ticari ürünüyle piyasaya çıktı.
- MySQL’den Netflix’in altyapısına kadar hemen her yerde SQL var.
- Deklaratif yapısı sayesinde ne istediğinizi söylemeniz yeterli.
- ACID özellikleri, işlemlerin yarıda kalmamasını ve tutarlı kalmasını garanti ediyor.
Bir dahaki sefere bir uygulama yavaşladığında, sorunun kod tarafında değil, veritabanına sorduğunuz o tek satırlık sorguda saklı olabileceğini unutmayın. Sorularınız olursa yorumlarda buluşalım.
