SQL'de Veri Türlerine Giriş
JavaScript'ten farklı olarak, SQL'de güçlü yazım vardır. Her tabloda, her sütunun kendi sabit veri türü vardır.
Pek çok veri türü vardır, ancak Java dilinin aksine, tüm durumlar için veri türleri olduğu için çok fazla veri türü vardır. Veritabanları, verilerin boyutuna çok bağlıdır, bu nedenle birçok veri türü birbirinden yalnızca uzunluk olarak farklılık gösterir.
Toplamda, veri türleri 5 gruba ayrılabilir:
- sayısal türler
- Dize türleri
- Tarihleri ve saatleri saklamak için türler
- Nesneler: genellikle bir bayt koleksiyonu olarak temsil edilir
- Taşıma : JSON ve XML
Genellikle farklı DBMS'lerin hala kendi veri türleri vardır. Her DBMS'nin kendi uzmanlığı vardır, bu nedenle yeni veri türleri eklemek çok yaygın bir şeydir.
Başka bir şey de, sadece yeni bir veri türü eklemek yeterli değil, onunla çalışacak işlevler eklemeniz ve bu işi rahat ve hızlı hale getirmeniz gerekiyor.
Herhangi bir endüstriyel (kurumsal) DBMS üzerinde çalışıyorsanız, büyük olasılıkla veri türleri ve işlevleriyle uğraşmanız gerekecektir. Bunun için 2-5 iyi kitap okumak gerekecek.
SQL ile tanışmamızın bir parçası olarak, üç ana veri türü grubunu ele alacağız:
- Sayılar
- Teller
- Tarih
SQL'deki Sayısal Türler
SQL'de sayısal türler üç gruba ayrılır:
- tamsayı türleri
- Sabit nokta sayıları (sabit ondalık basamak sayısı)
- Kayan nokta sayıları
Tamsayılarla başlayalım . Sadece 5 tane var ve bunlar bir tabloda açıklanabilir:
# | Tip adı | Bayt cinsinden uzunluk | Java'dan analog | En az değer | Maksimum değer |
---|---|---|---|---|---|
1 | TINYINT | 1 | bayt | -128 | 127 |
2 | SMALLINT | 2 | kısa | -32.768 | 32.767 |
3 | ORTA MINT | 3 | -8.388.608 | 8.388.607 | |
4 | INT | 4 | int | -2.147.483.648 | 2.147.483.647 |
5 | BÜYÜK | 8 | uzun | -2 63 | 2 63-1 |
Veri türleri Java veri türlerine çok benzer, ancak üç bayt uzunluğunda bir tamsayı türü de vardır. Bu, boyuttan tasarruf etmek için yapılır.
Sonra kayan nokta türleri gelir , tıpkı Java'da olduğu gibi, bunlardan yalnızca ikisi vardır:
# | Tip adı | Bayt cinsinden uzunluk | Java'dan analog | En az değer | Maksimum değer |
---|---|---|---|---|---|
1 | BATMADAN YÜZMEK | 4 | batmadan yüzmek | -3.40D+38 | +1.18D+38 |
2 | ÇİFT | 8 | çift | -1.79D+308 | +1.79D+308 |
Yine, yeni bir şey yok. Her şey Java'daki ile aynı. Bununla birlikte, Java'dan farklı olarak, SQL'in başka bir özel türü vardır, sabit noktalı gerçek sayı. Buna ONDALIK denir.
Tipik olarak bu tür, para miktarlarını depolamak için kullanılır. Bu türün adı yazıldığında, ondan sonra genellikle sayının ondalık noktadan önce ve sonra kaç tane ondalık basamağa sahip olduğu belirtilir. Genel format şöyle görünür:
DECIMAL(total_characters, after_comma)
Ve küçük bir örnek:
salary DECIMAL(5,2)
Maaş sütununun tam sayılar (en fazla 3 ondalık basamak) ve kesirli kısım - 2 ondalık basamak içerebileceğini bu şekilde açıkladık.
DECIMAL türünün desteklediği maksimum karakter sayısı 65'tir.
SQL'de dize türleri
Bir veritabanındaki satırlar iki biçimde saklanabilir:
- Sabit uzunluklu diziler
- Değişken uzunlukta dizeler
Sabit uzunluklu dizeler CHAR olarak belirtilir :
CHAR(length)
Sabit uzunluk, bu sütunun tüm değerlerinin kesinlikle sabit sayıda karakter içereceği anlamına gelir.
Sabit uzunluklu bir dize örneği:
country_code CHAR(2)
Değişken uzunluklu dizeler, VARCHAR türü tarafından belirtilir :
VARCHAR(max_length)
Değişken uzunluk, bu sütunun tüm değerlerinin herhangi bir uzunlukta metin içereceği, ancak maksimum uzunluktan fazla olmayacağı anlamına gelir.
Değişken uzunluklu dize örneği:
phone VARCHAR(12)
Sabit uzunluktaki dizilerin çok büyük bir avantajı vardır. İstemci, SQL sunucusundan tablodan 1.000.000'inci satırı kendisine döndürmesini isterse ve tablodaki satırlar sabit uzunluktaysa, satırın uzunluğunu bilerek, ilgili baytları kolayca hesaplayabilirsiniz. sıra.
Değişken uzunluktaki satırlar olması durumunda, istenen satırı tabloda hızlı bir şekilde bulmak mümkün olmayacaktır. ArrayList ve LinkedList'e erişim hızını hatırlayın, burada durum yaklaşık olarak aynı.
Veri türüne bağlı olarak, farklı uzunluklardaki dizelerin bir tabloda nasıl saklanacağını karşılaştıralım.
Astar | karakter(4) | Saklanacak bayt | VARCHAR(4) | Saklanacak bayt | |
---|---|---|---|---|---|
'' | '' | 4 | '' | 1 | |
'ab' | 'ab' | 4 | 'ab' | 3 | |
"abcd" | "abcd" | 4 | "abcd" | 5 | |
'abcdefgh' | "abcd" | 4 | "abcd" | 5 |
Not. VARCHAR türü, aynı uzunluk için bir bayt daha gerektirir, çünkü dizenin uzunluğunu ek olarak saklaması gerekir.
SQL'de geçici türler
SQL ayrıca tarih ve saatleri saklamak için özel türlere sahiptir. Toplamda beş tür vardır:
# | Tip adı | Java DateTime API'sinden analog | Örnek | En az değer | Maksimum değer |
---|---|---|---|---|---|
1 | TARİH | Yerel Tarih | '2022-06-30' | "1000-01-01" | '9999-12-31' |
2 | ZAMAN | Yerel zaman | 'ss:dd:ss[.fraction]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | DATETIME | LocalDateTime | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | ZAMAN BİLGİSİ | Tarih | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | YIL | 1901 | 2155 |
Sorgulardaki tüm veriler, tek tırnak içinde bir dize olarak yazılır. Giriş formatı büyükten küçüğe doğru gider:
- Yıl
- Ay
- Gün
- Saat
- Dakika
- Saniye
- Saniyenin kesirleri
DATE, TIME ve DATETIME türleri geleneksel olarak Java DateTme API'sindeki türlerin analogları olarak kabul edilebilir: LocalDate, LocalTime, LocalDateTime. Mantık aşağı yukarı aynı.
TIMESTAMP türü, verileri 1970'in başından beri (bir UNIX işletim sistemi standardı) milisaniye cinsinden depolar. Bu formda, Java dilinde Tarih türüne göre depolanırlar.
Ve son olarak 1 byte uzunluğunda olan ve 1 ile 255 arasında değerler depolayan YEAR tipi vardır. Bu nedenle kullanabileceği yıl aralığı 1901-2155'tir. 1900 yılı bu tür tarafından saklanamaz, çünkü 0 değeri bir NULL değerini kodlamak için kullanılır.
Nesneleri SQL'de depolamak
Nesneleri veya çok uzun metinleri saklamak için özel türler vardır. Ayrıntısına girmeyeceğiz ama yine de sıralayayım:
# | Tip adı | Açıklama |
---|---|---|
1 | METİN | Uzun metinleri saklamak için kullanılır. Bu alanda karşılaştırma ve sıralama yapılırken sadece ilk 100 karakter kullanılır. |
2 | BLOB | Ad, Bayt Büyük Nesne anlamına gelir. Yalnızca bir bayt koleksiyonu olarak depolanır. Örneğin resimleri bir veritabanında saklamak için kullanılabilir. |
3 | CLOB | Ad, Char Büyük Nesne anlamına gelir. Uzun metinleri saklamak için kullanılır. |
4 | SIRALAMA | Sabit bir değer kümesi belirlemenizi ve bunlardan birini değer olarak saklamanızı sağlar. |
5 | AYARLAMAK | Sabit bir değer kümesi belirlemenize ve bunların herhangi bir alt kümesini bir değer olarak saklamanıza olanak tanır. Genellikle bunları bir ikili maske olarak saklar. |
Teorik olarak, herhangi bir Java nesnesini bir bayt kümesi olarak seri hale getirebilir ve onu bir BLOB olarak veritabanında saklayabilirsiniz. Nesneyi kaydetmek sorun değil. Onunla daha fazla nasıl çalışılır?
Diyelim ki bir tablo milyonlarca nesneyi serileştirilmiş biçimde saklıyor - bunlar arasında nasıl arama yapacaksınız? Bir DBMS, yalnızca belirli bir veri türünü, onunla çalışmak için kapsamlı bir dizi işlev sağladığında destekler.