SQL veri tipleri, sütunda tutulacak değerin anlamına, üzerinde yapılacak işleme ve kabul edilen değer aralığına göre seçilir. Hesaplanacak veya sayısal olarak sıralanacak değerleri, ayrıca tarih ve saatleri gelişigüzel metin olarak saklamak; aritmetik, karşılaştırma, kronolojik sıralama ve doğrulama işlemlerini zorlaştırabilir.
Metin türü de kimi durumlarda doğru seçimdir: toplama yapılmayacak ve biçimi korunacak bir öğrenci kodu başında sıfır taşıyabilir. Bu yazıda öğrenci, ders ve sınav notu tabloları üzerinden temel türlerin nasıl ayrıldığını ve veri tipi seçiminin hangi ölçütlerle yapılacağını inceleyeceğiz.
SQL veri tipleri nasıl seçilir? Değerin anlamıyla başla
İlk adım, sütunun adından önce taşıdığı değerin anlamını tanımlamaktır. Bir sınav notu ortalamaya girecekse sayısal tür, sınav tarihi kronolojik karşılaştırılacaksa tarih türü, öğrenci adı ise metin türü ister. Aynı karakter dizisi, farklı kullanım amaçlarına göre farklı veri tipi gerektirebilir.
Örneğin bir öğrencinin 75, 90 ve 100 notlarını metin olarak tuttuğunu düşün. Ortalama almak, en yüksek notu bulmak veya belirli bir aralıkta filtrelemek için bu değerleri sayısal olarak yorumlamak gerekir. Metin biçiminde saklanan sayı ve tarihlerde dönüşüm, karşılaştırma ve sıralama kuralları kullanılan veri tabanı yönetim sistemine göre değişebilir. Bu nedenle ek dönüşüm ve doğrulama kuralları gerekebilir.
Buna karşılık öğrenci numarası ya da ders kodu gibi değerler yalnızca tanımlama ve biçim koruma amacı taşıyorsa metin seçimi anlamlıdır. Örneğin 0012 kodunda baştaki sıfırın korunması gerekir ve bu değer üzerinde toplama yapılmaz. Bu nedenle yalnızca rakamlardan oluşuyor diye her kodu tam sayı olarak tanımlamak doğru değildir.
Bu bakış açısı, öğrenci adı, ders kodu, sınav notu, sınav tarihi ve derse katılım durumu gibi alanların neden farklı türlere ihtiyaç duyduğunu açıklar. Şimdi temel sayısal, metinsel, tarih ve mantıksal türleri; ayrıca NULL, uzunluk ve precision kavramlarını birlikte ayıralım.
Temel SQL veri tipleri ve kavramlar nasıl ayrılır?

Aşağıdaki tablo, yaygın SQL tür adlarını kavramsal bir başlangıç olarak özetler. Tür adları, eş anlamlılar, kabul edilen uzunluklar, precision kuralları ve tarih ile saat ayrıntıları kullanılan DBMS'e göre değişebilir. Özellikle TIMESTAMP adının anlamı ve BOOLEAN desteği her sistemde aynı olmayabilir.
| Tür veya kavram | Anlamı | Uygun kullanım | Seçim uyarısı |
|---|---|---|---|
INTEGER |
Tam sayıları temsil eder. | Ders sayısı, sınav puanı tam sayıysa, sıra numarası. | Ondalık kısım için uygun değildir. INT eş adı ve kabul edilen aralık DBMS'e göre değişebilir. |
DECIMAL(p,s) |
Ondalık basamakları tanımlanabilen sayısal değerleri tutar. | 87.50 gibi ondalıklı not, oran veya ölçüm. |
p toplam basamak, s ondalık basamak sayısıdır. Bazı sistemlerde NUMERIC eş adıyla görülür. |
CHAR(n) |
Sabit uzunluk mantığı taşıyan metin türüdür. | Sabit biçimli kodlar ve belirli uzunluktaki kısa değerler. | CHAR veya CHARACTER yazımı, boşluk doldurma ve uzunluk aşımı davranışı DBMS'e göre değişebilir. |
VARCHAR(n) |
Değişken uzunluklu, üst sınırı tanımlanabilen metindir. | Öğrenci adı, ders adı ve değişken uzunluklu kodlar. | VARCHAR veya CHARACTER VARYING yazımı görülebilir. Uzunluk birimi ve sınır uygulaması sistemle birlikte kontrol edilmelidir. |
TEXT |
Uzun metinler için kullanılan türdür. | Ders açıklaması, öğrenci notu ve geri bildirim. | Her DBMS aynı TEXT türünü, sınırları veya işlemleri sunmayabilir. |
DATE, TIME, TIMESTAMP |
Yaygın kullanımda sırasıyla tarihi, gün içindeki saati ve tarih ile saati birlikte ifade eder. | Sınav tarihi, ders başlangıç saati ve kayıt zamanı. | Zaman dilimi, saniye hassasiyeti ve TIMESTAMP adının anlamı DBMS'e göre değişebilir. |
BOOLEAN |
Doğru veya yanlış mantıksal durumu ifade eder. | Ödev teslim edildi mi veya sınav tamamlandı mı gibi alanlar. | Doğrudan destek, saklama biçimi ve kabul edilen değer yazımları sisteme göre farklı olabilir. |
NULL |
Değerin bilinmediğini, henüz girilmediğini veya uygulanmadığını gösterebilir. | Henüz açıklanmayan not veya belirtilmeyen teslim tarihi. | 0 ya da boş metin değildir. Sorgularda özel NULL kuralları dikkate alınmalıdır. |
| Uzunluk, precision ve scale | Uzunluk metin kapasitesini, precision sayının toplam basamaklarını, scale ise ondalık basamaklarını anlatır. | VARCHAR(n) sınırı ile DECIMAL(p,s) aralığını belirlemek. |
Uzunluk ile precision aynı kavram değildir. Ölçüm ve sınır ayrıntıları DBMS'e göre değişebilir. |
Genel gösterim mantığında DECIMAL(5,2), toplam beş basamaktan ikisinin ondalık kısma ayrıldığını belirtir. VARCHAR(20) içindeki 20 ise metin uzunluğu sınırını anlatır; iki sayı aynı türde bir kapasiteyi ifade etmez. Bu değerler, yalnızca örnek veriye değil, alanın gerçek üst ve alt sınırlarına göre seçilmelidir. NULL için de aynı dikkat gerekir: bilinmeyen veya uygulanmayan bilgiyi sıfır ya da boş metinle gizlemek, sonraki sorguların anlamını değiştirebilir.
Dört adımlı veri tipi seçim çerçevesi

Bu alan üzerinde hesaplama, sıralama veya karşılaştırma yapılacak mı? Yanıt, veri tipini seçmenin ilk filtresidir. Değerin ekranda nasıl göründüğünden çok, sorgularda hangi anlamla kullanılacağı önemlidir.
- İşlem ihtiyacını belirle. Aritmetik, sıralama, filtreleme veya tarih karşılaştırması gerekip gerekmediğini saptayarak uygun doğal türü seç. Ortalama alınacak sınav notu sayısal, tarih aralığında aranacak sınav tarihi ise
DATEtüründe tutulmaya uygundur. - Değerin anlamını ve aralığını belirle. Adet için tam sayı, ölçüm veya ondalıklı not için uygun bir ondalık türü, tarih için
DATEdüşün. Başında sıfır bulunan0074gibi bir kodda rakamlar hesaplanmayacaksa metin seçimi daha anlamlıdır. - Precision veya metin uzunluğunu belirle. Geçerli ondalık basamak sayısını ve metin boyutunu gerçek gereksinime göre seç.
DECIMAL(5,2)ya daVARCHAR(100)yalnızca örnektir, evrensel kural değildir. Precision, scale ve metin uzunluğu yorumunu kullandığın sistemin belgelerinden kontrol et. NULLpolitikasını ve veri tabanı uyumluluğunu kontrol et. Bilinmeyen veya henüz girilmemiş değeri gerçek0'dan ayır. Uygulanamaz durum ve boş metin için de ayrı bir politika belirle.BOOLEAN, tarih-saat türleri veCREATE TABLEsözdizimini hedef sistemde doğrula.
Örnek uygulama: sınav notu, kod ve tarih
Sınav notu ortalamaya girecekse sayısal tür seçilir; notlar ondalıklı tutuluyorsa DECIMAL türünün precision ve scale değerleri gerçek gereksinime göre belirlenir. 0074 gibi başında sıfır bulunan öğrenci kodu, kimlik kodu olarak metin tutulur. Sınav günü tarih karşılaştırmalarında kullanılacaksa DATE seçilir. Not henüz girilmemişse NULL, gerçek not sıfırsa 0 kullanılır. İki durumlu devamsızlık bilgisi için Boolean türü düşünülebilir. Bu seçimlerin adları ve yazım biçimleri DBMS'e göre değişebildiği için uygulamadan önce ilgili belgeler kontrol edilmelidir.
Kısa kontrol listesi
- Bu alanda yapılacak işlemleri yaz.
- Değerin anlamını ve gerçek aralığını belirle.
- Precision, scale veya metin uzunluğunu gereksinime göre seç.
NULL,0, uygulanamaz durum ve boş metin politikasını netleştir.- Şemayı hedef DBMS'te çalıştırıp tür desteğini doğrula.
Öğrenci, ders ve sınav notu tablolarında doğru seçim
Öğrenci, ders ve sınav sonucu tablolarında hatalı türler, veriyi kaydetmekten çok sorgulama aşamasında sorun çıkarabilir. İlk şema bu nedenle kasıtlı olarak hatalıdır.
Kasıtlı olarak hatalı tasarım
CREATE TABLE students (
student_id VARCHAR(20),
student_code VARCHAR(20),
full_name VARCHAR(100)
);
CREATE TABLE courses (
course_id VARCHAR(20),
course_name VARCHAR(100)
);
CREATE TABLE exam_results (
result_id VARCHAR(20),
student_id VARCHAR(20),
course_id VARCHAR(20),
exam_score VARCHAR(10),
exam_date VARCHAR(30),
is_absent VARCHAR(5)
);
exam_score metin olduğunda ortalama ve sayısal sıralama için dönüştürme veya ek işlem gerekebilir. exam_date metin olduğunda tarih karşılaştırmaları yazım biçimine bağımlı hâle gelebilir. student_id, course_id ve result_id iç kimlik olarak gerçekten sayısalsa VARCHAR seçmek gereksizdir. Buna karşılık student_code harf içerebilir veya başında sıfır taşıyabilir. Böyle bir kodu metin tutmak koşullu olarak uygundur.
Daha uygun tasarım
Aşağıdaki şema, BOOLEAN, DATE ve DECIMAL tür adlarını destekleyen bir SQL sistemi için örnektir.
CREATE TABLE students (
student_id INTEGER,
student_code VARCHAR(20),
full_name VARCHAR(100)
);
CREATE TABLE courses (
course_id INTEGER,
course_name VARCHAR(100)
);
CREATE TABLE exam_results (
result_id INTEGER,
student_id INTEGER,
course_id INTEGER,
exam_score DECIMAL(5,2),
exam_date DATE,
is_absent BOOLEAN
);
Bu tasarımda INTEGER yalnızca ilgili kimlik gerçekten tam sayıysa uygundur. DECIMAL(5,2), VARCHAR(20) ve VARCHAR(100) değerleri örnektir; evrensel not aralığı veya zorunlu uzunluk değildir. Örneğin bu tasarımda not henüz oluşmadıysa NULL, gerçek not sıfırsa 0 saklanır. is_absent bilinen iki durumu Boolean ile ifade eder. Kullanılan sistemde BOOLEAN yerine farklı bir tür bulunabilir; örneğin SQL Server belgelerinde bu amaçla bit yer alır. Tablo ve sütun adlarının yazım kuralları da hedef sisteme göre kontrol edilmelidir.
SELECT örnekleriyle sıralama, ortalama, tarih ve NULL
Bir alanın anlamına uygun veri tipi seçildiğinde ORDER BY, AVG, tarih karşılaştırmaları ve NULL kontrolleri daha anlaşılır sonuç verir. Aynı öğrenci notu veri kümesi üzerinden bu davranışları birlikte inceleyelim.
CREATE TABLE student_scores (
student_name VARCHAR(40),
exam_date DATE,
score DECIMAL(5,2)
);
INSERT INTO student_scores (student_name, exam_date, score)
VALUES
('Ada', DATE '2025-05-10', 72.50),
('Deniz', DATE '2025-05-10', NULL),
('Ece', DATE '2025-06-01', 88.00);
Örnekte tarih değerleri, türü açıkça belirten DATE 'YYYY-MM-DD' biçiminde yazıldı. Tarih literalinin tek tırnak içinde ve tarih türüyle birlikte kullanılması, değerin nasıl yorumlanacağını daha açık hâle getirir.
Sayısal sıralama
Notu henüz girilmemiş satırı önce filtreleyip kalan puanları büyükten küçüğe sıralayalım.
SELECT student_name, score
FROM student_scores
WHERE score IS NOT NULL
ORDER BY score DESC;
Beklenen çıktı:
student_name | score
Ece | 88.00
Ada | 72.50
NULL satırını sorgudan çıkardığımız için sonuçta yalnızca 88.00 ve 72.50 görünür. NULL değerlerinin varsayılan sıralama yeri DBMS'e göre değişebildiğinden, eksik değerleri açıkça filtrelemek daha öngörülebilir bir yaklaşım oluşturur.
Ortalama ve kayıt sayısı
AVG(score), NULL olmayan iki notu kullanır. Matematiksel sonuç (72.50 + 88.00) / 2 = 80.25 olur. Aynı sorguda COUNT(score) notu bulunan satırları, COUNT(*) ise bütün satırları sayar.
SELECT
CAST(AVG(score) AS DECIMAL(5,2)) AS average_score,
COUNT(score) AS scored_students,
COUNT(*) AS total_rows
FROM student_scores;
Beklenen çıktı:
average_score | scored_students | total_rows
80.25 | 2 | 3
Bu nedenle eksik not ortalamaya katılmaz, fakat ilgili öğrenci satırı COUNT(*) sonucunda sayılmaya devam eder.
Tarih karşılaştırması
2025-06-01 ve sonrasındaki sınavları bulmak için tarih alanını doğrudan karşılaştırabilirsin.
SELECT student_name, exam_date
FROM student_scores
WHERE exam_date >= DATE '2025-06-01'
ORDER BY exam_date;
Beklenen çıktı:
student_name | exam_date
Ece | 2025-06-01
Eksik notu bulmak
Eksik notu bulmanın doğru yolu IS NULL kullanmaktır.
SELECT student_name, score
FROM student_scores
WHERE score IS NULL;
Beklenen çıktı:
student_name | score
Deniz | NULL
score = NULL ifadesi aynı amaca hizmet etmez. Çünkü normal eşitlik karşılaştırmalarında NULL ile yapılan işlem doğru ya da yanlış yerine bilinmeyen sonuç üretir. Ayrıca NULL sıfır değildir. Sıfır gerçek bir sayısal değerken NULL, bu örnekte notun girilmediğini gösterir.
Sık Sorulan Sorular
SQL'de sayıları neden VARCHAR yerine INTEGER veya DECIMAL olarak tanımlamalıyım?
Sayı olarak saklanan değerler toplama, ortalama ve sayısal sıralama işlemlerinde doğrudan kullanılabilir. VARCHAR seçildiğinde değer metin olarak değerlendirilir ve sayısal işlemler için dönüştürme gerekebilir. Değerin anlamı sayısalsa sayısal veri tipi daha uygundur.
INTEGER ile DECIMAL arasında nasıl seçim yaparım?
Yalnızca tam sayılar kullanılacaksa INTEGER, kesirli değerler anlam taşıyorsa DECIMAL seçebilirsin. Öğrenci notu, ölçüm veya para gibi 72.50 biçimindeki değerlerde DECIMAL daha uygun bir tercihtir.
NULL, 0 ve boş metin aynı anlama mı gelir?
Hayır. NULL eksik veya bilinmeyen değeri, 0 gerçek bir sayıyı, boş metin ise karakter alanındaki boş içeriği ifade eder. Bu değerleri birbirinin yerine kullanmak sorgu sonuçlarını değiştirebilir.
VARCHAR, CHAR ve TEXT arasında nasıl karar verilir?
VARCHAR değişken uzunluklu metinler, CHAR sabit uzunluklu değerler, TEXT ise uzunluğu önceden net olmayan serbest metinler için düşünülebilir. Uzunluk sınırları ve ayrıntılı davranışlar DBMS'e göre değişebileceği için hedef sistemin özelliklerini kontrol etmelisin.
SQL veri tipleri bütün veri tabanı sistemlerinde aynı mıdır?
Temel türlerin önemli bir bölümü ortak olsa da tür adları, tarih yazımı, metin sınırları, ondalık sonuçların gösterimi ve NULL sıralaması değişebilir. Bu nedenle tabloyu çalıştıracağın DBMS'in sözdizimini ve veri tipi kurallarını ayrıca incelemek gerekir.
Doğru veri tipi seçimi, tablo oluştururken verilen küçük bir karar gibi görünse de sorguların anlamını doğrudan etkiler. Her alan için değerin neyi temsil ettiğini, eksik olup olamayacağını ve hangi işlemlerde kullanılacağını birlikte değerlendirerek ilerle.