{
  "assessmentTests": {
    "sql_test": {
      "name": "Tes SQL",
      "desc": "30 pertanyaan skenario tentang filtering, joins, aggregation, subqueries dan window functions — temukan apakah SQL Anda sesuai dengan apa yang dimaksud lowongan kerja dengan profisiensi SQL.",
      "recommendation": "Profil keterampilan SQL Anda",
      "results": {
        "beginner": {
          "name": "Pemula",
          "desc": "Anda dapat menulis pernyataan SELECT yang berfungsi dan memfilter pada beberapa kondisi, tetapi pertanyaan yang Anda lewatkan berkumpul di sekitar penanganan NULL dan mekanika join daripada sintaks — membandingkan kolom ke NULL dengan =, apa yang sebenarnya dipertahankan LEFT JOIN, bagaimana batas BETWEEN bekerja. Ini bukan tentang buruk di database; ini adalah aturan spesifik yang menjebak orang yang belajar SQL dengan coba-coba daripada dari standar. Mereka penting di tempat kerja karena masing-masing adalah tempat query mengembalikan jumlah baris yang terlihat benar tetapi salah.",
          "recommendation": "Mulai dengan tiga hal, dalam urutan ini: mengapa WHERE col = NULL tidak pernah cocok apa pun (dan IS NULL diperlukan sebagai gantinya), bagaimana INNER JOIN menghilangkan baris yang tidak cocok sementara LEFT JOIN menyimpannya, dan batas tepat BETWEEN mencakup. Tutorial SQL Mode Analytics dan dokumentasi PostgreSQL keduanya mencakup ketiga-tiganya dengan contoh yang dapat dijalankan."
        },
        "intermediate": {
          "name": "Menengah",
          "desc": "Anda menangani query pelaporan sehari-hari dengan nyaman — joins, GROUP BY, filtering langsung — dan tidak akan diperlambat oleh pekerjaan dashboard rutin atau analisis ad-hoc. Kesenjangan antara di sini dan Lanjutan sebagian besar dalam apa yang terjadi ketika klausa berinteraksi: klausa WHERE pada tabel yang digabungkan secara diam-diam mengubah LEFT JOIN kembali menjadi INNER JOIN, join yang menyebabkan fan-out jumlah baris sebelum aggregate diterapkan, NOT IN yang secara diam-diam mengembalikan apa pun karena satu NULL masuk ke subquery. Ini adalah jenis bug yang melewati pemeriksaan pandangan cepat dan hanya muncul ketika seseorang membandingkan total dengan laporan berbeda.",
          "recommendation": "Fokus pada bagaimana klausa berinteraksi daripada apa yang masing-masing lakukan sendiri: filtering WHERE pada kolom tangan kanan LEFT JOIN, penggandaan baris dari join satu-ke-banyak sebelum Anda agregasi, dan mengapa NOT IN rusak kehadiran NULLs (EXISTS biasanya tidak). Kemudian HAVING vs WHERE, karena split itu menjebak orang yang sudah tahu kedua klausa secara individu."
        },
        "advanced": {
          "name": "Lanjutan",
          "desc": "Ini adalah level yang kebanyakan lowongan kerja maksudkan dengan \"SQL kuat.\" Anda membaca query multi-join dan dapat memprediksi jumlah barisnya sebelum menjalankannya, Anda tahu mengapa result set berubah daripada hanya bahwa hal itu terjadi, dan Anda mencapai CTE atau window function daripada subquery bersarang ketika itu adalah alat yang lebih jelas. Apa yang memisahkan band ini dari puncak adalah sisi defensif pekerjaan: mengetahui fungsi ranking mana yang digunakan ketika ties penting, apa yang sebenarnya diisolasi COMMIT dari sesi concurrent, dan apa yang sebenarnya dilakukan aturan ON DELETE yang hilang pada level database.",
          "recommendation": "Dorong ke bagian yang melindungi data yang juga disentuh orang lain: perbedaan antara RANK, DENSE_RANK dan ROW_NUMBER di bawah ties, apa yang sebenarnya dilakukan COMMIT yang terlihat dan kepada siapa, dan perilaku foreign key pada DELETE. Gunakan deep dive newsletter The Index atau SQL untuk Devs pada window functions dan transaction isolation sebagai langkah berikutnya untuk keduanya."
        },
        "expert": {
          "name": "Ahli",
          "desc": "Anda mencetak gol di puncak setiap bagian — filtering dan NULL semantics, joins dan set operations, aggregation dan subqueries, dan window functions, CTEs dan constraints. Secara praktis, itu berarti Anda dapat diserahkan query laporan multi-join orang asing dan jelaskan mengapa ia mengembalikan jumlah baris yang dilakukan, bukan hanya apa yang sintaks katakan seharusnya dilakukan, yang lebih sulit dan keterampilan lebih berharga. Di level ini query language jarang menjadi faktor pembatas; batasnya biasanya desain schema atau ukuran data di bawahnya.",
          "recommendation": "Pengembalian sekarang dalam execution plans dan desain: membaca output EXPLAIN sebelum mengasumsikan query lambat, strategi indexing sebagai tradeoff terhadap write cost daripada kemenangan gratis, dan keputusan normalisasi yang bertahan saat schema tumbuh. Jika Anda disaring untuk peran, jelaskan query bug seperti join fan-out atau NOT IN/NULL trap yang Anda temukan dalam produksi daripada naming SQL features — ini menunjukkan penalaran, bukan hanya vocabulary."
        }
      },
      "questions": [
        {
          "question": "Tabel memiliki kolom age yang dapat null. Anda menjalankan SELECT * FROM users WHERE age = NULL. Berapa banyak baris yang dikembalikan ini, bahkan jika beberapa baris memiliki age diatur ke NULL?",
          "options": [
            {
              "icon": "",
              "label": "Setiap baris di mana age adalah NULL, karena = cocok dengan NULL seperti nilai lainnya"
            },
            {
              "icon": "",
              "label": "Nol — membandingkan apa pun ke NULL dengan = menghasilkan UNKNOWN, tidak pernah TRUE, jadi tidak ada baris yang cocok; IS NULL diperlukan sebagai gantinya"
            },
            {
              "icon": "",
              "label": "Kesalahan sintaks — NULL tidak dapat muncul di sisi kanan ="
            },
            {
              "icon": "",
              "label": "Setiap baris dalam tabel, karena perbandingan NULL secara default TRUE"
            }
          ]
        },
        {
          "question": "Anda menjalankan SELECT DISTINCT department, role FROM employees. Apa yang DISTINCT hapus duplikat?",
          "options": [
            {
              "icon": "",
              "label": "Kombinasi department dan role bersama-sama — baris hanya dihapus jika kedua kolom cocok dengan baris lain persis"
            },
            {
              "icon": "",
              "label": "Nilai department yang duplikat hanya, menjaga setiap role"
            },
            {
              "icon": "",
              "label": "Nilai role yang duplikat hanya, menjaga setiap department"
            },
            {
              "icon": "",
              "label": "Tidak apa pun — DISTINCT hanya bekerja dengan kolom tunggal"
            }
          ]
        },
        {
          "question": "Kolom name difilter dengan WHERE name LIKE 'A_'. Nilai mana yang cocok: 'A', 'Al', 'Ana', 'Ally'?",
          "options": [
            {
              "icon": "",
              "label": "'A' — underscore opsional dan cocok nol atau lebih karakter"
            },
            {
              "icon": "",
              "label": "'Al' — underscore cocok persis satu karakter, jadi LIKE 'A_' cocok string dua karakter apa pun yang dimulai dengan A"
            },
            {
              "icon": "",
              "label": "'Ana' dan 'Ally' — underscore cocok karakter trailing apa pun jumlahnya"
            },
            {
              "icon": "",
              "label": "Keempat nilai cocok, karena LIKE mengabaikan panjang"
            }
          ]
        },
        {
          "question": "Kolom price difilter dengan WHERE price BETWEEN 10 AND 20. Apakah baris dengan price persis 10 atau persis 20 termasuk?",
          "options": [
            {
              "icon": "",
              "label": "Tidak — BETWEEN mengecualikan kedua endpoint"
            },
            {
              "icon": "",
              "label": "Ya — BETWEEN inklusif di kedua ujung, setara dengan price >= 10 AND price <= 20"
            },
            {
              "icon": "",
              "label": "Hanya price = 10 yang disertakan; batas atas eksklusif"
            },
            {
              "icon": "",
              "label": "Hanya price = 20 yang disertakan; batas bawah eksklusif"
            }
          ]
        },
        {
          "question": "Tabel orders memiliki 10 baris, dan 3 di antaranya memiliki shipped_date NULL. Apa yang dikembalikan SELECT COUNT(*) FROM orders, dan apa yang dikembalikan SELECT COUNT(shipped_date) FROM orders?",
          "options": [
            {
              "icon": "",
              "label": "10, kemudian 10 — COUNT selalu menghitung baris terlepas dari NULLs"
            },
            {
              "icon": "",
              "label": "7, kemudian 7 — kedua bentuk melewati baris NULL"
            },
            {
              "icon": "",
              "label": "10, kemudian 7 — COUNT(*) menghitung setiap baris, COUNT(column) menghitung hanya baris di mana kolom itu bukan NULL"
            },
            {
              "icon": "",
              "label": "10, kemudian 3 — COUNT(column) menghitung hanya nilai NULL"
            }
          ]
        },
        {
          "question": "Anda menjalankan SELECT name, salary FROM employees ORDER BY 2 DESC. Apa yang merujuk 2?",
          "options": [
            {
              "icon": "",
              "label": "Kesalahan sintaks — ORDER BY hanya menerima nama kolom, bukan angka"
            },
            {
              "icon": "",
              "label": "Baris kedua hasil"
            },
            {
              "icon": "",
              "label": "Nilai literal 2, digunakan sebagai tiebreaker"
            },
            {
              "icon": "",
              "label": "Kolom kedua dalam daftar SELECT, salary — ORDER BY menerima nomor posisi kolom sebagai shorthand"
            }
          ]
        },
        {
          "question": "Dalam SQL standar, 'Ana' || ' ' || 'Lee' mengevaluasi ke apa?",
          "options": [
            {
              "icon": "",
              "label": "Kesalahan sintaks — SQL tidak memiliki operator concatenation"
            },
            {
              "icon": "",
              "label": "3 — || diperlakukan sebagai boolean OR dan mengembalikan count"
            },
            {
              "icon": "",
              "label": "'AnaLee' — || concatenates tanpa mempertahankan spasi"
            },
            {
              "icon": "",
              "label": "'Ana Lee' — || adalah operator concatenation string SQL standar"
            }
          ]
        },
        {
          "question": "Mana dari ini yang persis setara dengan WHERE status IN ('open', 'pending', 'review')?",
          "options": [
            {
              "icon": "",
              "label": "WHERE status = 'open' AND status = 'pending' AND status = 'review'"
            },
            {
              "icon": "",
              "label": "WHERE status != 'open' OR status != 'pending' OR status != 'review'"
            },
            {
              "icon": "",
              "label": "WHERE status = 'open' OR status = 'pending' OR status = 'review'"
            },
            {
              "icon": "",
              "label": "WHERE status LIKE 'open,pending,review'"
            }
          ]
        },
        {
          "question": "customers memiliki 100 baris; 20 dari mereka tidak pernah menempatkan pesanan. Anda menjalankan SELECT c.id FROM customers c INNER JOIN orders o ON c.id = o.customer_id. Apakah 20 pelanggan tanpa pesanan muncul dalam hasil?",
          "options": [
            {
              "icon": "",
              "label": "Ya, sekali setiap, dengan o.id ditampilkan sebagai NULL"
            },
            {
              "icon": "",
              "label": "Ya, tetapi hanya jika mereka juga muncul dalam klausa WHERE"
            },
            {
              "icon": "",
              "label": "Tidak — INNER JOIN hanya mengembalikan baris yang memiliki kecocokan di kedua tabel, jadi pelanggan tanpa pesanan dihilangkan sepenuhnya"
            },
            {
              "icon": "",
              "label": "Ya, digandakan sekali per kolom dalam orders"
            }
          ]
        },
        {
          "question": "Anda ingin setiap pelanggan baik atau tidak mereka memiliki pesanan, jadi Anda menulis SELECT c.id, o.total FROM customers c LEFT JOIN orders o ON c.id = o.customer_id WHERE o.total > 100. Apakah ini masih mengembalikan pelanggan tanpa pesanan?",
          "options": [
            {
              "icon": "",
              "label": "Tidak — filtering pada o.total dalam klausa WHERE membuang baris NULL yang dihasilkan LEFT JOIN untuk pelanggan yang tidak cocok, jadi berperilaku seperti INNER JOIN"
            },
            {
              "icon": "",
              "label": "Ya — LEFT JOIN selalu mempertahankan setiap baris dari customers tidak peduli apa yang mengikuti"
            },
            {
              "icon": "",
              "label": "Ya, dengan o.total ditampilkan sebagai 0 untuk pelanggan tanpa pesanan"
            },
            {
              "icon": "",
              "label": "Tidak — LEFT JOIN secara diam-diam mengubah dirinya menjadi RIGHT JOIN ketika klausa WHERE ditambahkan"
            }
          ]
        },
        {
          "question": "Tabel employees memiliki kolom id dan kolom manager_id yang menunjuk ke baris lain's id. Untuk membuat daftar setiap karyawan di samping nama manajer mereka, Anda menggabungkan tabel ke dirinya sendiri: SELECT e.name, m.name FROM employees e JOIN employees m ON e.manager_id = m.id. Pola apa ini disebut?",
          "options": [
            {
              "icon": "",
              "label": "Cross join — setiap karyawan cocok dengan setiap manajer"
            },
            {
              "icon": "",
              "label": "Recursive join — ia mengambil rantai manajemen penuh"
            },
            {
              "icon": "",
              "label": "Self-join — tabel yang sama digabungkan ke dirinya sendiri menggunakan dua alias berbeda"
            },
            {
              "icon": "",
              "label": "Ini adalah SQL tidak valid — tabel tidak dapat digabungkan ke dirinya sendiri"
            }
          ]
        },
        {
          "question": "Dua query SELECT dengan kolom yang sama digabungkan dengan UNION. Jika kedua query mengembalikan baris yang identik, berapa banyak salinan baris itu muncul dalam hasil akhir?",
          "options": [
            {
              "icon": "",
              "label": "Satu — UNION menghapus baris duplikat di seluruh hasil gabungan; UNION ALL akan menyimpan kedua salinan"
            },
            {
              "icon": "",
              "label": "Dua — UNION menyimpan setiap baris dari kedua query"
            },
            {
              "icon": "",
              "label": "Nol — UNION menghapus baris apa pun yang muncul di kedua query"
            },
            {
              "icon": "",
              "label": "Itu tergantung pada query mana yang membuat daftar baris terlebih dahulu"
            }
          ]
        },
        {
          "question": "Table sizes memiliki 3 baris dan colors memiliki 4 baris. Berapa banyak baris yang dikembalikan SELECT * FROM sizes CROSS JOIN colors?",
          "options": [
            {
              "icon": "",
              "label": "7 — CROSS JOIN menambahkan jumlah baris bersama-sama"
            },
            {
              "icon": "",
              "label": "12 — CROSS JOIN mengembalikan setiap kombinasi baris yang mungkin dari kedua tabel (3 x 4)"
            },
            {
              "icon": "",
              "label": "3 — CROSS JOIN mengembalikan satu baris per baris dalam tabel pertama"
            },
            {
              "icon": "",
              "label": "0 — CROSS JOIN memerlukan kondisi ON atau mengembalikan tidak apa pun"
            }
          ]
        },
        {
          "question": "orders memiliki 1 baris untuk order #100, dan order_items memiliki 3 baris untuk order #100 (satu per line item). Anda menjalankan SELECT o.id, o.total FROM orders o JOIN order_items i ON o.id = i.order_id WHERE o.id = 100. Berapa banyak baris yang kembali untuk order #100?",
          "options": [
            {
              "icon": "",
              "label": "3 — join menghasilkan satu baris output per baris order_items yang cocok, jadi baris tunggal order #100 diulang sekali per line item"
            },
            {
              "icon": "",
              "label": "1 — orders hanya memiliki satu baris untuk order #100, jadi join tidak dapat menghasilkan lebih banyak"
            },
            {
              "icon": "",
              "label": "4 — satu baris untuk order ditambah satu per line item"
            },
            {
              "icon": "",
              "label": "0 — joining tabel satu baris ke tabel tiga baris pada kunci non-unik gagal"
            }
          ]
        },
        {
          "question": "SELECT c.name, o.id FROM customers c RIGHT JOIN orders o ON c.id = o.customer_id mengembalikan baris yang sama seperti yang mana dari ini?",
          "options": [
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM customers c INNER JOIN orders o ON c.id = o.customer_id"
            },
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM orders o LEFT JOIN customers c ON c.id = o.customer_id — menukar urutan tabel dan menggunakan LEFT JOIN daripada RIGHT JOIN setara"
            },
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM customers c LEFT JOIN orders o ON c.id = o.customer_id"
            },
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM orders o CROSS JOIN customers c"
            }
          ]
        },
        {
          "question": "Dalam SQL standar, Anda menjalankan SELECT department, name, AVG(salary) FROM employees GROUP BY department. Apakah ini query yang valid?",
          "options": [
            {
              "icon": "",
              "label": "Ya — GROUP BY hanya perlu menyertakan department karena terdaftar terlebih dahulu"
            },
            {
              "icon": "",
              "label": "Tidak — name dipilih tetapi tidak diagregasi atau terdaftar dalam GROUP BY, dan SQL standar memerlukan setiap kolom non-aggregated yang dipilih untuk muncul dalam klausa GROUP BY"
            },
            {
              "icon": "",
              "label": "Ya — SQL secara otomatis mengambil satu nama arbitrary per department"
            },
            {
              "icon": "",
              "label": "Tidak — AVG() tidak dapat digabungkan dengan GROUP BY dalam query yang sama"
            }
          ]
        },
        {
          "question": "Anda ingin departments yang rata-rata salary melebihi 80000. Klausa mana yang memfilter pada nilai aggregated seperti AVG(salary) setelah grouping — WHERE atau HAVING?",
          "options": [
            {
              "icon": "",
              "label": "WHERE — HAVING hanya digunakan dengan query UNION"
            },
            {
              "icon": "",
              "label": "Keduanya bekerja identik dengan aggregate functions"
            },
            {
              "icon": "",
              "label": "Tidak satupun — aggregate filtering memerlukan subquery"
            },
            {
              "icon": "",
              "label": "HAVING — WHERE memfilter baris individual sebelum grouping terjadi, HAVING memfilter groups setelah aggregation"
            }
          ]
        },
        {
          "question": "Anda menulis SELECT salary * 1.1 AS new_salary FROM employees WHERE new_salary > 50000. Apakah ini berjalan?",
          "options": [
            {
              "icon": "",
              "label": "Ya — aliases yang didefinisikan dalam SELECT selalu tersedia untuk WHERE dalam query yang sama"
            },
            {
              "icon": "",
              "label": "Ya, tetapi hanya untuk alias numeric"
            },
            {
              "icon": "",
              "label": "Tidak — AS tidak diizinkan di dalam query yang difilter WHERE"
            },
            {
              "icon": "",
              "label": "Tidak — WHERE dievaluasi sebelum SELECT menetapkan alias new_salary, jadi alias belum ada pada titik itu dalam execution"
            }
          ]
        },
        {
          "question": "SELECT name FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department = e.department). Mengapa ini disebut correlated subquery?",
          "options": [
            {
              "icon": "",
              "label": "Karena menggunakan JOIN daripada klausa WHERE"
            },
            {
              "icon": "",
              "label": "Inner subquery mereferensikan e.department dari outer query, jadi harus dievaluasi ulang untuk setiap baris yang outer query pertimbangkan"
            },
            {
              "icon": "",
              "label": "Karena mengembalikan lebih dari satu kolom"
            },
            {
              "icon": "",
              "label": "Karena berjalan persis sekali sebelum outer query dimulai"
            }
          ]
        },
        {
          "question": "Subquery SELECT manager_id FROM employees mengembalikan beberapa nilai NULL bersama dengan id real. Anda menjalankan SELECT name FROM employees WHERE id NOT IN (SELECT manager_id FROM employees). Apa yang terjadi?",
          "options": [
            {
              "icon": "",
              "label": "Ia mengembalikan setiap karyawan yang bukan manajer, mengabaikan NULLs"
            },
            {
              "icon": "",
              "label": "Ia mengembalikan nol baris — NULL tunggal dalam daftar NOT IN membuat setiap perbandingan UNKNOWN, jadi tidak ada baris yang dapat memenuhi kondisi"
            },
            {
              "icon": "",
              "label": "Ia menaikkan error karena NOT IN tidak dapat digunakan dengan subqueries"
            },
            {
              "icon": "",
              "label": "Ia mengembalikan setiap karyawan, karena NULL diperlakukan sebagai wildcard"
            }
          ]
        },
        {
          "question": "SELECT name FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id). Apa yang dikembalikan ini?",
          "options": [
            {
              "icon": "",
              "label": "Setiap pelanggan yang memiliki setidaknya satu baris dalam orders — EXISTS hanya memeriksa apakah subquery mengembalikan baris apa pun, bukan nilai apa yang mereka berisi"
            },
            {
              "icon": "",
              "label": "Setiap pelanggan, karena SELECT 1 selalu mengembalikan true"
            },
            {
              "icon": "",
              "label": "Error, karena subquery memilih nomor daripada nama kolom"
            },
            {
              "icon": "",
              "label": "Hanya pelanggan dengan persis satu order"
            }
          ]
        },
        {
          "question": "Anda menulis SELECT name, (SELECT order_id FROM orders WHERE customer_id = c.id) AS last_order FROM customers c, dan pelanggan yang diberikan memiliki 3 baris dalam orders. Apa yang terjadi ketika query ini berjalan?",
          "options": [
            {
              "icon": "",
              "label": "Ia mengembalikan order_id pertama yang cocok dan secara diam-diam mengabaikan dua lainnya"
            },
            {
              "icon": "",
              "label": "Ia mengembalikan daftar yang dipisahkan koma dari ketiga order_ids"
            },
            {
              "icon": "",
              "label": "Ia mengembalikan 3 baris untuk pelanggan itu, satu per order"
            },
            {
              "icon": "",
              "label": "Ia menaikkan error pada runtime — scalar subquery dalam daftar SELECT harus mengembalikan paling banyak satu baris, dan ini mengembalikan tiga"
            }
          ]
        },
        {
          "question": "Empat baris tied untuk skor tertinggi. Menggunakan RANK() ORDER BY score DESC, keempatnya mendapat rank 1. Apa rank yang didapat baris berikutnya?",
          "options": [
            {
              "icon": "",
              "label": "5 — RANK() meninggalkan gap sama dengan jumlah baris tied sebelum melanjutkan"
            },
            {
              "icon": "",
              "label": "2 — RANK() selalu increments persis satu setelah tie apa pun"
            },
            {
              "icon": "",
              "label": "1 — setiap baris subsequent juga mendapat rank 1"
            },
            {
              "icon": "",
              "label": "4 — RANK() restart counting dari jumlah ties"
            }
          ]
        },
        {
          "question": "Empat baris tied untuk skor tertinggi. Menggunakan DENSE_RANK() ORDER BY score DESC, keempatnya mendapat rank 1. Apa rank yang didapat baris berikutnya?",
          "options": [
            {
              "icon": "",
              "label": "5 — DENSE_RANK() berperilaku persis seperti RANK()"
            },
            {
              "icon": "",
              "label": "1 — DENSE_RANK() menetapkan rank yang sama untuk setiap baris remaining"
            },
            {
              "icon": "",
              "label": "2 — DENSE_RANK() tidak pernah meninggalkan gaps, jadi nilai distinct berikutnya selalu mendapat rank consecutive berikutnya"
            },
            {
              "icon": "",
              "label": "3 — DENSE_RANK() melewati satu rank per tie group"
            }
          ]
        },
        {
          "question": "SUM(amount) OVER (PARTITION BY region ORDER BY amount) ditambahkan ke query. Apa yang PARTITION BY region lakukan di sini?",
          "options": [
            {
              "icon": "",
              "label": "Ia restart running sum secara terpisah untuk setiap region, daripada accumulating di seluruh result set"
            },
            {
              "icon": "",
              "label": "Ia memfilter hasil ke region tunggal"
            },
            {
              "icon": "",
              "label": "Ia groups dan collapses baris ke satu per region, seperti GROUP BY"
            },
            {
              "icon": "",
              "label": "Ia sorts regions alphabetically sebelum summing"
            }
          ]
        },
        {
          "question": "ROW_NUMBER() OVER (ORDER BY score DESC) diterapkan ke lima baris, dua di antaranya exactly tied dalam score. Bisakah dua baris pernah menerima nomor baris yang sama?",
          "options": [
            {
              "icon": "",
              "label": "Ya — tied rows selalu berbagi nomor baris yang sama"
            },
            {
              "icon": "",
              "label": "Hanya jika PARTITION BY juga digunakan"
            },
            {
              "icon": "",
              "label": "Itu tergantung pada apakah tie berada dalam posisi pertama atau terakhir"
            },
            {
              "icon": "",
              "label": "Tidak — ROW_NUMBER() selalu menetapkan integer yang unik, strictly increasing ke setiap baris, bahkan ketika nilai tied"
            }
          ]
        },
        {
          "question": "WITH high_earners AS (SELECT * FROM employees WHERE salary > 100000) SELECT department, COUNT(*) FROM high_earners GROUP BY department. Apa yang high_earners?",
          "options": [
            {
              "icon": "",
              "label": "Common table expression (CTE) — named, temporary result set yang rest dari query dapat reference seperti tabel"
            },
            {
              "icon": "",
              "label": "Tabel permanent yang dibuat di database"
            },
            {
              "icon": "",
              "label": "View yang persists setelah query selesai"
            },
            {
              "icon": "",
              "label": "Stored procedure yang harus called secara terpisah"
            }
          ]
        },
        {
          "question": "Kolom dideklarasikan PRIMARY KEY. Bisakah Anda insert baris di mana kolom itu NULL?",
          "options": [
            {
              "icon": "",
              "label": "Ya — PRIMARY KEY hanya memaksa uniqueness, bukan NULL-ness"
            },
            {
              "icon": "",
              "label": "Ya, tetapi hanya satu baris NULL diizinkan, sama seperti UNIQUE constraint"
            },
            {
              "icon": "",
              "label": "Tidak — kolom PRIMARY KEY secara implisit NOT NULL, jadi insert NULL ke dalamnya ditolak"
            },
            {
              "icon": "",
              "label": "Itu tergantung pada apakah kolom juga memiliki nilai default"
            }
          ]
        },
        {
          "question": "Di dalam transaksi terbuka, Anda menjalankan UPDATE tetapi belum menjalankan COMMIT. Dari koneksi kedua yang terpisah ke database, apakah update itu terlihat?",
          "options": [
            {
              "icon": "",
              "label": "Ya — semua connections melihat setiap write saat instant ia berjalan"
            },
            {
              "icon": "",
              "label": "Ya, tetapi hanya jika koneksi kedua juga membuka transaksi"
            },
            {
              "icon": "",
              "label": "Itu tergantung hanya pada tabel mana yang diupdate"
            },
            {
              "icon": "",
              "label": "Tidak — uncommitted change hanya terlihat di dalam transaksi yang membuatnya, sampai COMMIT membuatnya durable dan terlihat untuk others"
            }
          ]
        },
        {
          "question": "products.category_id memiliki FOREIGN KEY constraint mereferensikan categories.id. Anda mencoba DELETE baris dari categories yang masih memiliki products menunjuk kepadanya, tanpa ON DELETE rule yang ditentukan. Apa yang terjadi?",
          "options": [
            {
              "icon": "",
              "label": "Baris category dihapus dan matching products.category_id values secara otomatis diatur ke NULL"
            },
            {
              "icon": "",
              "label": "Baris category dihapus dan setiap product yang mereferensikannya juga dihapus"
            },
            {
              "icon": "",
              "label": "DELETE ditolak — default foreign key behavior memblokir deleting referenced row sementara dependent rows masih menunjuk kepadanya"
            },
            {
              "icon": "",
              "label": "DELETE berhasil diam-diam, meninggalkan products' category_id menunjuk ke category yang tidak ada lagi"
            }
          ]
        }
      ],
      "optionOrderVersion": "e0466e547cfd8a45"
    }
  }
}
