SQL Server T-SQL Dasar: Sintaks yang Beda dari SQL Standar
TL;DR
T-SQL adalah versi SQL milik Microsoft SQL Server. Sintaks dasarnya sama dengan SQL standar, tapi ada perbedaan yang bikin query dari MySQL atau PostgreSQL langsung error: TOP dipakai sebagai ganti LIMIT, ISNULL sebagai ganti IFNULL atau COALESCE, GETDATE untuk tanggal sekarang, dan nama kolom berspasi dibungkus kurung siku. Menguasai delapan perbedaan ini cukup buat langsung produktif kalau kantor kamu pakai SQL Server.
T-SQL adalah versi SQL milik Microsoft, dipakai di SQL Server dan Azure SQL. Sintaks dasarnya sama, tapi ada 8 perbedaan yang bikin query dari MySQL langsung error.
Kalau kamu ngelamar ke bank, asuransi, atau perusahaan manufaktur di Indonesia, kemungkinan besar database-nya SQL Server. Dan kalau kamu belajar SQL dari tutorial yang pakai MySQL, hari pertama kerja kamu bakal ketemu error yang bikin bingung.
Ini 8 perbedaannya, urut dari yang paling sering nyangkut. Semua contoh pakai data toko_berkah.
1. TOP, bukan LIMIT
Ini yang paling sering. LIMIT gak ada di SQL Server.
Di MySQL atau Postgres:
SELECT nama_produk, harga
FROM produk
ORDER BY harga DESC
LIMIT 5;
Di T-SQL, jumlahnya ditaruh di depan pakai TOP:
SELECT TOP 5
nama_produk,
harga
FROM produk
ORDER BY harga DESC;
Perhatiin posisinya: setelah SELECT, sebelum nama kolom. Bukan di akhir query.
2. Paginasi pakai OFFSET FETCH
Mau ambil baris ke-11 sampai 20? Di MySQL kamu tulis LIMIT 10 OFFSET 10.
Di T-SQL:
SELECT
nama_produk,
harga
FROM produk
ORDER BY harga DESC
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
ORDER BY itu wajib. Tanpa itu, OFFSET FETCH gak jalan — SQL Server bakal error.
3. ISNULL, bukan IFNULL
Buat ngeganti nilai NULL dengan sesuatu:
SELECT
nama_produk,
ISNULL(kategori, 'Belum dikategorikan') AS kategori
FROM produk;
MySQL pakai IFNULL. Oracle pakai NVL. SQL Server pakai ISNULL.
Yang aman buat semua: COALESCE. Ini bagian dari SQL standar dan jalan di semua database.
SELECT
nama_produk,
COALESCE(kategori, 'Belum dikategorikan') AS kategori
FROM produk;
Aku pakai COALESCE aja, jadi query-nya gak perlu ditulis ulang kalau nanti pindah database. Detailnya ada di COALESCE.
4. GETDATE untuk tanggal sekarang
MySQL pakai NOW(). Postgres pakai CURRENT_DATE. SQL Server pakai GETDATE().
SELECT
COUNT(*) AS pesanan_7_hari,
SUM(total_harga) AS omzet_7_hari
FROM penjualan
WHERE tanggal >= DATEADD(DAY, -7, CAST(GETDATE() AS DATE));
GETDATE() ngasih tanggal dan jam. Kalau kamu cuma butuh tanggalnya, bungkus pakai CAST(... AS DATE). Kalau nggak, query kamu bakal ngelewatin transaksi hari ini yang jamnya lebih pagi dari sekarang.
Ini bug yang halus dan sering lolos sampai produksi.
5. DATEADD dan DATEDIFF untuk hitung tanggal
T-SQL punya cara sendiri buat nambah dan ngurang tanggal.
-- 30 hari ke belakang
SELECT DATEADD(DAY, -30, GETDATE());
-- Selisih hari antara dua tanggal
SELECT
id_customer,
DATEDIFF(DAY, tanggal_terakhir_beli, GETDATE()) AS hari_sejak_beli
FROM customer
WHERE DATEDIFF(DAY, tanggal_terakhir_beli, GETDATE()) > 90;
Urutan argumennya: satuan dulu, baru angkanya, baru tanggalnya. Ini kebalik dari kebiasaan MySQL, dan sering bikin salah tulis di minggu pertama.
6. Variabel pakai DECLARE
Ini fitur yang gak ada di SQL standar. T-SQL bisa nyimpen nilai di variabel.
DECLARE @awal DATE = '2026-06-01';
DECLARE @akhir DATE = '2026-06-30';
SELECT
p.kategori,
SUM(j.jumlah * p.harga) AS omzet
FROM penjualan AS j
JOIN produk AS p ON p.id_produk = j.id_produk
WHERE j.tanggal BETWEEN @awal AND @akhir
GROUP BY p.kategori
ORDER BY omzet DESC;
Kenapa ini berguna: query laporan bulanan kamu cuma perlu ganti dua baris di atas, bukan nyari-nyari tanggal di tengah query yang panjang.
Semua variabel di T-SQL diawali @.
7. Kurung siku buat nama yang aneh
Kalau nama kolom ada spasinya, atau kebetulan sama dengan kata yang dipakai SQL, bungkus pakai kurung siku.
SELECT
[Nama Produk],
[Order],
[Total Harga]
FROM [Data Penjualan 2026];
Ini paling sering muncul di tabel yang diimpor dari Excel — header kolomnya suka ada spasi.
Saran aku: jangan biasain. Ganti nama kolomnya jadi nama_produk sekali di awal, dan hidup kamu lebih tenang selamanya.
8. Gabung teks pakai + atau CONCAT
MySQL pakai CONCAT(). Postgres pakai ||. SQL Server pakai tanda plus:
SELECT
nama_depan + ' ' + nama_belakang AS nama_lengkap
FROM customer;
Hati-hati: kalau salah satu kolomnya NULL, hasilnya NULL semua. Aman-nya pakai CONCAT() yang juga jalan di SQL Server dan nganggap NULL sebagai string kosong.
SELECT
CONCAT(nama_depan, ' ', nama_belakang) AS nama_lengkap
FROM customer;
Tabel ringkasan: MySQL vs T-SQL
| Fungsi | MySQL / Postgres | T-SQL (SQL Server) |
|---|---|---|
| Ambil N baris teratas | LIMIT 10 | SELECT TOP 10 |
| Paginasi | LIMIT 10 OFFSET 10 | OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY |
| Ganti NULL | IFNULL / COALESCE | ISNULL / COALESCE |
| Tanggal sekarang | NOW() / CURRENT_DATE | GETDATE() |
| Tambah hari | DATE_ADD / INTERVAL | DATEADD(DAY, 7, tgl) |
| Gabung teks | CONCAT / || | + atau CONCAT |
| Variabel | — | DECLARE @nama |
| Nama berspasi | backtick atau kutip dua | [Kurung Siku] |
Contoh kasus: laporan customer tidak aktif di toko_berkah
toko_berkah punya 1.184 customer terdaftar. Owner mau tau siapa yang udah lama gak belanja, buat dikirimin promo lewat WhatsApp.
Query T-SQL lengkapnya:
DECLARE @batas_hari INT = 90;
WITH terakhir_beli AS (
SELECT
id_customer,
MAX(tanggal) AS tanggal_terakhir,
COUNT(*) AS total_transaksi,
SUM(total_harga) AS total_belanja
FROM penjualan
WHERE status <> 'batal'
GROUP BY id_customer
)
SELECT TOP 50
c.nama,
c.no_hp,
t.tanggal_terakhir,
DATEDIFF(DAY, t.tanggal_terakhir, GETDATE()) AS hari_sejak_beli,
t.total_transaksi,
t.total_belanja
FROM terakhir_beli AS t
JOIN customer AS c ON c.id_customer = t.id_customer
WHERE DATEDIFF(DAY, t.tanggal_terakhir, GETDATE()) > @batas_hari
AND t.total_transaksi >= 2
ORDER BY t.total_belanja DESC;
Filter total_transaksi >= 2 itu penting. Customer yang cuma beli sekali terus hilang biasanya emang cuma iseng — yang layak dikejar itu yang udah pernah balik lagi.
Hasilnya dari data toko_berkah:
| Kelompok | Jumlah | Total belanja historis |
|---|---|---|
| Beli ≥2x, hilang >90 hari | 147 | Rp 63.400.000 |
| Beli 1x, hilang >90 hari | 392 | Rp 51.100.000 |
| Masih aktif | 645 | — |
Yang menarik: 147 customer di kelompok pertama rata-rata udah belanja Rp 431.000 masing-masing. Itu 2,3 kali lipat rata-rata customer yang cuma beli sekali.
Jadi kalau budget promo terbatas, 147 nama itu yang dikirimin duluan — bukan 392 yang lain.
Kesalahan umum waktu pindah ke T-SQL
Nulis LIMIT di akhir query. Error pertama semua orang. Refleks dari MySQL.
Lupa CAST GETDATE ke DATE. Query kamu jadi ngelewatin transaksi hari ini yang jamnya lebih pagi dari waktu query dijalanin. Bug halus yang bisa lolos berbulan-bulan.
Pakai + buat gabung teks tanpa cek NULL. Satu kolom NULL bikin seluruh hasilnya NULL. Pakai CONCAT.
Balik urutan argumen DATEADD. Yang bener: DATEADD(DAY, -7, tanggal). Satuan dulu, baru angka, baru tanggal.
Lupa ORDER BY sebelum OFFSET FETCH. SQL Server nolak, dan pesan error-nya gak langsung ngasih tau apa yang kurang.
Nulis nama kolom pakai kutip dua. Di T-SQL, pakai kurung siku. Kutip dua bisa jalan, tapi cuma kalau setting QUOTED_IDENTIFIER lagi aktif — jangan andelin itu.
Cara latihan T-SQL kalau gak punya SQL Server
Nggak perlu Windows Server. Tiga cara gratis:
- SQL Server Express — versi gratis, bisa dipasang di Windows. Batasnya 10 GB per database, jauh lebih dari cukup buat latihan.
- Docker — satu perintah, jalan di Mac dan Linux. Microsoft nyediain image resminya.
- Azure SQL free tier — kalau kamu mau langsung latihan di cloud.
Referensi sintaks lengkapnya ada di dokumentasi resmi Microsoft. Itu tempat yang aku buka tiap ketemu fungsi yang gak familiar.
FAQ
T-SQL itu bahasa yang beda dari SQL?
Bukan bahasa baru. T-SQL adalah versi SQL milik Microsoft, dipakai di SQL Server dan Azure SQL. Semua yang kamu tau dari SQL standar — SELECT, WHERE, JOIN, GROUP BY — jalan sama persis. Yang ditambahin Microsoft itu fungsi tambahan dan kemampuan pemrograman kayak variabel, kondisi IF, dan loop, yang gak ada di SQL standar.
Kenapa LIMIT gak jalan di SQL Server?
SQL Server gak pakai LIMIT. Buat ngambil sejumlah baris teratas, pakai TOP yang ditaruh setelah SELECT: SELECT TOP 10 nama FROM produk ORDER BY harga DESC. Kalau kamu butuh lewatin baris tertentu buat paginasi, pakai OFFSET dan FETCH NEXT di bagian bawah query setelah ORDER BY.
Bedanya ISNULL sama COALESCE di T-SQL?
ISNULL cuma nerima dua argumen dan tipe hasilnya ngikutin argumen pertama. COALESCE bisa nerima banyak argumen dan ngembaliin yang pertama bukan NULL. COALESCE juga bagian dari SQL standar, jadi query kamu lebih gampang dipindah ke database lain. Kalau ragu, pakai COALESCE — dia jalan di SQL Server juga.
Kapan harus pakai kurung siku di T-SQL?
Kalau nama kolom atau tabel mengandung spasi, atau kebetulan sama dengan kata yang dipakai SQL kayak ORDER atau GROUP. Contoh: SELECT [Nama Produk], [Order] FROM penjualan. Ini kenapa file impor dari Excel sering bikin masalah — header kolomnya sering ada spasi. Lebih baik ganti nama kolomnya jadi tanpa spasi sekalian.
T-SQL bisa dipelajari kalau aku udah bisa MySQL?
Bisa, dan cepat. Sekitar 90 persen query yang kamu tulis sehari-hari sintaksnya sama. Yang perlu dihafal cuma pengganti fungsi: TOP untuk LIMIT, ISNULL untuk IFNULL, GETDATE untuk NOW, dan DATEADD untuk fungsi tanggal. Sisanya tinggal cari di dokumentasi Microsoft pas ketemu error.
SQL Server masih banyak dipakai di Indonesia?
Masih, terutama di perbankan, asuransi, manufaktur, dan perusahaan yang sistemnya jalan di Windows Server. Banyak sistem ERP dan aplikasi internal yang backend-nya SQL Server sejak bertahun-tahun lalu. Kalau kamu ngelamar ke perusahaan yang udah mapan, kemungkinan besar T-SQL yang kamu pakai sehari-hari, bukan Postgres.
Penutup
Yang perlu kamu hafal buat hari pertama kerja di SQL Server:
TOPgantiinLIMIT, dan posisinya di depan.GETDATE()ngasih tanggal dan jam — bungkusCAST(... AS DATE)kalau cuma butuh tanggal.DECLARE @variabelbikin query laporan kamu gampang diganti tanggalnya.
Sisanya sama kayak SQL yang udah kamu pelajarin. JOIN, GROUP BY, dan window function jalan persis sama.
Mau latihan sampai refleks? NgulikSQL punya latihan bertahap dari SELECT sampai window function, langsung di browser.
Lanjut baca: SQLite untuk Pemula — kalau kamu belum punya database buat latihan sama sekali.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel Terkait
7 SQL Client Gratis Terbaik buat Analis Data (2026)
Nggak perlu bayar buat nulis query. Ini 7 SQL client gratis yang beneran dipakai analis, plus kelebihan dan kekurangannya masing-masing.
SQL Style Guide: Cara Nulis Query yang Enak Dibaca Tim
Sepuluh aturan SQL style guide yang bikin query kamu kebaca sama tim — dan sama kamu sendiri 6 bulan lagi. Lengkap dengan contoh sebelum-sesudah.
Take-Home Test SQL Data Analyst: Contoh Soal + Cara Ngerjainnya
Contoh soal take-home test SQL yang beneran dipakai perusahaan, dikerjain step by step — dari baca soal, nulis query, sampai nyusun insight yang bikin recruiter nengok.