{"id":14453,"date":"2026-09-02T21:39:26","date_gmt":"2026-09-02T16:09:26","guid":{"rendered":"https:\/\/www.scaler.com\/blog\/?p=14453"},"modified":"2026-09-02T21:39:48","modified_gmt":"2026-09-02T16:09:48","slug":"database-skills","status":"publish","type":"post","link":"https:\/\/www.scaler.com\/blog\/database-skills\/","title":{"rendered":"Database Skills: What to Learn and How to Get Better"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">When you work with a database, the way you structure and access the data affects almost everything built on top of it. A poorly chosen schema can make common operations difficult, an unnecessary join can slow down a query, and a missing index can turn a simple lookup into an expensive operation as the data grows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That means you\u2019ll work with several connected areas when building your database skills: relational models, SQL, schema design, keys and constraints, normalisation, indexing, transactions, query optimisation, and different types of data stores. The depth you need in each area depends on the role, so the database skills expected from a backend engineer can differ from those needed for a data engineer or database administrator.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide takes you through these areas in the order you\u2019re likely to encounter them, from relational and SQL fundamentals to schema design, indexing, query performance, transactions, and modern data stores. Along the way, the focus is on applying each concept to real development problems and understanding the decisions behind how a database is designed and used.<\/p>\n\n\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Scaler Carousel<\/title>\n\n<!-- Plus Jakarta Sans Font -->\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&amp;display=swap\" rel=\"stylesheet\">\n<!-- Swiper CSS -->\n<link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n\n<style>\n.scaler-carousel {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  max-width: 900px;\n  margin: 24px auto;\n  padding: 0;\n  box-sizing: border-box;\n}\n.scaler-carousel *,\n.scaler-carousel *::before,\n.scaler-carousel *::after {\n  box-sizing: border-box;\n}\n\n\/* Header *\/\n.scaler-header {\n  text-align: center;\n  margin-bottom: 20px;\n}\n.scaler-header-title {\n  font-size: 22px;\n  font-weight: 700;\n  color: #1a1a2e;\n  margin: 0 0 6px;\n  line-height: 1.2;\n}\n.scaler-header-subtitle {\n  font-size: 14px;\n  color: #6b7280;\n  margin: 0;\n  font-weight: 500;\n}\n\n\/* Swiper *\/\n.swiper.scaler-swiper {\n  padding-bottom: 48px;\n}\n.scaler-swiper .swiper-slide {\n  height: auto;\n  display: flex;\n  align-items: stretch;\n}\n\/* Navigation arrows \u2014 styled to match the topics HorizontalScroll controls *\/\n.scaler-swiper .swiper-button-next,\n.scaler-swiper .swiper-button-prev {\n  width: 46px;\n  height: 46px;\n  border-radius: 8px;\n  background: #ffffff;\n  box-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n  top: calc(50% - 24px); \/* centre on the cards, ignoring the pagination space below *\/\n  transform: translateY(-50%);\n  margin-top: 0;\n}\n.scaler-swiper .swiper-button-prev { left: 10px; }\n.scaler-swiper .swiper-button-next { right: 10px; }\n\/* hide Swiper's default font-icon arrow and draw the topics chevron via a mask *\/\n.scaler-swiper .swiper-button-next::after,\n.scaler-swiper .swiper-button-prev::after {\n  content: \"\";\n  width: 20px;\n  height: 20px;\n  background-color: #61738e;\n  -webkit-mask: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 32 32'%3E%3Cpath d='M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z'\/%3E%3C\/svg%3E\") no-repeat center \/ contain;\n  mask: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 32 32'%3E%3Cpath d='M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z'\/%3E%3C\/svg%3E\") no-repeat center \/ contain;\n}\n.scaler-swiper .swiper-button-prev::after { transform: rotate(-90deg); }\n.scaler-swiper .swiper-button-next::after { transform: rotate(90deg); }\n.scaler-swiper .swiper-button-disabled {\n  opacity: 0.35;\n  pointer-events: none;\n}\n.scaler-swiper .swiper-pagination-bullet-active {\n  background: #255aad;\n}\n\n\/* Card *\/\n.scaler-card {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n  width: 100%;\n  background: #ffffff;\n  border: 1px solid #e5e7eb;\n  border-radius: 16px;\n  padding: 24px;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n  transition: box-shadow 0.2s ease;\n}\n.scaler-card:hover {\n  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.10);\n}\n\n\/* NSDC badge *\/\n.scaler-badge {\n  display: inline-flex;\n  align-items: center;\n  align-self: flex-start;\n  background: #f3f4f6;\n  color: #111827;\n  font-size: 12px;\n  font-weight: 600;\n  padding: 4px 10px;\n  border-radius: 20px;\n  white-space: nowrap;\n  letter-spacing: 0.1px;\n}\n\n\/* Top: icon + title + description *\/\n.scaler-card-top {\n  display: flex;\n  align-items: flex-start;\n  gap: 12px;\n  min-height: 100px;\n}\n.scaler-icon-wrap {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 64px;\n  height: 64px;\n  border-radius: 12px;\n  background: #f3f4f6;\n  color: #374151;\n  flex-shrink: 0;\n}\n.scaler-icon-wrap svg {\n  width: 26px;\n  height: 26px;\n}\n.scaler-card-top-content {\n  flex: 1;\n  min-width: 0;\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n}\n.scaler-title {\n  font-size: 16px;\n  font-weight: 700;\n  color: #111827;\n  margin: 0;\n  line-height: 1.35;\n}\n.scaler-desc {\n  font-size: 13px;\n  color: #6b7280;\n  margin: 0;\n  line-height: 1.45;\n}\n\n\/* Stats row *\/\n.scaler-stats {\n  display: flex;\n  border-top: 1px solid #e5e7eb;\n  border-bottom: 1px solid #e5e7eb;\n  padding: 12px 0;\n}\n.scaler-stat {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 2px;\n  flex: 1;\n  min-width: 0;\n  text-align: center;\n}\n.scaler-stat:not(:last-child) {\n  border-right: 1px solid #d1d5db;\n}\n.scaler-stat-value {\n  font-size: 14px;\n  font-weight: 700;\n  color: #111827;\n  white-space: nowrap;\n}\n.scaler-stat-label {\n  font-size: 12px;\n  color: #9ca3af;\n}\n\n\/* Company logos *\/\n.scaler-logos {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  flex-wrap: nowrap;\n}\n.scaler-company-logo {\n  height: 20px !important;\n  width: auto !important;\n  max-width: 70px;\n  object-fit: contain;\n  display: inline-block;\n}\n.scaler-logo-more {\n  font-size: 12px;\n  color: #9ca3af;\n  white-space: nowrap;\n}\n.scaler-logo-strip {\n  display: block;\n  width: 100% !important;\n  max-width: 100%;\n  min-width: 0;\n  height: auto !important;\n  object-fit: contain;\n}\n\n\/* CTA *\/\n.scaler-card-btns {\n  margin-top: auto;\n}\n.scaler-card-btns button {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 8px;\n  width: 100%;\n  padding: 12px 16px;\n  border: none;\n  border-radius: 10px;\n  background-color: #255aad;\n  color: #ffffff;\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 600;\n  cursor: pointer;\n  text-decoration: none;\n  transition: opacity 0.15s ease;\n}\n.scaler-card-btns button:hover,\n.scaler-card-btns button:focus {\n  opacity: 0.88;\n  color: #ffffff;\n}\n.scaler-card-btns button svg {\n  flex-shrink: 0;\n}\n\n@media (max-width: 1000px) {\n  .scaler-carousel { max-width: 96vw; }\n}\n<\/style>\n\n\n<div class=\"scaler-carousel\">\n  <div class=\"scaler-header\">\n    <h2 class=\"scaler-header-title\"><span class=\"ez-toc-section\" id=\"transform-your-career\"><\/span>Transform Your Career<span class=\"ez-toc-section-end\"><\/span><\/h2>\n    <p class=\"scaler-header-subtitle\">Choose from our industry-leading programs designed for career success<\/p>\n  <\/div>\n\n  <div class=\"swiper scaler-swiper\">\n    <div class=\"swiper-wrapper\">\n\n      <!-- CARD 1 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"16 18 22 12 16 6\"\/><polyline points=\"8 6 2 12 8 18\"\/><\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">Modern Software and AI Engineering Program<\/h3>\n              <p class=\"scaler-desc\">Master full-stack development with AI integration<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/academy\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 2 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\"\/><path d=\"M3 5v14c0 1.66 4.03 3 9 3s9-1.34 9-3V5\"\/><path d=\"M3 12c0 1.66 4.03 3 9 3s9-1.34 9-3\"\/><\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">Modern Data Science and ML with specialisation in AI<\/h3>\n              <p class=\"scaler-desc\">Advanced data science techniques with AI specialization<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/data-science-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 3 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2L13.5 8.5L20 10L13.5 11.5L12 18L10.5 11.5L4 10L10.5 8.5L12 2Z\"\/><\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">Advanced AIML with Specialisation in Agentic AI<\/h3>\n              <p class=\"scaler-desc\">Deep dive into AIML with focus on Agentic systems<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/ai-machine-learning-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 4 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                <path d=\"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z\" \/>\n                <path d=\"M9.2 15.2a3 3 0 1 0 4.24-4.24\" \/>\n              <\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">DevOps, Cloud &#038; AI Platform Engineering<\/h3>\n              <p class=\"scaler-desc\">Build and manage AI-powered cloud infrastructure<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/devops-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 5 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                <line x1=\"3\" y1=\"22\" x2=\"21\" y2=\"22\" \/>\n                <line x1=\"6\" y1=\"18\" x2=\"6\" y2=\"11\" \/>\n                <line x1=\"10\" y1=\"18\" x2=\"10\" y2=\"11\" \/>\n                <line x1=\"14\" y1=\"18\" x2=\"14\" y2=\"11\" \/>\n                <line x1=\"18\" y1=\"18\" x2=\"18\" y2=\"11\" \/>\n                <polygon points=\"12 2 20 7 4 7\" \/>\n              <\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">AI Engineering Advanced Certification by IIT-Roorkee<\/h3>\n              <p class=\"scaler-desc\">Premier AI engineering certification from IIT-Roorkee<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">3 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-logo-strip\" src=\"https:\/\/scaler-blog-prod-wp-content.s3.ap-south-1.amazonaws.com\/wp-content\/uploads\/2026\/07\/08135139\/iitr-icons-strip.png\" alt=\"Program highlights\" loading=\"lazy\">\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/iit-roorkee-advanced-ai-engineering-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- Continue for remaining cards (6\u20138) using same pattern -->\n\n    <\/div>\n    <div class=\"swiper-button-next\"><\/div>\n    <div class=\"swiper-button-prev\"><\/div>\n    <div class=\"swiper-pagination\"><\/div>\n  <\/div>\n<\/div>\n\n<!-- Swiper.js -->\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  const pathParts = window.location.pathname.split(\"\/\").filter(Boolean);\n  const slug = pathParts[pathParts.length - 1] || \"\";\n  const readableSlug = encodeURIComponent(slug);\n  const buttons = document.querySelectorAll(\".scaler-card-btns button\");\n\n  buttons.forEach((btn) => {\n    const baseURL = btn.getAttribute(\"onclick\").match(\/'(.*?)'\/)[1];\n    if (!baseURL.includes(\"utm_source=\")) {\n      const separator = baseURL.includes(\"?\") ? \"&\" : \"?\";\n      const updatedURL = `${baseURL}${separator}utm_source=blog&utm_medium=program_carousel&utm_content=${readableSlug}`;\n      btn.setAttribute(\"onclick\", `window.open('${updatedURL}', '_blank')`);\n    }\n  });\n\n  new Swiper(\".scaler-swiper\", {\n    slidesPerView: 1,\n    spaceBetween: 28,\n    grabCursor: true,\n    navigation: { nextEl: \".swiper-button-next\", prevEl: \".swiper-button-prev\" },\n    pagination: { el: \".swiper-pagination\", dynamicBullets: true, clickable: true },\n    breakpoints: { 1000: { slidesPerView: 2 } },\n    keyboard: { enabled: true },\n  });\n});\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"the-database-skills-checklist-all-six-tiers\"><\/span><strong>The Database Skills Checklist: All Six Tiers<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Database skills cover the knowledge and practical ability needed to work with data in applications. They include relational concepts, SQL querying, schema design, indexing and performance, transactions and database operations, and newer approaches such as NoSQL and vector storage. You can explain these concepts and apply them to practical problems.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Skill<\/strong><\/td><td><strong>Why employers screen for it<\/strong><\/td><td><strong>How it&#8217;s tested in interviews<\/strong><\/td><td><strong>How to evidence it<\/strong><\/td><\/tr><tr><td><strong>Foundations<\/strong><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>Relational model<\/td><td>Tests whether you understand how application data is structured.<\/td><td>Model relationships between entities.<\/td><td>Create an ER diagram and schema.<\/td><\/tr><tr><td>Keys and constraints<\/td><td>Shows you can protect data integrity.<\/td><td>Choose appropriate keys and constraints.<\/td><td>Use them in a working schema.<\/td><\/tr><tr><td>Normalisation<\/td><td>Tests whether you can avoid unnecessary duplication.<\/td><td>Normalise a flawed schema.<\/td><td>Show a 1NF\u20133NF example.<\/td><\/tr><tr><td>ACID<\/td><td>Tests your understanding of reliable transactions.<\/td><td>Explain what happens when a transaction fails.<\/td><td>Demonstrate a transactional workflow.<\/td><\/tr><tr><td><strong>Querying<\/strong><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>Joins<\/td><td>Most real queries combine data from multiple tables.<\/td><td>Choose the appropriate join for a scenario.<\/td><td>Write multi-table queries<\/td><\/tr><tr><td>Aggregation<\/td><td>Tests whether you can turn rows into useful results.<\/td><td>Solve a grouped-data problem.<\/td><td>Use GROUP BY and HAVING.<\/td><\/tr><tr><td>Subqueries and CTEs<\/td><td>Tests whether you can structure multi-step queries.<\/td><td>Break a problem into intermediate results.<\/td><td>Include readable CTE-based queries.<\/td><\/tr><tr><td>Window functions<\/td><td>Tests more advanced query fluency.<\/td><td>Solve ranking or running-total problems.<\/td><td>Use window functions in a project.<\/td><\/tr><tr><td>NULL semantics<\/td><td>Incorrect handling can produce silent errors.<\/td><td>Predict results involving NULL.<\/td><td>Show explicit NULL handling.<\/td><\/tr><tr><td><strong>Design<\/strong><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>Schema modelling<\/td><td>Poor schemas create problems later.<\/td><td>Design tables for an application.<\/td><td>Publish the ERD and schema.<\/td><\/tr><tr><td>Indexing strategy<\/td><td>Indexes affect both reads and writes.<\/td><td>Choose an index for a query.<\/td><td>Document index decisions.<\/td><\/tr><tr><td>Denormalisation<\/td><td>Some workloads justify duplicated data.<\/td><td>Explain when you&#8217;d denormalise.<\/td><td>Document the trade-off.<\/td><\/tr><tr><td>Data types<\/td><td>Incorrect types can cause storage and correctness problems.<\/td><td>Choose types for common fields.<\/td><td>Explain non-obvious type choices.<\/td><\/tr><tr><td><strong>Performance<\/strong><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>Reading a query plan<\/td><td>Slow queries require more than reading the SQL.<\/td><td>Identify the expensive operation in an EXPLAIN plan.<\/td><td>Include an annotated execution plan.<\/td><\/tr><tr><td>Optimisation and sargability<\/td><td>Query structure affects whether indexes can be used.<\/td><td>Rewrite a non-sargable query.<\/td><td>Show before-and-after timings.<\/td><\/tr><tr><td>Index selection<\/td><td>More indexes are not always better.<\/td><td>Choose indexes for a workload.<\/td><td>Benchmark the query with and without them.<\/td><\/tr><tr><td>N+1<\/td><td>ORM queries can multiply unexpectedly.<\/td><td>Identify the pattern and propose a fix.<\/td><td>Show the query count before and after.<\/td><\/tr><tr><td><strong>Operations<\/strong><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>Transactions and isolation<\/td><td>Concurrent operations can create inconsistent results.<\/td><td>Explain a race condition and isolation choice.<\/td><td>Reproduce and document a concurrency case.<\/td><\/tr><tr><td>Backups and PITR<\/td><td>Recovery is part of operating a database.<\/td><td>Explain recovery after accidental deletion.<\/td><td>Document a recovery procedure.<\/td><\/tr><tr><td>Replication<\/td><td>Production systems often need availability and read scaling.<\/td><td>Explain replicas and consistency trade-offs.<\/td><td>Demonstrate or document a replicated setup.<\/td><\/tr><tr><td>Connection pooling<\/td><td>Poor connection management can exhaust resources.<\/td><td>Diagnose connection exhaustion.<\/td><td>Show pool configuration and behaviour.<\/td><\/tr><tr><td>Migrations<\/td><td>Schema changes must be introduced without breaking applications.<\/td><td>Design a safe schema migration.<\/td><td>Include versioned migrations.<\/td><\/tr><tr><td><strong>Modern<\/strong><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>When NoSQL is right<\/td><td>Some workloads fit non-relational stores better.<\/td><td>Choose between relational and NoSQL approaches.<\/td><td>Document the workload and decision.<\/td><\/tr><tr><td>Stores by access pattern<\/td><td>Database choice should follow application access patterns.<\/td><td>Select a store for a given workload.<\/td><td>Map access patterns to the chosen store.<\/td><\/tr><tr><td>ORMs and their failure modes<\/td><td>Abstraction can hide inefficient database behaviour.<\/td><td>Diagnose SQL generated by an ORM.<\/td><td>Show the problematic query and fix.<\/td><\/tr><tr><td>Vector storage<\/td><td>Similarity search uses a different retrieval model.<\/td><td>Explain when vector search fits the application.<\/td><td>Build a small semantic-search example.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You can use this table as a self-audit. Find the highest tier where you can honestly tick everything below it. That is your current level; the tier above it is the next gap to close.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Read More:<\/strong> <a href=\"https:\/\/www.scaler.com\/blog\/what-are-technical-skills-examples-with-future-trends\/\"><strong>What Are Technical Skills?<\/strong><\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-1-foundations\"><\/span><strong>Tier 1: Foundations<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Understanding the Relational Model<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When you work with a relational database, you describe the data you need through SQL while the database handles how that data is stored and retrieved. This separation matters because the database can change its indexes or execution plan without requiring you to rewrite the query in your application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The relational model was introduced by Edgar F. Codd in his 1970 paper, <a href=\"https:\/\/www.seas.upenn.edu\/~zives\/03f\/cis550\/codd.pdf\" target=\"_blank\" rel=\"noopener\">A Relational Model of Data for Large Shared Data Banks<\/a>. Understanding the model gives you a useful base for working with tables, relationships, keys, and queries before moving into schema design and performance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also check out the <a href=\"https:\/\/www.scaler.com\/blog\/dbms-syllabus\/\">DBMS Syllabus<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Keys and Constraints<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Application validation is relevant, but it only protects the paths through your application that actually perform the check. A constraint in the database applies regardless of whether the data comes from the API, an admin script, a reporting job, or a migration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consider an orders table with a customer_id column but no foreign key. The application may validate that the customer exists when an order is created. Three years later, someone runs a data migration or reporting import that bypasses that validation and creates orphaned orders. The reporting query joins orders to customers and quietly loses those rows. The database could have rejected the invalid reference at the point of insertion.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keys also involve design choices. A natural key uses an existing business value, such as an email address or government-issued identifier. A surrogate key uses an identifier created specifically to identify the record. UUIDs can help avoid some coordination issues in distributed systems, while auto-incrementing integers are compact and straightforward.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Normalisation to 3NF and Knowing When to Stop<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Take a college course-enrolment table containing:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">student_id | student_name | course_id | course_name | instructor<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At first, the table looks convenient because everything needed for an enrolment is in one place. But student and course information gets repeated across multiple rows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1NF:<\/strong> keep each field atomic and each row represents one enrolment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2NF:<\/strong> remove attributes that depend on only part of a composite key. student_name belongs with the student, while course_name and instructor belong with the course rather than being repeated for every enrolment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3NF:<\/strong> remove non-key dependencies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The resulting model separates Students, Courses, and Enrolments, with keys connecting them. The benefit isn&#8217;t that the schema now satisfies an exam definition of 3NF; it is that changing a student&#8217;s name or a course&#8217;s details happens in one place instead of creating conflicting copies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">BCNF goes further by tightening the dependency rules, but it is more likely to appear as an exam question than as the deciding point in a typical application interview.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The interview question to prepare for is: \u201cNormalise this, and now tell me when you wouldn&#8217;t.\u201d A read-heavy workload may justify controlled denormalisation when avoiding joins is worth the additional consistency and update cost. Knowing the rule is baseline; knowing when to break it is the stronger answer.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>ACID, and What Each Letter Buys You<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Atomicity:<\/strong> the transaction completes as a unit or doesn&#8217;t take effect.<\/li>\n\n\n\n<li><strong>Consistency:<\/strong> committed transactions preserve the database&#8217;s defined integrity rules.<\/li>\n\n\n\n<li><strong>Isolation:<\/strong> concurrent transactions don&#8217;t interfere in ways the chosen isolation level permits.<\/li>\n\n\n\n<li><strong>Durability:<\/strong> once committed, the result survives a failure.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Isolation isn&#8217;t simply \u201con\u201d or \u201coff\u201d; databases provide different isolation levels with different guarantees and concurrency costs. We&#8217;ll return to that trade-off when we cover transactions and isolation later.<\/p>\n\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&#038;display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n\n    <style>\n      :root {\n        \/* topics design tokens (variables.scss) *\/\n        --scaler-primary: #005bb3;          \/* primary-color-80 *\/\n        --scaler-primary-30: #8acaff;       \/* primary-color-30 *\/\n        --scaler-brand-blue: #255aad;\n        --scaler-live: #ee001d;             \/* accent-v5-60 *\/\n        --scaler-live-bg: #ffe6e9;          \/* accent-v5-10 *\/\n        --scaler-card-bg: #ffffff;          \/* neutral-scale-0 *\/\n        --scaler-surface: #f4f6f9;          \/* neutral-scale-2 *\/\n        --scaler-text-primary: #1a2c47;     \/* neutral-scale-12 *\/\n        --scaler-text-secondary: #61738e;   \/* neutral-scale-9 *\/\n        --scaler-border: #d6dee5;           \/* neutral-scale-4 *\/\n        --scaler-radius: 16px;\n        --scaler-radius-sm: 8px;\n        --scaler-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n      }\n\n      .scaler-events-carousel * { box-sizing: border-box; }\n\n      .scaler-events-carousel {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        padding: 24px;\n        position: relative;\n        width: 100%;\n      }\n      .scaler-events-carousel__inner {\n        max-width: 1000px;\n        margin: 0 auto;\n        position: relative;\n        width: 100%;\n      }\n\n      \/* Header \u2014 calendar icon + \"Live Masterclasses\" *\/\n      .scaler-events-header {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin-bottom: 8px;\n        padding: 8px 0;\n      }\n      .scaler-events-header__icon { display: inline-flex; color: var(--scaler-text-primary); }\n      .scaler-events-header__icon svg { width: 24px; height: 24px; }\n      .scaler-events-header__title {\n        font-size: 18px;\n        font-weight: 700;\n        color: var(--scaler-text-primary);\n        line-height: 1.3;\n        margin: 0;\n      }\n\n      \/* Swiper wrap (holds side arrows) *\/\n      .scaler-events-swiper-wrap { position: relative; }\n      .scaler-events-carousel .swiper { width: 100%; padding: 4px; }\n      .scaler-event-swiper .swiper-slide {\n        width: 296px;          \/* topics card_container width *\/\n        height: auto;\n        display: flex;\n      }\n\n      \/* Event Card \u2014 matches topics EventCard *\/\n      .scaler-event-card {\n        background: var(--scaler-card-bg);\n        border: 1px solid var(--scaler-border);\n        border-radius: var(--scaler-radius);\n        padding: 16px;\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        width: 100%;\n        cursor: pointer;\n      }\n\n      \/* Header row: headshot + title\/name *\/\n      .scaler-event-card__header { display: flex; align-items: flex-start; }\n      .scaler-event-card__image-wrapper {\n        position: relative;\n        width: 88px;\n        height: 88px;\n        min-width: 88px;\n        border-radius: var(--scaler-radius-sm);\n        overflow: hidden;\n        background: var(--scaler-primary-30);\n      }\n      .scaler-event-card__image {\n        position: absolute;\n        top: 0; left: 0;\n        width: 100%; height: 100%;\n        object-fit: cover;\n      }\n      \/* attendee-count footer (default) *\/\n      .scaler-event-card__img-footer {\n        position: absolute;\n        left: 0; right: 0; bottom: 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 4px;\n        padding: 1px 8px;\n        background: var(--scaler-surface);\n        color: var(--scaler-text-primary);\n        font-size: 13px;\n        line-height: 22px;\n      }\n      .scaler-event-card__img-footer svg { width: 14px; height: 14px; }\n      \/* live chip (shown when status === current) *\/\n      .scaler-event-card__live-badge {\n        position: absolute;\n        left: 0; right: 0; bottom: 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 5px;\n        padding: 1px 8px;\n        background: var(--scaler-live-bg);\n        color: var(--scaler-live);\n        font-size: 12px;\n        line-height: 22px;\n        text-transform: uppercase;\n        letter-spacing: 0.18em;\n      }\n      .scaler-event-card__live-badge::before {\n        content: \"\";\n        width: 6px; height: 6px;\n        background: var(--scaler-live);\n        border-radius: 50%;\n      }\n      .scaler-event-card__text { margin-left: 16px; min-width: 0; }\n      .scaler-event-card__title {\n        font-size: 20px;\n        font-weight: 600;\n        color: var(--scaler-text-primary);\n        margin: 0;\n        line-height: 1.4;\n        display: -webkit-box;\n        -webkit-line-clamp: 2;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n      }\n      .scaler-event-card__speaker {\n        margin-top: 8px;\n        font-size: 14px;\n        line-height: 1.4;\n        color: var(--scaler-text-primary);\n      }\n\n      \/* Takeaways *\/\n      .scaler-event-card__takeaways {\n        margin-top: 12px;\n        min-height: 50px;\n        max-height: 50px;\n        overflow: hidden;\n      }\n      .scaler-event-card__takeaway-item {\n        display: flex;\n        align-items: flex-start;\n        gap: 6px;\n      }\n      .scaler-event-card__dot {\n        width: 4px; height: 4px;\n        min-width: 4px;\n        border-radius: 50%;\n        background: var(--scaler-text-secondary);\n        margin-top: 11px;\n      }\n      .scaler-event-card__takeaway-text {\n        flex: 1;\n        min-width: 0;\n        font-size: 14px;\n        line-height: 24px;\n        color: var(--scaler-text-primary);\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .scaler-event-card__knowmore,\n      .scaler-event-card__knowmore:link,\n      .scaler-event-card__knowmore:visited {\n        flex-shrink: 0;\n        font-size: 14px;\n        line-height: 24px;\n        color: var(--scaler-primary) !important;\n        text-decoration: none;\n        white-space: nowrap;\n      }\n      .scaler-event-card__knowmore:hover { text-decoration: underline; }\n\n      \/* Date + duration *\/\n      .scaler-event-card__meta {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        margin-top: 20px;\n        font-size: 13px;\n        line-height: 24px;\n        color: var(--scaler-text-primary);\n      }\n      .scaler-event-card__duration {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n      }\n      .scaler-event-card__duration svg { width: 15px; height: 15px; }\n\n      .scaler-event-card__spacer { flex-grow: 1; min-height: 4px; }\n\n      \/* CTA \u2014 outlined \"Register with 1-Click\" *\/\n      .scaler-event-card__cta,\n      .scaler-event-card__cta:link,\n      .scaler-event-card__cta:visited {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 100%;\n        margin-top: 16px;\n        padding: 8px;\n        background: transparent;\n        color: var(--scaler-primary) !important;\n        font-family: inherit;\n        font-size: 14px;\n        font-weight: 600;\n        line-height: 24px;\n        text-decoration: none;\n        border: 1px solid var(--scaler-primary);\n        border-radius: var(--scaler-radius-sm);\n        cursor: pointer;\n        transition: background 0.2s ease, color 0.2s ease;\n      }\n      .scaler-event-card__cta:hover,\n      .scaler-event-card__cta:focus {\n        background: var(--scaler-primary);\n        color: #fff !important;\n      }\n\n      \/* Side navigation arrows *\/\n      .scaler-events-nav__btn {\n        position: absolute !important;\n        top: 50% !important;\n        transform: translateY(-50%) !important;\n        z-index: 2;\n        width: 46px !important;\n        height: 46px !important;\n        min-width: 46px;\n        display: flex !important;\n        align-items: center;\n        justify-content: center;\n        padding: 0 !important;\n        background: var(--scaler-card-bg) !important;\n        border: none !important;\n        border-radius: var(--scaler-radius-sm) !important;\n        box-shadow: var(--scaler-shadow) !important;\n        color: var(--scaler-text-secondary) !important;\n        cursor: pointer;\n        transition: opacity 0.2s ease, visibility 0.2s ease;\n      }\n      .scaler-nav-prev { left: 8px !important; }\n      .scaler-nav-next { right: 8px !important; }\n      .scaler-events-nav__btn svg {\n        width: 20px !important;\n        height: 20px !important;\n        fill: var(--scaler-text-secondary) !important;\n      }\n      .scaler-events-nav__btn.swiper-button-disabled {\n        opacity: 0;\n        visibility: hidden;\n        pointer-events: none;\n      }\n\n      \/* View All Events *\/\n      .scaler-events-viewall,\n      .scaler-events-viewall:link,\n      .scaler-events-viewall:visited {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 6px;\n        margin-top: 12px;\n        font-size: 14px;\n        font-weight: 600;\n        color: var(--scaler-brand-blue) !important;\n        text-decoration: none;\n      }\n      .scaler-events-viewall:hover { text-decoration: underline; }\n      .scaler-events-viewall svg { width: 16px; height: 16px; fill: var(--scaler-brand-blue); }\n\n      \/* hide swiper defaults *\/\n      .scaler-events-pagination { display: none; }\n      .scaler-events-carousel .swiper-button-prev,\n      .scaler-events-carousel .swiper-button-next { display: none; }\n\n      \/* Skeleton & Empty States *\/\n      .scaler-event-card--skeleton { pointer-events: none; }\n      .scaler-event-card--skeleton .scaler-event-card__image-wrapper,\n      .scaler-event-card--skeleton .scaler-event-card__title,\n      .scaler-event-card--skeleton .scaler-event-card__speaker,\n      .scaler-event-card--skeleton .scaler-event-card__takeaways,\n      .scaler-event-card--skeleton .scaler-event-card__meta,\n      .scaler-event-card--skeleton .scaler-event-card__cta {\n        background: linear-gradient(90deg, var(--scaler-border) 25%, var(--scaler-surface) 50%, var(--scaler-border) 75%);\n        background-size: 200% 100%;\n        animation: shimmer 1.5s infinite;\n        color: transparent !important;\n        border-color: transparent !important;\n        border-radius: 4px;\n      }\n      .scaler-event-card--skeleton .scaler-event-card__title { min-height: 44px; }\n      .scaler-event-card--skeleton .scaler-event-card__speaker { min-height: 16px; }\n      .scaler-event-card--skeleton .scaler-event-card__meta { min-height: 24px; }\n      .scaler-event-card--skeleton .scaler-event-card__cta { min-height: 40px; }\n      .scaler-event-card--skeleton .scaler-event-card__image,\n      .scaler-event-card--skeleton .scaler-event-card__img-footer,\n      .scaler-event-card--skeleton .scaler-event-card__live-badge { display: none; }\n\n      @keyframes shimmer {\n        0% { background-position: 200% 0; }\n        100% { background-position: -200% 0; }\n      }\n\n      .scaler-events-empty {\n        text-align: center;\n        padding: 40px 20px;\n        color: var(--scaler-text-secondary);\n        font-size: 15px;\n      }\n\n      @media (max-width: 768px) {\n        .scaler-events-carousel { padding: 16px; }\n        .scaler-event-swiper .swiper-slide { width: calc(100vw - 52px); }\n        .scaler-events-nav__btn { display: none; }\n      }\n    <\/style>\n\n\n\n    <div class=\"scaler-events-carousel js-scaler-carousel\">\n\n      <template class=\"js-event-card-template\">\n        <div class=\"swiper-slide\">\n          <article class=\"scaler-event-card\">\n            <div class=\"scaler-event-card__header\">\n              <div class=\"scaler-event-card__image-wrapper\">\n                <img decoding=\"async\" src=\"\" alt=\"\" class=\"scaler-event-card__image\" loading=\"lazy\">\n                <div class=\"scaler-event-card__img-footer\">\n                  <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M11.199 7.957c-3.086 0-5.588 2.502-5.588 5.588s2.502 5.588 5.588 5.588c3.086 0 5.588-2.502 5.588-5.588s-2.502-5.588-5.588-5.588zM3.611 13.545c0-4.191 3.397-7.588 7.588-7.588s7.588 3.397 7.588 7.588c0 4.191-3.397 7.588-7.588 7.588s-7.588-3.397-7.588-7.588z\"\/><path d=\"M21.090 6.369h0.003c1.989 0 3.897 0.79 5.303 2.197s2.197 3.314 2.197 5.303-0.79 3.897-2.197 5.303c-1.406 1.407-3.314 2.197-5.303 2.197-0.552 0-1-0.448-1-1s0.448-1 1-1c1.459 0 2.858-0.579 3.889-1.611s1.611-2.43 1.611-3.889c0-1.459-0.58-2.858-1.611-3.889s-2.429-1.611-3.888-1.611c-0.507 0.002-1.013 0.070-1.502 0.203-0.533 0.145-1.082-0.17-1.227-0.703s0.17-1.082 0.703-1.227c0.659-0.179 1.339-0.27 2.021-0.272z\"\/><path d=\"M10.906 21.364c-1.605 0-3.186 0.386-4.61 1.126s-2.649 1.811-3.572 3.124c-0.318 0.452-0.941 0.561-1.393 0.243s-0.561-0.941-0.243-1.393c1.107-1.576 2.577-2.862 4.286-3.749s3.606-1.351 5.532-1.351 3.823 0.463 5.532 1.351c1.709 0.888 3.179 2.174 4.286 3.749 0.318 0.452 0.209 1.076-0.243 1.393s-1.076 0.209-1.393-0.243c-0.923-1.313-2.148-2.385-3.572-3.124s-3.005-1.126-4.61-1.126z\"\/><\/svg>\n                  <span class=\"js-event-count\"><\/span>\n                <\/div>\n                <div class=\"scaler-event-card__live-badge\" style=\"display: none;\">Live<\/div>\n              <\/div>\n              <div class=\"scaler-event-card__text\">\n                <h3 class=\"scaler-event-card__title\"><\/h3>\n                <div class=\"scaler-event-card__speaker js-event-speaker\"><\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"scaler-event-card__takeaways js-event-takeaways\"><\/div>\n\n            <div class=\"scaler-event-card__spacer\"><\/div>\n\n            <div class=\"scaler-event-card__meta\">\n              <span class=\"js-event-date\"><\/span>\n              <span class=\"scaler-event-card__duration\">\n                <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M16 6.333c6.443 0 11.667 5.223 11.667 11.667s-5.223 11.667-11.667 11.667c-6.443 0-11.667-5.223-11.667-11.667v0c0.008-6.44 5.226-11.659 11.666-11.667h0.001zM16 28.333c5.707 0 10.333-4.626 10.333-10.333s-4.626-10.333-10.333-10.333c-5.707 0-10.333 4.626-10.333 10.333v0c0.007 5.704 4.629 10.326 10.333 10.333h0.001z\"\/><path d=\"M16 18.667c-0 0-0.001 0-0.001 0-0.184 0-0.35-0.074-0.471-0.195v0c-0.121-0.121-0.195-0.287-0.195-0.471s0.075-0.351 0.195-0.471l4.951-4.952c0.121-0.121 0.287-0.195 0.471-0.195s0.351 0.075 0.471 0.195v0c0.121 0.121 0.195 0.287 0.195 0.471s-0.075 0.351-0.195 0.471l-4.949 4.951c-0.121 0.121-0.288 0.196-0.472 0.196v0z\"\/><path d=\"M19 3.667h-6c-0.368 0-0.667-0.298-0.667-0.667v0c0-0.368 0.298-0.667 0.667-0.667v0h6c0.368 0 0.667 0.298 0.667 0.667v0c0 0.368-0.298 0.667-0.667 0.667v0z\"\/><\/svg>\n                <span class=\"js-event-duration\"><\/span>\n              <\/span>\n            <\/div>\n\n            <a href=\"#\" class=\"scaler-event-card__cta js-event-cta\">Register with 1-Click<\/a>\n          <\/article>\n        <\/div>\n      <\/template>\n\n      <div class=\"scaler-events-carousel__inner\">\n        <header class=\"scaler-events-header\">\n          <span class=\"scaler-events-header__icon\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 33 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M6.406 6.8c-0.11 0-0.2 0.090-0.2 0.2v20c0 0.11 0.090 0.2 0.2 0.2h20c0.11 0 0.2-0.090 0.2-0.2v-20c0-0.11-0.090-0.2-0.2-0.2h-20zM4.606 7c0-0.994 0.806-1.8 1.8-1.8h20c0.994 0 1.8 0.806 1.8 1.8v20c0 0.994-0.806 1.8-1.8 1.8h-20c-0.994 0-1.8-0.806-1.8-1.8v-20z\"\/><path d=\"M22.406 3.2c0.442 0 0.8 0.358 0.8 0.8v4c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-4c0-0.442 0.358-0.8 0.8-0.8z\"\/><path d=\"M10.406 3.2c0.442 0 0.8 0.358 0.8 0.8v4c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-4c0-0.442 0.358-0.8 0.8-0.8z\"\/><path d=\"M4.606 12c0-0.442 0.358-0.8 0.8-0.8h22c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-22c-0.442 0-0.8-0.358-0.8-0.8z\"\/><path d=\"M21.488 16.451c0.303 0.322 0.288 0.828-0.034 1.131l-5.838 5.5c-0.309 0.291-0.791 0.29-1.099-0.002l-3.162-3c-0.321-0.304-0.334-0.81-0.030-1.131s0.81-0.334 1.131-0.030l2.614 2.48 5.287-4.981c0.322-0.303 0.828-0.288 1.131 0.034z\"\/><\/svg>\n          <\/span>\n          <h2 class=\"scaler-events-header__title\"><span class=\"ez-toc-section\" id=\"live-masterclasses\"><\/span>Live Masterclasses<span class=\"ez-toc-section-end\"><\/span><\/h2>\n        <\/header>\n\n        <div class=\"scaler-events-swiper-wrap\">\n          <div class=\"swiper scaler-event-swiper\">\n            <div class=\"swiper-wrapper scaler-events-wrapper\"><\/div>\n            <div class=\"swiper-pagination scaler-events-pagination\"><\/div>\n          <\/div>\n\n          <button class=\"scaler-events-nav__btn scaler-nav-prev\" aria-label=\"Previous slide\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(-90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n          <button class=\"scaler-events-nav__btn scaler-nav-next\" aria-label=\"Next slide\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n        <\/div>\n\n        <a class=\"scaler-events-viewall\" href=\"https:\/\/www.scaler.com\/events\/\">\n          <span>View All Events<\/span>\n          <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n        <\/a>\n      <\/div>\n    <\/div>\n\n    <script>\n    document.addEventListener(\"DOMContentLoaded\", () => {\n\n      const monthNames = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];\n\n      function formatTime(st) {\n        const t = new Date(st);\n        const date = t.getDate();\n        const month = monthNames[t.getMonth()];\n        const year = t.getFullYear();\n        const h = t.getHours();\n        const m = String(t.getMinutes()).padStart(2, \"0\");\n        let time;\n        if (h === 0) time = `12:${m} AM`;\n        else if (h === 12) time = `12:${m} PM`;\n        else if (h > 12) time = `${h - 12}:${m} PM`;\n        else time = `${h}:${m} AM`;\n        return `${date} ${month} ${year} | ${time}`;\n      }\n\n      const carouselInstances = document.querySelectorAll('.js-scaler-carousel');\n\n      carouselInstances.forEach(container => {\n\n          if(container.dataset.initialized === \"true\") return;\n          container.dataset.initialized = \"true\";\n\n          const swiperElement = container.querySelector(\".scaler-event-swiper\");\n          const swiperWrapper = container.querySelector(\".scaler-events-wrapper\");\n          const template = container.querySelector(\".js-event-card-template\");\n          const nextBtn = container.querySelector(\".scaler-nav-next\");\n          const prevBtn = container.querySelector(\".scaler-nav-prev\");\n          const paginationEl = container.querySelector(\".scaler-events-pagination\");\n\n          if (!swiperWrapper || !template) {\n             console.error(\"Scaler Carousel: Missing required elements inside container\");\n             return;\n          }\n\n          const swiper = new Swiper(swiperElement, {\n            slidesPerView: \"auto\",\n            spaceBetween: 16,\n            grabCursor: true,\n            observer: true,\n            observeParents: true,\n            pagination: {\n                el: paginationEl,\n                clickable: true,\n                dynamicBullets: true\n            },\n            navigation: {\n                nextEl: nextBtn,\n                prevEl: prevBtn\n            },\n          });\n\n          function showSkeletons(count = 4) {\n            swiperWrapper.innerHTML = \"\";\n            for (let i = 0; i < count; i++) {\n              const clone = template.content.cloneNode(true);\n              const card = clone.querySelector(\".scaler-event-card\");\n              card.classList.add(\"scaler-event-card--skeleton\");\n              swiperWrapper.appendChild(clone);\n            }\n            swiper.update();\n          }\n\n          function renderEvents(events) {\n            swiperWrapper.innerHTML = \"\";\n\n            if (events.length === 0) {\n              swiperWrapper.innerHTML = `<div class=\"scaler-events-empty\">No upcoming masterclasses found.<\/div>`;\n              return;\n            }\n\n            const pathParts = location.pathname.split(\"\/\").filter(Boolean);\n            const currentSlug = pathParts.length > 0 ? pathParts[pathParts.length - 1] : \"homepage\";\n\n            events.forEach(event => {\n              const attr = event.attributes;\n              const cd = attr.custom_data || {};\n              const clone = template.content.cloneNode(true);\n              const joinUrl = `\/event\/${attr.slug}\/?utm_source=blog&utm_medium=master_class&utm_content=${currentSlug}`;\n\n              \/\/ Instructor headshot\n              const instructor = (cd.instructors && cd.instructors[0]) || {};\n              const img = clone.querySelector(\".scaler-event-card__image\");\n              img.src = instructor.media_url || attr.image_url ||\n                \"https:\/\/images.unsplash.com\/photo-1531891437562-4301cf35b7e4?w=200&h=200&fit=crop\";\n              img.alt = instructor.name || attr.instructor_name || attr.title;\n\n              \/\/ Title + speaker\n              clone.querySelector(\".scaler-event-card__title\").textContent = attr.title;\n              clone.querySelector(\".js-event-speaker\").textContent = instructor.name || attr.instructor_name || \"\";\n\n              \/\/ Live chip vs attendee count\n              const isLive = attr.status === \"current\";\n              const footer = clone.querySelector(\".scaler-event-card__img-footer\");\n              const liveBadge = clone.querySelector(\".scaler-event-card__live-badge\");\n              if (isLive) {\n                footer.style.display = \"none\";\n                liveBadge.style.display = \"flex\";\n                liveBadge.textContent = \"Live\";\n              } else if (attr.registration_count) {\n                clone.querySelector(\".js-event-count\").textContent = attr.registration_count;\n              } else {\n                footer.style.display = \"none\";\n              }\n\n              \/\/ Takeaways (up to 2, Know More on the last)\n              const takeaways = (cd.takeaways || []).slice(0, 2);\n              const listEl = clone.querySelector(\".js-event-takeaways\");\n              listEl.innerHTML = \"\";\n              takeaways.forEach((t, idx) => {\n                const item = document.createElement(\"div\");\n                item.className = \"scaler-event-card__takeaway-item\";\n                const dot = document.createElement(\"span\");\n                dot.className = \"scaler-event-card__dot\";\n                const txt = document.createElement(\"span\");\n                txt.className = \"scaler-event-card__takeaway-text\";\n                txt.textContent = t;\n                item.appendChild(dot);\n                item.appendChild(txt);\n                if (idx === takeaways.length - 1) {\n                  const km = document.createElement(\"a\");\n                  km.className = \"scaler-event-card__knowmore\";\n                  km.textContent = \"Know More\";\n                  km.href = joinUrl;\n                  item.appendChild(km);\n                }\n                listEl.appendChild(item);\n              });\n\n              \/\/ Date + duration\n              clone.querySelector(\".js-event-date\").textContent = formatTime(attr.start_time);\n              let hrs = \"\";\n              if (attr.duration) {\n                hrs = (attr.duration \/ 60).toFixed(2);\n              } else if (attr.end_time) {\n                hrs = (Math.abs(new Date(attr.start_time) - new Date(attr.end_time)) \/ 3600000).toFixed(2);\n              }\n              clone.querySelector(\".js-event-duration\").textContent = hrs ? `${hrs} Hrs` : \"\";\n\n              \/\/ CTA\n              clone.querySelector(\".js-event-cta\").href = joinUrl;\n\n              swiperWrapper.appendChild(clone);\n            });\n\n            swiper.update();\n            swiper.slideTo(0);\n          }\n\n          async function fetchEvents() {\n            try {\n              showSkeletons();\n              const res = await fetch(\n                \"https:\/\/www.scaler.com\/api\/v4\/events?event_type[]=company&distributor=scaler&type=upcoming&serializer_mode=L2&limit=8&program[]=software_development&program[]=data_science&program[]=devops&program[]=ai_ml\"\n              );\n              const json = await res.json();\n              const events = json.data || [];\n              renderEvents(events);\n            } catch (error) {\n              console.error(\"Failed to load events:\", error);\n              if(swiperWrapper) swiperWrapper.innerHTML = `<div class=\"scaler-events-empty\">Failed to load events.<\/div>`;\n            }\n          }\n\n          fetchEvents();\n      });\n    });\n    <\/script>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-2-querying\"><\/span><strong>Tier 2: Querying<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once the interview moves past basic SQL, the questions get less predictable. Multiple-table queries, NULLs, duplicates, window functions, CTEs and subqueries become fair game. You don&#8217;t need every SQL function memorised; you need to understand what your query is doing and why.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Working With Different Types of Joins<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">As your queries involve more than one table, you\u2019ll need to choose a join based on which rows you want to keep in the result. An INNER JOIN returns rows where both tables have a match, while a LEFT JOIN keeps every row from the left table even when there is no matching row on the right. A self-join is useful when rows in the same table are related to each other, such as connecting employees with their managers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You\u2019ll also encounter queries that require several joins together when the data you need is spread across multiple related tables. This is where understanding which table should be on each side of the join becomes important.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One detail to pay attention to is where you place your filters. If you put a condition on the right-hand table in the WHERE clause of a LEFT JOIN, rows without a match will be removed from the result. In practice, that can make the query return the same rows you would have expected from an INNER JOIN.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SELECT o.id, c.name<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">FROM orders o<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">LEFT JOIN customers c ON o.customer_id = c.id<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">WHERE c.status = &#8216;active&#8217;;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the requirement was to keep all orders and only attach active customers, that query is wrong. The filter belongs in the join condition.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Aggregation, GROUP BY, and HAVING<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Aggregation tests whether you understand the difference between filtering rows and filtering groups. WHERE operates before grouping; HAVING filters the groups produced by the aggregation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There are also small details that expose shaky understanding. COUNT(*) counts rows, while COUNT(column) ignores rows where that column is NULL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Another common problem is join fan-out. If you join one customer to several orders and several payments before aggregating, the combinations can multiply and inflate your totals. The query may execute perfectly and still return the wrong number.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Subqueries and CTEs<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Subqueries can return a single value, filter against a set with IN or EXISTS, or reference the outer query through a correlated subquery. The right choice comes down to what you&#8217;re trying to return and how the tables relate to each other.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CTEs provide another way to structure the same reasoning into named steps. They can make a complicated query easier to inspect without changing the underlying problem into a procedural program. Recursive CTEs extend this to hierarchical data such as employee-manager relationships and are worth knowing once you&#8217;re beyond the basics.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Window Functions: The Clearest Beginner\/Intermediate Divide<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Window functions let you calculate across related rows without reducing them to one row per group. ROW_NUMBER() and RANK() handle ranking, LAG() and LEAD() compare rows, and SUM() can calculate running totals. PARTITION BY defines the group for each calculation.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Three interview problems cover a large part of the territory:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>The problem<\/strong><\/td><td><strong>The beginner approach<\/strong><\/td><td><strong>The window-function approach<\/strong><\/td><\/tr><tr><td>Top 3 employees by salary in each department<\/td><td>Loop through departments and sort each group separately.<\/td><td>Rank rows with ROW_NUMBER() or RANK() over each department<\/td><\/tr><tr><td>Running account balance<\/td><td>Fetch rows and maintain a running value in application code.<\/td><td>Use a windowed SUM() ordered by transaction date.<\/td><\/tr><tr><td>Compare each sale with the previous sale<\/td><td>Fetch rows and track the previous value manually.<\/td><td>Use LAG() over the required ordering.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>NULL Semantics and the Quiet Wrong Answers<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">NULL represents an unknown or missing value, which introduces three-valued logic into SQL. Comparisons involving NULL can therefore produce UNKNOWN rather than TRUE or FALSE. If you need to revisit how SQL handles these comparisons, the <a href=\"https:\/\/www.scaler.com\/topics\/sql\/\">SQL Tutorial<\/a> can help you refresh on the fundamentals.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One particularly tricky example is NOT IN. If the subquery contains a NULL, the comparison can evaluate to UNKNOWN for every candidate row, leaving you with no results when you expected several. You\u2019ll want to account for this when working with subqueries and missing values.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">COALESCE can give you a fallback value when a value is missing, but it doesn&#8217;t remove the distinction between a missing value and a real value. These details become easier to work with once you understand how SQL handles NULL throughout a query. For a broader view of the concepts and skills to learn, you can also refer to the <a href=\"https:\/\/www.scaler.com\/blog\/sql-roadmap-learning-path-career-roles-and-tools-to-master\/\">SQL Roadmap<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-3-database-design\"><\/span><strong>Tier 3: Database Design<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Database design brings together the decisions you make about how data should be structured and accessed. You\u2019ll work with normalisation, relationships, constraints, and indexes while considering how those choices affect queries, updates, and the application as a whole.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Modelling a Real Domain from Requirements<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Start with the domain: identify the entities, define their relationships and cardinality, then determine attributes, keys and constraints. Before finalising the schema, check it against the queries the application actually needs to run.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Take a library system. You might have Book, Member, Loan and Author as core entities. A book can have multiple authors, while an author can write multiple books, so an intermediate BookAuthor table connects the two. A member can have many loans, while each loan refers to one member and one book copy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That last detail: before drawing the final ER diagram, ask \u201cWhat are the main queries?\u201d If the application needs to show a member&#8217;s current loans, find overdue books, and list all books by an author, those access patterns should influence the design. A schema designed without knowing how the application will read and write the data is incomplete.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Indexing Is a Design Decision<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">An index gives the database a faster path to finding rows, but it isn&#8217;t free. It consumes storage and creates write amplification because the index has to be maintained when rows are inserted, updated, or deleted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Indexes can speed up reads, but they also use disk space and make inserts and updates more expensive because the index has to be updated too.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Column order is important in a composite index, and selectivity affects how relevant an index is for a particular query. A covering index can go further by containing everything needed for a query, potentially avoiding a separate table lookup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So don&#8217;t stop at \u201cI&#8217;d add an index.\u201d A stronger answer names the query, the index, the expected benefit and the cost it introduces.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Denormalisation<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Denormalisation can be the right choice for read-heavy paths, expensive repeated joins or precomputed aggregates. But it creates another problem: the same information now exists in multiple places and has to remain consistent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So you need to normalise first. Denormalise when you&#8217;ve measured a real performance problem and have a clear way to keep the duplicated data consistent. That could mean a transaction, an application-level update, a trigger, a materialised view or a background synchronisation process.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without the measurement, you&#8217;re guessing about performance. Without the consistency mechanism, you&#8217;re creating a data-integrity problem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Data Types and Key Choices<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Data type choices matter once a schema reaches production. Choose numeric types according to the range and precision the data requires, and avoid FLOAT for monetary values. Use DECIMAL when you need exact decimal representation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For timestamps, be deliberate about timezone handling. TIMESTAMP WITH TIME ZONE is often safer for events that represent an actual point in time, particularly when applications and users operate across regions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">TEXT versus VARCHAR(n) should reflect an actual data constraint rather than a habit. JSON columns can be pragmatic when part of the data is genuinely flexible, but putting an entire relational model inside JSON usually means you&#8217;ve avoided making a schema decision.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keys deserve the same scrutiny. Auto-incrementing integers are compact and straightforward; UUIDs work well when identifiers need to be generated independently across systems. The right choice depends on how the data is created, referenced, and exposed, not on which type looks more modern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For a broader guide to system design:<\/strong> <a href=\"https:\/\/www.scaler.com\/blog\/system-design-roadmap-2026-complete-guide-from-beginner-to-advanced\/\"><strong>System Design Roadmap<\/strong><\/a><\/p>\n\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&#038;display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n\n    <style>\n      :root {\n        --cl-primary: #005bb3;\n        --cl-brand-blue: #255aad;\n        --cl-card-bg: #ffffff;\n        --cl-surface: #f6f7f8;\n        --cl-border: #d6dee5;\n        --cl-text-primary: #1a2c47;   \/* neutral-scale-12 *\/\n        --cl-text-secondary: #61738e; \/* neutral-scale-9 *\/\n        --cl-radius: 16px;\n        --cl-radius-sm: 8px;\n        --cl-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n      }\n\n      .scaler-courses * { box-sizing: border-box; }\n\n      .scaler-courses {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        padding: 24px;\n        width: 100%;\n      }\n      .scaler-courses__inner {\n        max-width: 1000px;\n        margin: 0 auto;\n        position: relative;\n        width: 100%;\n      }\n\n      \/* Header *\/\n      .scaler-courses__header {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin-bottom: 8px;\n        padding: 8px 0;\n      }\n      .scaler-courses__header-icon { display: inline-flex; color: var(--cl-text-primary); }\n      .scaler-courses__header-icon svg { width: 24px; height: 24px; }\n      .scaler-courses__title {\n        font-size: 18px;\n        font-weight: 700;\n        color: var(--cl-text-primary);\n        line-height: 1.3;\n        margin: 0;\n      }\n\n      \/* Swiper *\/\n      .scaler-courses__swiper-wrap { position: relative; }\n      .scaler-courses .swiper { width: 100%; padding: 4px; }\n      .scaler-courses-swiper .swiper-slide {\n        width: 296px;\n        height: auto;\n        display: flex;\n      }\n\n      \/* Card *\/\n      .scaler-course-card {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        height: 100%;\n        min-height: 336px;\n        background: var(--cl-card-bg);\n        border: 1px solid var(--cl-border);\n        border-radius: var(--cl-radius);\n        overflow: hidden;\n        text-decoration: none;\n        cursor: pointer;\n        transition: box-shadow 0.2s ease;\n      }\n      .scaler-course-card:hover { box-shadow: 0 2px 12px rgba(50, 71, 102, 0.12); }\n\n      .scaler-course-card__image {\n        width: 100%;\n        height: 128px;\n        min-height: 128px;\n        object-fit: cover;\n        background: var(--cl-surface);\n        display: block;\n      }\n\n      .scaler-course-card__detail {\n        display: flex;\n        flex-direction: column;\n        flex: 1 1 auto;\n        padding: 16px 16px 8px;\n      }\n      .scaler-course-card__heading,\n      .scaler-course-card__heading:link,\n      .scaler-course-card__heading:visited {\n        font-size: 20px;\n        font-weight: 600;\n        line-height: 1.4;\n        color: var(--cl-text-primary) !important;\n        margin: 0 0 8px;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .scaler-course-card__instructor {\n        font-size: 14px;\n        line-height: 1.86;\n        color: var(--cl-text-primary);\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .scaler-course-card__instructor b { font-weight: 700; }\n      .scaler-course-card__desc {\n        flex-grow: 1;\n        margin-top: 8px;\n        margin-bottom: 12px;\n        font-size: 16px;\n        line-height: 1.5;\n        color: var(--cl-text-secondary);\n        display: -webkit-box;\n        -webkit-line-clamp: 2;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n      }\n\n      .scaler-course-card__footer {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        width: 100%;\n      }\n      .scaler-course-card__stat {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        font-size: 14px;\n        color: var(--cl-text-primary);\n      }\n      .scaler-course-card__stat svg { width: 18px; height: 18px; flex-shrink: 0; }\n      .scaler-course-card__stat img { width: 20px; height: 20px; flex-shrink: 0; }\n\n      \/* Side arrows *\/\n      .scaler-courses__nav {\n        position: absolute !important;\n        top: 50% !important;\n        transform: translateY(-50%) !important;\n        z-index: 2;\n        width: 46px !important; height: 46px !important; min-width: 46px;\n        display: flex !important; align-items: center; justify-content: center;\n        padding: 0 !important;\n        background: var(--cl-card-bg) !important;\n        border: none !important;\n        border-radius: var(--cl-radius-sm) !important;\n        box-shadow: var(--cl-shadow) !important;\n        color: var(--cl-text-secondary) !important;\n        cursor: pointer;\n        transition: opacity 0.2s ease, visibility 0.2s ease;\n      }\n      .scaler-courses__nav--prev { left: 8px !important; }\n      .scaler-courses__nav--next { right: 8px !important; }\n      .scaler-courses__nav svg { width: 20px !important; height: 20px !important; fill: var(--cl-text-secondary) !important; }\n      .scaler-courses__nav.swiper-button-disabled { opacity: 0; visibility: hidden; pointer-events: none; }\n\n      .scaler-courses .swiper-button-prev,\n      .scaler-courses .swiper-button-next,\n      .scaler-courses .swiper-pagination { display: none; }\n\n      \/* Skeleton *\/\n      .scaler-course-card--skeleton { pointer-events: none; }\n      .scaler-course-card--skeleton .scaler-course-card__image,\n      .scaler-course-card--skeleton .scaler-course-card__heading,\n      .scaler-course-card--skeleton .scaler-course-card__instructor,\n      .scaler-course-card--skeleton .scaler-course-card__desc,\n      .scaler-course-card--skeleton .scaler-course-card__footer {\n        background: linear-gradient(90deg, var(--cl-border) 25%, var(--cl-surface) 50%, var(--cl-border) 75%);\n        background-size: 200% 100%;\n        animation: cl-shimmer 1.5s infinite;\n        color: transparent !important;\n        border-radius: 4px;\n      }\n      .scaler-course-card--skeleton .scaler-course-card__heading { height: 24px; margin: 0 0 8px; }\n      .scaler-course-card--skeleton .scaler-course-card__instructor { height: 16px; }\n      .scaler-course-card--skeleton .scaler-course-card__footer { height: 20px; }\n      @keyframes cl-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }\n\n      .scaler-courses__empty { display: none; }\n\n      @media (max-width: 768px) {\n        .scaler-courses { padding: 16px; }\n        .scaler-courses-swiper .swiper-slide { width: 260px; }\n        .scaler-courses__nav { display: none !important; }\n      }\n    <\/style>\n\n\n    <div class=\"scaler-courses js-scaler-courses\">\n\n      <template class=\"js-course-card-template\">\n        <div class=\"swiper-slide\">\n          <a class=\"scaler-course-card js-course-link\" href=\"#\" target=\"_blank\" rel=\"noopener\">\n            <img decoding=\"async\" class=\"scaler-course-card__image js-course-image\" src=\"\" alt=\"\" loading=\"lazy\">\n            <div class=\"scaler-course-card__detail\">\n              <div class=\"scaler-course-card__heading js-course-title\"><\/div>\n              <div class=\"scaler-course-card__instructor js-course-instructor\"><\/div>\n              <div class=\"scaler-course-card__desc js-course-desc\"><\/div>\n              <div class=\"scaler-course-card__footer\">\n                <span class=\"scaler-course-card__stat js-course-star\">\n                  <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M14.83 2.868c0.342-0.239 0.75-0.368 1.168-0.368s0.826 0.128 1.168 0.368c0.338 0.236 0.596 0.569 0.741 0.955l2.759 6.936c0.003 0.007 0.007 0.013 0.013 0.017s0.013 0.007 0.020 0.007l7.402 0.476c0.411 0.036 0.802 0.194 1.124 0.452s0.559 0.607 0.683 1 0.127 0.815 0.011 1.211c-0.116 0.396-0.347 0.748-0.664 1.013l-5.655 4.714c-0.013 0.011-0.022 0.025-0.028 0.040s-0.006 0.032-0.002 0.047l1.821 7.163c0.107 0.395 0.094 0.812-0.037 1.2-0.133 0.391-0.38 0.734-0.71 0.983s-0.727 0.393-1.14 0.413c-0.413 0.020-0.822-0.084-1.175-0.3l-0.015-0.009-6.307-4.005c-0.004-0.003-0.009-0.004-0.014-0.004s-0.009 0.001-0.013 0.004l-5.876 3.721c-0.389 0.235-0.839 0.347-1.292 0.323s-0.889-0.184-1.251-0.459c-0.361-0.275-0.632-0.652-0.777-1.082-0.143-0.426-0.157-0.885-0.038-1.319l1.684-6.629c0.004-0.016 0.003-0.033-0.002-0.049s-0.015-0.030-0.027-0.040l-5.653-4.714c-0.317-0.264-0.548-0.617-0.664-1.013s-0.112-0.817 0.011-1.211c0.124-0.394 0.361-0.742 0.683-1s0.713-0.416 1.124-0.452l0.023-0.002 7.38-0.476c0.007-0 0.014-0.003 0.020-0.007s0.010-0.010 0.013-0.017l0.008-0.020 2.746-6.913c0.145-0.386 0.403-0.719 0.741-0.956z\"\/><\/svg>\n                  <span class=\"js-course-star-val\"><\/span>\n                <\/span>\n                <span class=\"scaler-course-card__stat\">\n                  <img decoding=\"async\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/user-check-dark.svg\" alt=\"Enrolled\" loading=\"lazy\">\n                  <span class=\"js-course-reg\"><\/span>\n                <\/span>\n              <\/div>\n            <\/div>\n          <\/a>\n        <\/div>\n      <\/template>\n\n      <div class=\"scaler-courses__inner\">\n        <div class=\"scaler-courses__header\">\n          <span class=\"scaler-courses__header-icon\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M26.259 23.289h-20.518c-1.193 0-2.16-0.967-2.16-2.16v0-14.588c0-1.193 0.967-2.16 2.16-2.16v0h20.518c1.193 0 2.16 0.967 2.16 2.16v0 14.588c0 1.193-0.967 2.16-2.16 2.16v0zM5.741 5.501c-0.574 0-1.040 0.466-1.040 1.040v0 14.588c0 0.574 0.466 1.040 1.040 1.040v0h20.518c0.574 0 1.040-0.466 1.040-1.040v0-14.588c0-0.574-0.466-1.040-1.040-1.040v0z\"\/><path d=\"M19.764 27.619h-7.53c-0.309 0-0.56-0.251-0.56-0.56v0c0-0.309 0.251-0.56 0.56-0.56h7.53c0.309 0 0.56 0.251 0.56 0.56v0c0 0.309-0.251 0.56-0.56 0.56v0z\"\/><path d=\"M14.023 9.322c0.116 0 0.223 0.035 0.312 0.096l-0.002-0.001 5.93 3.953c0.151 0.102 0.249 0.272 0.249 0.466s-0.098 0.364-0.247 0.465l-0.002 0.001-5.93 3.953c-0.087 0.059-0.195 0.094-0.31 0.094-0.309 0-0.56-0.25-0.56-0.559v-7.906c0-0.309 0.251-0.56 0.56-0.56v0zM18.943 13.835l-4.36-2.906v5.813z\"\/><\/svg>\n          <\/span>\n          <h2 class=\"scaler-courses__title\"><span class=\"ez-toc-section\" id=\"free-courses-by-top-scaler-instructors\"><\/span>Free Courses by top Scaler instructors<span class=\"ez-toc-section-end\"><\/span><\/h2>\n        <\/div>\n\n        <div class=\"scaler-courses__swiper-wrap\">\n          <div class=\"swiper scaler-courses-swiper\">\n            <div class=\"swiper-wrapper js-courses-wrapper\"><\/div>\n            <div class=\"swiper-pagination\"><\/div>\n          <\/div>\n\n          <button class=\"scaler-courses__nav scaler-courses__nav--prev js-courses-prev\" aria-label=\"Previous\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(-90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n          <button class=\"scaler-courses__nav scaler-courses__nav--next js-courses-next\" aria-label=\"Next\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <script>\n    document.addEventListener(\"DOMContentLoaded\", () => {\n      const EXTRA_COUNT_ADDED = 1000;\n\n      \/\/ Mirrors getInstructorStar(): first token of the headline.\n      function getInstructorStar(headline) {\n        return (headline || \"\").toString().split(\" \")[0] || \"\";\n      }\n\n      document.querySelectorAll(\".js-scaler-courses\").forEach(container => {\n        if (container.dataset.initialized === \"true\") return;\n        container.dataset.initialized = \"true\";\n\n        const swiperElement = container.querySelector(\".scaler-courses-swiper\");\n        const wrapper = container.querySelector(\".js-courses-wrapper\");\n        const template = container.querySelector(\".js-course-card-template\");\n        const nextBtn = container.querySelector(\".js-courses-next\");\n        const prevBtn = container.querySelector(\".js-courses-prev\");\n\n        if (!wrapper || !template) return;\n\n        const swiper = new Swiper(swiperElement, {\n          slidesPerView: \"auto\",\n          spaceBetween: 16,\n          grabCursor: true,\n          observer: true,\n          observeParents: true,\n          navigation: { nextEl: nextBtn, prevEl: prevBtn },\n        });\n\n        const pathParts = location.pathname.split(\"\/\").filter(Boolean);\n        const currentSlug = pathParts.length > 0 ? pathParts[pathParts.length - 1] : \"homepage\";\n\n        function showSkeletons(count = 4) {\n          wrapper.innerHTML = \"\";\n          for (let i = 0; i < count; i++) {\n            const clone = template.content.cloneNode(true);\n            clone.querySelector(\".scaler-course-card\").classList.add(\"scaler-course-card--skeleton\");\n            wrapper.appendChild(clone);\n          }\n          swiper.update();\n        }\n\n        function renderCourses(courses) {\n          wrapper.innerHTML = \"\";\n          if (!courses.length) { container.style.display = \"none\"; return; }\n\n          courses.forEach(item => {\n            const a = item.attributes || {};\n            const clone = template.content.cloneNode(true);\n            const instructor = (a.instructors_data && a.instructors_data[0]) || {};\n\n            clone.querySelector(\".js-course-link\").href =\n              `https:\/\/www.scaler.com\/topics\/course\/${a.slug}\/?utm_source=blog&utm_medium=free_courses&utm_content=${currentSlug}`;\n\n            const img = clone.querySelector(\".js-course-image\");\n            img.src = a.cover_image_thumbnail || a.featured_image || \"\";\n            img.alt = a.title || \"\";\n\n            clone.querySelector(\".js-course-title\").textContent = a.title || \"\";\n\n            const instrEl = clone.querySelector(\".js-course-instructor\");\n            if (instructor.name) {\n              instrEl.innerHTML = \"A Course by <b><\/b>\";\n              instrEl.querySelector(\"b\").textContent = instructor.name;\n            } else {\n              instrEl.style.display = \"none\";\n            }\n\n            clone.querySelector(\".js-course-desc\").textContent = a.description || \"\";\n\n            \/\/ Star\n            const star = getInstructorStar(instructor.star_headline);\n            const starWrap = clone.querySelector(\".js-course-star\");\n            if (star && star !== \"0\") clone.querySelector(\".js-course-star-val\").textContent = star;\n            else starWrap.style.display = \"none\";\n\n            \/\/ Enrolled count (+1000 like topics)\n            clone.querySelector(\".js-course-reg\").textContent =\n              ((a.user_registration_count || 0) + EXTRA_COUNT_ADDED).toLocaleString(\"en-US\");\n\n            wrapper.appendChild(clone);\n          });\n\n          swiper.update();\n          swiper.slideTo(0);\n        }\n\n        async function fetchCourses() {\n          try {\n            showSkeletons();\n            \/\/ Public same-origin endpoint (topics course search). Returns 6 free courses.\n            const res = await fetch(\"\/topics\/api\/v1\/search\/courses\", {\n              method: \"POST\",\n              headers: {\n                \"Content-Type\": \"application\/json\",\n                \"Accept\": \"application\/json\",\n                \"X-Requested-With\": \"XMLHttpRequest\",\n              },\n              body: JSON.stringify({\n                filters: {\n                  q: \"\",\n                  page: { limit: 6, current_page: 1 },\n                  sort: { key: \"user_registration_count\", order: \"desc\" },\n                  filter_type: null,\n                  tags: [],\n                  program: [],\n                  level: [],\n                  category_type: [],\n                },\n              }),\n            });\n            const json = await res.json();\n            const courses = (json && json.data) || [];\n            renderCourses(courses);\n          } catch (error) {\n            console.error(\"Failed to load courses:\", error);\n            container.style.display = \"none\";\n          }\n        }\n\n        fetchCourses();\n      });\n    });\n    <\/script>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-4-performance\"><\/span><strong>Tier 4: Performance<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A common response to a slow query is to change the SQL until it feels faster. That&#8217;s guesswork. The important skill is being able to stop guessing and read what the database says it is doing.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You can also explore these<\/strong> <a href=\"https:\/\/www.scaler.com\/blog\/backend-developer-skills\/\"><strong>15 Backend Developer Skills<\/strong><\/a><strong>.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>How to Read an Execution Plan<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The database planner works out how to execute a query, including which indexes to use, how to join tables, and how many rows it expects to process. EXPLAIN shows the planned operations without executing the query. EXPLAIN ANALYZE runs the query and adds the actual timings and row counts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When reading a plan, use this order:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Large sequential scan<\/strong> &#8211; check whether an index is missing or unusable.<\/li>\n\n\n\n<li><strong>Estimated rows far from actual rows<\/strong> &#8211; check for stale or inaccurate statistics.<\/li>\n\n\n\n<li><strong>Nested loop over a large outer relation<\/strong> &#8211; investigate whether the join strategy is appropriate.<\/li>\n\n\n\n<li><strong>Sort or hash spilling to disk<\/strong> &#8211; check memory pressure and the operation&#8217;s data volume.<\/li>\n\n\n\n<li><strong>Most expensive node first<\/strong> -don&#8217;t automatically start at the top of the plan.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">For practice, free visualisers such as <a href=\"https:\/\/explain.dalibo.com\/\" target=\"_blank\" rel=\"noopener\">explain.dalibo.com<\/a> and <a href=\"https:\/\/explain.depesz.com\/\" target=\"_blank\" rel=\"noopener\">explain.depesz.com<\/a> make execution plans much easier to inspect.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Required visual:<\/strong> an annotated EXPLAIN ANALYZE output highlighting the scan, estimated-versus-actual rows, and the most expensive node.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Why Is This Query Slow? Use a Diagnostic Order<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t start by rewriting the query. First ask whether the problem affects everyone or only appears at scale. Then run EXPLAIN ANALYZE and work through the likely causes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">See if the predicate is sargable. For instance, WHERE YEAR(created_at) = 2026 can prevent a created_at index from being used efficiently. Check the amount of data your query will pull in, see if you&#8217;re dealing with one query or many due to an N+1 situation involving hundreds of queries, and see if the database is waiting for locks or connections.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t quote a made-up \u201cpercentage of database incidents caused by slow queries.\u201d A real before-and-after measurement is stronger. If you actually reduce a query from 4.2 seconds to 40 milliseconds, show the original plan, the change, and the resulting plan.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The N+1 Problem, and Why Your ORM Caused It<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose an application fetches 100 orders and then lazily loads the customer for each order. The first query returns the orders; the loop triggers another query for every customer. You now have 101 queries even though each individual query looks fast.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is the N+1 problem. Common fixes include eager loading, select_related or prefetch_related, JOIN FETCH, batching, or deliberately using SQL for the specific access pattern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The important diagnostic step is to count the queries. An ORM can hide the problem because the application code looks clean while the database is doing far more work than expected.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Index Selection: Why More Indexes Can Make Things Worse<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every index has a maintenance cost. Inserts, updates, and deletes have to maintain the relevant index structures, while indexes also consume storage and can increase write latency.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Redundant indexes are another problem. A composite index on (a, b) can often make a separate index on (a) unnecessary, while it does not generally replace an index whose leading column is b.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Look at actual query patterns and index usage before adding another one. The interview question to prepare for is straightforward:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cYou added indexes, and the application got slower. Explain.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A good answer starts with write amplification, storage and maintenance overhead, then looks at whether the new indexes were actually being used.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-5-operations\"><\/span><strong>Tier 5: Operations<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once you\u2019re working with a database in production, you\u2019ll also need to deal with concurrency, failures, recovery, replication, and connection management. A transaction may behave differently when several operations run at the same time, a replica may fall behind, a restore may fail, or the application may run out of database connections. When something like this happens, you\u2019ll need to trace the problem through the database and application, identify what caused it, and decide how to bring the system back to a healthy state. Working through these situations is an important part of building database skills for production environments.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Transactions and Isolation Levels<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Isolation controls what concurrent transactions are allowed to observe. PostgreSQL, for example, treats READ UNCOMMITTED as READ COMMITTED, and its REPEATABLE READ implementation prevents phantom reads. MySQL InnoDB has REPEATABLE READ as its default and uses a different concurrency model.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Isolation level<\/strong><\/td><td><strong>Dirty read<\/strong><\/td><td><strong>Non-repeatable read<\/strong><\/td><td><strong>Phantom read<\/strong><\/td><td><strong>Typical use<\/strong><\/td><\/tr><tr><td>Read Uncommitted<\/td><td>Possible<\/td><td>Possible<\/td><td>Possible<\/td><td>Rare; weak consistency requirements<\/td><\/tr><tr><td>Read Committed<\/td><td>Prevented<\/td><td>Possible<\/td><td>Possible<\/td><td>Common transactional workloads<\/td><\/tr><tr><td>Repeatable Read<\/td><td>Prevented<\/td><td>Prevented<\/td><td>Possible under the SQL standard<\/td><td>Workloads needing a stable transaction snapshot<\/td><\/tr><tr><td>Serializable<\/td><td>Prevented<\/td><td>Prevented<\/td><td>Prevented<\/td><td>Operations requiring the strongest isolation<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">One detail often comes up in interviews: PostgreSQL&#8217;s default is READ COMMITTED. Two identical SELECT statements in the same transaction can therefore see different committed data if another transaction commits between them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Deadlocks are another production problem. They commonly arise when two transactions acquire locks in different orders; for example, transaction A locks row 1 then waits for row 2 while transaction B has row 2 and waits for row 1. A consistent lock-acquisition order reduces the risk, but your application should also be prepared to retry transactions that the database aborts because of a deadlock.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Backups, Recovery, and the Restore Nobody Tested<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A backup strategy isn&#8217;t just \u201cwe take backups.\u201d Full backups capture the database at a point in time, while incremental approaches capture changes since an earlier backup. Point-in-time recovery (PITR) combines a base backup with transaction logs such as PostgreSQL&#8217;s WAL or MySQL&#8217;s binary log to recover to a specific point.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two terms belong in every recovery discussion:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>RPO (Recovery Point Objective):<\/strong> how much recent data the business can afford to lose.<\/li>\n\n\n\n<li><strong>RTO (Recovery Time Objective):<\/strong> how long the service can afford to remain unavailable.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">And the practical rule is worth remembering:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A backup you have never restored is not a backup; it is a hypothesis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A recovery procedure that has never been tested can fail because of missing credentials, incompatible versions, incomplete backups, incorrect retention, or a restore process nobody has documented.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Replication, Read Replicas, and Lag<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Replication is not simply \u201cmake a copy of the database.\u201d Read replicas introduce a consistency problem that the application has to account for.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine a user posts a comment. The write reaches the primary, but the next page load is routed to a replica that hasn&#8217;t caught up yet. The user refreshes, and their comment appears to have disappeared. Replication lag has become a product bug, even though the database infrastructure is technically working.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Replication can support read scaling and availability, but it doesn&#8217;t automatically give you stronger consistency. It is also different from sharding and partitioning. Sharding distributes data across database instances, while partitioning divides data within a database according to a defined strategy. Most applications don&#8217;t need sharding early on, and introducing it too soon can add unnecessary operational complexity.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Connection Pooling: The Failure Mode You&#8217;ll Hit First<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Applications usually reuse database connections through a connection pool rather than opening a new connection for every request. The pool should not simply be made \u201cas large as possible\u201d: every active connection consumes database and application resources.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A common failure starts when the connection pool reaches its limit. New requests begin waiting for a connection, application latency climbs, and the dashboards point to the application servers even though the database is barely busy. The real bottleneck is the time spent waiting for a connection.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">HikariCP is widely used for JDBC connection pooling, while PgBouncer provides connection pooling in front of PostgreSQL. The right pool size depends on the workload, database capacity, and concurrency, so it should be measured rather than set arbitrarily.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Schema Migrations Without Downtime<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Production schemas change while applications are still serving traffic. Tools such as Flyway, Liquibase, Alembic, and Django migrations help version and apply those changes, but the tool doesn&#8217;t make a dangerous migration safe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schema changes can cause trouble when the application is still serving traffic. Adding a NOT NULL column with a default to a large table, building an index that holds up production traffic, or renaming a column before every application instance has been updated can all create problems. PostgreSQL provides CREATE INDEX CONCURRENTLY for cases where you need to build an index while allowing concurrent writes.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With an expand-and-contract migration, you first add the new schema without removing the old one. Then deploy application code that supports both versions, and remove the old column or structure only after all instances have moved to the new version.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Being able to explain that sequence is a much stronger signal of production experience than simply listing \u201cdatabase migrations\u201d on a resume.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Learn more about: <a href=\"https:\/\/www.scaler.com\/blog\/data-engineer-skills\/\">12 Essential Data Engineer Skills<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"how-to-get-better-at-databases\"><\/span><strong>How to Get Better at Databases<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Courses and certifications are a great start and a good place to validate your skills, but they also often fail to build database fluency because databases are a feedback-loop skill. You write a query against real data, get the wrong result or a slow plan, work out why, and fix it. Watching someone else write the query gives you recognition; writing it yourself builds fluency.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A simple practice loop is:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Write queries you cannot yet write.<\/li>\n\n\n\n<li>Read the execution plan, even when the query already works.<\/li>\n\n\n\n<li>Break performance deliberately, then fix it.<\/li>\n\n\n\n<li>Model a real domain and defend your decisions out loud.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Repeat that loop with increasingly difficult data and problems. The point isn&#8217;t to accumulate completed exercises; it&#8217;s to create situations where the database gives you feedback.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Practise Against a Real Dataset, Not Toy Tables<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tutorial tables usually have five rows, clean values and predictable relationships. Real data has NULLs, duplicates, missing references, unexpected values and uneven distributions. Working with it forces you to deal with the problems that toy examples conveniently remove.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For PostgreSQL, Pagila and DVD Rental are good databases to practise with. MySQL has the Employees and Sakila sample databases, while Chinook is available for several database engines. For more realistic data, look at Kaggle and <a href=\"https:\/\/www.data.gov.in\/\" target=\"_blank\" rel=\"noopener\">data.gov.in<\/a>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Try modelling the schema of an application you use every day without looking at its implementation. Then find its actual implementation or a documented schema and compare the two. The differences can show you where your assumptions about relationships, keys, and access patterns were off.<\/p>\n\n\n<style data-wp-block-html=\"css\">\n<style>\n      :root {\n        --sp-brand: #255aad;            \/* brand blue *\/\n        --sp-brand-hover: #19468c;\n        --sp-card-bg: #ffffff;          \/* neutral-scale-0 *\/\n        --sp-surface: #f4f6f9;          \/* neutral-scale-2 *\/\n        --sp-pill-bg: #f8fafc;\n        --sp-border: #d6dee5;           \/* neutral-scale-4 *\/\n        --sp-text-primary: #1a2c47;     \/* neutral-scale-12 *\/\n        --sp-text-secondary: #61738e;   \/* neutral-scale-9 *\/\n      }\n\n      .scaler-placement * { box-sizing: border-box; }\n\n      .scaler-placement {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        width: 100%;\n        max-width: 100%;\n        margin: 24px auto;\n        display: flex;\n        flex-direction: column;\n      }\n\n      \/* ---- Placement report (OnlineCallout) ---- *\/\n      .scaler-placement__title {\n        font-size: 24px;\n        font-weight: 600;\n        line-height: 1.3;\n        color: var(--sp-text-primary);\n        margin: 0 0 16px;\n      }\n\n      .scaler-placement__card {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        background: var(--sp-card-bg);\n        border: 1px solid var(--sp-border);\n        border-radius: 20px;\n        padding: 16px;\n        box-shadow: 0 8px 32px rgba(37, 90, 173, 0.04);\n        overflow: hidden;\n        gap: 5px;\n      }\n\n      .scaler-placement__top {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        width: 100%;\n        gap: 18px;\n      }\n\n      .scaler-placement__stat-block {\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center;\n        width: 30%;\n        min-width: 200px;\n        flex-shrink: 0;\n        background: var(--sp-surface);\n        border: 1px solid var(--sp-border);\n        border-radius: 16px;\n        padding: 16px 10px;\n        gap: 8px;\n      }\n      .scaler-placement__stat-number {\n        font-size: 48px;\n        font-weight: 600;\n        line-height: 1;\n        color: var(--sp-brand);\n        text-align: center;\n      }\n      .scaler-placement__stat-label {\n        font-size: 13px;\n        font-weight: 600;\n        line-height: 14px;\n        color: rgba(37, 90, 173, 0.85);\n        text-transform: uppercase;\n        letter-spacing: 0.8px;\n      }\n\n      .scaler-placement__info {\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        flex: 1;\n        gap: 10px;\n      }\n      .scaler-placement__proof-header {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 8px;\n      }\n      .scaler-placement__proof-header svg { width: 18px; height: 18px; flex-shrink: 0; }\n      .scaler-placement__proof-label {\n        font-size: 12px;\n        font-weight: 600;\n        line-height: 16px;\n        color: var(--sp-brand);\n        text-transform: uppercase;\n        letter-spacing: 1px;\n      }\n      .scaler-placement__body-text {\n        font-size: 16px;\n        font-weight: 400;\n        line-height: 24px;\n        color: var(--sp-text-primary);\n        margin: 0;\n      }\n\n      .scaler-placement__bottom {\n        display: flex;\n        flex-direction: column;\n        align-items: flex-start;\n        margin-left: calc(30% + 18px);\n        width: calc(70% - 18px);\n        gap: 12px;\n      }\n      .scaler-placement__stats-row {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 24px;\n      }\n      .scaler-placement__stat-item {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 8px;\n      }\n      .scaler-placement__stat-item > svg {\n        color: var(--sp-brand);\n        width: 18px;\n        height: 18px;\n        flex-shrink: 0;\n      }\n      .scaler-placement__stat-text {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 4px;\n      }\n      .scaler-placement__stat-value {\n        font-size: 16px;\n        font-weight: 600;\n        line-height: 24px;\n        color: var(--sp-text-primary);\n      }\n      .scaler-placement__stat-desc {\n        font-size: 14px;\n        font-weight: 400;\n        line-height: 20px;\n        color: var(--sp-text-secondary);\n      }\n\n      .scaler-placement__cta,\n      .scaler-placement__cta:link,\n      .scaler-placement__cta:visited {\n        display: inline-flex;\n        align-items: center;\n        align-self: flex-start;\n        font-size: 14px;\n        font-weight: 600;\n        line-height: 20px;\n        color: var(--sp-brand) !important;\n        gap: 6px;\n        text-decoration: none;\n        cursor: pointer;\n        margin-top: 2px;\n        transition: color 0.25s ease;\n      }\n      .scaler-placement__cta:hover,\n      .scaler-placement__cta:focus { color: var(--sp-brand-hover) !important; }\n      .scaler-placement__cta svg {\n        width: 14px;\n        height: 14px;\n        fill: currentColor;\n        transition: transform 0.25s ease;\n      }\n      .scaler-placement__cta:hover svg { transform: translateX(3px); }\n\n      \/* ---- Hiring Partners ---- *\/\n      .scaler-hiring {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        flex-wrap: wrap;\n        gap: 8px 12px;\n        margin: 24px 0 8px;\n        padding-top: 16px;\n        border-top: 1px solid var(--sp-border);\n      }\n      .scaler-hiring__label {\n        font-size: 14px;\n        color: var(--sp-text-secondary);\n        white-space: nowrap;\n      }\n      .scaler-hiring__pills {\n        display: flex;\n        align-items: center;\n        flex-wrap: wrap;\n        gap: 8px;\n      }\n      .scaler-hiring__pill {\n        display: inline-flex;\n        align-items: center;\n        gap: 6px;\n        padding: 5px 12px 5px 5px;\n        background: var(--sp-pill-bg);\n        border-radius: 999px;\n      }\n      .scaler-hiring__badge {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        flex-shrink: 0;\n        width: 24px;\n        height: 24px;\n        border-radius: 50%;\n        background: #ffffff;\n      }\n      .scaler-hiring__logo {\n        width: 16px !important;\n        height: 16px !important;\n        object-fit: contain;\n        margin: 0 !important;\n        display: block;\n      }\n      .scaler-hiring__name {\n        font-size: 14px;\n        font-weight: 600;\n        color: var(--sp-text-primary);\n      }\n      .scaler-hiring__more {\n        font-size: 14px;\n        color: var(--sp-text-secondary);\n      }\n\n      @media (max-width: 768px) {\n        .scaler-placement__title { font-size: 18px; margin-bottom: 12px; }\n        .scaler-placement__card { gap: 16px; border-radius: 16px; }\n        .scaler-placement__top { gap: 12px; }\n        .scaler-placement__stat-block { width: 35%; min-width: 110px; padding: 12px 8px; gap: 4px; }\n        .scaler-placement__stat-number { font-size: 24px; }\n        .scaler-placement__stat-label { font-size: 10px; }\n        .scaler-placement__body-text { font-size: 14px; line-height: 20px; }\n        .scaler-placement__bottom { margin-left: 0; width: 100%; gap: 16px; }\n        .scaler-placement__stats-row { flex-wrap: wrap; gap: 10px 16px; }\n        .scaler-placement__stat-value { font-size: 14px; line-height: 20px; }\n        .scaler-placement__stat-desc { font-size: 12px; line-height: 16px; }\n      }\n<\/style>\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&#038;display=swap\" rel=\"stylesheet\">\n\n<div class=\"scaler-placement\">\n      <h2 class=\"scaler-placement__title\"><span class=\"ez-toc-section\" id=\"scaler-placement-report-and-statistics\"><\/span>Scaler Placement Report and Statistics<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n      <div class=\"scaler-placement__card\">\n        <div class=\"scaler-placement__top\">\n          <div class=\"scaler-placement__stat-block\">\n            <div class=\"scaler-placement__stat-number\">\u20b923L<\/div>\n            <div class=\"scaler-placement__stat-label\">AVG CTC<\/div>\n          <\/div>\n          <div class=\"scaler-placement__info\">\n            <div class=\"scaler-placement__proof-header\">\n              <svg viewBox=\"0 0 21 21\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M8.64 0 0 8.683V21h12.257l8.64-8.683V0H8.64zm-.11 17.257H3.725v-4.828H8.53v4.828zm7.901-1.88-4.174 4.194V8.684H1.447l4.076-4.14h10.914l-.006 10.83v.004z\" fill=\"#255aad\"><\/path><\/svg>\n              <span class=\"scaler-placement__proof-label\">SCALER PLACEMENT PROOF<\/span>\n            <\/div>\n            <p class=\"scaler-placement__body-text\">\n              Scaler learners achieved 2.5x salary growth with average post-Scaler CTC reaching \u20b923L.\n            <\/p>\n          <\/div>\n        <\/div>\n\n        <div class=\"scaler-placement__bottom\">\n          <div class=\"scaler-placement__stats-row\">\n            <div class=\"scaler-placement__stat-item\">\n              <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M11.199 7.957c-3.086 0-5.588 2.502-5.588 5.588s2.502 5.588 5.588 5.588c3.086 0 5.588-2.502 5.588-5.588s-2.502-5.588-5.588-5.588zM3.611 13.545c0-4.191 3.397-7.588 7.588-7.588s7.588 3.397 7.588 7.588c0 4.191-3.397 7.588-7.588 7.588s-7.588-3.397-7.588-7.588z\"><\/path><path d=\"M21.090 6.369h0.003c1.989 0 3.897 0.79 5.303 2.197s2.197 3.314 2.197 5.303-0.79 3.897-2.197 5.303c-1.406 1.407-3.314 2.197-5.303 2.197-0.552 0-1-0.448-1-1s0.448-1 1-1c1.459 0 2.858-0.579 3.889-1.611s1.611-2.43 1.611-3.889c0-1.459-0.58-2.858-1.611-3.889s-2.429-1.611-3.888-1.611c-0.507 0.002-1.013 0.070-1.502 0.203-0.533 0.145-1.082-0.17-1.227-0.703s0.17-1.082 0.703-1.227c0.659-0.179 1.339-0.27 2.021-0.272z\"><\/path><path d=\"M10.906 21.364c-1.605 0-3.186 0.386-4.61 1.126s-2.649 1.811-3.572 3.124c-0.318 0.452-0.941 0.561-1.393 0.243s-0.561-0.941-0.243-1.393c1.107-1.576 2.577-2.862 4.286-3.749s3.606-1.351 5.532-1.351 3.823 0.463 5.532 1.351c1.709 0.888 3.179 2.174 4.286 3.749 0.318 0.452 0.209 1.076-0.243 1.393s-1.076 0.209-1.393-0.243c-0.923-1.313-2.148-2.385-3.572-3.124s-3.005-1.126-4.61-1.126z\"><\/path><path d=\"M25.704 22.493c-1.424-0.74-3.005-1.125-4.61-1.124-0.552 0-1-0.447-1.001-0.999s0.447-1 0.999-1.001c1.926-0.001 3.824 0.462 5.533 1.349s3.179 2.174 4.286 3.751c0.317 0.452 0.208 1.076-0.244 1.393s-1.076 0.208-1.393-0.244c-0.922-1.313-2.147-2.385-3.571-3.125z\"><\/path><\/svg>\n              <div class=\"scaler-placement__stat-text\">\n                <span class=\"scaler-placement__stat-value\">11,000+<\/span>\n                <span class=\"scaler-placement__stat-desc\">placements<\/span>\n              <\/div>\n            <\/div>\n            <div class=\"scaler-placement__stat-item\">\n              <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M1.2 27.5c0-0.442 0.358-0.8 0.8-0.8h28c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-28c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M3.727 4.227c0.338-0.338 0.795-0.527 1.273-0.527h12c0.477 0 0.935 0.19 1.273 0.527s0.527 0.795 0.527 1.273v22c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-22c0-0.053-0.021-0.104-0.059-0.141s-0.088-0.059-0.141-0.059h-12c-0.053 0-0.104 0.021-0.141 0.059s-0.059 0.088-0.059 0.141v22c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-22c0-0.477 0.19-0.935 0.527-1.273z\"><\/path><path d=\"M17.2 12.5c0-0.442 0.358-0.8 0.8-0.8h9c0.477 0 0.935 0.19 1.273 0.527s0.527 0.795 0.527 1.273v14c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-14c0-0.053-0.021-0.104-0.059-0.141s-0.088-0.059-0.141-0.059h-9c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M7.2 9.5c0-0.442 0.358-0.8 0.8-0.8h4c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-4c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M9.2 17.5c0-0.442 0.358-0.8 0.8-0.8h4c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-4c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M7.2 22.5c0-0.442 0.358-0.8 0.8-0.8h4c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-4c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M21.2 22.5c0-0.442 0.358-0.8 0.8-0.8h2c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-2c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M21.2 17.5c0-0.442 0.358-0.8 0.8-0.8h2c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-2c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><\/svg>\n              <div class=\"scaler-placement__stat-text\">\n                <span class=\"scaler-placement__stat-value\">650+<\/span>\n                <span class=\"scaler-placement__stat-desc\">companies<\/span>\n              <\/div>\n            <\/div>\n            <div class=\"scaler-placement__stat-item\">\n              <svg viewBox=\"0 0 25 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M5.60938 18.8906C4.74688 18.0281 5.31875 16.2188 4.87813 15.1594C4.4375 14.1 2.75 13.1719 2.75 12C2.75 10.8281 4.41875 9.9375 4.87813 8.84063C5.3375 7.74375 4.74688 5.97187 5.60938 5.10938C6.47187 4.24688 8.28125 4.81875 9.34063 4.37813C10.4 3.9375 11.3281 2.25 12.5 2.25C13.6719 2.25 14.5625 3.91875 15.6594 4.37813C16.7562 4.8375 18.5281 4.24688 19.3906 5.10938C20.2531 5.97187 19.6812 7.78125 20.1219 8.84063C20.5625 9.9 22.25 10.8281 22.25 12C22.25 13.1719 20.5813 14.0625 20.1219 15.1594C19.6625 16.2562 20.2531 18.0281 19.3906 18.8906C18.5281 19.7531 16.7188 19.1812 15.6594 19.6219C14.6 20.0625 13.6719 21.75 12.5 21.75C11.3281 21.75 10.4375 20.0813 9.34063 19.6219C8.24375 19.1625 6.47187 19.7531 5.60938 18.8906Z\" fill=\"#ffffff\" stroke=\"#255aad\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path><path d=\"M16.625 9.75L11.1219 15L8.375 12.375\" stroke=\"#255aad\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path><\/svg>\n              <span class=\"scaler-placement__stat-desc\">Verified data<\/span>\n            <\/div>\n          <\/div>\n\n          <a class=\"scaler-placement__cta\" href=\"https:\/\/d2beiqkhq929f0.cloudfront.net\/public_assets\/assets\/000\/195\/869\/original\/Scaler_Career_Report.pdf?1778499863\" target=\"_blank\" rel=\"noopener\">\n            See full placement report\n            <svg viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"><\/path><\/svg>\n          <\/a>\n        <\/div>\n      <\/div>\n\n      <div class=\"scaler-hiring\">\n        <span class=\"scaler-hiring__label\">Hiring Partners:<\/span>\n        <div class=\"scaler-hiring__pills\">\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/googleicon_.svg\" alt=\"Google\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Google<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/amazonicon_.svg\" alt=\"Amazon\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Amazon<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/microsoft.svg\" alt=\"Microsoft\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Microsoft<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/flipkarticon_.svg\" alt=\"Flipkart\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Flipkart<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/adobeicon_.svg\" alt=\"Adobe\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Adobe<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__more\">1200+ more<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Deliberate Practice: The Four-Move Loop<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. Write queries you can't yet write.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use SQLZoo, PostgreSQL Exercises, LeetCode Database, HackerRank SQL, StrataScratch, or DataLemur for problems you haven't solved before. When possible, run them against a real database rather than a browser sandbox that hides the execution plan.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Read the plan for every query.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Don't wait until a query is slow. Looking at EXPLAIN regularly turns scans, joins, estimates, and index usage from terminology into things you've actually seen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. Break performance deliberately, then fix it.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Load a large dataset, time a query, remove the index and time it again. Add redundant indexes and measure the effect on writes. Use a non-sargable predicate and compare the plan. You learn indexing faster by making a query slow on purpose than by memorising what an index does.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. Model a domain and defend it out loud.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Choose a real application, design its schema, identify the likely access patterns, and explain why you chose each relationship, key, and constraint. Then challenge your own design with questions about scale, consistency, and performance. That's close to the format of an actual design interview.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Skill tier<\/strong><\/td><td><strong>One concrete exercise<\/strong><\/td><td><strong>How you know you've got it<\/strong><\/td><\/tr><tr><td>Foundations<\/td><td>Design and constrain a small relational schema.<\/td><td>You can explain every key, relationship, and constraint.<\/td><\/tr><tr><td>Querying<\/td><td>Solve the same data problem using joins, CTEs, and windows.<\/td><td>You can choose the approach without trial-and-error syntax.<\/td><\/tr><tr><td>Design<\/td><td>Model a real application from its access patterns.<\/td><td>You can defend the schema's trade-offs.<\/td><\/tr><tr><td>Performance<\/td><td>Diagnose and fix a deliberately slow query.<\/td><td>You can explain the plan before changing the SQL.<\/td><\/tr><tr><td>Operations<\/td><td>Simulate a migration, backup, or concurrency problem.<\/td><td>You can describe the failure and recovery path.<\/td><\/tr><tr><td>Modern<\/td><td>Choose a database for a specific workload.<\/td><td>You can defend the choice against a relational alternative.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>References for Database Skills<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/www.postgresql.org\/docs\/\" target=\"_blank\" rel=\"noopener\">PostgreSQL documentation<\/a> is one of the best free references for understanding how a production relational database works. For distributed systems and database operations, Designing Data-Intensive Applications by Martin Kleppmann is a great read, while <a href=\"https:\/\/use-the-index-luke.com\/\" target=\"_blank\" rel=\"noopener\">Use The Index, Luke!<\/a> goes deeper into indexing and query performance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can get more from these resources when you use them alongside your projects. Once you run into a problem yourself, look up the relevant section and use it to understand what happened and how the database handles it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can check out this <a href=\"https:\/\/www.scaler.com\/blog\/sql-syllabus\/\">SQL Syllabus<\/a> and begin your learning journey with this free <a href=\"https:\/\/www.scaler.com\/topics\/course\/sql-using-mysql-course\/\">SQL Tutorial<\/a> with certificate.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"what-database-interviews-test\"><\/span><strong>What Database Interviews Test<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Database-heavy interviews usually test the same four areas in increasing depth: a live SQL round, schema design, indexing and performance, and transaction concepts. The exact format varies by company, but knowing what each round is trying to uncover makes preparation much more targeted.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The SQL Query Round<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A typical live round starts with a straightforward join and then gets harder: a GROUP BY with a filter, followed by a problem that needs a window function or CTE. The interviewer is testing whether you can move beyond familiar query patterns when the problem changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You are generally evaluated first on correctness, then on how you reason through the problem, readability, and whether you consider edge cases. Before writing the query, ask about NULLs, duplicates, and what the expected result should be. Better still, explain your approach before you start writing. Getting the right answer isn't enough; the interviewer also needs to see how you arrived at it.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The Schema-Design Round<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You might get an open-ended prompt such as \u201cDesign the schema for a ride-hailing app.\u201d Give yourself time to clarify the requirements before drawing tables: what entities exist, how they relate, what the main access patterns are, and which operations need to be fast.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">From there, move through relationships, cardinality, keys and constraints before discussing indexes or denormalisation. You may also be asked what happens as the data grows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The most common mistake is drawing tables immediately. The interviewer is looking for the reasoning behind the schema, not how quickly you can produce an ER diagram.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u201cWhy Is This Query Slow?\u201d<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is often where the difference between a mid-level and senior candidate becomes visible. A strong answer follows a procedure: establish the scale of the problem, inspect the execution plan, check indexes and predicate structure, look for excessive rows or columns, and consider N+1 queries, locks, or connection pressure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A weak answer starts suggesting indexes before asking how much data exists or what the current plan looks like. If you propose an index, explain its write and storage cost as well as the expected read benefit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Concept Questions on Transactions and Isolation<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Interviewers often start with something familiar: \u201cWhat is ACID?\u201d Then they make it concrete: two users try to buy the last available item at the same time. What happens? What should the transaction guarantee? Which isolation behaviour is appropriate?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Everyone can recite Atomicity, Consistency, Isolation and Durability. Fewer candidates can explain what READ COMMITTED permits, how concurrent transactions can interact, or why a particular isolation level is appropriate for the operation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The ORM Question and Being Honest About It<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For many application developers, the database is accessed through an ORM such as Hibernate, JPA, SQLAlchemy, Django, Sequelize, or Prisma. That's not a problem. ORMs remove genuine boilerplate and give application code a simpler way to interact with the database.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The problem is when the ORM becomes the only way you've ever seen the database. It shows up when a candidate reaches for ORM method names instead of writing a join, doesn't recognise an N+1 because the application never failed outright, or can't answer \u201cWhat SQL does this generate?\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The fix is surprisingly small. Turn on SQL logging, show_sql, echo=True, Django's connection. queries, or Prisma's query logging and read the generated SQL during normal development for a week. You will quickly see the queries your application is actually sending and start connecting ORM operations to database behaviour.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Are Database Skills Still Worth Learning When AI Writes SQL?<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">AI assistants can generate competent SQL, which makes it easier to produce a query without writing every part of it yourself. You still need to check whether the query matches your schema, returns the correct result, remains performant at 50 million rows, or holds a transaction open for too long.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The query may be generated for you, but you still have to understand what it is doing and whether it is appropriate for your database. That makes schema design, query performance, and database operations important skills to build alongside your SQL knowledge.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"sql-vs-nosql-and-which-skills-your-target-role-needs\"><\/span><strong>SQL vs NoSQL and Which Skills Your Target Role Needs<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>When SQL Is Right, and When NoSQL Genuinely Is<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cNoSQL for unstructured data and scale\u201d is too vague to help with a real design decision. Relational databases can handle JSON, and most applications never reach a scale that requires abandoning them simply because the data is large.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So you need to ask this question: how will the application access the data?<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Access pattern<\/strong><\/td><td><strong>Likely choice<\/strong><\/td><\/tr><tr><td>Clear relationships and strong write correctness<\/td><td>Relational<\/td><\/tr><tr><td>Query patterns are not yet predictable<\/td><td>Relational<\/td><\/tr><tr><td>A document is always read and written as a whole<\/td><td>Document store<\/td><\/tr><tr><td>High-throughput key lookups, caching, sessions or rate limits<\/td><td>Key-value<\/td><\/tr><tr><td>Extreme write volume, time-series or event data<\/td><td>Wide-column<\/td><\/tr><tr><td>Relationships themselves are the primary queries<\/td><td>Graph<\/td><\/tr><tr><td>Analytical aggregates over billions of rows<\/td><td>Columnar analytics store<\/td><\/tr><tr><td>Similarity search over embeddings<\/td><td>Vector store \/ pgvector<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The term \u201cschemaless\u201d can also be misleading. The schema hasn't disappeared; it has often moved into application code, where the database may no longer enforce it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A relational database might handle orders and payments while a key-value store handles sessions or a vector store handles semantic search. In an interview, \u201cI'd use MongoDB\u201d isn't a strong answer by itself, just as \u201cI'd always use PostgreSQL\u201d isn't. Name the access pattern and explain why the chosen store fits it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Which Database Skills Does Your Role Need?<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Foundations and Querying are the baseline for every role here. The difference starts in the higher tiers: a backend developer needs enough Design and Performance to build reliable application data access, while a DBA needs much deeper Operations knowledge.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Role<\/strong><\/td><td><strong>Must be strong in<\/strong><\/td><td><strong>Should be competent in<\/strong><\/td><td><strong>Can defer<\/strong><\/td><\/tr><tr><td>Backend Developer<\/td><td>Foundations, Querying<\/td><td>Design, Performance<\/td><td>Advanced Operations, Modern<\/td><\/tr><tr><td>SQL\/Database Developer<\/td><td>Foundations, Querying, Design<\/td><td>Performance, Operations<\/td><td>Modern<\/td><\/tr><tr><td>DBA<\/td><td>Foundations, Design, Operations<\/td><td>Performance, Querying<\/td><td>Modern<\/td><\/tr><tr><td>Data Engineer<\/td><td>Foundations, Querying, Operations<\/td><td>Design, Performance, Modern<\/td><td>\u2014<\/td><\/tr><tr><td>Data Analyst<\/td><td>Foundations, Querying<\/td><td>Basic Design<\/td><td>Performance, Operations, Modern<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For database developer skills, the expectation usually extends to schema design, indexing, performance, and database-side development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The point isn't to master all six tiers before applying for a role. Build a strong foundation and querying layer first, then go deeper where your target role actually demands it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Also read:<\/strong> <a href=\"https:\/\/www.scaler.com\/blog\/backend-developer-roadmap\/\"><strong>Backend Developer Roadmap<\/strong><\/a><\/p>\n\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&amp;display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n\n    <style>\n      :root {\n        --ss-primary: #005bb3;        \/* primary-color-80 *\/\n        --ss-card-bg: #ffffff;\n        --ss-border: #e6e6e6;\n        --ss-quote-bg: #f6f6f6;\n        --ss-text-dark: #1c1c1c;\n        --ss-text-mid: #6b6b6b;\n        --ss-text-muted: #9a9a9a;\n        --ss-radius: 12px;\n        --ss-radius-sm: 8px;\n        --ss-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n      }\n\n      .scaler-ss * { box-sizing: border-box; }\n\n      .scaler-ss {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        padding: 24px;\n        width: 100%;\n      }\n      .scaler-ss__inner {\n        max-width: 1000px;\n        margin: 0 auto;\n        position: relative;\n        width: 100%;\n      }\n\n      \/* Heading *\/\n      .scaler-ss__heading {\n        font-size: 26px;\n        line-height: 34px;\n        font-weight: 700;\n        margin: 0 0 16px;\n        text-align: center;\n        color: var(--ss-text-dark);\n      }\n\n      \/* Swiper *\/\n      .scaler-ss__swiper-wrap { position: relative; }\n      .scaler-ss .swiper { width: 100%; padding: 4px; }\n      .scaler-ss-swiper .swiper-slide {\n        width: 300px;          \/* topics card width *\/\n        height: auto;\n        display: flex;\n      }\n\n      \/* Card *\/\n      .scaler-ss-card {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        border: 1px solid var(--ss-border);\n        border-radius: var(--ss-radius);\n        overflow: hidden;\n        background: var(--ss-card-bg);\n      }\n\n      .scaler-ss-card__hike {\n        padding: 8px 12px;\n        background: var(--ss-primary);\n        color: #ffffff;\n        font-size: 14px;\n        font-weight: 700;\n        text-align: center;\n        letter-spacing: 0.4px;\n      }\n\n      .scaler-ss-card__body {\n        display: flex;\n        flex: 1 1 auto;\n        flex-direction: column;\n        gap: 12px;\n        padding: 16px;\n      }\n\n      \/* Person *\/\n      .scaler-ss-card__person {\n        display: flex;\n        align-items: center;\n        gap: 10px;\n      }\n      .scaler-ss-card__avatar {\n        width: 44px;\n        height: 44px;\n        min-width: 44px;\n        border-radius: 50%;\n        object-fit: cover;\n        background: var(--ss-quote-bg);\n      }\n      .scaler-ss-card__name {\n        font-size: 16px;\n        font-weight: 700;\n        line-height: 20px;\n        color: var(--ss-text-dark);\n      }\n      .scaler-ss-card__city {\n        font-size: 13px;\n        line-height: 18px;\n        color: var(--ss-text-mid);\n      }\n\n      \/* Before \/ Now transition *\/\n      .scaler-ss-card__transition {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 8px;\n      }\n      .scaler-ss-card__col {\n        flex: 1;\n        min-width: 0;\n      }\n      .scaler-ss-card__col-label {\n        font-size: 11px;\n        font-weight: 600;\n        letter-spacing: 0.4px;\n        color: var(--ss-text-muted);\n        margin-bottom: 2px;\n      }\n      .scaler-ss-card__col-role {\n        font-size: 13px;\n        line-height: 18px;\n        color: var(--ss-text-mid);\n      }\n      .scaler-ss-card__col-company {\n        font-size: 14px;\n        font-weight: 700;\n        line-height: 20px;\n        color: var(--ss-text-dark);\n      }\n      .scaler-ss-card__company-logo {\n        margin-top: 2px;\n        max-width: 64px;\n        max-height: 20px;\n        width: auto;\n        height: auto;\n        object-fit: contain;\n        display: block;\n      }\n      .scaler-ss-card__arrow {\n        flex-shrink: 0;\n        width: 28px;\n        height: 8px;\n        color: var(--ss-text-mid);\n        fill: currentColor;\n      }\n\n      \/* Quote *\/\n      .scaler-ss-card__quote {\n        font-size: 13px;\n        font-style: italic;\n        line-height: 19px;\n        color: var(--ss-text-mid);\n        background: var(--ss-quote-bg);\n        border-radius: var(--ss-radius-sm);\n        padding: 8px 10px;\n      }\n\n      \/* View Profile *\/\n      .scaler-ss-card__cta,\n      .scaler-ss-card__cta:link,\n      .scaler-ss-card__cta:visited {\n        display: block;\n        margin-top: auto;\n        text-align: center;\n        font-size: 14px;\n        font-weight: 600;\n        color: var(--ss-primary) !important;\n        text-decoration: none;\n        border: 1px solid var(--ss-primary);\n        border-radius: var(--ss-radius-sm);\n        padding: 9px 12px;\n        cursor: pointer;\n        transition: background 0.2s ease, color 0.2s ease;\n      }\n      .scaler-ss-card__cta:hover,\n      .scaler-ss-card__cta:focus {\n        background: var(--ss-primary);\n        color: #ffffff !important;\n      }\n\n      \/* Side navigation arrows *\/\n      .scaler-ss__nav {\n        position: absolute !important;\n        top: 50% !important;\n        transform: translateY(-50%) !important;\n        z-index: 2;\n        width: 46px !important;\n        height: 46px !important;\n        min-width: 46px;\n        display: flex !important;\n        align-items: center;\n        justify-content: center;\n        padding: 0 !important;\n        background: var(--ss-card-bg) !important;\n        border: none !important;\n        border-radius: var(--ss-radius-sm) !important;\n        box-shadow: var(--ss-shadow) !important;\n        color: #61738e !important;\n        cursor: pointer;\n        transition: opacity 0.2s ease, visibility 0.2s ease;\n      }\n      .scaler-ss__nav--prev { left: 8px !important; }\n      .scaler-ss__nav--next { right: 8px !important; }\n      .scaler-ss__nav svg {\n        width: 20px !important;\n        height: 20px !important;\n        fill: #61738e !important;\n      }\n      .scaler-ss__nav.swiper-button-disabled {\n        opacity: 0;\n        visibility: hidden;\n        pointer-events: none;\n      }\n\n      .scaler-ss .swiper-button-prev,\n      .scaler-ss .swiper-button-next,\n      .scaler-ss .swiper-pagination { display: none; }\n\n      \/* Skeleton *\/\n      .scaler-ss-card--skeleton { pointer-events: none; }\n      .scaler-ss-card--skeleton .scaler-ss-card__hike,\n      .scaler-ss-card--skeleton .scaler-ss-card__avatar,\n      .scaler-ss-card--skeleton .scaler-ss-card__person-text,\n      .scaler-ss-card--skeleton .scaler-ss-card__transition,\n      .scaler-ss-card--skeleton .scaler-ss-card__quote,\n      .scaler-ss-card--skeleton .scaler-ss-card__cta {\n        background: linear-gradient(90deg, var(--ss-border) 25%, var(--ss-quote-bg) 50%, var(--ss-border) 75%);\n        background-size: 200% 100%;\n        animation: ss-shimmer 1.5s infinite;\n        color: transparent !important;\n        border-color: transparent !important;\n        border-radius: 4px;\n      }\n      .scaler-ss-card--skeleton .scaler-ss-card__person-text { flex: 1; height: 32px; }\n      .scaler-ss-card--skeleton .scaler-ss-card__transition { height: 56px; }\n      .scaler-ss-card--skeleton .scaler-ss-card__quote { height: 48px; }\n      .scaler-ss-card--skeleton .scaler-ss-card__cta { height: 38px; }\n\n      @keyframes ss-shimmer {\n        0% { background-position: 200% 0; }\n        100% { background-position: -200% 0; }\n      }\n\n      @media (max-width: 768px) {\n        .scaler-ss { padding: 16px; }\n        .scaler-ss__heading { font-size: 22px; line-height: 30px; }\n        .scaler-ss-swiper .swiper-slide { width: 270px; }\n        .scaler-ss__nav { display: none !important; }\n      }\n    <\/style>\n\n\n\n    <div class=\"scaler-ss js-scaler-ss\">\n\n      <template class=\"js-ss-card-template\">\n        <div class=\"swiper-slide\">\n          <article class=\"scaler-ss-card\">\n            <div class=\"scaler-ss-card__hike js-ss-hike\"><\/div>\n            <div class=\"scaler-ss-card__body\">\n              <div class=\"scaler-ss-card__person\">\n                <img decoding=\"async\" class=\"scaler-ss-card__avatar js-ss-avatar\" src=\"\" alt=\"\" loading=\"lazy\">\n                <div class=\"scaler-ss-card__person-text\">\n                  <div class=\"scaler-ss-card__name js-ss-name\"><\/div>\n                  <div class=\"scaler-ss-card__city js-ss-city\"><\/div>\n                <\/div>\n              <\/div>\n\n              <div class=\"scaler-ss-card__transition\">\n                <div class=\"scaler-ss-card__col\">\n                  <div class=\"scaler-ss-card__col-label\">BEFORE:<\/div>\n                  <div class=\"scaler-ss-card__col-role js-ss-before-role\"><\/div>\n                  <div class=\"scaler-ss-card__col-company js-ss-before-company\"><\/div>\n                <\/div>\n                <svg class=\"scaler-ss-card__arrow\" viewBox=\"0 0 32 8\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M31.3882 4.35355C31.5835 4.15829 31.5835 3.84171 31.3882 3.64645L28.2062 0.464466C28.011 0.269204 27.6944 0.269204 27.4991 0.464466C27.3039 0.659728 27.3039 0.976311 27.4991 1.17157L30.3276 4L27.4991 6.82843C27.3039 7.02369 27.3039 7.34027 27.4991 7.53553C27.6944 7.7308 28.011 7.7308 28.2062 7.53553L31.3882 4.35355ZM0.034668 4.5H31.0347V3.5H0.034668V4.5Z\"><\/path><\/svg>\n                <div class=\"scaler-ss-card__col\">\n                  <div class=\"scaler-ss-card__col-label\">NOW:<\/div>\n                  <div class=\"scaler-ss-card__col-role js-ss-now-role\"><\/div>\n                  <div class=\"js-ss-now-company\"><\/div>\n                <\/div>\n              <\/div>\n\n              <div class=\"scaler-ss-card__quote js-ss-quote\"><\/div>\n\n              <a class=\"scaler-ss-card__cta js-ss-cta\" href=\"#\" target=\"_blank\" rel=\"noopener\">View Profile<\/a>\n            <\/div>\n          <\/article>\n        <\/div>\n      <\/template>\n\n      <div class=\"scaler-ss__inner\">\n        <h2 class=\"scaler-ss__heading\"><span class=\"ez-toc-section\" id=\"scaler-alumni-and-their-success-stories\"><\/span>Scaler Alumni and Their Success Stories<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n        <div class=\"scaler-ss__swiper-wrap\">\n          <div class=\"swiper scaler-ss-swiper\">\n            <div class=\"swiper-wrapper js-ss-wrapper\"><\/div>\n          <\/div>\n\n          <button class=\"scaler-ss__nav scaler-ss__nav--prev js-ss-prev\" aria-label=\"Previous\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(-90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"><\/path><\/svg>\n          <\/button>\n          <button class=\"scaler-ss__nav scaler-ss__nav--next js-ss-next\" aria-label=\"Next\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"><\/path><\/svg>\n          <\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <script>\n    document.addEventListener(\"DOMContentLoaded\", () => {\n\n      const ASSET_CDN = \"https:\/\/d2beiqkhq929f0.cloudfront.net\/public_assets\/assets\";\n      const AVATAR_FALLBACK =\n        \"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='44' height='44' viewBox='0 0 44 44'%3E%3Ccircle cx='22' cy='22' r='22' fill='%23e6e6e6'\/%3E%3Ccircle cx='22' cy='17' r='7' fill='%23b9b9b9'\/%3E%3Cpath d='M8 40c0-8 6.3-13 14-13s14 5 14 13' fill='%23b9b9b9'\/%3E%3C\/svg%3E\";\n\n      \/\/ Mirrors buildAssetUrl(): pass through absolute urls, else build the CDN url.\n      function buildAssetUrl(raw) {\n        if (!raw) return \"\";\n        if (String(raw).startsWith(\"http\")) return raw;\n        return `${ASSET_CDN}\/${raw}\/original`;\n      }\n\n      const instances = document.querySelectorAll(\".js-scaler-ss\");\n\n      instances.forEach(container => {\n        if (container.dataset.initialized === \"true\") return;\n        container.dataset.initialized = \"true\";\n\n        const swiperElement = container.querySelector(\".scaler-ss-swiper\");\n        const wrapper = container.querySelector(\".js-ss-wrapper\");\n        const template = container.querySelector(\".js-ss-card-template\");\n        const nextBtn = container.querySelector(\".js-ss-next\");\n        const prevBtn = container.querySelector(\".js-ss-prev\");\n\n        if (!wrapper || !template) {\n          console.error(\"Scaler Success Stories: missing required elements\");\n          return;\n        }\n\n        const swiper = new Swiper(swiperElement, {\n          slidesPerView: \"auto\",\n          spaceBetween: 16,\n          grabCursor: true,\n          observer: true,\n          observeParents: true,\n          navigation: { nextEl: nextBtn, prevEl: prevBtn },\n        });\n\n        const pathParts = location.pathname.split(\"\/\").filter(Boolean);\n        const currentSlug = pathParts.length > 0 ? pathParts[pathParts.length - 1] : \"homepage\";\n        const profileUrl =\n          `https:\/\/www.scaler.com\/review\/?utm_source=blog&utm_medium=success_stories&utm_content=${currentSlug}`;\n\n        function showSkeletons(count = 4) {\n          wrapper.innerHTML = \"\";\n          for (let i = 0; i < count; i++) {\n            const clone = template.content.cloneNode(true);\n            clone.querySelector(\".scaler-ss-card\").classList.add(\"scaler-ss-card--skeleton\");\n            wrapper.appendChild(clone);\n          }\n          swiper.update();\n        }\n\n        function renderStories(stories) {\n          wrapper.innerHTML = \"\";\n          if (!stories.length) {\n            container.style.display = \"none\";   \/\/ match topics: render nothing when empty\n            return;\n          }\n\n          stories.forEach(story => {\n            const a = story.attributes || {};\n            const clone = template.content.cloneNode(true);\n\n            const hike = String(a.growth || \"\").replace(\"%\", \"\").trim() || \"150\";\n            clone.querySelector(\".js-ss-hike\").textContent = `${hike}% HIKE`;\n\n            \/\/ Avatar\n            const avatar = buildAssetUrl(a.image_url) || a.generated_thumbnail_url || \"\";\n            const img = clone.querySelector(\".js-ss-avatar\");\n            img.src = avatar || AVATAR_FALLBACK;\n            img.alt = a.name || \"Scaler alumnus\";\n            img.onerror = function () { this.onerror = null; this.src = AVATAR_FALLBACK; };\n\n            clone.querySelector(\".js-ss-name\").textContent = a.name || \"\";\n            const cityEl = clone.querySelector(\".js-ss-city\");\n            if (a.city) cityEl.textContent = a.city; else cityEl.style.display = \"none\";\n\n            \/\/ BEFORE\n            clone.querySelector(\".js-ss-before-role\").textContent = a.pre_scaler_role || a.pre_academy_company || \"\";\n            const beforeCompany = clone.querySelector(\".js-ss-before-company\");\n            if (a.pre_academy_company) beforeCompany.textContent = a.pre_academy_company;\n            else beforeCompany.style.display = \"none\";\n\n            \/\/ NOW\n            clone.querySelector(\".js-ss-now-role\").textContent = a.role || \"\";\n            const nowCompanyBox = clone.querySelector(\".js-ss-now-company\");\n            const companyLogo = buildAssetUrl(a.company_logo_url);\n            if (companyLogo) {\n              const logo = document.createElement(\"img\");\n              logo.className = \"scaler-ss-card__company-logo\";\n              logo.src = companyLogo;\n              logo.alt = a.post_academy_company || \"company\";\n              logo.loading = \"lazy\";\n              logo.onerror = function () {\n                this.onerror = null;\n                this.replaceWith(Object.assign(document.createElement(\"div\"), {\n                  className: \"scaler-ss-card__col-company\",\n                  textContent: a.post_academy_company || \"\",\n                }));\n              };\n              nowCompanyBox.appendChild(logo);\n            } else if (a.post_academy_company) {\n              nowCompanyBox.className = \"scaler-ss-card__col-company\";\n              nowCompanyBox.textContent = a.post_academy_company;\n            }\n\n            \/\/ Quote (clip to 110 chars like topics)\n            const quoteEl = clone.querySelector(\".js-ss-quote\");\n            quoteEl.textContent = `\u201c${String(a.content).slice(0, 110)}\u2026\u201d`;\n\n            \/\/ View Profile\n            clone.querySelector(\".js-ss-cta\").href = profileUrl;\n\n            wrapper.appendChild(clone);\n          });\n\n          swiper.update();\n          swiper.slideTo(0);\n        }\n\n        async function fetchStories() {\n          try {\n            showSkeletons();\n            \/\/ Same-origin POST on www.scaler.com (the blog canonical host).\n            \/\/ The endpoint only returns JSON when the Referer is a \/topics\/ page\n            \/\/ (a soft anti-hotlinking gate); a \/blog\/ referer gets a Turbolinks\n            \/\/ redirect. Since blog + topics are the same origin, we set the\n            \/\/ fetch referrer to a topics URL so the server serves the data.\n            const res = await fetch(\"\/success-stories\/testimonials\", {\n              method: \"POST\",\n              credentials: \"include\",\n              referrer: \"https:\/\/www.scaler.com\/topics\/\",\n              referrerPolicy: \"unsafe-url\",\n              headers: {\n                \"Content-Type\": \"application\/json\",\n                \"Accept\": \"application\/json\",\n                \"X-Requested-With\": \"XMLHttpRequest\",\n              },\n              \/\/ q:{} => all programs (no program filter)\n              body: JSON.stringify({\n                page_number: 1,\n                per_page: 12,\n                sort_by: \"eligible_for_qna\",\n                new_quick_filters: true,\n                quick_filter: [],\n                q: {},\n              }),\n            });\n            const json = await res.json();\n            const all = (json && json.data && json.data.data) || [];\n            \/\/ Only show stories that carry a testimonial quote (matches topics).\n            const withQuote = all.filter(s => s.attributes && s.attributes.content);\n            renderStories(withQuote);\n          } catch (error) {\n            console.error(\"Failed to load success stories:\", error);\n            container.style.display = \"none\";\n          }\n        }\n\n        fetchStories();\n      });\n    });\n    <\/script>\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"how-to-put-database-skills-on-your-resume\"><\/span><strong>How to Put Database Skills on Your Resume<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every claimed skill should have an artefact behind it. \u201cProficient in SQL\u201d is quite overused; a repository containing a schema, migrations, ER diagram, and a README explaining one indexing decision gives an interviewer something they can evaluate.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Portfolio Evidence That Reads as Evidence<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build your database project around the decisions you make about the data. Show the schema, relationships between tables, queries used by the application, and the changes you make as the dataset and access patterns grow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, if a query went from 4.2 seconds to 40 milliseconds, include the execution plans from before and after the change and explain what caused the improvement. You might have added an index, changed the query, or changed the way the data was structured. Show the connection between the problem and the change you made.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keep the migration history with the project as well. Versioned, reversible migrations show how the schema changed as you added features or changed how the application used the data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These details give you specific database decisions to discuss in an interview, from why you chose a particular relationship to what changed in an execution plan and why.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Listing Database Skills on a Resume Without Keyword-Stuffing<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Name the database engine and the capability, rather than repeatedly writing \u201cdatabase.\u201d For example:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL<strong>:<\/strong> schema design, query optimisation with EXPLAIN ANALYZE, indexing and migrations<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Don't list a skill you couldn't defend in an interview. A SQL round can expose a weak claim in four minutes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Where you have a genuine number, include it: queries reduced from 4.2s to 40ms, 30% fewer database calls, or a migration completed without downtime. The number should describe something you actually measured, not a result invented to make the bullet stronger.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As you build your database skills alongside your broader technical skill set, you can also look at how upskilling has affected career transitions in <a href=\"https:\/\/www.scaler.com\/blog\/tech-professionals-witness-150-median-salary-hike-post-upskilling-scaler-career-transition-assessment-report\/\">Scaler\u2019s latest Career Transition Assessment Report<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"conclusion\"><\/span><strong>Conclusion<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Database skills start with understanding how data is structured and queried, but the way you work with a database changes as the application around it grows. You\u2019ll move from writing queries and modelling relationships to thinking about indexes, query plans, transactions, concurrency, recovery, and the data stores that fit different requirements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use the six tiers to decide where you want to build further. Foundations and Querying give you the base for working with relational databases; from there, Design, Performance, Operations, and Modern Databases become more relevant depending on the role and systems you want to work with.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pick a project with a real dataset and start investigating how the database handles your queries. Run EXPLAIN ANALYZE, look at the execution plan, change something, and run it again. That process will teach you far more about database performance than looking at the query alone.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"faq\"><\/span><strong>FAQ<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. What are database skills?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Database skills cover six areas: Foundations, Querying, Design, Performance, Operations, and Modern database technologies. Together, they include relational concepts, SQL, schema design, indexing, query optimisation, transactions, recovery, and newer approaches such as NoSQL and vector storage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. What database skills do employers look for?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You\u2019ll see SQL and database fundamentals in most database-related roles, but the skills you work with after that depend on the kind of role you\u2019re targeting. Schema design and indexing become important when you\u2019re building application databases, while query optimisation, transactions, isolation, and database operations become more important as you work with larger and more heavily used systems.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For interviews, be ready to explain why you chose a particular schema or index, read an execution plan, find the cause of a slow query, and understand what happens when multiple transactions access the same data.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. Is SQL the same as database skills?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No. SQL covers querying, but database work also involves schema design, indexing, performance, transactions, operations, and choosing the right data store for a given workload.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. What are the basic database skills a beginner should learn first?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start with the relational model, keys and constraints, 3NF, joins, and GROUP BY. Work with these concepts on a real dataset so you can see how they affect the way data is structured and queried. From there, move into indexing, query performance, transactions, and NoSQL as your projects introduce those requirements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>5. How can I improve my database skills?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can improve your database skills by working through problems where you have to decide how the data should be stored, queried, and updated. Start with a real application or dataset and practise writing queries, reading execution plans, finding the cause of slow queries, and changing the schema or indexes when the requirements call for it. As you work on larger projects, take on problems involving more tables, more data, concurrency, and different access patterns.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>6. How long does it take to get good at databases?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can build a foundation in querying in roughly 4 - 8 weeks with consistent practice. Give yourself more time for schema design, query performance, and database operations, since these skills develop through working with different schemas, workloads, concurrency patterns, and failure scenarios.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>7. Do I need to learn NoSQL as well as SQL?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start with a relational database and work with its tables, relationships, queries, indexes, and transactions. Once you have built a few projects with those concepts, you can explore NoSQL databases and see where their data models and access patterns fit. Pick the systems that match the kind of applications you want to build and go deeper into those.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>8. How do I list database skills on a resume?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Name the database engines you have worked with and the specific work you did. For example, list PostgreSQL alongside schema design, EXPLAIN ANALYZE, indexing, or migrations if you have actually used them. Only list skills you can defend in an interview.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>9. Are database skills still worth learning now that AI can write SQL?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. AI can generate SQL, but you still need to check the result, handle edge cases, and understand its performance against the schema and workload. Database knowledge lets you review the query properly and change it when necessary.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>When you work with a database, the way you structure and access the data affects almost everything built on top of it. A poorly chosen schema can make common operations difficult, an unnecessary join can slow down a query, and a missing index can turn a simple lookup into an expensive operation as the data [&hellip;]<\/p>\n","protected":false},"author":242,"featured_media":14454,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[373],"tags":[620],"class_list":["post-14453","post","type-post","status-publish","format-standard","has-post-thumbnail","category-database-management","tag-database-skills"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts\/14453","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/users\/242"}],"replies":[{"embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/comments?post=14453"}],"version-history":[{"count":1,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts\/14453\/revisions"}],"predecessor-version":[{"id":14455,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts\/14453\/revisions\/14455"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/media\/14454"}],"wp:attachment":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/media?parent=14453"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/categories?post=14453"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/tags?post=14453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}