Pengantar Tipe Data dalam SQL
Tidak seperti JavaScript, SQL memiliki pengetikan yang kuat. Di setiap tabel, setiap kolom memiliki tipe data tetapnya sendiri.
Ada banyak tipe data, tetapi tidak seperti bahasa Java, ada banyak sekali bukan karena ada tipe data untuk semua kesempatan. Basis data sangat bergantung pada ukuran data, sehingga banyak tipe data yang berbeda satu sama lain hanya panjangnya.
Secara total, tipe data dapat dibagi menjadi 5 grup:
- Jenis numerik
- Jenis string
- Jenis untuk menyimpan tanggal dan waktu
- Objek: biasanya direpresentasikan sebagai kumpulan byte
- Transportasi : JSON dan XML
Biasanya DBMS yang berbeda masih memiliki tipe datanya masing-masing. Setiap DBMS memiliki spesialisasi masing-masing, sehingga menambahkan tipe data baru adalah hal yang sangat umum.
Hal lain adalah menambahkan tipe data baru saja tidak cukup, Anda perlu menambahkan fungsi yang akan bekerja dengannya, serta membuatnya bekerja dengan nyaman dan cepat.
Jika Anda bekerja pada DBMS industri (perusahaan), kemungkinan besar Anda harus berurusan dengan tipe data dan fungsinya. Untuk apa perlu membaca 2-5 buku bagus.
Sebagai bagian dari perkenalan kita dengan SQL, kita akan mempertimbangkan tiga kelompok utama tipe data:
- Angka
- String
- tanggal
Jenis Numerik dalam SQL
Dalam SQL, tipe numerik dibagi menjadi tiga kelompok:
- Jenis bilangan bulat
- Angka titik tetap (jumlah tempat desimal tetap)
- Angka titik mengambang
Mari kita mulai dengan bilangan bulat . Hanya ada 5 di antaranya, dan dapat dijelaskan dalam satu tabel:
# | Ketik nama | Panjang dalam byte | Analog dari Jawa | Nilai minimal | Nilai maksimum |
---|---|---|---|---|---|
1 | TINYINT | 1 | byte | -128 | 127 |
2 | KECIL | 2 | pendek | -32.768 | 32.767 |
3 | MENENGAH | 3 | -8.388.608 | 8.388.607 | |
4 | INT | 4 | int | -2.147.483.648 | 2.147.483.647 |
5 | BESAR | 8 | panjang | -2 63 | 2 63-1 |
Tipe datanya sangat mirip dengan tipe data Java, tetapi ada juga tipe integer yang panjangnya tiga byte. Hal ini dilakukan untuk menghemat ukuran.
Berikutnya adalah floating point types , seperti di Java, hanya ada dua di antaranya:
# | Ketik nama | Panjang dalam byte | Analog dari Jawa | Nilai minimal | Nilai maksimum |
---|---|---|---|---|---|
1 | MENGAMBANG | 4 | mengambang | -3.40E+38 | +1.18E+38 |
2 | DOBEL | 8 | dobel | -1.79E+308 | +1.79E+308 |
Sekali lagi, tidak ada yang baru. Semuanya sama seperti di Jawa. Namun, tidak seperti Java, SQL memiliki tipe khusus lainnya, bilangan real titik tetap. Ini disebut DECIMAL.
Biasanya jenis ini digunakan untuk menyimpan sejumlah uang. Ketika nama jenis ini ditulis, maka setelah itu biasanya ditunjukkan berapa angka desimal yang dimiliki angka tersebut sebelum dan sesudah koma desimal. Format umumnya terlihat seperti ini:
DECIMAL(total_characters, after_comma)
Dan contoh kecil:
salary DECIMAL(5,2)
Beginilah cara kami menjelaskan fakta bahwa kolom gaji dapat berisi bilangan bulat (maksimum 3 tempat desimal) dan bagian pecahan - 2 tempat desimal.
Jumlah maksimum karakter yang didukung tipe DECIMAL adalah 65.
Tipe string dalam SQL
Baris dalam database dapat disimpan dalam dua bentuk:
- String panjang tetap
- String dengan panjang variabel
String dengan panjang tetap ditentukan sebagai CHAR :
CHAR(length)
Panjang tetap berarti bahwa semua nilai kolom ini akan berisi jumlah karakter yang tetap.
Contoh string dengan panjang tetap:
country_code CHAR(2)
String panjang variabel ditentukan oleh tipe VARCHAR :
VARCHAR(max_length)
Panjang variabel berarti bahwa semua nilai kolom ini akan berisi teks dengan panjang berapa pun, tetapi tidak lebih dari panjang maksimum.
Contoh string panjang variabel:
phone VARCHAR(12)
String dengan panjang tetap memiliki keuntungan yang sangat besar. Jika klien meminta server SQL untuk mengembalikan baris ke-1.000.000 dari tabel kepadanya, dan baris dalam tabel memiliki panjang tetap, maka, mengetahui panjang baris, Anda dapat dengan mudah menghitung byte yang berhubungan dengan yang diinginkan. baris.
Dalam kasus panjang garis variabel, tidak mungkin menemukan baris yang diinginkan dengan cepat di tabel. Ingat kecepatan akses ke ArrayList dan LinkedList, situasinya kurang lebih sama di sini.
Mari kita bandingkan bagaimana string dengan panjang berbeda akan disimpan dalam sebuah tabel, bergantung pada tipe datanya.
Garis | CHAR(4) | Byte untuk menyimpan | VARCHAR(4) | Byte untuk menyimpan | |
---|---|---|---|---|---|
'' | ' ' | 4 | '' | 1 | |
'ab' | 'ab' | 4 | 'ab' | 3 | |
'abcd' | 'abcd' | 4 | 'abcd' | 5 | |
'ABCD EFGH' | 'abcd' | 4 | 'abcd' | 5 |
Catatan. Tipe VARCHAR membutuhkan satu byte lagi untuk panjang yang sama, karena ia juga harus menyimpan panjang string.
Jenis sementara dalam SQL
SQL juga memiliki tipe khusus untuk menyimpan tanggal dan waktu. Total ada lima jenis:
# | Ketik nama | Analog dari Java DateTime API | Contoh | Nilai minimal | Nilai maksimum |
---|---|---|---|---|---|
1 | TANGGAL | Tanggal Lokal | '2022-06-30' | '1000-01-01' | '9999-12-31' |
2 | WAKTU | Waktu lokal | 'hh:mm:ss[.fraksi]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | TANGGAL WAKTU | TanggalWaktu Lokal | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | URUTAN WAKTU | Tanggal | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | TAHUN | 1901 | 2155 |
Semua data dalam kueri ditulis sebagai string - dalam tanda kutip tunggal. Format entri mulai dari yang terbesar hingga yang terkecil:
- Tahun
- Bulan
- Hari
- Jam
- Menit
- Kedua
- Sepersekian detik
Tipe DATE, TIME dan DATETIME secara konvensional dapat dianggap analog dari tipe dari Java DateTme API: LocalDate, LocalTime, LocalDateTime. Logikanya hampir sama.
Jenis TIMESTAMP menyimpan data dalam milidetik sejak awal tahun 1970 (standar sistem operasi UNIX). Dalam bentuk inilah mereka disimpan oleh tipe Tanggal dalam bahasa Java.
Dan terakhir, ada tipe YEAR, yang panjangnya 1 byte dan menyimpan nilai dari 1 hingga 255. Oleh karena itu, kisaran tahun yang tersedia adalah 1901-2155. Tahun 1900 tidak dapat disimpan dengan tipe ini, karena nilai 0 digunakan untuk menyandikan nilai NULL.
Menyimpan objek dalam SQL
Ada jenis khusus untuk menyimpan objek atau teks yang sangat panjang. Kami tidak akan merincinya, tetapi saya tetap akan mencantumkannya:
# | Ketik nama | Penjelasan |
---|---|---|
1 | TEKS | Digunakan untuk menyimpan teks panjang. Saat membandingkan dan menyortir bidang ini, hanya 100 karakter pertama yang digunakan. |
2 | GUMPAL | Nama singkatan dari Byte Large Object. Disimpan hanya sebagai kumpulan byte. Dapat digunakan untuk, misalnya, menyimpan gambar dalam database. |
3 | KLOB | Namanya singkatan dari Char Large Object. Digunakan untuk menyimpan teks panjang. |
4 | ENUM | Memungkinkan Anda menyetel kumpulan nilai tetap dan menyimpan salah satunya sebagai nilai. |
5 | MENGATUR | Memungkinkan Anda menyetel kumpulan nilai tetap dan menyimpan sebagian darinya sebagai nilai. Biasanya menyimpannya sebagai topeng biner. |
Secara teoritis, Anda dapat membuat serial objek Java apa pun sebagai satu set byte dan menyimpannya di database sebagai BLOB. Menyimpan objek bukanlah masalah. Bagaimana cara bekerja dengannya lebih jauh?
Katakanlah sebuah tabel menyimpan sejuta objek dalam bentuk berseri - bagaimana Anda akan menelusurinya? Sebuah DBMS hanya mendukung jenis data tertentu ketika menyediakan serangkaian fungsi yang ekstensif untuk bekerja dengannya.