SQL Nedir? Sorgular, Tablolar ve Veritabanı Mantığı
SQL, ilişkisel veritabanlarındaki verileri sorgulamak ve yönetmek için kullanılan, ne yapılacağını belirten bildirimsel bir dildir. SQL ile tablo oluşturma, veri ekleme, kayıtları filtreleme, güncelleme ve silme işlemleri yapılabilir; ancak SQL tek başına bir veritabanı yönetim sistemi değildir.
Bu yazıda (8)
- ›SQL ile Veritabanı Yönetim Sistemi Aynı Şey Değildir
- ›SELECT Sorgusunu Okuma: Tablo, Sütun ve Koşul İlişkisi
- ›CRUD İşlemlerinde Veri Kaybını Önleyen Sorgu Mantığı
- ›İlişkili Tabloları Anlamak: Kullanıcı, Film ve İzleme Geçmişi
- ›Sorgu Sonucunu Yorumlama: Filtre, Sayım ve Toplama
- ›Çözümlü Örnek: 123 Numaralı Kullanıcının İzleme Kaydını Bulma
- ›Çözümlü Örnek: Aksiyon Filmlerini Yıla Göre İnceleme
- ›Sık Yapılan Hatalar ve Karıştırılan SQL Kavramları
SQL Nedir? Sorgular, Tablolar ve Veritabanı Mantığı
Bir alışveriş uygulamasında ürünleri listelerken, bankacılık uygulamasında hesap hareketlerini görüntülerken veya bir film platformunda içerik ararken ekranda yalnızca birkaç saniyede sonuç görürüz. Bu sonuçların arkasında, düzenli biçimde saklanan veriler ve bu verilere yöneltilen sorgular bulunur. SQL, uygulamaların ilişkisel veritabanlarıyla iletişim kurmasını sağlayan temel dildir.
SQL'i öğrenirken yalnızca komutların İngilizce karşılıklarını ezberlemek yeterli değildir. Bir sorgunun hangi tabloya yöneldiğini, hangi koşulla kayıt seçtiğini, birden fazla tablonun nasıl ilişkilendirildiğini ve yapılan değişikliğin hangi kayıtları etkilediğini anlamak gerekir. Bu rehberde SQL'in veritabanı yönetim sisteminden farkını, temel komutların görevlerini, sorgu yazma sırasını, ilişkisel tablo mantığını ve sık yapılan hataları örneklerle ele alacağız.
SQL ile Veritabanı Yönetim Sistemi Aynı Şey Değildir
SQL, Structured Query Language ifadesinin kısaltmasıdır ve Türkçede genellikle 'Yapılandırılmış Sorgu Dili' olarak karşılanır. SQL'in görevi, veritabanındaki verilerle iletişim kurmak için kullanılacak komutları sağlamaktır. Örneğin bir uygulama, ürün tablosundaki belirli kayıtları almak için SELECT sorgusu gönderir; veritabanı yönetim sistemi de bu isteği yorumlayıp sonucu döndürür.
Burada iki kavramı ayırmak önemlidir: SQL bir dil, MySQL, PostgreSQL, Microsoft SQL Server, Oracle Database ve SQLite ise SQL kullanabilen veritabanı yönetim sistemlerine örnektir. Bu sistemler yalnızca sorguyu çalıştırmaz; verilerin saklanması, erişim yetkileri ve tablo yapısının yönetilmesi gibi görevleri de üstlenir. İstemci-sunucu mimarisindeki DBMS'ler istemci bağlantılarını ve sorgu iletişimini yönetebilir. SQLite gibi gömülü sistemler ise uygulamanın bir kütüphane/API aracılığıyla veritabanına erişmesini sağlar.
SQL özellikle ilişkisel veritabanlarında kullanılır. İlişkisel modelde bilgiler, satır ve sütunlardan oluşan tablolarda tutulur. Satır tek bir kaydı, sütun ise o kaydın bir özelliğini temsil eder. Örneğin Kullanicilar tablosunda KullaniciID, Ad ve Eposta sütunları bulunabilir. KullaniciID gibi bir alan, kayıtları birbirinden ayırmak için kullanılabilir; başka bir tabloda aynı değer kullanılarak kullanıcı ile sipariş veya izleme geçmişi arasında ilişki kurulabilir.
SQL bildirimsel bir dildir. Kullanıcı çoğu sorguda sonucun nasıl hesaplanacağını ayrıntılı biçimde tarif etmek yerine ne istediğini belirtir. Sorgunun uygun yürütme biçimini seçmek ve veriye erişmek veritabanı sisteminin görevidir. Bu nedenle SQL'i Python veya JavaScript gibi genel amaçlı dillerle aynı türde değerlendirmek doğru olmaz; SQL veritabanı işlemlerine odaklanır.
SELECT Sorgusunu Okuma: Tablo, Sütun ve Koşul İlişkisi
Bir SQL sorgusunu anlamanın en kolay yolu, onu üç soruya ayırmaktır: Hangi sütunlar isteniyor, hangi tablodan alınacak ve hangi kayıtlar seçilecek? Temel biçim şöyledir:
SELECT SutunAdi FROM TabloAdi WHERE Kosul;
SELECT Baslik, Kategori FROM Filmler WHERE Kategori = 'Aksiyon'; sorgusunda sonuç olarak Filmler tablosundaki yalnızca Baslik ve Kategori sütunları istenir. FROM Filmler verinin kaynağını, WHERE Kategori = 'Aksiyon' ise seçimin koşulunu gösterir.
SELECT * FROM Filmler ifadesindeki yıldız, tablodaki tüm sütunların istenmesi anlamına gelir. Öğrenme amacıyla veya küçük bir tabloda kullanılabilir; ancak uygulamalarda gerekli sütunları açıkça yazmak çoğu durumda daha anlaşılırdır. Böylece sorgunun ne döndürmesi gerektiği belirginleşir.
WHERE kullanılmadığında SELECT, koşul belirtilmeden tablodaki kayıtları döndürür. Bu durum özellikle büyük tablolarda gereğinden fazla veri alınmasına yol açabilir. Karşılaştırma koşullarında eşittir işareti (=) kullanılır; birden fazla koşul için AND veya alternatif koşullar için OR kullanılabilir. Örneğin WHERE Kategori = 'Aksiyon' AND Yil = 2023 yalnızca iki koşulu birlikte sağlayan kayıtları seçer.
Bir değeri yorumlamak için onu doğru eşikle karşılaştırmak gerekir. Örneğin bir sorguda Yil = 2023 yalnızca yılı 2023 olan kayıtları seçer; Yil > 2023 ise 2023'ten sonraki yılları hedefler. Bu iki ifade aynı sonucu vermez. SQL'de koşul yazarken veri türüne de dikkat edilir: metin değerleri tek tırnak içinde yazılırken sayısal değerler örnekteki 123 veya 2023 gibi doğrudan yazılır.
CRUD İşlemlerinde Veri Kaybını Önleyen Sorgu Mantığı
Uygulamaların veritabanıyla yaptığı dört temel işlem CRUD adıyla özetlenir: Create, Read, Update ve Delete. SQL'deki karşılıkları kabaca INSERT, SELECT, UPDATE ve DELETE komutlarıdır.
INSERT yeni kayıt ekler. Örneğin INSERT INTO Filmler (Baslik, Yonetmen, Yil, Kategori) VALUES ('Yeni Film', 'Yönetmen Adı', 2023, 'Dram'); komutu, belirtilen sütunlara karşılık gelen yeni bir film kaydı eklemeyi amaçlar. Sütun sırası ile VALUES bölümündeki değer sırası birbirini karşılamalıdır.
UPDATE mevcut kayıtların değerlerini değiştirir. UPDATE Kullanicilar SET Eposta = 'yeni@eposta.com' WHERE KullaniciID = 123; sorgusunda yalnızca KullaniciID değeri 123 olan kullanıcı hedeflenir. WHERE bölümü çıkarılırsa, kullanılan veritabanı sisteminin davranışına bağlı ayrıntılar bulunsa da sorgunun tablodaki çok sayıda veya tüm kayıtları değiştirme riski ortaya çıkar. Bu nedenle UPDATE çalıştırmadan önce aynı WHERE koşuluyla bir SELECT sorgusu denemek güvenli bir çalışma alışkanlığıdır.
DELETE kayıt siler. DELETE FROM IzlemeGecmisi WHERE KullaniciID = 123 AND FilmID = 456; yalnızca hem kullanıcı hem film koşulunu sağlayan izleme geçmişi kaydını hedefler. DELETE de WHERE olmadan yazıldığında tablodaki kayıtların tamamını etkileme riski taşır.
CRUD, verinin yaşam döngüsünü anlatır; ancak veritabanının yapısını değiştiren işlemler bundan farklıdır. Tablo oluşturma veya tablo yapısını düzenleme gibi işlemler, mevcut makaledeki sınıflandırmaya göre Data Definition Language, yani DDL kapsamındadır. Kayıt ekleme, güncelleme ve sorgulama ise veri üzerinde işlem yapan DML yaklaşımıyla ilişkilendirilir. Komut sınıflarının ayrıntılı kapsamı kullanılan sisteme göre değişebileceğinden, her veritabanı ürününün belgeleri ayrıca incelenmelidir.
İlişkili Tabloları Anlamak: Kullanıcı, Film ve İzleme Geçmişi
İlişkisel veritabanlarında her bilgiyi tek bir tabloya doldurmak yerine, farklı varlıklar ayrı tablolarda tutulabilir. Bir film platformunda Kullanicilar, Filmler ve IzlemeGecmisi tabloları düşünülebilir. Kullanicilar kullanıcı bilgilerini, Filmler içerik bilgilerini, IzlemeGecmisi ise hangi kullanıcının hangi filmi izlediğini tutar.
Bu ayrım, aynı kullanıcı veya film bilgisinin her izleme kaydında tekrar tekrar yazılmasını azaltabilir. IzlemeGecmisi tablosunda KullaniciID ve FilmID gibi alanlar bulunması, kayıtların ilgili kullanıcı ve filmle eşleştirilmesine yardım eder. Böylece bir kullanıcının izlediği filmleri aramak için yalnızca tek bir tablodaki metni taramak yerine, ilişkili kayıtlar üzerinden sorgu kurulabilir.
İki veya daha fazla tablodan birlikte sonuç almak için JOIN yapısı kullanılır. Örnek bir sorgu şu mantıktadır:
SELECT Kullanicilar.Ad, Filmler.Baslik FROM IzlemeGecmisi JOIN Kullanicilar ON IzlemeGecmisi.KullaniciID = Kullanicilar.KullaniciID JOIN Filmler ON IzlemeGecmisi.FilmID = Filmler.FilmID WHERE Kullanicilar.KullaniciID = 123;
Bu sorguda başlangıç noktası IzlemeGecmisi tablosudur. İlk JOIN, izleme kaydındaki KullaniciID ile Kullanicilar tablosundaki aynı alanı eşleştirir. İkinci JOIN ise FilmID değerini Filmler tablosundaki FilmID ile eşleştirir. Sonuçta 123 numaralı kullanıcı için kullanıcı adı ve film başlığı birlikte alınır.
Buradaki karar kuralı eşleşme koşuludur: ON bölümündeki alanlar doğru eşleşmezse sorgu eksik veya yanlış kayıt döndürebilir. Bu nedenle JOIN yazarken tablo ve sütun adlarını açıkça belirtmek, özellikle aynı isimli sütunlar olduğunda, belirsizliği azaltır.
Sorgu Sonucunu Yorumlama: Filtre, Sayım ve Toplama
SQL sorgusunun çıktısı yalnızca kayıt listesi olmak zorunda değildir. Bir tablodaki kayıtları saymak veya sayısal bir değeri toplamak için toplulaştırma işlevleri kullanılabilir. Örneğin COUNT(*), koşulu sağlayan kayıtların sayısını; SUM(Tutar), seçilen kayıtlardaki Tutar değerlerinin toplamını ifade eder. Bu işlevlerin doğru yorumlanabilmesi için hangi kayıt kümesine uygulandığına bakılmalıdır.
SELECT COUNT(*) FROM Filmler WHERE Kategori = 'Aksiyon'; sorgusunun sonucu, Filmler tablosundaki tüm kayıt sayısı değil, Kategori değeri Aksiyon olan kayıtların sayısıdır. WHERE koşulunu kaldırmak sonucu değiştirir. Bu nedenle bir sayının anlamı, kullanılan filtreyle birlikte değerlendirilmelidir.
Birden fazla kategori veya yıl için ayrı sonuçlar isteniyorsa GROUP BY kullanılabilir. Örneğin SELECT Kategori, COUNT(*) FROM Filmler GROUP BY Kategori; her kategori için ayrı bir kayıt sayısı üretmeyi amaçlar. Burada Kategori sütunu gruplama anahtarıdır; COUNT her grubun içindeki kayıtları sayar.
Sıralama için ORDER BY kullanılabilir. ORDER BY Yil sonuçları yıl alanına göre sıralar; artan veya azalan sıralama tercihi sorgunun yazımına ve kullanılan SQL lehçesine göre belirtilir. Sıralama ile filtreleme farklı işlemlerdir: WHERE hangi kayıtların sonuçta bulunacağını belirler, ORDER BY ise seçilmiş kayıtların hangi sırayla gösterileceğini etkiler. Bu ayrım, sorgu sonuçlarını yorumlarken sıkça karıştırılır.
Çözümlü Örnek: 123 Numaralı Kullanıcının İzleme Kaydını Bulma
Verilenler:
- KullaniciID: 123
- FilmID: 456
- Tablolar: Kullanicilar, Filmler ve IzlemeGecmisi
- Amaç: Kullanıcının izlediği filmlerin başlıklarını listelemek.
Çözüm adımları:
- İzleme ilişkisini taşıyan tabloyu belirleriz: IzlemeGecmisi. Çünkü kullanıcı ile film arasındaki bağlantı burada tutulur.
- Kullanıcı adını almak için IzlemeGecmisi.KullaniciID ile Kullanicilar.KullaniciID alanlarını eşleştiririz.
- Film başlığını almak için IzlemeGecmisi.FilmID ile Filmler.FilmID alanlarını eşleştiririz.
- İstenen sütunları açıkça seçeriz: Kullanicilar.Ad ve Filmler.Baslik.
- Yalnızca 123 numaralı kullanıcıyı hedeflemek için WHERE koşulu ekleriz.
Sorgu:
SELECT Kullanicilar.Ad, Filmler.Baslik FROM IzlemeGecmisi JOIN Kullanicilar ON IzlemeGecmisi.KullaniciID = Kullanicilar.KullaniciID JOIN Filmler ON IzlemeGecmisi.FilmID = Filmler.FilmID WHERE Kullanicilar.KullaniciID = 123;
Sonuç: Sorgu, 123 numaralı kullanıcıya ait izleme kayıtlarını bulur ve her eşleşme için kullanıcı adını ve film başlığını döndürmeyi amaçlar. FilmID değeri 456 olan kayıt da bu kullanıcının izleme geçmişinde bulunuyorsa sonuç kümesine dahil edilir. Sorgunun doğru çalışması, üç tabloda kullanılan ID alanlarının gerçekten aynı ilişkiyi temsil etmesine bağlıdır.
Çözümlü Örnek: Aksiyon Filmlerini Yıla Göre İnceleme
Verilenler:
- Tablo: Filmler
- İstenen kategori: Aksiyon
- İstenen yıl: 2023
- Amaç: 2023 yılında yayımlanan aksiyon filmlerinin başlık ve yönetmen bilgilerini almak.
Çözüm adımları:
- Sonuçta gösterilecek alanları belirleriz: Baslik ve Yonetmen.
- Verinin Filmler tablosundan alınacağını FROM ile belirtiriz.
- Kategori koşulunu
Kategori = 'Aksiyon'olarak yazarız. Aksiyon bir metin olduğu için tek tırnak kullanılır. - Yıl koşulunu
Yil = 2023olarak ekleriz. 2023 sayısal bir değer olarak yazılır. - İki koşulun aynı anda sağlanması gerektiği için koşulları AND ile birleştiririz.
Sorgu:
SELECT Baslik, Yonetmen FROM Filmler WHERE Kategori = 'Aksiyon' AND Yil = 2023;
Sonuç: Çıktıda yalnızca kategorisi Aksiyon ve yılı 2023 olan filmlerin başlıkları ile yönetmenleri yer alır. Kategori Aksiyon olup yılı farklı olan ya da yılı 2023 olup kategorisi farklı olan kayıtlar bu koşulun dışında kalır. Eğer amaç tüm aksiyon filmlerini bulmak olsaydı Yil koşulu kaldırılmalıydı; bu nedenle sorgunun sonucu, yazılan her koşulun anlamıyla birlikte okunmalıdır.
Sık Yapılan Hatalar ve Karıştırılan SQL Kavramları
SQL ile veritabanı yönetim sistemini aynı kabul etmek: SQL komutları sağlayan dildir; veritabanı yönetim sistemi ise bu komutları çalıştıran ve veriyi yöneten yazılımdır. Bu ayrım, 'SQL kurmak' veya 'SQL veritabanı' gibi ifadelerin hangi anlamda kullanıldığını netleştirir.
UPDATE veya DELETE sorgusunda WHERE yazmayı unutmak: Belirli bir kullanıcıyı güncellemek veya tek bir izleme kaydını silmek isteniyorsa, hedef kaydı tanımlayan koşul bulunmalıdır. Güvenli yaklaşım, değişiklikten önce aynı koşulla SELECT çalıştırıp kaç ve hangi kayıtların etkileneceğini kontrol etmektir.
Metin ile sayıyı aynı biçimde yazmak: 'Aksiyon' ve 'Dram' gibi metin değerleri tek tırnakla gösterilir. 2023 veya 123 gibi sayısal örnekler ise metin olarak değil, sayı olarak ele alınır. Gerçek veritabanındaki sütun tipi bu davranışı etkileyebilir.
WHERE ile ORDER BY'ı karıştırmak: WHERE sonuç kümesine girecek kayıtları seçer; ORDER BY seçilen kayıtların sırasını düzenler. Bir sorgunun sıralanması, filtrelenmiş kayıt sayısını değiştirmez.
JOIN koşulunu yanlış kurmak: JOIN, tabloların rastgele birleştirilmesi değildir. İlişkiyi taşıyan alanlar, örneğin KullaniciID veya FilmID, doğru sütunlarla eşleştirilmelidir. Yanlış eşleştirme, gerçek olmayan kombinasyonlar veya eksik sonuçlar üretebilir.
SQL ile NoSQL'i tek bir üstünlük sıralamasına koymak: SQL ilişkisel, tablo temelli veriler için tasarlanmış sistemlerde kullanılır. NoSQL ise belge, anahtar-değer veya grafik gibi farklı veri modellerini kullanabilir. Hangi yaklaşımın uygun olduğu uygulamanın veri yapısına ve gereksinimlerine bağlıdır; bu nedenle biri her senaryoda diğerinin yerine geçmez.
Her SQL sisteminin aynı sözdizimini tüm ayrıntılarıyla desteklediğini varsaymak: Temel SELECT, INSERT, UPDATE ve DELETE mantığı yaygın olsa da ürünler arasında işlev ve sözdizimi farklılıkları bulunabilir. Özellikle tarih, metin, yetki ve performans özelliklerinde kullanılan sistemin belgelerine başvurulmalıdır.
Temel sorgu şablonu: Kayıt sayısı için: . Bir koşulu sağlayan kayıtların sayısını yorumlarken sonuç, tüm tabloyla değil WHERE koşulundan sonra kalan kayıt kümesiyle karşılaştırılmalıdır.
Bir bankacılık uygulamasında son işlemler ekranını açtığınızda uygulama, hesabınızla ilişkili kayıtları veritabanından ister. Örneğin 'hesap numarası belirli kullanıcıya ait olan ve seçilen tarih aralığındaki işlemleri getir' mantığındaki bir SQL sorgusu, sonuçları uygulamaya iletebilir. Uygulamanın ekranda yalnızca işlem tarihi, açıklama ve tutar sütunlarını göstermesi, SELECT ile gerekli alanların seçilmesine; tarih aralığı veya hesap koşulu ise WHERE ile filtrelenmesine karşılık gelir. Buradaki örnek, gerçek bankacılık sorgusunun birebir sözdizimini değil, SQL'in günlük bir uygulamadaki rolünü açıklar.
TYT/AYT'de SQL, genel olarak bilişim ve veri yönetimi bağlamında kavramsal sorularla ilişkilendirilebilir. En önemli ayrım şudur: SQL veritabanıyla iletişim kurulan dildir; RDBMS ise veriyi saklayan ve SQL sorgularını çalıştıran sistemdir. CRUD eşleştirmesini hatırlayın: Create-INSERT, Read-SELECT, Update-UPDATE, Delete-DELETE. Bir sorgu örneğinde WHERE varsa hangi kayıtların seçildiğini, JOIN varsa tabloların hangi ortak alan üzerinden ilişkilendirildiğini kontrol edin. UPDATE ve DELETE komutlarında WHERE bulunmaması, hedeflenen tek kayıt yerine daha geniş bir kümenin etkilenebileceğine işaret eden kritik bir uyarıdır.
Sık sorulan sorular
SQL bir programlama dili midir?
SQL, veritabanı işlemleri için kullanılan bildirimsel bir dildir. Ne yapılacağını belirtir; veritabanı sistemi çoğu durumda işlemin nasıl yürütüleceğini kendi çalışma mekanizmalarıyla belirler. Bu nedenle Python veya JavaScript gibi genel amaçlı dillerle aynı kapsama sahip değildir.
SQL ile veritabanı yönetim sistemi arasındaki fark nedir?
SQL komutların yazıldığı dildir. MySQL, PostgreSQL, Microsoft SQL Server, Oracle Database ve SQLite gibi sistemler ise verileri saklayan, sorguları çalıştıran ve veritabanını yöneten yazılımlardır.
SELECT, INSERT, UPDATE ve DELETE ne işe yarar?
SELECT verileri okur veya sorgular, INSERT yeni kayıt ekler, UPDATE mevcut kayıtları değiştirir ve DELETE kayıt siler. Bu dört işlem CRUD adıyla özetlenir.
WHERE kullanmak neden önemlidir?
WHERE, sorgunun hangi kayıtları hedefleyeceğini belirler. Özellikle UPDATE ve DELETE komutlarında koşul yazılmaması, amaçlanandan daha fazla kaydın değiştirilmesi veya silinmesi riskini doğurur.
SQL ile NoSQL arasındaki temel fark nedir?
SQL ilişkisel ve tablo temelli veritabanlarıyla ilişkilidir. NoSQL sistemleri belge, anahtar-değer veya grafik gibi farklı veri modelleri kullanabilir. Uygun seçim, verinin yapısına ve uygulamanın gereksinimlerine göre yapılır.
SQL öğrenmek zor mudur?
SELECT, INSERT, UPDATE ve DELETE gibi temel komutlar sınırlı bir sözdizimiyle öğrenilebilir. Ancak JOIN, toplulaştırma, büyük veri kümeleri ve performans gibi konular daha fazla uygulama gerektirir. Zorluk, yalnızca komutları ezberlemekten değil, veri ilişkilerini doğru modellemekten kaynaklanır.
- •SQL Nedir, Ne İşe Yarar? SQL'in Avantajları Nelerdir?coderspace.io
- •SQL Eğitimiyoutube.com
- •Uygulamalarla SQL Öğreniyorumbtkakademi.gov.tr