{
  "assessmentTests": {
    "sql_test": {
      "name": "SQL тесті",
      "desc": "Сүзгілеу, JOIN, агрегаттау, ішкі сұраныстар (subquery) және терезелік функциялар бойынша 30 сценарийлік сұрақ — SQL білігіңіз жұмыс хабарландыруларындағы «SQL меңгеру» талабына сай келе ме, соны анықтаңыз.",
      "recommendation": "Сіздің SQL дағдыларыңыздың профилі",
      "results": {
        "beginner": {
          "name": "Бастауыш деңгей",
          "desc": "Сіз жұмыс істейтін SELECT операторын жаза аласыз және бірнеше шарт бойынша сүзгілей аласыз, бірақ қателескен сұрақтарыңыз синтаксиске емес, негізінен NULL мәндерін өңдеуге және JOIN механикасына қатысты — бағанды NULL-мен = арқылы салыстыру, LEFT JOIN нақты қандай жолдарды сақтайтыны, BETWEEN шекараларының қалай жұмыс істейтіні. Бұның бәрі деректер қорын нашар білу дегенді білдірмейді; бұл SQL-ды стандарт бойынша емес, сынақ пен қателік арқылы үйренген адамдарды әдетте шатастыратын нақты ережелер. Олар жұмыста маңызды, өйткені әр жағдайда сұраныс сырт көзге дұрыс көрінетін, бірақ шын мәнінде қате жол санын қайтарады.",
          "recommendation": "Үш нәрседен осы ретпен бастаңыз: неге WHERE col = NULL ешқашан ешнәрсеге сәйкес келмейді (оның орнына IS NULL қажет), INNER JOIN сәйкессіз жолдарды қалай алып тастайтыны және LEFT JOIN оларды қалай сақтайтыны, сондай-ақ BETWEEN нақты қай шекараларды қосатыны. Mode Analytics-тің SQL оқулығы мен PostgreSQL құжаттамасының екеуі де осы үшеуін де іске қосуға болатын мысалдармен түсіндіреді."
        },
        "intermediate": {
          "name": "Орта деңгей",
          "desc": "Сіз күнделікті есеп беру сұраныстарын еркін меңгергенсіз — JOIN, GROUP BY, қарапайым сүзгілеу — және кәдімгі дашборд немесе жедел талдау жұмысы сізді қиналтпайды. Осы деңгей мен «Жетілдірілген» деңгей арасындағы алшақтық негізінен шарттар бір-бірімен әрекеттескенде не болатынына байланысты: біріктірілген кестедегі WHERE шарты LEFT JOIN-ды байқаусызда қайтадан INNER JOIN-ға айналдырып жібереді, агрегат қолданылғанға дейін JOIN жол санын көбейтіп жібереді, ішкі сұранысқа бір ғана NULL түсіп кеткендіктен NOT IN ешнәрсе қайтармай үнсіз қалады. Мұндай қателер тез көзбен тексергенде байқалмайды және тек біреу жалпы соманы басқа есеппен салыстырғанда ғана көрінеді.",
          "recommendation": "Әр шарттың жеке не істейтініне емес, шарттардың бір-бірімен қалай әрекеттесетініне назар аударыңыз: WHERE-дің LEFT JOIN-ның оң жақ бағандарын сүзгілеуі, агрегаттаудан бұрын «бірден-көпке» JOIN-нан туындайтын жол санының көбеюі, және NULL болған кезде NOT IN неге бұзылатыны (ал EXISTS әдетте бұзылмайды). Одан кейін HAVING мен WHERE айырмашылығын қараңыз, өйткені бұл екі шартты жеке-жеке білсе де, көп адамды шатастырады."
        },
        "advanced": {
          "name": "Жетілдірілген деңгей",
          "desc": "Бұл көптеген жұмыс хабарландыруларында «күшті SQL» деп аталатын деңгей. Сіз бірнеше JOIN бар сұранысты оқып, оны іске қоспас бұрын қанша жол қайтаратынын болжай аласыз, нәтиже жиынтығының тек өзгергенін ғана емес, неге өзгергенін де білесіз, әрі анығырақ құрал болған жағдайда ұялас ішкі сұраныстың орнына CTE немесе терезелік функцияны қолданасыз. Бұл деңгейді ең жоғарғысынан бөлетін — жұмыстың қорғаныс жағы: тең мәндер маңызды болғанда қай дәрежелеу (ranking) функциясын қолдану керегін, транзакция бір мезгілдегі басқа сеанстан нені оқшаулайтынын және ON DELETE ережесі көрсетілмегенде деректер қоры деңгейінде нақты не болатынын білу.",
          "recommendation": "Басқа адамдар да қатынасатын деректерді қорғайтын бөліктерге тереңдей түсіңіз: тең мәндер кезінде RANK, DENSE_RANK және ROW_NUMBER арасындағы айырмашылық, COMMIT нақты нені және кімге көрінетін ететіні, сондай-ақ DELETE кезіндегі FOREIGN KEY тәртібі. Терезелік функциялар мен транзакция оқшаулануы бойынша келесі қадам ретінде The Index бюллетенінің немесе SQL for Devs-тің тереңдетілген материалдарын пайдаланыңыз."
        },
        "expert": {
          "name": "Сарапшы деңгейі",
          "desc": "Сіз әр бөлімде ең жоғары нәтиже көрсеттіңіз — сүзгілеу және NULL семантикасы, JOIN мен жиындар амалдары, агрегаттау мен ішкі сұраныстар, терезелік функциялар, CTE және шектеулер (constraints). Іс жүзінде бұл — сізге бөтен адамның бірнеше JOIN бар есеп сұранысын берсе, ол неліктен дәл осы жол санын қайтаратынын, тек синтаксис бойынша не қайтаруы керегін емес, түсіндіре аласыз дегенді білдіреді, ал бұл әлдеқайда қиын әрі құндырақ дағды. Бұл деңгейде сұраныс тілінің өзі сирек шектеуші фактор болады; шектеу әдетте схема жобалауында немесе астындағы деректер көлемінде болады.",
          "recommendation": "Енді нәтиже орындалу жоспарлары мен жобалауда: сұраныс баяу деп есептеместен бұрын EXPLAIN шығысын оқу, индекстеу стратегиясын тегін пайда емес, жазу құнына қарсы ымыра ретінде қарастыру, және схема өскен сайын өз күшінде қалатын нормализациялау шешімдері. Егер сізді лауазымға сынап жатса, SQL мүмкіндіктерінің атын атаудың орнына, продакшннан тапқан JOIN-ның көбеюі немесе NOT IN/NULL тұзағы сияқты нақты қате жағдайды сипаттаңыз — бұл тек терминологияны емес, ойлау логикасын көрсетеді."
        }
      },
      "questions": [
        {
          "question": "Кестеде NULL мәнін қабылдай алатын age бағаны бар. Сіз SELECT * FROM users WHERE age = NULL сұранысын орындайсыз. Тіпті бірнеше жолда age мәні NULL болса да, бұл сұраныс қанша жол қайтарады?",
          "options": [
            {
              "icon": "",
              "label": "age мәні NULL болатын әрбір жол, себебі = операторы NULL-ды кез келген басқа мән сияқты салыстырады"
            },
            {
              "icon": "",
              "label": "Нөл — кез келген мәнді NULL-мен = арқылы салыстыру әрқашан UNKNOWN нәтижесін береді, ешқашан TRUE болмайды, сондықтан ешбір жол сәйкес келмейді; оның орнына IS NULL қолданылуы керек"
            },
            {
              "icon": "",
              "label": "Синтаксистік қате — NULL = операторының оң жағында тұра алмайды"
            },
            {
              "icon": "",
              "label": "Кестедегі әрбір жол, себебі NULL салыстырулары әдепкі бойынша TRUE болады"
            }
          ]
        },
        {
          "question": "Сіз SELECT DISTINCT department, role FROM employees сұранысын орындайсыз. DISTINCT нақты нені қайталанудан тазартады?",
          "options": [
            {
              "icon": "",
              "label": "department пен role-дың бірлескен тіркесімін — жол тек екі баған да басқа жолмен дәл сәйкес келгенде ғана алынып тасталады"
            },
            {
              "icon": "",
              "label": "Тек қайталанатын department мәндерін ғана, барлық role мәндерін сақтай отырып"
            },
            {
              "icon": "",
              "label": "Тек қайталанатын role мәндерін ғана, барлық department мәндерін сақтай отырып"
            },
            {
              "icon": "",
              "label": "Ешнәрсені — DISTINCT тек бір бағанмен ғана жұмыс істейді"
            }
          ]
        },
        {
          "question": "name бағаны WHERE name LIKE 'A_' арқылы сүзгіленеді. Мына мәндердің қайсысы сәйкес келеді: 'A', 'Al', 'Ana', 'Ally'?",
          "options": [
            {
              "icon": "",
              "label": "'A' — астыңғы сызық (underscore) міндетті емес және нөл немесе одан көп таңбаға сәйкес келеді"
            },
            {
              "icon": "",
              "label": "'Al' — астыңғы сызық дәл бір таңбаға сәйкес келеді, сондықтан LIKE 'A_' A-дан басталатын кез келген екі таңбалы жолға сәйкес келеді"
            },
            {
              "icon": "",
              "label": "'Ana' және 'Ally' — астыңғы сызық соңындағы кез келген санда таңбаға сәйкес келеді"
            },
            {
              "icon": "",
              "label": "Барлық төрт мән сәйкес келеді, себебі LIKE ұзындықты елемейді"
            }
          ]
        },
        {
          "question": "price бағаны WHERE price BETWEEN 10 AND 20 арқылы сүзгіленеді. price мәні дәл 10 немесе дәл 20 болатын жолдар нәтижеге кіре ме?",
          "options": [
            {
              "icon": "",
              "label": "Жоқ — BETWEEN екі шеткі мәнді де қоспайды"
            },
            {
              "icon": "",
              "label": "Иә — BETWEEN екі шетінде де қосады, бұл price >= 10 AND price <= 20 дегенмен пара-пар"
            },
            {
              "icon": "",
              "label": "Тек price = 10 қосылады; жоғарғы шек қосылмайды"
            },
            {
              "icon": "",
              "label": "Тек price = 20 қосылады; төменгі шек қосылмайды"
            }
          ]
        },
        {
          "question": "orders кестесінде 10 жол бар, оның 3-інде shipped_date мәні NULL. SELECT COUNT(*) FROM orders нені қайтарады, ал SELECT COUNT(shipped_date) FROM orders нені қайтарады?",
          "options": [
            {
              "icon": "",
              "label": "10, содан кейін 10 — COUNT NULL мәндеріне қарамастан әрқашан жолдарды санайды"
            },
            {
              "icon": "",
              "label": "7, содан кейін 7 — екі түрі де NULL жолдарын өткізіп жібереді"
            },
            {
              "icon": "",
              "label": "10, содан кейін 7 — COUNT(*) әрбір жолды санайды, ал COUNT(баған) тек сол баған NULL болмаған жолдарды ғана санайды"
            },
            {
              "icon": "",
              "label": "10, содан кейін 3 — COUNT(баған) тек NULL мәндерін ғана санайды"
            }
          ]
        },
        {
          "question": "Сіз SELECT name, salary FROM employees ORDER BY 2 DESC сұранысын орындайсыз. Мұндағы 2 санының мағынасы қандай?",
          "options": [
            {
              "icon": "",
              "label": "Синтаксистік қате — ORDER BY тек баған атауларын қабылдайды, сандарды емес"
            },
            {
              "icon": "",
              "label": "Нәтиженің екінші жолы"
            },
            {
              "icon": "",
              "label": "Тең мәндерді ажырату үшін қолданылатын 2 деген литерал мән"
            },
            {
              "icon": "",
              "label": "SELECT тізіміндегі екінші баған, яғни salary — ORDER BY бағанның реттік нөмірін қысқаша белгі ретінде қабылдайды"
            }
          ]
        },
        {
          "question": "Стандартты SQL-де 'Ana' || ' ' || 'Lee' өрнегінің нәтижесі қандай болады?",
          "options": [
            {
              "icon": "",
              "label": "Синтаксистік қате — SQL-де біріктіру (concatenation) операторы жоқ"
            },
            {
              "icon": "",
              "label": "3 — || логикалық OR ретінде қарастырылып, сан қайтарады"
            },
            {
              "icon": "",
              "label": "'AnaLee' — || бос орындарды сақтамай біріктіреді"
            },
            {
              "icon": "",
              "label": "'Ana Lee' — || стандартты SQL-дегі жолдарды біріктіру операторы"
            }
          ]
        },
        {
          "question": "Осылардың қайсысы WHERE status IN ('open', 'pending', 'review') дегенмен дәл пара-пар?",
          "options": [
            {
              "icon": "",
              "label": "WHERE status = 'open' AND status = 'pending' AND status = 'review'"
            },
            {
              "icon": "",
              "label": "WHERE status != 'open' OR status != 'pending' OR status != 'review'"
            },
            {
              "icon": "",
              "label": "WHERE status = 'open' OR status = 'pending' OR status = 'review'"
            },
            {
              "icon": "",
              "label": "WHERE status LIKE 'open,pending,review'"
            }
          ]
        },
        {
          "question": "customers кестесінде 100 жол бар; олардың 20-сы ешқашан тапсырыс бермеген. Сіз SELECT c.id FROM customers c INNER JOIN orders o ON c.id = o.customer_id сұранысын орындайсыз. Тапсырысы жоқ 20 клиент нәтижеде көрінеді ме?",
          "options": [
            {
              "icon": "",
              "label": "Иә, әрқайсысы бір рет, o.id мәні NULL түрінде көрсетіліп"
            },
            {
              "icon": "",
              "label": "Иә, бірақ тек олар WHERE шартында да көрсетілсе ғана"
            },
            {
              "icon": "",
              "label": "Жоқ — INNER JOIN тек екі кестеде де сәйкестігі бар жолдарды ғана қайтарады, сондықтан тапсырысы жоқ клиенттер толығымен алынып тасталады"
            },
            {
              "icon": "",
              "label": "Иә, orders-тегі әрбір баған үшін бір рет қайталанып"
            }
          ]
        },
        {
          "question": "Сізге тапсырысы бар-жоғына қарамастан барлық клиент керек, сондықтан SELECT c.id, o.total FROM customers c LEFT JOIN orders o ON c.id = o.customer_id WHERE o.total > 100 деп жазасыз. Бұл сұраныс тапсырысы жоқ клиенттерді әлі де қайтара ма?",
          "options": [
            {
              "icon": "",
              "label": "Жоқ — WHERE шартындағы o.total бойынша сүзгілеу LEFT JOIN сәйкессіз клиенттер үшін жасаған NULL жолдарын алып тастайды, сондықтан бұл INNER JOIN сияқты әрекет етеді"
            },
            {
              "icon": "",
              "label": "Иә — LEFT JOIN одан кейін не жазылғанына қарамастан customers-тегі әрбір жолды әрқашан сақтайды"
            },
            {
              "icon": "",
              "label": "Иә, тапсырысы жоқ клиенттер үшін o.total мәні 0 болып көрсетіліп"
            },
            {
              "icon": "",
              "label": "Жоқ — WHERE шарты қосылғанда LEFT JOIN өздігінен байқаусызда RIGHT JOIN-ға айналады"
            }
          ]
        },
        {
          "question": "employees кестесінде id бағаны және басқа жолдың id-ін көрсететін manager_id бағаны бар. Әрбір қызметкерді оның менеджерінің атымен қатар көрсету үшін кестені өзіне-өзін біріктіресіз: SELECT e.name, m.name FROM employees e JOIN employees m ON e.manager_id = m.id. Бұл үлгі қалай аталады?",
          "options": [
            {
              "icon": "",
              "label": "Cross join — әрбір қызметкер әрбір менеджермен сәйкестендіріледі"
            },
            {
              "icon": "",
              "label": "Рекурсивті join — ол толық басқару тізбегін алады"
            },
            {
              "icon": "",
              "label": "Self-join — бір кесте екі түрлі бүркеншік атпен (alias) өзіне-өзі біріктіріледі"
            },
            {
              "icon": "",
              "label": "Бұл жарамсыз SQL — кестені өзіне-өзін біріктіруге болмайды"
            }
          ]
        },
        {
          "question": "Бірдей бағандары бар екі SELECT сұранысы UNION арқылы біріктіріледі. Егер екі сұраныс та бірдей жолды қайтарса, түпкі нәтижеде сол жолдың қанша көшірмесі болады?",
          "options": [
            {
              "icon": "",
              "label": "Бір — UNION біріктірілген нәтижедегі қайталанатын жолдарды алып тастайды; UNION ALL болса екі көшірмені де сақтар еді"
            },
            {
              "icon": "",
              "label": "Екі — UNION екі сұраныстың да барлық жолын сақтайды"
            },
            {
              "icon": "",
              "label": "Нөл — UNION екі сұраныста да кездесетін кез келген жолды алып тастайды"
            },
            {
              "icon": "",
              "label": "Бұл жолды қай сұраныс бірінші тізгеніне байланысты"
            }
          ]
        },
        {
          "question": "sizes кестесінде 3 жол, ал colors кестесінде 4 жол бар. SELECT * FROM sizes CROSS JOIN colors қанша жол қайтарады?",
          "options": [
            {
              "icon": "",
              "label": "7 — CROSS JOIN жол сандарын қосады"
            },
            {
              "icon": "",
              "label": "12 — CROSS JOIN екі кестенің жолдарының мүмкін болатын барлық тіркесімін қайтарады (3 x 4)"
            },
            {
              "icon": "",
              "label": "3 — CROSS JOIN бірінші кестенің әрбір жолына бір жолдан қайтарады"
            },
            {
              "icon": "",
              "label": "0 — CROSS JOIN-ға ON шарты қажет, әйтпесе ол ешнәрсе қайтармайды"
            }
          ]
        },
        {
          "question": "orders кестесінде №100 тапсырыс үшін 1 жол бар, ал order_items кестесінде №100 тапсырыс үшін 3 жол бар (әр позиция үшін біреуден). Сіз SELECT o.id, o.total FROM orders o JOIN order_items i ON o.id = i.order_id WHERE o.id = 100 сұранысын орындайсыз. №100 тапсырыс үшін қанша жол қайтады?",
          "options": [
            {
              "icon": "",
              "label": "3 — join сәйкес келетін әрбір order_items жолы үшін бір шығыс жол жасайды, сондықтан №100 тапсырыстың жалғыз жолы әрбір позиция үшін бір рет қайталанады"
            },
            {
              "icon": "",
              "label": "1 — orders-те №100 тапсырыс үшін тек бір ғана жол бар, сондықтан join одан көп жасай алмайды"
            },
            {
              "icon": "",
              "label": "4 — тапсырыс үшін бір жол, оған қоса әрбір позиция үшін бір жолдан"
            },
            {
              "icon": "",
              "label": "0 — бір жолды кестені үш жолды кестемен бірегей емес кілт бойынша біріктіру сәтсіз аяқталады"
            }
          ]
        },
        {
          "question": "SELECT c.name, o.id FROM customers c RIGHT JOIN orders o ON c.id = o.customer_id сұранысы төмендегілердің қайсысымен бірдей жолдар қайтарады?",
          "options": [
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM customers c INNER JOIN orders o ON c.id = o.customer_id"
            },
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM orders o LEFT JOIN customers c ON c.id = o.customer_id — кестелердің ретін ауыстырып, RIGHT JOIN-ның орнына LEFT JOIN қолдану пара-пар нәтиже береді"
            },
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM customers c LEFT JOIN orders o ON c.id = o.customer_id"
            },
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM orders o CROSS JOIN customers c"
            }
          ]
        },
        {
          "question": "Стандартты SQL-де сіз SELECT department, name, AVG(salary) FROM employees GROUP BY department сұранысын орындайсыз. Бұл жарамды сұраныс па?",
          "options": [
            {
              "icon": "",
              "label": "Иә — GROUP BY тек department-ті ғана қамтуы керек, себебі ол бірінші тізілген"
            },
            {
              "icon": "",
              "label": "Жоқ — name таңдалған, бірақ ол агрегатталмаған да, GROUP BY-да тізілмеген де; стандартты SQL агрегатталмаған әрбір таңдалған бағанның GROUP BY шартында болуын талап етеді"
            },
            {
              "icon": "",
              "label": "Иә — SQL әрбір department үшін кездейсоқ бір name мәнін автоматты түрде таңдайды"
            },
            {
              "icon": "",
              "label": "Жоқ — AVG() функциясын бір сұраныста GROUP BY-мен бірге қолдануға болмайды"
            }
          ]
        },
        {
          "question": "Сізге орташа жалақысы 80000-нан асатын бөлімдер керек. AVG(salary) сияқты агрегатталған мәнді топтастырудан кейін қай шарт сүзгілейді — WHERE ме, әлде HAVING ма?",
          "options": [
            {
              "icon": "",
              "label": "WHERE — HAVING тек UNION сұраныстарында ғана қолданылады"
            },
            {
              "icon": "",
              "label": "Екеуі де агрегат функцияларымен бірдей жұмыс істейді"
            },
            {
              "icon": "",
              "label": "Екеуі де емес — агрегатты сүзгілеу үшін ішкі сұраныс қажет"
            },
            {
              "icon": "",
              "label": "HAVING — WHERE топтастыру болғанға дейін жеке жолдарды сүзгілейді, ал HAVING агрегаттаудан кейін топтарды сүзгілейді"
            }
          ]
        },
        {
          "question": "Сіз SELECT salary * 1.1 AS new_salary FROM employees WHERE new_salary > 50000 деп жазасыз. Бұл орындала ма?",
          "options": [
            {
              "icon": "",
              "label": "Иә — SELECT-те анықталған бүркеншік аттар (alias) сол сұраныстағы WHERE-де әрқашан қолжетімді болады"
            },
            {
              "icon": "",
              "label": "Иә, бірақ тек сандық бүркеншік аттар үшін ғана"
            },
            {
              "icon": "",
              "label": "Жоқ — WHERE арқылы сүзгіленетін сұраныста AS қолдануға болмайды"
            },
            {
              "icon": "",
              "label": "Жоқ — WHERE SELECT-тің new_salary бүркеншік атын тағайындауынан бұрын есептеледі, сондықтан орындалудың сол сәтінде бұл бүркеншік ат әлі жоқ"
            }
          ]
        },
        {
          "question": "SELECT name FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department = e.department). Мұны неге байланысты (correlated) ішкі сұраныс деп атайды?",
          "options": [
            {
              "icon": "",
              "label": "Себебі ол WHERE шартының орнына JOIN қолданады"
            },
            {
              "icon": "",
              "label": "Ішкі сұраныс сыртқы сұраныстағы e.department-ке сілтейді, сондықтан ол сыртқы сұраныс қарастыратын әрбір жол үшін қайта есептелуі керек"
            },
            {
              "icon": "",
              "label": "Себебі ол бірден көп баған қайтарады"
            },
            {
              "icon": "",
              "label": "Себебі ол сыртқы сұраныс басталмас бұрын дәл бір рет орындалады"
            }
          ]
        },
        {
          "question": "SELECT manager_id FROM employees ішкі сұранысы нақты id-лармен қатар кейбір NULL мәндерін де қайтарады. Сіз SELECT name FROM employees WHERE id NOT IN (SELECT manager_id FROM employees) сұранысын орындайсыз. Не болады?",
          "options": [
            {
              "icon": "",
              "label": "Ол NULL мәндерін елемей, менеджер болып табылмайтын әрбір қызметкерді қайтарады"
            },
            {
              "icon": "",
              "label": "Ол нөл жол қайтарады — NOT IN тізіміндегі бір ғана NULL әрбір салыстыруды UNKNOWN етеді, сондықтан ешбір жол бұл шартты қанағаттандыра алмайды"
            },
            {
              "icon": "",
              "label": "Ол қате шығарады, себебі NOT IN ішкі сұраныстармен қолданылмайды"
            },
            {
              "icon": "",
              "label": "Ол барлық қызметкерді қайтарады, себебі NULL қойылмалы белгі (wildcard) ретінде қарастырылады"
            }
          ]
        },
        {
          "question": "SELECT name FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id). Бұл сұраныс нені қайтарады?",
          "options": [
            {
              "icon": "",
              "label": "orders-те кемінде бір жолы бар әрбір клиент — EXISTS тек ішкі сұраныс қандай да бір жол қайтара ма, соны ғана тексереді, олардың мәндерін емес"
            },
            {
              "icon": "",
              "label": "Барлық клиент, себебі SELECT 1 әрқашан true қайтарады"
            },
            {
              "icon": "",
              "label": "Қате, себебі ішкі сұраныс баған атауының орнына сан таңдайды"
            },
            {
              "icon": "",
              "label": "Дәл бір тапсырысы бар клиенттер ғана"
            }
          ]
        },
        {
          "question": "Сіз SELECT name, (SELECT order_id FROM orders WHERE customer_id = c.id) AS last_order FROM customers c деп жазасыз, ал белгілі бір клиенттің orders-те 3 жолы бар. Бұл сұраныс орындалғанда не болады?",
          "options": [
            {
              "icon": "",
              "label": "Ол алғашқы сәйкес келетін order_id-ды қайтарады да, қалған екеуін үнсіз елемейді"
            },
            {
              "icon": "",
              "label": "Ол үш order_id-дың үтірмен бөлінген тізімін қайтарады"
            },
            {
              "icon": "",
              "label": "Ол сол клиент үшін 3 жол қайтарады, әр тапсырысқа бір жолдан"
            },
            {
              "icon": "",
              "label": "Ол орындалу кезінде қате шығарады — SELECT тізіміндегі скалярлық ішкі сұраныс ең көбі бір жол қайтаруы керек, ал бұл үш жол қайтарады"
            }
          ]
        },
        {
          "question": "Төрт жол ең жоғары ұпай бойынша тең түсті. RANK() ORDER BY score DESC қолданғанда төртеуі де 1-дәреже алады. Одан кейінгі жол қандай дәреже алады?",
          "options": [
            {
              "icon": "",
              "label": "5 — RANK() жалғастырмас бұрын тең түскен жолдар санына тең алшақтық қалдырады"
            },
            {
              "icon": "",
              "label": "2 — RANK() кез келген тең түсуден кейін әрқашан дәл бірге өседі"
            },
            {
              "icon": "",
              "label": "1 — келесі әрбір жол да 1-дәреже алады"
            },
            {
              "icon": "",
              "label": "4 — RANK() санауды тең түскен жолдар санынан қайта бастайды"
            }
          ]
        },
        {
          "question": "Төрт жол ең жоғары ұпай бойынша тең түсті. DENSE_RANK() ORDER BY score DESC қолданғанда төртеуі де 1-дәреже алады. Одан кейінгі жол қандай дәреже алады?",
          "options": [
            {
              "icon": "",
              "label": "5 — DENSE_RANK() дәл RANK() сияқты әрекет етеді"
            },
            {
              "icon": "",
              "label": "1 — DENSE_RANK() қалған әрбір жолға бірдей дәреже береді"
            },
            {
              "icon": "",
              "label": "2 — DENSE_RANK() ешқашан алшақтық қалдырмайды, сондықтан келесі бөлек мән әрқашан кезекті дәрежені алады"
            },
            {
              "icon": "",
              "label": "3 — DENSE_RANK() әрбір тең түсу тобы үшін бір дәрежені өткізіп жібереді"
            }
          ]
        },
        {
          "question": "Сұранысқа SUM(amount) OVER (PARTITION BY region ORDER BY amount) қосылды. Мұнда PARTITION BY region нені істейді?",
          "options": [
            {
              "icon": "",
              "label": "Ол жинақталған соманы бүкіл нәтиже жиынтығы бойынша жинақтаудың орнына, әрбір аймақ үшін бөлек қайта бастайды"
            },
            {
              "icon": "",
              "label": "Ол нәтижелерді бір ғана аймаққа дейін сүзгілейді"
            },
            {
              "icon": "",
              "label": "Ол жолдарды GROUP BY сияқты топтастырып, әр аймақ үшін бір жолға дейін тарылтады"
            },
            {
              "icon": "",
              "label": "Ол қосуды бастамас бұрын аймақтарды алфавит бойынша сұрыптайды"
            }
          ]
        },
        {
          "question": "ROW_NUMBER() OVER (ORDER BY score DESC) бес жолға қолданылады, олардың екеуі ұпай бойынша дәл тең түскен. Екі жол ешқашан бірдей жол нөмірін ала ма?",
          "options": [
            {
              "icon": "",
              "label": "Иә — тең түскен жолдар әрқашан бірдей жол нөмірін бөліседі"
            },
            {
              "icon": "",
              "label": "Тек PARTITION BY де қолданылса ғана"
            },
            {
              "icon": "",
              "label": "Бұл тең түсу бірінші немесе соңғы позицияда болуына байланысты"
            },
            {
              "icon": "",
              "label": "Жоқ — ROW_NUMBER() мәндер тең түскен күнде де әрбір жолға бірегей, қатаң өсетін бүтін сан береді"
            }
          ]
        },
        {
          "question": "WITH high_earners AS (SELECT * FROM employees WHERE salary > 100000) SELECT department, COUNT(*) FROM high_earners GROUP BY department. high_earners деген не?",
          "options": [
            {
              "icon": "",
              "label": "Ортақ кестелік өрнек (common table expression, CTE) — сұраныстың қалған бөлігі кесте ретінде сілтей алатын аталған, уақытша нәтиже жиынтығы"
            },
            {
              "icon": "",
              "label": "Деректер қорында жасалған тұрақты кесте"
            },
            {
              "icon": "",
              "label": "Сұраныс аяқталғаннан кейін де сақталатын view (көрініс)"
            },
            {
              "icon": "",
              "label": "Бөлек шақырылуы тиіс сақталған процедура"
            }
          ]
        },
        {
          "question": "Баған PRIMARY KEY ретінде жарияланған. Сол баған мәні NULL болатын жол қоса аласыз ба?",
          "options": [
            {
              "icon": "",
              "label": "Иә — PRIMARY KEY тек бірегейлікті ғана талап етеді, NULL болмауын емес"
            },
            {
              "icon": "",
              "label": "Иә, бірақ UNIQUE шектеуіндегідей тек бір ғана NULL жолға рұқсат етіледі"
            },
            {
              "icon": "",
              "label": "Жоқ — PRIMARY KEY бағаны айқын емес түрде NOT NULL болып саналады, сондықтан оған NULL қосу қабылданбайды"
            },
            {
              "icon": "",
              "label": "Бұл бағанда әдепкі мән (default value) бар-жоғына байланысты"
            }
          ]
        },
        {
          "question": "Ашық транзакция ішінде сіз UPDATE орындайсыз, бірақ әлі COMMIT жасаған жоқсыз. Деректер қорына жасалған екінші, бөлек қосылымнан бұл өзгеріс көрінеді ме?",
          "options": [
            {
              "icon": "",
              "label": "Иә — барлық қосылымдар әрбір жазуды ол орындалған сәтте-ақ көреді"
            },
            {
              "icon": "",
              "label": "Иә, бірақ тек екінші қосылым да транзакция ашса ғана"
            },
            {
              "icon": "",
              "label": "Бұл тек қай кесте жаңартылғанына ғана байланысты"
            },
            {
              "icon": "",
              "label": "Жоқ — расталмаған өзгеріс тек оны жасаған транзакция ішінде ғана көрінеді, ал COMMIT оны тұрақты әрі басқаларға көрінетін еткенге дейін солай болады"
            }
          ]
        },
        {
          "question": "products.category_id бағанында categories.id-ге сілтейтін FOREIGN KEY шектеуі бар. Сіз ON DELETE ережесі көрсетілмеген күйде, әлі де products сілтеп тұрған categories жолын DELETE арқылы жойғыңыз келеді. Не болады?",
          "options": [
            {
              "icon": "",
              "label": "Категория жолы жойылады, ал сәйкес products.category_id мәндері автоматты түрде NULL-ге орнатылады"
            },
            {
              "icon": "",
              "label": "Категория жолы жойылады және оған сілтеген әрбір өнім де жойылады"
            },
            {
              "icon": "",
              "label": "DELETE қабылданбайды — FOREIGN KEY-дің әдепкі тәртібі, тәуелді жолдар әлі сілтеп тұрған кезде, сілтеме жасалған жолды жоюға тыйым салады"
            },
            {
              "icon": "",
              "label": "DELETE үнсіз сәтті орындалады, нәтижесінде өнімдердің category_id мәні енді жоқ категорияға сілтеп қалады"
            }
          ]
        }
      ],
      "optionOrderVersion": "e0466e547cfd8a45"
    }
  }
}
