{
  "assessmentTests": {
    "sql_test": {
      "name": "Bài Kiểm Tra SQL",
      "desc": "30 câu hỏi tình huống về lọc, join, tổng hợp, subquery và hàm cửa sổ — tìm hiểu liệu kỹ năng SQL của bạn có phù hợp với ý nghĩa của thông báo tuyển dụng hay không.",
      "recommendation": "Hồ sơ kỹ năng SQL của bạn",
      "results": {
        "beginner": {
          "name": "Người Mới Bắt Đầu",
          "desc": "Bạn có thể viết một câu lệnh SELECT hoạt động và lọc trên một vài điều kiện, nhưng những câu hỏi bạn sai tập trung xung quanh xử lý NULL và cơ học join hơn là cú pháp — so sánh một cột với NULL bằng cách dùng =, điều gì LEFT JOIN thực sự bảo tồn, cách các ranh giới BETWEEN hoạt động. Không phải là do kỹ năng cơ sở dữ liệu yếu; đây là những quy tắc cụ thể khiến những người học SQL bằng trial and error chứ không phải từ tiêu chuẩn bị vấp phải. Chúng quan trọng ở nơi làm việc vì mỗi quy tắc là nơi một truy vấn trả về số hàng chính xác nhưng sai.",
          "recommendation": "Hãy bắt đầu với ba điều, theo thứ tự này: tại sao WHERE col = NULL không bao giờ khớp bất kỳ thứ gì (và IS NULL là bắt buộc thay vào đó), cách INNER JOIN loại bỏ các hàng không khớp trong khi LEFT JOIN giữ lại chúng, và các ranh giới chính xác BETWEEN bao gồm. Hướng dẫn SQL của Mode Analytics và tài liệu PostgreSQL đều bao gồm cả ba với các ví dụ có thể chạy được."
        },
        "intermediate": {
          "name": "Trung Cấp",
          "desc": "Bạn xử lý các truy vấn báo cáo hàng ngày một cách thoải mái — join, GROUP BY, lọc thẳng — và sẽ không bị chậm bởi công việc trang bị bình thường hoặc phân tích ad-hoc. Khoảng cách giữa đây và Nâng Cao chủ yếu là những gì xảy ra khi các mệnh đề tương tác: một mệnh đề WHERE trên bảng đã join yên tĩnh biến một LEFT JOIN thành INNER JOIN, một join mà tạo ra nhiều hàng trước khi một tổng hợp được áp dụng cho chúng, một NOT IN yên tĩnh trả về không có gì vì một NULL lọt vào subquery. Đó là loại lỗi mà một kiểm tra nhanh qua mắt bỏ qua và chỉ xuất hiện khi ai đó so sánh tổng số với một báo cáo khác.",
          "recommendation": "Tập trung vào cách các mệnh đề tương tác thay vì những gì mỗi cái làm riêng lẻ: lọc WHERE trên các cột LEFT JOIN phía bên phải, nhân row từ join một-nhiều trước khi bạn tổng hợp, và tại sao NOT IN phá vỡ khi NULL xuất hiện (EXISTS thường thì không). Sau đó là HAVING so với WHERE, vì sự chia rẽ này vấp phải những người đã biết cả hai mệnh đề riêng lẻ."
        },
        "advanced": {
          "name": "Nâng Cao",
          "desc": "Đây là cấp độ hầu hết thông báo tuyển dụng có nghĩa là \"SQL mạnh.\" Bạn đọc một truy vấn multi-join và có thể dự đoán số hàng của nó trước khi chạy, bạn biết tại sao một bộ kết quả thay đổi hơn là chỉ biết rằng nó đã thay đổi, và bạn tới một CTE hoặc hàm cửa sổ thay vì một subquery lồng nhau khi đó là công cụ rõ ràng hơn. Điều tách rời dải này với đỉnh cao là phía bảo vệ của công việc: biết hàm xếp hạng nào cần dùng khi mối liên hệ quan trọng, những gì một transaction cô lập từ một phiên đồng thời, và những gì một quy tắc ON DELETE bị mất thực sự làm ở cấp cơ sở dữ liệu."
        },
        "expert": {
          "name": "Chuyên Gia",
          "desc": "Bạn ghi điểm ở mức cao nhất trong mọi phần — lọc và NULL semantics, join và set operations, tổng hợp và subquery, và hàm cửa sổ, CTE và ràng buộc. Thực tế, điều đó có nghĩa là bạn có thể được giao một truy vấn báo cáo multi-join của người lạ và giải thích tại sao nó trả về số hàng nó làm, không chỉ những gì cú pháp nói rằng nó nên làm, đó là kỹ năng khó hơn và có giá trị hơn. Ở cấp độ này ngôn ngữ truy vấn hiếm khi là yếu tố hạn chế; giới hạn thường là thiết kế schema hoặc kích thước của dữ liệu bên dưới nó."
        }
      },
      "questions": [
        {
          "question": "Một bảng có một cột nullable age. Bạn chạy SELECT * FROM users WHERE age = NULL. Điều này trả về bao nhiêu hàng, ngay cả khi có nhiều hàng có age được đặt thành NULL?",
          "options": [
            {
              "icon": "",
              "label": "Mọi hàng có age là NULL, vì = khớp NULL như bất kỳ giá trị nào khác"
            },
            {
              "icon": "",
              "label": "Không — so sánh bất kỳ điều gì với NULL bằng cách dùng = tạo ra UNKNOWN, không bao giờ TRUE, vì vậy không có hàng nào khớp; IS NULL là bắt buộc thay vào đó"
            },
            {
              "icon": "",
              "label": "Một lỗi cú pháp — NULL không thể xuất hiện trên phía bên phải của ="
            },
            {
              "icon": "",
              "label": "Mọi hàng trong bảng, vì so sánh NULL mặc định thành TRUE"
            }
          ]
        },
        {
          "question": "Bạn chạy SELECT DISTINCT department, role FROM employees. DISTINCT loại bỏ bản sao của cái gì?",
          "options": [
            {
              "icon": "",
              "label": "Sự kết hợp của department và role cùng nhau — một hàng chỉ được loại bỏ nếu cả hai cột khớp một hàng khác một cách chính xác"
            },
            {
              "icon": "",
              "label": "Chỉ các giá trị department trùng lặp, giữ lại mọi role"
            },
            {
              "icon": "",
              "label": "Chỉ các giá trị role trùng lặp, giữ lại mọi department"
            },
            {
              "icon": "",
              "label": "Không có gì — DISTINCT chỉ hoạt động với một cột"
            }
          ]
        },
        {
          "question": "Một tên cột được lọc bằng WHERE name LIKE 'A_'. Cái nào trong số những giá trị này khớp: 'A', 'Al', 'Ana', 'Ally'?",
          "options": [
            {
              "icon": "",
              "label": "'A' — dấu gạch dưới là tùy chọn và khớp với không hoặc nhiều ký tự"
            },
            {
              "icon": "",
              "label": "'Al' — dấu gạch dưới khớp với chính xác một ký tự, vì vậy LIKE 'A_' khớp với bất kỳ chuỗi hai ký tự nào bắt đầu bằng A"
            },
            {
              "icon": "",
              "label": "'Ana' và 'Ally' — dấu gạch dưới khớp với bất kỳ số lượng ký tự theo sau"
            },
            {
              "icon": "",
              "label": "Cả bốn giá trị khớp, vì LIKE bỏ qua độ dài"
            }
          ]
        },
        {
          "question": "Một cột price được lọc bằng WHERE price BETWEEN 10 AND 20. Có những hàng với price chính xác 10 hoặc chính xác 20 được bao gồm không?",
          "options": [
            {
              "icon": "",
              "label": "Không — BETWEEN loại trừ cả hai điểm cuối"
            },
            {
              "icon": "",
              "label": "Có — BETWEEN bao gồm cả hai điểm cuối, tương đương với price >= 10 AND price <= 20"
            },
            {
              "icon": "",
              "label": "Chỉ price = 10 được bao gồm; điểm cuối trên là loại trừ"
            },
            {
              "icon": "",
              "label": "Chỉ price = 20 được bao gồm; điểm cuối dưới là loại trừ"
            }
          ]
        },
        {
          "question": "Một bảng orders có 10 hàng, và 3 trong số chúng có shipped_date là NULL. SELECT COUNT(*) FROM orders trả về cái gì, và SELECT COUNT(shipped_date) FROM orders trả về cái gì?",
          "options": [
            {
              "icon": "",
              "label": "10, rồi 10 — COUNT luôn đếm các hàng bất kể NULL"
            },
            {
              "icon": "",
              "label": "7, rồi 7 — cả hai hình thức bỏ qua các hàng NULL"
            },
            {
              "icon": "",
              "label": "10, rồi 7 — COUNT(*) đếm mọi hàng, COUNT(column) đếm chỉ các hàng có cột đó không NULL"
            },
            {
              "icon": "",
              "label": "10, rồi 3 — COUNT(column) đếm chỉ các giá trị NULL"
            }
          ]
        },
        {
          "question": "Bạn chạy SELECT name, salary FROM employees ORDER BY 2 DESC. 2 đề cập đến cái gì?",
          "options": [
            {
              "icon": "",
              "label": "Một lỗi cú pháp — ORDER BY chỉ chấp nhận tên cột, không phải số"
            },
            {
              "icon": "",
              "label": "Hàng thứ hai của kết quả"
            },
            {
              "icon": "",
              "label": "Một giá trị theo nghĩa đen của 2, được sử dụng làm tiebreaker"
            },
            {
              "icon": "",
              "label": "Cột thứ hai trong danh sách SELECT, salary — ORDER BY chấp nhận số vị trí của cột làm từ viết tắt"
            }
          ]
        },
        {
          "question": "Trong SQL tiêu chuẩn, 'Ana' || ' ' || 'Lee' đánh giá thành cái gì?",
          "options": [
            {
              "icon": "",
              "label": "Một lỗi cú pháp — SQL không có toán tử nối chuỗi"
            },
            {
              "icon": "",
              "label": "3 — || được coi là boolean OR và trả về một count"
            },
            {
              "icon": "",
              "label": "'AnaLee' — || nối mà không bảo tồn khoảng cách"
            },
            {
              "icon": "",
              "label": "'Ana Lee' — || là toán tử nối chuỗi SQL tiêu chuẩn"
            }
          ]
        },
        {
          "question": "Cái nào trong số những cái này hoàn toàn tương đương với 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 có 100 hàng; 20 trong số chúng không bao giờ đặt một đơn hàng. Bạn chạy SELECT c.id FROM customers c INNER JOIN orders o ON c.id = o.customer_id. Những 20 khách hàng không có đơn hàng có xuất hiện trong kết quả không?",
          "options": [
            {
              "icon": "",
              "label": "Có, một lần mỗi cái, với o.id hiển thị là NULL"
            },
            {
              "icon": "",
              "label": "Có, nhưng chỉ nếu chúng cũng xuất hiện trong một mệnh đề WHERE"
            },
            {
              "icon": "",
              "label": "Không — INNER JOIN chỉ trả về các hàng có một trận đấu trong cả hai bảng, vì vậy những khách hàng không có đơn hàng bị loại bỏ hoàn toàn"
            },
            {
              "icon": "",
              "label": "Có, nhân đôi một lần mỗi cột trong orders"
            }
          ]
        },
        {
          "question": "Bạn muốn mọi khách hàng cho dù có hay không có đơn hàng, nên bạn viết SELECT c.id, o.total FROM customers c LEFT JOIN orders o ON c.id = o.customer_id WHERE o.total > 100. Điều này có còn trả về các khách hàng không có đơn hàng không?",
          "options": [
            {
              "icon": "",
              "label": "Không — lọc trên o.total trong mệnh đề WHERE loại bỏ các hàng NULL mà LEFT JOIN tạo ra cho các khách hàng không khớp, vì vậy nó hoạt động giống như INNER JOIN"
            },
            {
              "icon": "",
              "label": "Có — LEFT JOIN luôn bảo tồn mọi hàng từ customers không có vấn đề gì theo sau"
            },
            {
              "icon": "",
              "label": "Có, với o.total hiển thị là 0 cho các khách hàng không có đơn hàng"
            },
            {
              "icon": "",
              "label": "Không — LEFT JOIN yên tĩnh chuyển đổi chính nó thành RIGHT JOIN khi một mệnh đề WHERE được thêm vào"
            }
          ]
        },
        {
          "question": "Một bảng employees có một cột id và một cột manager_id trỏ đến id của một hàng khác. Để liệt kê mỗi nhân viên bên cạnh tên của người quản lý của họ, bạn join bảng với chính nó: SELECT e.name, m.name FROM employees e JOIN employees m ON e.manager_id = m.id. Mô hình này được gọi là cái gì?",
          "options": [
            {
              "icon": "",
              "label": "Một cross join — mọi nhân viên được khớp với mọi người quản lý"
            },
            {
              "icon": "",
              "label": "Một recursive join — nó lấy toàn bộ chuỗi quản lý"
            },
            {
              "icon": "",
              "label": "Một self-join — cùng một bảng được join với chính nó bằng hai alias khác nhau"
            },
            {
              "icon": "",
              "label": "Đây là SQL không hợp lệ — một bảng không thể được join với chính nó"
            }
          ]
        },
        {
          "question": "Hai truy vấn SELECT có cùng các cột được kết hợp bằng UNION. Nếu cả hai truy vấn trả về cùng một hàng, có bao nhiêu bản sao của hàng đó xuất hiện trong kết quả cuối cùng?",
          "options": [
            {
              "icon": "",
              "label": "Một — UNION loại bỏ các hàng trùng lặp trên toàn bộ kết quả kết hợp; UNION ALL sẽ giữ cả hai bản sao"
            },
            {
              "icon": "",
              "label": "Hai — UNION giữ mọi hàng từ cả hai truy vấn"
            },
            {
              "icon": "",
              "label": "Không — UNION loại bỏ bất kỳ hàng nào xuất hiện trong cả hai truy vấn"
            },
            {
              "icon": "",
              "label": "Nó phụ thuộc vào truy vấn nào liệt kê hàng trước tiên"
            }
          ]
        },
        {
          "question": "Bảng sizes có 3 hàng và colors có 4 hàng. SELECT * FROM sizes CROSS JOIN colors trả về bao nhiêu hàng?",
          "options": [
            {
              "icon": "",
              "label": "7 — CROSS JOIN thêm các số hàng lại với nhau"
            },
            {
              "icon": "",
              "label": "12 — một CROSS JOIN trả về mọi sự kết hợp có thể của các hàng từ cả hai bảng (3 x 4)"
            },
            {
              "icon": "",
              "label": "3 — CROSS JOIN trả về một hàng mỗi hàng trong bảng đầu tiên"
            },
            {
              "icon": "",
              "label": "0 — CROSS JOIN yêu cầu một điều kiện ON hoặc nó trả về không có gì"
            }
          ]
        },
        {
          "question": "orders có 1 hàng cho đơn hàng #100, và order_items có 3 hàng cho đơn hàng #100 (một cho mỗi mục dòng). Bạn chạy SELECT o.id, o.total FROM orders o JOIN order_items i ON o.id = i.order_id WHERE o.id = 100. Có bao nhiêu hàng quay lại cho đơn hàng #100?",
          "options": [
            {
              "icon": "",
              "label": "3 — join tạo ra một hàng đầu ra mỗi hàng order_items phù hợp, vì vậy hàng duy nhất của đơn hàng #100 được lặp lại một lần mỗi mục dòng"
            },
            {
              "icon": "",
              "label": "1 — orders chỉ có một hàng cho đơn hàng #100, vì vậy join không thể tạo ra nhiều hơn"
            },
            {
              "icon": "",
              "label": "4 — một hàng cho đơn hàng cộng với một mỗi mục dòng"
            },
            {
              "icon": "",
              "label": "0 — join một bảng một hàng với một bảng ba hàng trên một khóa không duy nhất không thành công"
            }
          ]
        },
        {
          "question": "SELECT c.name, o.id FROM customers c RIGHT JOIN orders o ON c.id = o.customer_id trả về cùng các hàng như cái nào trong số những cái này?",
          "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 — hoán đổi thứ tự bảng và sử dụng LEFT JOIN thay vì RIGHT JOIN là tương đương"
            },
            {
              "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": "Trong SQL tiêu chuẩn, bạn chạy SELECT department, name, AVG(salary) FROM employees GROUP BY department. Đây có phải là một truy vấn hợp lệ không?",
          "options": [
            {
              "icon": "",
              "label": "Có — GROUP BY chỉ cần bao gồm department vì nó được liệt kê trước tiên"
            },
            {
              "icon": "",
              "label": "Không — name được chọn nhưng không được tổng hợp cũng không được liệt kê trong GROUP BY, và SQL tiêu chuẩn yêu cầu mọi cột không tổng hợp được chọn phải xuất hiện trong mệnh đề GROUP BY"
            },
            {
              "icon": "",
              "label": "Có — SQL tự động chọn một name tùy ý mỗi department"
            },
            {
              "icon": "",
              "label": "Không — AVG() không thể được kết hợp với GROUP BY trong cùng một truy vấn"
            }
          ]
        },
        {
          "question": "Bạn muốn các department có mức lương trung bình vượt quá 80000. Mệnh đề nào lọc trên một giá trị tổng hợp như AVG(salary) sau khi nhóm — WHERE hoặc HAVING?",
          "options": [
            {
              "icon": "",
              "label": "WHERE — HAVING chỉ được sử dụng với các truy vấn UNION"
            },
            {
              "icon": "",
              "label": "Một trong hai hoạt động giống hệt nhau với các hàm tổng hợp"
            },
            {
              "icon": "",
              "label": "Không — lọc tổng hợp yêu cầu một subquery"
            },
            {
              "icon": "",
              "label": "HAVING — WHERE lọc các hàng riêng lẻ trước khi nhóm xảy ra, HAVING lọc các nhóm sau khi tổng hợp"
            }
          ]
        },
        {
          "question": "Bạn viết SELECT salary * 1.1 AS new_salary FROM employees WHERE new_salary > 50000. Điều này có chạy không?",
          "options": [
            {
              "icon": "",
              "label": "Có — các alias được định nghĩa trong SELECT luôn khả dụng cho WHERE trong cùng một truy vấn"
            },
            {
              "icon": "",
              "label": "Có, nhưng chỉ cho các alias số"
            },
            {
              "icon": "",
              "label": "Không — AS không được phép bên trong một truy vấn được lọc bằng WHERE"
            },
            {
              "icon": "",
              "label": "Không — WHERE được đánh giá trước khi SELECT gán alias new_salary, vì vậy alias không tồn tại ở thời điểm đó trong thực thi"
            }
          ]
        },
        {
          "question": "SELECT name FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department = e.department). Tại sao đây được gọi là một correlated subquery?",
          "options": [
            {
              "icon": "",
              "label": "Vì nó sử dụng một JOIN thay vì một mệnh đề WHERE"
            },
            {
              "icon": "",
              "label": "Subquery bên trong tham chiếu e.department từ truy vấn bên ngoài, vì vậy nó phải được tái đánh giá cho mọi hàng mà truy vấn bên ngoài xem xét"
            },
            {
              "icon": "",
              "label": "Vì nó trả về nhiều hơn một cột"
            },
            {
              "icon": "",
              "label": "Vì nó chạy chính xác một lần trước khi truy vấn bên ngoài bắt đầu"
            }
          ]
        },
        {
          "question": "Một subquery SELECT manager_id FROM employees trả về một số giá trị NULL cùng với các id thực. Bạn chạy SELECT name FROM employees WHERE id NOT IN (SELECT manager_id FROM employees). Điều gì xảy ra?",
          "options": [
            {
              "icon": "",
              "label": "Nó trả về mọi nhân viên không phải là người quản lý, bỏ qua các NULL"
            },
            {
              "icon": "",
              "label": "Nó trả về không có hàng — một NULL duy nhất trong danh sách NOT IN làm cho mọi so sánh UNKNOWN, vì vậy không có hàng nào có thể thỏa mãn điều kiện"
            },
            {
              "icon": "",
              "label": "Nó tăng một lỗi vì NOT IN không thể được sử dụng với các subquery"
            },
            {
              "icon": "",
              "label": "Nó trả về mọi nhân viên, vì NULL được coi là một ký tự đại diện"
            }
          ]
        },
        {
          "question": "SELECT name FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id). Điều này trả về cái gì?",
          "options": [
            {
              "icon": "",
              "label": "Mọi khách hàng có ít nhất một hàng trong orders — EXISTS chỉ kiểm tra xem subquery trả về bất kỳ hàng nào hay không, không phải những giá trị mà nó chứa"
            },
            {
              "icon": "",
              "label": "Mọi khách hàng, vì SELECT 1 luôn trả về true"
            },
            {
              "icon": "",
              "label": "Một lỗi, vì subquery chọn một số thay vì một tên cột"
            },
            {
              "icon": "",
              "label": "Chỉ những khách hàng có chính xác một đơn hàng"
            }
          ]
        },
        {
          "question": "Bạn viết SELECT name, (SELECT order_id FROM orders WHERE customer_id = c.id) AS last_order FROM customers c, và một khách hàng nhất định có 3 hàng trong orders. Điều gì xảy ra khi truy vấn này chạy?",
          "options": [
            {
              "icon": "",
              "label": "Nó trả về order_id khớp đầu tiên và yên tĩnh bỏ qua hai cái khác"
            },
            {
              "icon": "",
              "label": "Nó trả về một danh sách được phân tách bằng dấu phẩy của cả ba order_ids"
            },
            {
              "icon": "",
              "label": "Nó trả về 3 hàng cho khách hàng đó, một cho mỗi đơn hàng"
            },
            {
              "icon": "",
              "label": "Nó tăng một lỗi tại thời gian chạy — một scalar subquery trong danh sách SELECT phải trả về nhiều nhất một hàng, và cái này trả về ba"
            }
          ]
        },
        {
          "question": "Bốn hàng mà giằng cho điểm cao nhất. Sử dụng RANK() ORDER BY score DESC, cả bốn cái nhận được xếp hạng 1. Hàng tiếp theo xuống nhận được xếp hạng nào?",
          "options": [
            {
              "icon": "",
              "label": "5 — RANK() để lại một khoảng cách bằng số hàng được giằng trước khi tiếp tục"
            },
            {
              "icon": "",
              "label": "2 — RANK() luôn tăng chính xác một sau bất kỳ giằng nào"
            },
            {
              "icon": "",
              "label": "1 — mọi hàng tiếp theo cũng nhận được xếp hạng 1"
            },
            {
              "icon": "",
              "label": "4 — RANK() khởi động lại đếm từ số giằng"
            }
          ]
        },
        {
          "question": "Bốn hàng mà giằng cho điểm cao nhất. Sử dụng DENSE_RANK() ORDER BY score DESC, cả bốn cái nhận được xếp hạng 1. Hàng tiếp theo xuống nhận được xếp hạng nào?",
          "options": [
            {
              "icon": "",
              "label": "5 — DENSE_RANK() hoạt động chính xác giống RANK()"
            },
            {
              "icon": "",
              "label": "1 — DENSE_RANK() gán cùng một xếp hạng cho mọi hàng còn lại"
            },
            {
              "icon": "",
              "label": "2 — DENSE_RANK() không bao giờ để lại khoảng cách, vì vậy giá trị riêng biệt tiếp theo luôn nhận được xếp hạng liên tiếp tiếp theo"
            },
            {
              "icon": "",
              "label": "3 — DENSE_RANK() bỏ qua một xếp hạng mỗi nhóm giằng"
            }
          ]
        },
        {
          "question": "SUM(amount) OVER (PARTITION BY region ORDER BY amount) được thêm vào một truy vấn. PARTITION BY region làm gì ở đây?",
          "options": [
            {
              "icon": "",
              "label": "Nó khởi động lại tổng chạy riêng biệt cho mỗi region, thay vì tích lũy trên toàn bộ bộ kết quả"
            },
            {
              "icon": "",
              "label": "Nó lọc kết quả thành một region duy nhất"
            },
            {
              "icon": "",
              "label": "Nó nhóm và thu gọn các hàng thành một cho mỗi region, giống như GROUP BY"
            },
            {
              "icon": "",
              "label": "Nó sắp xếp các region theo bảng chữ cái trước khi cộng"
            }
          ]
        },
        {
          "question": "ROW_NUMBER() OVER (ORDER BY score DESC) được áp dụng cho năm hàng, hai trong số đó có chính xác tương ứng trong điểm. Có thể hai hàng bao giờ nhận được cùng một số hàng không?",
          "options": [
            {
              "icon": "",
              "label": "Có — các hàng được giằng luôn chia sẻ cùng một số hàng"
            },
            {
              "icon": "",
              "label": "Chỉ nếu PARTITION BY cũng được sử dụng"
            },
            {
              "icon": "",
              "label": "Nó phụ thuộc vào liệu giằng có ở vị trí đầu tiên hay cuối cùng không"
            },
            {
              "icon": "",
              "label": "Không — ROW_NUMBER() luôn gán một số nguyên duy nhất, tăng chặt chẽ cho mỗi hàng, ngay cả khi các giá trị được giằng"
            }
          ]
        },
        {
          "question": "WITH high_earners AS (SELECT * FROM employees WHERE salary > 100000) SELECT department, COUNT(*) FROM high_earners GROUP BY department. high_earners là cái gì?",
          "options": [
            {
              "icon": "",
              "label": "Một common table expression (CTE) — một bộ kết quả tạm thời được đặt tên mà phần còn lại của truy vấn có thể tham chiếu giống như một bảng"
            },
            {
              "icon": "",
              "label": "Một bảng vĩnh viễn được tạo trong cơ sở dữ liệu"
            },
            {
              "icon": "",
              "label": "Một view tồn tại sau khi truy vấn hoàn thành"
            },
            {
              "icon": "",
              "label": "Một stored procedure phải được gọi riêng biệt"
            }
          ]
        },
        {
          "question": "Một cột được khai báo PRIMARY KEY. Bạn có thể chèn một hàng có cột đó là NULL không?",
          "options": [
            {
              "icon": "",
              "label": "Có — PRIMARY KEY chỉ thực thi tính duy nhất, không phải NULL-ness"
            },
            {
              "icon": "",
              "label": "Có, nhưng chỉ một hàng NULL được phép, giống như một ràng buộc UNIQUE"
            },
            {
              "icon": "",
              "label": "Không — một cột PRIMARY KEY là ngầm NOT NULL, vì vậy chèn NULL vào nó bị từ chối"
            },
            {
              "icon": "",
              "label": "Nó phụ thuộc vào liệu cột cũng có một giá trị mặc định hay không"
            }
          ]
        },
        {
          "question": "Bên trong một transaction mở, bạn chạy một UPDATE nhưng chưa chạy COMMIT. Từ một kết nối thứ hai, riêng biệt với cơ sở dữ liệu, bản cập nhật đó có hiển thị không?",
          "options": [
            {
              "icon": "",
              "label": "Có — tất cả các kết nối thấy mọi ghi khoá ngay khi nó chạy"
            },
            {
              "icon": "",
              "label": "Có, nhưng chỉ nếu kết nối thứ hai cũng mở một transaction"
            },
            {
              "icon": "",
              "label": "Nó phụ thuộc chỉ vào bảng nào được cập nhật"
            },
            {
              "icon": "",
              "label": "Không — một thay đổi uncommitted chỉ hiển thị bên trong transaction mà đã tạo ra nó, cho đến khi COMMIT làm cho nó durable và hiển thị cho người khác"
            }
          ]
        },
        {
          "question": "products.category_id có một ràng buộc FOREIGN KEY tham chiếu categories.id. Bạn cố gắng XÓA một hàng từ categories mà vẫn còn các sản phẩm trỏ đến nó, không có quy tắc ON DELETE được chỉ định. Điều gì xảy ra?",
          "options": [
            {
              "icon": "",
              "label": "Hàng danh mục được xóa và các giá trị products.category_id phù hợp được tự động đặt thành NULL"
            },
            {
              "icon": "",
              "label": "Hàng danh mục được xóa và mọi sản phẩm mà tham chiếu đến nó cũng bị xóa"
            },
            {
              "icon": "",
              "label": "DELETE bị từ chối — hành vi khóa ngoài mặc định chặn xóa một hàng được tham chiếu trong khi các hàng phụ thuộc vẫn trỏ đến nó"
            },
            {
              "icon": "",
              "label": "DELETE thành công yên tĩnh, để lại category_id của các sản phẩm trỏ đến một danh mục không còn tồn tại"
            }
          ]
        }
      ],
      "optionOrderVersion": "e0466e547cfd8a45"
    }
  }
}
