[{"data":1,"prerenderedAt":2842},["ShallowReactive",2],{"navigation_docs":3,"-phong-van-lo-trinh-ngay-4-database-sql":420,"-phong-van-lo-trinh-ngay-4-database-sql-surround":2837},[4,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Phỏng vấn .NET","i-lucide-briefcase","\u002Fphong-van","1.phong-van",[10,27,66,111,128],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":26},"Tổng quan","i-lucide-compass","\u002Fphong-van\u002Ftong-quan","1.phong-van\u002F1.tong-quan",[16,21],{"title":17,"path":18,"stem":19,"icon":20},"Thị trường HCM","\u002Fphong-van\u002Ftong-quan\u002Fthi-truong","1.phong-van\u002F1.tong-quan\u002F1.thi-truong","i-lucide-trending-up",{"title":22,"path":23,"stem":24,"icon":25},"Lộ trình 7 ngày","\u002Fphong-van\u002Ftong-quan\u002Flo-trinh","1.phong-van\u002F1.tong-quan\u002F2.lo-trinh","i-lucide-calendar-days",false,{"title":22,"icon":25,"path":28,"stem":29,"children":30,"page":26},"\u002Fphong-van\u002Flo-trinh","1.phong-van\u002F2.lo-trinh",[31,36,41,46,51,56,61],{"title":32,"path":33,"stem":34,"icon":35},"Ngày 1 — C# cơ bản","\u002Fphong-van\u002Flo-trinh\u002Fngay-1-csharp-co-ban","1.phong-van\u002F2.lo-trinh\u002F1.ngay-1-csharp-co-ban","i-lucide-1",{"title":37,"path":38,"stem":39,"icon":40},"Ngày 2 — OOP và SOLID","\u002Fphong-van\u002Flo-trinh\u002Fngay-2-oop-solid","1.phong-van\u002F2.lo-trinh\u002F2.ngay-2-oop-solid","i-lucide-2",{"title":42,"path":43,"stem":44,"icon":45},"Ngày 3 — C# nâng cao","\u002Fphong-van\u002Flo-trinh\u002Fngay-3-csharp-nang-cao","1.phong-van\u002F2.lo-trinh\u002F3.ngay-3-csharp-nang-cao","i-lucide-3",{"title":47,"path":48,"stem":49,"icon":50},"Ngày 4 — Database và SQL","\u002Fphong-van\u002Flo-trinh\u002Fngay-4-database-sql","1.phong-van\u002F2.lo-trinh\u002F4.ngay-4-database-sql","i-lucide-4",{"title":52,"path":53,"stem":54,"icon":55},"Ngày 5 — ASP.NET Core và EF Core","\u002Fphong-van\u002Flo-trinh\u002Fngay-5-aspnet-efcore","1.phong-van\u002F2.lo-trinh\u002F5.ngay-5-aspnet-efcore","i-lucide-5",{"title":57,"path":58,"stem":59,"icon":60},"Ngày 6 — DSA coding","\u002Fphong-van\u002Flo-trinh\u002Fngay-6-dsa","1.phong-van\u002F2.lo-trinh\u002F6.ngay-6-dsa","i-lucide-6",{"title":62,"path":63,"stem":64,"icon":65},"Ngày 7 — Mock và HR","\u002Fphong-van\u002Flo-trinh\u002Fngay-7-mock-interview","1.phong-van\u002F2.lo-trinh\u002F7.ngay-7-mock-interview","i-lucide-7",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":26},"Ngân hàng câu hỏi","i-lucide-database","\u002Fphong-van\u002Fngan-hang-cau-hoi","1.phong-van\u002F3.ngan-hang-cau-hoi",[72,77,82,87,92,97,102,107],{"title":73,"path":74,"stem":75,"icon":76},"C# (60+ câu)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fcsharp","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F1.csharp","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"OOP và SOLID (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Foop","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F2.oop","i-lucide-shapes",{"title":83,"path":84,"stem":85,"icon":86},"SQL (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fsql","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F3.sql","i-lucide-database-zap",{"title":88,"path":89,"stem":90,"icon":91},"ASP.NET và EF (50+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-ef","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F4.aspnet-ef","i-lucide-server",{"title":93,"path":94,"stem":95,"icon":96},"DSA và Coding (30+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdsa-coding","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F5.dsa-coding","i-lucide-binary",{"title":98,"path":99,"stem":100,"icon":101},"HR và Soft skill (25+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fhr-behavior","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F6.hr-behavior","i-lucide-users",{"title":103,"path":104,"stem":105,"icon":106},"Design Pattern (55+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdesign-pattern","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F7.design-pattern","i-lucide-puzzle",{"title":108,"path":109,"stem":110,"icon":91},"ASP.NET MVC và Web API","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-mvc-webapi","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F8.aspnet-mvc-webapi",{"title":112,"itle":113,"icon":114,"path":115,"stem":116,"children":117,"page":26},"Tai Lieu","Tài liệu và Cheat sheet","i-lucide-book-marked","\u002Fphong-van\u002Ftai-lieu","1.phong-van\u002F4.tai-lieu",[118,123],{"title":119,"path":120,"stem":121,"icon":122},"Cheat Sheet","\u002Fphong-van\u002Ftai-lieu\u002Fcheatsheet","1.phong-van\u002F4.tai-lieu\u002F1.cheatsheet","i-lucide-clipboard-list",{"title":124,"path":125,"stem":126,"icon":127},"Nguồn tham khảo","\u002Fphong-van\u002Ftai-lieu\u002Fnguon","1.phong-van\u002F4.tai-lieu\u002F2.nguon","i-lucide-link",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":26},"Phỏng vấn English","i-lucide-globe","\u002Fphong-van\u002Fenglish-interview","1.phong-van\u002F5.english-interview",[134,138,143,148],{"title":135,"path":136,"stem":137,"icon":130},"Tổng quan English","\u002Fphong-van\u002Fenglish-interview\u002Ftong-quan","1.phong-van\u002F5.english-interview\u002F1.tong-quan",{"title":139,"path":140,"stem":141,"icon":142},"Vocabulary","\u002Fphong-van\u002Fenglish-interview\u002Fvocabulary","1.phong-van\u002F5.english-interview\u002F2.vocabulary","i-lucide-book-a",{"title":144,"path":145,"stem":146,"icon":147},"Technical Q và A (EN)","\u002Fphong-van\u002Fenglish-interview\u002Ftechnical-en","1.phong-van\u002F5.english-interview\u002F3.technical-en","i-lucide-code",{"title":149,"path":150,"stem":151,"icon":152},"Behavioral (EN)","\u002Fphong-van\u002Fenglish-interview\u002Fbehavioral-en","1.phong-van\u002F5.english-interview\u002F4.behavioral-en","i-lucide-message-square-text",{"title":154,"icon":155,"path":156,"stem":157,"children":158},"Tự học","i-lucide-graduation-cap","\u002Ftu-hoc","2.tu-hoc",[159,161,287,310,333,357,384],{"title":154,"path":156,"stem":160,"icon":155},"2.tu-hoc\u002Findex",{"title":162,"icon":68,"path":163,"stem":164,"children":165},"Database","\u002Ftu-hoc\u002Fdatabase","2.tu-hoc\u002F1.database\u002Findex",[166,167,197,222,243,248],{"title":162,"path":163,"stem":164,"icon":68},{"title":168,"icon":91,"path":169,"stem":170,"children":171,"page":26},"SQL Server","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server","2.tu-hoc\u002F1.database\u002F2.sql-server",[172,177,182,187,192],{"title":173,"path":174,"stem":175,"icon":176},"1. Giới thiệu và Cài đặt","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F1.gioi-thieu-cai-dat","i-lucide-play-circle",{"title":178,"path":179,"stem":180,"icon":181},"2. Cú pháp cơ bản","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F2.cu-phap-co-ban","i-lucide-code-2",{"title":183,"path":184,"stem":185,"icon":186},"3. Truy vấn nâng cao","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F3.truy-van-nang-cao","i-lucide-git-merge",{"title":188,"path":189,"stem":190,"icon":191},"4. Đặc thù và Performance","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F4.dac-thu-performance","i-lucide-gauge",{"title":193,"path":194,"stem":195,"icon":196},"5. Q và A phỏng vấn","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F5.cau-hoi-phong-van","i-lucide-message-circle-question",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":26},"PostgreSQL","i-simple-icons-postgresql","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql","2.tu-hoc\u002F1.database\u002F3.postgresql",[203,206,209,212,215,218],{"title":173,"path":204,"stem":205,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":207,"stem":208,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F2.cu-phap-co-ban",{"title":183,"path":210,"stem":211,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F3.truy-van-nang-cao",{"title":188,"path":213,"stem":214,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F4.dac-thu-performance",{"title":193,"path":216,"stem":217,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F5.cau-hoi-phong-van",{"title":219,"path":220,"stem":221,"icon":96},"6. Tích hợp C# và Postgres","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftich-hop-csharp","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F6.tich-hop-csharp",{"title":223,"icon":224,"path":225,"stem":226,"children":227,"page":26},"MySQL","i-simple-icons-mysql","\u002Ftu-hoc\u002Fdatabase\u002Fmysql","2.tu-hoc\u002F1.database\u002F4.mysql",[228,231,234,237,240],{"title":173,"path":229,"stem":230,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F4.mysql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":232,"stem":233,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F4.mysql\u002F2.cu-phap-co-ban",{"title":183,"path":235,"stem":236,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F4.mysql\u002F3.truy-van-nang-cao",{"title":188,"path":238,"stem":239,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F4.mysql\u002F4.dac-thu-performance",{"title":193,"path":241,"stem":242,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F4.mysql\u002F5.cau-hoi-phong-van",{"title":244,"path":245,"stem":246,"icon":247},"So sánh 3 RDBMS","\u002Ftu-hoc\u002Fdatabase\u002Fso-sanh","2.tu-hoc\u002F1.database\u002F5.so-sanh","i-lucide-columns-3",{"title":249,"path":250,"stem":251,"children":252,"icon":254},"Supabase (BaaS)","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002Findex",[253,255,259,264,269,274,278,283],{"title":249,"path":250,"stem":251,"icon":254},"i-simple-icons-supabase",{"title":256,"path":257,"stem":258,"icon":68},"1. Database","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fdatabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002F1.database",{"title":260,"path":261,"stem":262,"icon":263},"2. Authentication","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fauthentication","2.tu-hoc\u002F1.database\u002F6.supabase\u002F2.authentication","i-lucide-key",{"title":265,"path":266,"stem":267,"icon":268},"3. Storage & Realtime","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fstorage-realtime","2.tu-hoc\u002F1.database\u002F6.supabase\u002F3.storage-realtime","i-lucide-zap",{"title":270,"path":271,"stem":272,"icon":273},"4. Edge Functions & AI","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Ffunctions-ai","2.tu-hoc\u002F1.database\u002F6.supabase\u002F4.functions-ai","i-lucide-brain",{"title":275,"path":276,"stem":277,"icon":181},"5. API & SDKs","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fapi-sdk","2.tu-hoc\u002F1.database\u002F6.supabase\u002F5.api-sdk",{"title":279,"path":280,"stem":281,"icon":282},"6. Platform & Deploy","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fplatform-deploy","2.tu-hoc\u002F1.database\u002F6.supabase\u002F6.platform-deploy","i-lucide-cloud",{"title":284,"path":285,"stem":286,"icon":196},"7. Interview & Q&A","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Finterview","2.tu-hoc\u002F1.database\u002F6.supabase\u002F7.interview",{"title":288,"icon":289,"path":290,"stem":291,"children":292},"TypeScript","i-simple-icons-typescript","\u002Ftu-hoc\u002Ftypescript","2.tu-hoc\u002F2.typescript\u002Findex",[293,294,297,301,306],{"title":288,"path":290,"stem":291,"icon":289},{"title":173,"path":295,"stem":296,"icon":176},"\u002Ftu-hoc\u002Ftypescript\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F2.typescript\u002F1.gioi-thieu-cai-dat",{"title":298,"path":299,"stem":300,"icon":81},"2. Type System","\u002Ftu-hoc\u002Ftypescript\u002Ftype-system","2.tu-hoc\u002F2.typescript\u002F2.type-system",{"title":302,"path":303,"stem":304,"icon":305},"3. Advanced types","\u002Ftu-hoc\u002Ftypescript\u002Fadvanced-types","2.tu-hoc\u002F2.typescript\u002F3.advanced-types","i-lucide-braces",{"title":307,"path":308,"stem":309,"icon":196},"4. Q và A phỏng vấn","\u002Ftu-hoc\u002Ftypescript\u002Fcau-hoi-phong-van","2.tu-hoc\u002F2.typescript\u002F4.cau-hoi-phong-van",{"title":311,"icon":81,"path":312,"stem":313,"children":314},"OOP","\u002Ftu-hoc\u002Foop","2.tu-hoc\u002F3.oop\u002Findex",[315,316,321,326,330],{"title":311,"path":312,"stem":313,"icon":81},{"title":317,"path":318,"stem":319,"icon":320},"1. Bốn tính chất","\u002Ftu-hoc\u002Foop\u002F4-tinh-chat","2.tu-hoc\u002F3.oop\u002F1.4-tinh-chat","i-lucide-circle-dot",{"title":322,"path":323,"stem":324,"icon":325},"2. SOLID","\u002Ftu-hoc\u002Foop\u002Fsolid","2.tu-hoc\u002F3.oop\u002F2.solid","i-lucide-shield",{"title":327,"path":328,"stem":329,"icon":106},"3. Design Pattern","\u002Ftu-hoc\u002Foop\u002Fdesign-pattern","2.tu-hoc\u002F3.oop\u002F3.design-pattern",{"title":307,"path":331,"stem":332,"icon":196},"\u002Ftu-hoc\u002Foop\u002Fcau-hoi-phong-van","2.tu-hoc\u002F3.oop\u002F4.cau-hoi-phong-van",{"title":334,"icon":305,"path":335,"stem":336,"children":337},"Generic","\u002Ftu-hoc\u002Fgeneric","2.tu-hoc\u002F4.generic\u002Findex",[338,339,344,349,354],{"title":334,"path":335,"stem":336,"icon":305},{"title":340,"path":341,"stem":342,"icon":343},"1. Khái niệm và cú pháp","\u002Ftu-hoc\u002Fgeneric\u002Fkhai-niem","2.tu-hoc\u002F4.generic\u002F1.khai-niem","i-lucide-book",{"title":345,"path":346,"stem":347,"icon":348},"2. Constraint và Variance","\u002Ftu-hoc\u002Fgeneric\u002Fconstraint-variance","2.tu-hoc\u002F4.generic\u002F2.constraint-variance","i-lucide-filter",{"title":350,"path":351,"stem":352,"icon":353},"3. C# vs TS","\u002Ftu-hoc\u002Fgeneric\u002Fso-sanh","2.tu-hoc\u002F4.generic\u002F3.so-sanh","i-lucide-git-compare",{"title":307,"path":355,"stem":356,"icon":196},"\u002Ftu-hoc\u002Fgeneric\u002Fcau-hoi-phong-van","2.tu-hoc\u002F4.generic\u002F4.cau-hoi-phong-van",{"title":358,"icon":359,"path":360,"stem":361,"children":362},"Nuxt 4","i-simple-icons-nuxt","\u002Ftu-hoc\u002Fnuxt-4","2.tu-hoc\u002F5.nuxt-4\u002Findex",[363,364,367,372,376,379],{"title":358,"path":360,"stem":361,"icon":359},{"title":173,"path":365,"stem":366,"icon":176},"\u002Ftu-hoc\u002Fnuxt-4\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F5.nuxt-4\u002F1.gioi-thieu-cai-dat",{"title":368,"path":369,"stem":370,"icon":371},"2. Routing và Rendering","\u002Ftu-hoc\u002Fnuxt-4\u002Frouting-rendering","2.tu-hoc\u002F5.nuxt-4\u002F2.routing-rendering","i-lucide-route",{"title":373,"path":374,"stem":375,"icon":91},"3. Data và Server","\u002Ftu-hoc\u002Fnuxt-4\u002Fdata-server","2.tu-hoc\u002F5.nuxt-4\u002F3.data-server",{"title":307,"path":377,"stem":378,"icon":196},"\u002Ftu-hoc\u002Fnuxt-4\u002Fcau-hoi-phong-van","2.tu-hoc\u002F5.nuxt-4\u002F4.cau-hoi-phong-van",{"title":380,"path":381,"stem":382,"icon":383},"5. Practical Todo App","\u002Ftu-hoc\u002Fnuxt-4\u002Fpractical-todo-app","2.tu-hoc\u002F5.nuxt-4\u002F5.practical-todo-app","i-lucide-check-square",{"title":385,"path":386,"stem":387,"children":388,"icon":390},"Tailwind CSS","\u002Ftu-hoc\u002Ftailwindcss","2.tu-hoc\u002F6.tailwindcss\u002Findex",[389,391,396,401,406,411,416],{"title":385,"path":386,"stem":387,"icon":390},"i-simple-icons-tailwindcss",{"title":392,"path":393,"stem":394,"icon":395},"1. Layout & Spacing","\u002Ftu-hoc\u002Ftailwindcss\u002Flayout-spacing","2.tu-hoc\u002F6.tailwindcss\u002F1.layout-spacing","i-lucide-layout",{"title":397,"path":398,"stem":399,"icon":400},"2. Typography & Colors","\u002Ftu-hoc\u002Ftailwindcss\u002Ftypography-colors","2.tu-hoc\u002F6.tailwindcss\u002F2.typography-colors","i-lucide-type",{"title":402,"path":403,"stem":404,"icon":405},"3. Interactive & Effects","\u002Ftu-hoc\u002Ftailwindcss\u002Finteractive-effects","2.tu-hoc\u002F6.tailwindcss\u002F3.interactive-effects","i-lucide-sparkles",{"title":407,"path":408,"stem":409,"icon":410},"4. Responsive & Dark Mode","\u002Ftu-hoc\u002Ftailwindcss\u002Fresponsive-darkmode","2.tu-hoc\u002F6.tailwindcss\u002F4.responsive-darkmode","i-lucide-monitor-smartphone",{"title":412,"path":413,"stem":414,"icon":415},"5. Customization & Theme","\u002Ftu-hoc\u002Ftailwindcss\u002Fcustomization","2.tu-hoc\u002F6.tailwindcss\u002F5.customization","i-lucide-settings-2",{"title":417,"path":418,"stem":419,"icon":181},"6. Practical Projects","\u002Ftu-hoc\u002Ftailwindcss\u002Fpractical-projects","2.tu-hoc\u002F6.tailwindcss\u002F6.practical-projects",{"id":421,"title":47,"body":422,"description":2830,"extension":2831,"links":2832,"meta":2833,"navigation":2834,"path":48,"seo":2835,"stem":49,"__hash__":2836},"docs\u002F1.phong-van\u002F2.lo-trinh\u002F4.ngay-4-database-sql.md",{"type":423,"value":424,"toc":2784},"minimark",[425,430,434,477,483,486,490,496,501,859,863,1099,1101,1105,1109,1125,1129,1169,1177,1187,1191,1217,1222,1228,1235,1239,1346,1350,1390,1394,1419,1442,1446,1457,1516,1534,1538,1581,1587,1589,1593,1597,1663,1667,1737,1748,1752,1806,1810,1863,1865,1869,1873,1903,1907,1947,1951,1990,2003,2007,2051,2053,2057,2061,2135,2139,2142,2221,2227,2249,2253,2290,2292,2296,2300,2329,2333,2415,2438,2442,2486,2490,2543,2547,2562,2588,2590,2594,2600,2606,2613,2617,2646,2648,2652,2714,2716,2720,2763,2772,2774,2780],[426,427,429],"h2",{"id":428},"mục-tiêu-ngày-4","Mục tiêu ngày 4",[431,432,433],"p",{},"Sau ngày 4 bạn phải:",[435,436,437,446,453,460,467,474],"ul",{},[438,439,440,441,445],"li",{},"Hiểu ",[442,443,444],"strong",{},"INDEX hoạt động bên trong"," (B-tree) — không chỉ \"index giúp nhanh\".",[438,447,448,449,452],{},"Viết được ",[442,450,451],{},"mọi loại JOIN"," + tránh bẫy LEFT JOIN.",[438,454,455,456,459],{},"Giải thích ",[442,457,458],{},"ACID + 4 isolation level"," ở mức cơ chế.",[438,461,462,463,466],{},"Phân biệt ",[442,464,465],{},"MVCC vs Lock-based",".",[438,468,469,470,473],{},"Đọc ",[442,471,472],{},"execution plan"," và biết khi nào query non-sargable.",[438,475,476],{},"Tối ưu được 1 query chậm: indexing, rewrite, EXPLAIN.",[478,479,482],"callout",{"color":480,"icon":481},"primary","i-lucide-info","🟢 Intern | 🔵 Junior | 🟡 Mid | 🔴 Senior",[484,485],"hr",{},[426,487,489],{"id":488},"_1-schema-demo-mock-data","1. Schema demo + Mock data",[478,491,492,495],{"color":480,"icon":68},[442,493,494],{},"Copy block dưới vào SSMS, chạy 1 lần."," Mọi query trong tài liệu này test được trên schema này.",[497,498,500],"h3",{"id":499},"_11-tạo-schema","1.1. Tạo schema",[502,503,508],"pre",{"className":504,"code":505,"language":506,"meta":507,"style":507},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- Cleanup nếu chạy lại\nIF OBJECT_ID('OrderItems', 'U') IS NOT NULL DROP TABLE OrderItems;\nIF OBJECT_ID('Orders',     'U') IS NOT NULL DROP TABLE Orders;\nIF OBJECT_ID('Products',   'U') IS NOT NULL DROP TABLE Products;\nIF OBJECT_ID('Customers',  'U') IS NOT NULL DROP TABLE Customers;\nIF OBJECT_ID('Employees',  'U') IS NOT NULL DROP TABLE Employees;\nIF OBJECT_ID('Users',      'U') IS NOT NULL DROP TABLE Users;\n\nCREATE TABLE Customers (\n    Id    INT PRIMARY KEY IDENTITY,\n    Name  NVARCHAR(100) NOT NULL,\n    Email NVARCHAR(150),\n    City  NVARCHAR(50),\n    CreatedAt DATETIME2 DEFAULT SYSUTCDATETIME()\n);\n\nCREATE TABLE Products (\n    Id    INT PRIMARY KEY IDENTITY,\n    Name  NVARCHAR(100) NOT NULL,\n    Price DECIMAL(18, 2) NOT NULL,\n    Stock INT NOT NULL DEFAULT 0\n);\n\nCREATE TABLE Orders (\n    Id         INT PRIMARY KEY IDENTITY,\n    CustomerId INT NOT NULL,\n    OrderDate  DATE NOT NULL,\n    Status     NVARCHAR(20) NOT NULL DEFAULT 'Pending',\n    Total      DECIMAL(18, 2),\n    CONSTRAINT FK_Orders_Customers FOREIGN KEY (CustomerId) REFERENCES Customers(Id)\n);\n\nCREATE TABLE OrderItems (\n    Id        INT PRIMARY KEY IDENTITY,\n    OrderId   INT NOT NULL,\n    ProductId INT NOT NULL,\n    Quantity  INT NOT NULL,\n    UnitPrice DECIMAL(18, 2) NOT NULL,\n    CONSTRAINT FK_Items_Orders   FOREIGN KEY (OrderId)   REFERENCES Orders(Id),\n    CONSTRAINT FK_Items_Products FOREIGN KEY (ProductId) REFERENCES Products(Id)\n);\n\nCREATE TABLE Employees (\n    Id        INT PRIMARY KEY IDENTITY,\n    Name      NVARCHAR(100) NOT NULL,\n    ManagerId INT NULL,\n    Salary    DECIMAL(18, 2),\n    Dept      NVARCHAR(50),\n    CONSTRAINT FK_Emp_Manager FOREIGN KEY (ManagerId) REFERENCES Employees(Id)\n);\n\nCREATE TABLE Users (\n    Id    INT PRIMARY KEY IDENTITY,\n    Name  NVARCHAR(100),\n    Email NVARCHAR(150)\n);\n\nCREATE INDEX IX_Orders_CustomerId ON Orders(CustomerId);\nCREATE INDEX IX_Orders_Date       ON Orders(OrderDate);\nCREATE INDEX IX_Items_OrderId     ON OrderItems(OrderId);\n","sql","",[509,510,511,519,525,531,537,543,549,555,562,568,574,580,586,592,598,604,609,615,620,625,631,637,642,647,653,659,665,671,677,683,689,694,699,705,711,717,723,729,735,741,747,752,757,763,768,774,780,786,792,798,803,808,814,819,825,831,836,841,847,853],"code",{"__ignoreMap":507},[512,513,516],"span",{"class":514,"line":515},"line",1,[512,517,518],{},"-- Cleanup nếu chạy lại\n",[512,520,522],{"class":514,"line":521},2,[512,523,524],{},"IF OBJECT_ID('OrderItems', 'U') IS NOT NULL DROP TABLE OrderItems;\n",[512,526,528],{"class":514,"line":527},3,[512,529,530],{},"IF OBJECT_ID('Orders',     'U') IS NOT NULL DROP TABLE Orders;\n",[512,532,534],{"class":514,"line":533},4,[512,535,536],{},"IF OBJECT_ID('Products',   'U') IS NOT NULL DROP TABLE Products;\n",[512,538,540],{"class":514,"line":539},5,[512,541,542],{},"IF OBJECT_ID('Customers',  'U') IS NOT NULL DROP TABLE Customers;\n",[512,544,546],{"class":514,"line":545},6,[512,547,548],{},"IF OBJECT_ID('Employees',  'U') IS NOT NULL DROP TABLE Employees;\n",[512,550,552],{"class":514,"line":551},7,[512,553,554],{},"IF OBJECT_ID('Users',      'U') IS NOT NULL DROP TABLE Users;\n",[512,556,558],{"class":514,"line":557},8,[512,559,561],{"emptyLinePlaceholder":560},true,"\n",[512,563,565],{"class":514,"line":564},9,[512,566,567],{},"CREATE TABLE Customers (\n",[512,569,571],{"class":514,"line":570},10,[512,572,573],{},"    Id    INT PRIMARY KEY IDENTITY,\n",[512,575,577],{"class":514,"line":576},11,[512,578,579],{},"    Name  NVARCHAR(100) NOT NULL,\n",[512,581,583],{"class":514,"line":582},12,[512,584,585],{},"    Email NVARCHAR(150),\n",[512,587,589],{"class":514,"line":588},13,[512,590,591],{},"    City  NVARCHAR(50),\n",[512,593,595],{"class":514,"line":594},14,[512,596,597],{},"    CreatedAt DATETIME2 DEFAULT SYSUTCDATETIME()\n",[512,599,601],{"class":514,"line":600},15,[512,602,603],{},");\n",[512,605,607],{"class":514,"line":606},16,[512,608,561],{"emptyLinePlaceholder":560},[512,610,612],{"class":514,"line":611},17,[512,613,614],{},"CREATE TABLE Products (\n",[512,616,618],{"class":514,"line":617},18,[512,619,573],{},[512,621,623],{"class":514,"line":622},19,[512,624,579],{},[512,626,628],{"class":514,"line":627},20,[512,629,630],{},"    Price DECIMAL(18, 2) NOT NULL,\n",[512,632,634],{"class":514,"line":633},21,[512,635,636],{},"    Stock INT NOT NULL DEFAULT 0\n",[512,638,640],{"class":514,"line":639},22,[512,641,603],{},[512,643,645],{"class":514,"line":644},23,[512,646,561],{"emptyLinePlaceholder":560},[512,648,650],{"class":514,"line":649},24,[512,651,652],{},"CREATE TABLE Orders (\n",[512,654,656],{"class":514,"line":655},25,[512,657,658],{},"    Id         INT PRIMARY KEY IDENTITY,\n",[512,660,662],{"class":514,"line":661},26,[512,663,664],{},"    CustomerId INT NOT NULL,\n",[512,666,668],{"class":514,"line":667},27,[512,669,670],{},"    OrderDate  DATE NOT NULL,\n",[512,672,674],{"class":514,"line":673},28,[512,675,676],{},"    Status     NVARCHAR(20) NOT NULL DEFAULT 'Pending',\n",[512,678,680],{"class":514,"line":679},29,[512,681,682],{},"    Total      DECIMAL(18, 2),\n",[512,684,686],{"class":514,"line":685},30,[512,687,688],{},"    CONSTRAINT FK_Orders_Customers FOREIGN KEY (CustomerId) REFERENCES Customers(Id)\n",[512,690,692],{"class":514,"line":691},31,[512,693,603],{},[512,695,697],{"class":514,"line":696},32,[512,698,561],{"emptyLinePlaceholder":560},[512,700,702],{"class":514,"line":701},33,[512,703,704],{},"CREATE TABLE OrderItems (\n",[512,706,708],{"class":514,"line":707},34,[512,709,710],{},"    Id        INT PRIMARY KEY IDENTITY,\n",[512,712,714],{"class":514,"line":713},35,[512,715,716],{},"    OrderId   INT NOT NULL,\n",[512,718,720],{"class":514,"line":719},36,[512,721,722],{},"    ProductId INT NOT NULL,\n",[512,724,726],{"class":514,"line":725},37,[512,727,728],{},"    Quantity  INT NOT NULL,\n",[512,730,732],{"class":514,"line":731},38,[512,733,734],{},"    UnitPrice DECIMAL(18, 2) NOT NULL,\n",[512,736,738],{"class":514,"line":737},39,[512,739,740],{},"    CONSTRAINT FK_Items_Orders   FOREIGN KEY (OrderId)   REFERENCES Orders(Id),\n",[512,742,744],{"class":514,"line":743},40,[512,745,746],{},"    CONSTRAINT FK_Items_Products FOREIGN KEY (ProductId) REFERENCES Products(Id)\n",[512,748,750],{"class":514,"line":749},41,[512,751,603],{},[512,753,755],{"class":514,"line":754},42,[512,756,561],{"emptyLinePlaceholder":560},[512,758,760],{"class":514,"line":759},43,[512,761,762],{},"CREATE TABLE Employees (\n",[512,764,766],{"class":514,"line":765},44,[512,767,710],{},[512,769,771],{"class":514,"line":770},45,[512,772,773],{},"    Name      NVARCHAR(100) NOT NULL,\n",[512,775,777],{"class":514,"line":776},46,[512,778,779],{},"    ManagerId INT NULL,\n",[512,781,783],{"class":514,"line":782},47,[512,784,785],{},"    Salary    DECIMAL(18, 2),\n",[512,787,789],{"class":514,"line":788},48,[512,790,791],{},"    Dept      NVARCHAR(50),\n",[512,793,795],{"class":514,"line":794},49,[512,796,797],{},"    CONSTRAINT FK_Emp_Manager FOREIGN KEY (ManagerId) REFERENCES Employees(Id)\n",[512,799,801],{"class":514,"line":800},50,[512,802,603],{},[512,804,806],{"class":514,"line":805},51,[512,807,561],{"emptyLinePlaceholder":560},[512,809,811],{"class":514,"line":810},52,[512,812,813],{},"CREATE TABLE Users (\n",[512,815,817],{"class":514,"line":816},53,[512,818,573],{},[512,820,822],{"class":514,"line":821},54,[512,823,824],{},"    Name  NVARCHAR(100),\n",[512,826,828],{"class":514,"line":827},55,[512,829,830],{},"    Email NVARCHAR(150)\n",[512,832,834],{"class":514,"line":833},56,[512,835,603],{},[512,837,839],{"class":514,"line":838},57,[512,840,561],{"emptyLinePlaceholder":560},[512,842,844],{"class":514,"line":843},58,[512,845,846],{},"CREATE INDEX IX_Orders_CustomerId ON Orders(CustomerId);\n",[512,848,850],{"class":514,"line":849},59,[512,851,852],{},"CREATE INDEX IX_Orders_Date       ON Orders(OrderDate);\n",[512,854,856],{"class":514,"line":855},60,[512,857,858],{},"CREATE INDEX IX_Items_OrderId     ON OrderItems(OrderId);\n",[497,860,862],{"id":861},"_12-mock-data","1.2. Mock data",[502,864,866],{"className":504,"code":865,"language":506,"meta":507,"style":507},"INSERT INTO Customers (Name, Email, City) VALUES\n('Alice Nguyen',  'alice@gmail.com',   'HCM'),\n('Bob Tran',      'bob@gmail.com',     'HN'),\n('Charlie Le',    'charlie@gmail.com', 'HCM'),\n('Dave Pham',     'dave@gmail.com',    'DN'),\n('Eve Hoang',     'eve@gmail.com',     'HCM'),\n('Frank Vo',      'frank@gmail.com',   'HCM'),\n('Grace Bui',     'grace@gmail.com',   'HN'),\n('Henry Do',      NULL,                'CT');     -- Henry chưa từng mua (test LEFT JOIN)\n\nINSERT INTO Products (Name, Price, Stock) VALUES\n('Laptop Dell XPS',     32000000, 5),\n('iPhone 15',           25000000, 12),\n('AirPods Pro',          5500000, 30),\n('Bàn phím cơ Keychron', 2200000, 25),\n('Chuột Logitech MX',    1800000, 50),\n('Màn hình LG 27 4K',   12000000, 8);\n\nINSERT INTO Orders (CustomerId, OrderDate, Status, Total) VALUES\n(1, '2026-01-15', 'Paid',      37500000),\n(1, '2026-02-10', 'Paid',       5500000),\n(1, '2026-03-22', 'Pending',    2200000),\n(2, '2026-01-05', 'Paid',      25000000),\n(3, '2026-02-18', 'Paid',      14200000),\n(3, '2026-04-01', 'Cancelled',  1800000),\n(4, '2026-03-12', 'Paid',      32000000),\n(5, '2026-04-20', 'Pending',   18000000),\n(5, '2026-05-02', 'Paid',       5500000),\n(6, '2026-01-28', 'Paid',      37000000),\n(6, '2026-05-15', 'Paid',       7700000),\n(7, '2026-04-10', 'Pending',   12000000);\n\nINSERT INTO Employees (Name, ManagerId, Salary, Dept) VALUES\n('CEO An',          NULL, 80000000, 'Executive'),\n('CTO Bao',            1, 60000000, 'Tech'),\n('CFO Cuong',          1, 55000000, 'Finance'),\n('Lead Dev Dao',       2, 45000000, 'Tech'),\n('Senior Dev Phong',   4, 35000000, 'Tech'),\n('Junior Dev Giang',   4, 18000000, 'Tech'),\n('Fresher Hieu',       4, 12000000, 'Tech');\n\nINSERT INTO Users (Name, Email) VALUES\n('User A', 'duplicate@mail.com'),\n('User B', 'duplicate@mail.com'),\n('User C', 'unique1@mail.com'),\n('User D', 'another@mail.com'),\n('User E', 'another@mail.com');\n",[509,867,868,873,878,883,888,893,898,903,908,913,917,922,927,932,937,942,947,952,956,961,966,971,976,981,986,991,996,1001,1006,1011,1016,1021,1025,1030,1035,1040,1045,1050,1055,1060,1065,1069,1074,1079,1084,1089,1094],{"__ignoreMap":507},[512,869,870],{"class":514,"line":515},[512,871,872],{},"INSERT INTO Customers (Name, Email, City) VALUES\n",[512,874,875],{"class":514,"line":521},[512,876,877],{},"('Alice Nguyen',  'alice@gmail.com',   'HCM'),\n",[512,879,880],{"class":514,"line":527},[512,881,882],{},"('Bob Tran',      'bob@gmail.com',     'HN'),\n",[512,884,885],{"class":514,"line":533},[512,886,887],{},"('Charlie Le',    'charlie@gmail.com', 'HCM'),\n",[512,889,890],{"class":514,"line":539},[512,891,892],{},"('Dave Pham',     'dave@gmail.com',    'DN'),\n",[512,894,895],{"class":514,"line":545},[512,896,897],{},"('Eve Hoang',     'eve@gmail.com',     'HCM'),\n",[512,899,900],{"class":514,"line":551},[512,901,902],{},"('Frank Vo',      'frank@gmail.com',   'HCM'),\n",[512,904,905],{"class":514,"line":557},[512,906,907],{},"('Grace Bui',     'grace@gmail.com',   'HN'),\n",[512,909,910],{"class":514,"line":564},[512,911,912],{},"('Henry Do',      NULL,                'CT');     -- Henry chưa từng mua (test LEFT JOIN)\n",[512,914,915],{"class":514,"line":570},[512,916,561],{"emptyLinePlaceholder":560},[512,918,919],{"class":514,"line":576},[512,920,921],{},"INSERT INTO Products (Name, Price, Stock) VALUES\n",[512,923,924],{"class":514,"line":582},[512,925,926],{},"('Laptop Dell XPS',     32000000, 5),\n",[512,928,929],{"class":514,"line":588},[512,930,931],{},"('iPhone 15',           25000000, 12),\n",[512,933,934],{"class":514,"line":594},[512,935,936],{},"('AirPods Pro',          5500000, 30),\n",[512,938,939],{"class":514,"line":600},[512,940,941],{},"('Bàn phím cơ Keychron', 2200000, 25),\n",[512,943,944],{"class":514,"line":606},[512,945,946],{},"('Chuột Logitech MX',    1800000, 50),\n",[512,948,949],{"class":514,"line":611},[512,950,951],{},"('Màn hình LG 27 4K',   12000000, 8);\n",[512,953,954],{"class":514,"line":617},[512,955,561],{"emptyLinePlaceholder":560},[512,957,958],{"class":514,"line":622},[512,959,960],{},"INSERT INTO Orders (CustomerId, OrderDate, Status, Total) VALUES\n",[512,962,963],{"class":514,"line":627},[512,964,965],{},"(1, '2026-01-15', 'Paid',      37500000),\n",[512,967,968],{"class":514,"line":633},[512,969,970],{},"(1, '2026-02-10', 'Paid',       5500000),\n",[512,972,973],{"class":514,"line":639},[512,974,975],{},"(1, '2026-03-22', 'Pending',    2200000),\n",[512,977,978],{"class":514,"line":644},[512,979,980],{},"(2, '2026-01-05', 'Paid',      25000000),\n",[512,982,983],{"class":514,"line":649},[512,984,985],{},"(3, '2026-02-18', 'Paid',      14200000),\n",[512,987,988],{"class":514,"line":655},[512,989,990],{},"(3, '2026-04-01', 'Cancelled',  1800000),\n",[512,992,993],{"class":514,"line":661},[512,994,995],{},"(4, '2026-03-12', 'Paid',      32000000),\n",[512,997,998],{"class":514,"line":667},[512,999,1000],{},"(5, '2026-04-20', 'Pending',   18000000),\n",[512,1002,1003],{"class":514,"line":673},[512,1004,1005],{},"(5, '2026-05-02', 'Paid',       5500000),\n",[512,1007,1008],{"class":514,"line":679},[512,1009,1010],{},"(6, '2026-01-28', 'Paid',      37000000),\n",[512,1012,1013],{"class":514,"line":685},[512,1014,1015],{},"(6, '2026-05-15', 'Paid',       7700000),\n",[512,1017,1018],{"class":514,"line":691},[512,1019,1020],{},"(7, '2026-04-10', 'Pending',   12000000);\n",[512,1022,1023],{"class":514,"line":696},[512,1024,561],{"emptyLinePlaceholder":560},[512,1026,1027],{"class":514,"line":701},[512,1028,1029],{},"INSERT INTO Employees (Name, ManagerId, Salary, Dept) VALUES\n",[512,1031,1032],{"class":514,"line":707},[512,1033,1034],{},"('CEO An',          NULL, 80000000, 'Executive'),\n",[512,1036,1037],{"class":514,"line":713},[512,1038,1039],{},"('CTO Bao',            1, 60000000, 'Tech'),\n",[512,1041,1042],{"class":514,"line":719},[512,1043,1044],{},"('CFO Cuong',          1, 55000000, 'Finance'),\n",[512,1046,1047],{"class":514,"line":725},[512,1048,1049],{},"('Lead Dev Dao',       2, 45000000, 'Tech'),\n",[512,1051,1052],{"class":514,"line":731},[512,1053,1054],{},"('Senior Dev Phong',   4, 35000000, 'Tech'),\n",[512,1056,1057],{"class":514,"line":737},[512,1058,1059],{},"('Junior Dev Giang',   4, 18000000, 'Tech'),\n",[512,1061,1062],{"class":514,"line":743},[512,1063,1064],{},"('Fresher Hieu',       4, 12000000, 'Tech');\n",[512,1066,1067],{"class":514,"line":749},[512,1068,561],{"emptyLinePlaceholder":560},[512,1070,1071],{"class":514,"line":754},[512,1072,1073],{},"INSERT INTO Users (Name, Email) VALUES\n",[512,1075,1076],{"class":514,"line":759},[512,1077,1078],{},"('User A', 'duplicate@mail.com'),\n",[512,1080,1081],{"class":514,"line":765},[512,1082,1083],{},"('User B', 'duplicate@mail.com'),\n",[512,1085,1086],{"class":514,"line":770},[512,1087,1088],{},"('User C', 'unique1@mail.com'),\n",[512,1090,1091],{"class":514,"line":776},[512,1092,1093],{},"('User D', 'another@mail.com'),\n",[512,1095,1096],{"class":514,"line":782},[512,1097,1098],{},"('User E', 'another@mail.com');\n",[484,1100],{},[426,1102,1104],{"id":1103},"_2-index-kiến-thức-cốt-lõi","2. INDEX — kiến thức cốt lõi",[497,1106,1108],{"id":1107},"_21-tại-sao-cần-index","2.1. Tại sao cần INDEX?",[478,1110,1111,1118],{"color":480,"icon":481},[431,1112,1113,1114,1117],{},"🟢 Không có index, để tìm 1 row trong bảng N row, DB phải ",[442,1115,1116],{},"scan từ đầu đến cuối"," (Full Table Scan) — O(n).",[431,1119,1120,1121,1124],{},"Với bảng 100 triệu row, mỗi query mất nhiều giây. Index là ",[442,1122,1123],{},"cấu trúc dữ liệu phụ"," (B-tree) giúp tìm row trong O(log n).",[497,1126,1128],{"id":1127},"_22-b-tree-cấu-trúc-bên-trong","2.2. 🟡 B-tree — cấu trúc bên trong",[478,1130,1132,1139],{"color":1131,"icon":268},"warning",[431,1133,1134,1135,1138],{},"🟡 ",[442,1136,1137],{},"INDEX trong SQL Server \u002F Postgres \u002F MySQL InnoDB đều là B+ tree"," (variant của B-tree). Cấu trúc:",[435,1140,1141,1147,1153,1162],{},[438,1142,1143,1146],{},[442,1144,1145],{},"Root node"," (1 page) → trỏ tới các internal nodes.",[438,1148,1149,1152],{},[442,1150,1151],{},"Internal nodes"," → trỏ tới các leaf nodes.",[438,1154,1155,1158,1159,466],{},[442,1156,1157],{},"Leaf nodes"," chứa key + pointer tới row thực, ",[442,1160,1161],{},"sorted",[438,1163,1164,1165,1168],{},"Mỗi node là 1 ",[442,1166,1167],{},"disk page"," (8 KB trong SQL Server).",[502,1170,1175],{"className":1171,"code":1173,"language":1174},[1172],"language-text","           [Root]\n          \u002F  |   \\\n     [..]  [..]  [..]      ← internal\n     \u002F |    | \\    | \\\n   [L][L]  [L][L] [L][L]   ← leaf (sorted)\n","text",[509,1176,1173],{"__ignoreMap":507},[431,1178,1179,1182,1183,1186],{},[442,1180,1181],{},"Tại sao O(log n) tìm?"," Mỗi node có nhiều children (vd 100). Tree depth = log_100(N). Với 100 triệu row → depth ~4. Chỉ ",[442,1184,1185],{},"4 page reads"," thay vì scan 100 triệu row.",[497,1188,1190],{"id":1189},"_23-clustered-vs-non-clustered","2.3. Clustered vs Non-clustered",[1192,1193,1194,1208],"field-group",{},[1195,1196,1199,1200,1203,1204,1207],"field",{"name":1197,"type":1198},"Clustered Index","1 cái \u002F bảng","Sắp xếp ",[442,1201,1202],{},"vật lý"," data theo key. Leaf node ",[442,1205,1206],{},"CHỨA LUÔN"," data. Default = PRIMARY KEY.",[1195,1209,1212,1213,1216],{"name":1210,"type":1211},"Non-clustered Index","Nhiều cái \u002F bảng","B-tree riêng. Leaf chứa key + ",[442,1214,1215],{},"pointer"," tới row (clustered key hoặc RID).",[431,1218,1219],{},[442,1220,1221],{},"Hình dung:",[502,1223,1226],{"className":1224,"code":1225,"language":1174},[1172],"CLUSTERED (PK = Id) → data sorted by Id\n\nLeaf:\n  [Id=1, full row data] → [Id=2, full row data] → [Id=3, ...]\n\nNON-CLUSTERED (on Email) → tree riêng sorted by Email\n\nLeaf:\n  [Email='a@b.com', Id=42] → [Email='b@c.com', Id=7] → ...\n                       ↓\n              Lookup Id=42 trong clustered → lấy full row\n",[509,1227,1225],{"__ignoreMap":507},[431,1229,1230,1231,1234],{},"→ Non-clustered có ",[442,1232,1233],{},"2 cấp",": tìm leaf của index → lookup clustered theo PK.",[497,1236,1238],{"id":1237},"_24-code-ví-dụ","2.4. Code ví dụ",[502,1240,1242],{"className":504,"code":1241,"language":506,"meta":507,"style":507},"-- Clustered (default = PK)\nCREATE TABLE Orders (\n    Id INT PRIMARY KEY IDENTITY,   -- = clustered tự động\n    ...\n);\n\n-- Non-clustered đơn cột\nCREATE INDEX IX_Orders_CustomerId ON Orders(CustomerId);\n\n-- Non-clustered composite (thứ tự cột RẤT QUAN TRỌNG)\nCREATE INDEX IX_Orders_Cust_Date ON Orders(CustomerId, OrderDate);\n\n-- Covering — INCLUDE thêm cột để query không cần seek về bảng\nCREATE INDEX IX_Orders_Cover ON Orders(CustomerId)\nINCLUDE (OrderDate, Total, Status);\n\n-- Filtered — chỉ index 1 phần dữ liệu\nCREATE INDEX IX_Orders_Active ON Orders(CustomerId)\nWHERE Status \u003C> 'Cancelled';\n\n-- Unique\nCREATE UNIQUE INDEX IX_Users_Email ON Users(Email);\n",[509,1243,1244,1249,1253,1258,1263,1267,1271,1276,1280,1284,1289,1294,1298,1303,1308,1313,1317,1322,1327,1332,1336,1341],{"__ignoreMap":507},[512,1245,1246],{"class":514,"line":515},[512,1247,1248],{},"-- Clustered (default = PK)\n",[512,1250,1251],{"class":514,"line":521},[512,1252,652],{},[512,1254,1255],{"class":514,"line":527},[512,1256,1257],{},"    Id INT PRIMARY KEY IDENTITY,   -- = clustered tự động\n",[512,1259,1260],{"class":514,"line":533},[512,1261,1262],{},"    ...\n",[512,1264,1265],{"class":514,"line":539},[512,1266,603],{},[512,1268,1269],{"class":514,"line":545},[512,1270,561],{"emptyLinePlaceholder":560},[512,1272,1273],{"class":514,"line":551},[512,1274,1275],{},"-- Non-clustered đơn cột\n",[512,1277,1278],{"class":514,"line":557},[512,1279,846],{},[512,1281,1282],{"class":514,"line":564},[512,1283,561],{"emptyLinePlaceholder":560},[512,1285,1286],{"class":514,"line":570},[512,1287,1288],{},"-- Non-clustered composite (thứ tự cột RẤT QUAN TRỌNG)\n",[512,1290,1291],{"class":514,"line":576},[512,1292,1293],{},"CREATE INDEX IX_Orders_Cust_Date ON Orders(CustomerId, OrderDate);\n",[512,1295,1296],{"class":514,"line":582},[512,1297,561],{"emptyLinePlaceholder":560},[512,1299,1300],{"class":514,"line":588},[512,1301,1302],{},"-- Covering — INCLUDE thêm cột để query không cần seek về bảng\n",[512,1304,1305],{"class":514,"line":594},[512,1306,1307],{},"CREATE INDEX IX_Orders_Cover ON Orders(CustomerId)\n",[512,1309,1310],{"class":514,"line":600},[512,1311,1312],{},"INCLUDE (OrderDate, Total, Status);\n",[512,1314,1315],{"class":514,"line":606},[512,1316,561],{"emptyLinePlaceholder":560},[512,1318,1319],{"class":514,"line":611},[512,1320,1321],{},"-- Filtered — chỉ index 1 phần dữ liệu\n",[512,1323,1324],{"class":514,"line":617},[512,1325,1326],{},"CREATE INDEX IX_Orders_Active ON Orders(CustomerId)\n",[512,1328,1329],{"class":514,"line":622},[512,1330,1331],{},"WHERE Status \u003C> 'Cancelled';\n",[512,1333,1334],{"class":514,"line":627},[512,1335,561],{"emptyLinePlaceholder":560},[512,1337,1338],{"class":514,"line":633},[512,1339,1340],{},"-- Unique\n",[512,1342,1343],{"class":514,"line":639},[512,1344,1345],{},"CREATE UNIQUE INDEX IX_Users_Email ON Users(Email);\n",[497,1347,1349],{"id":1348},"_25-left-most-prefix-rule","2.5. Left-most prefix rule",[478,1351,1353,1364,1377,1383],{"color":1131,"icon":1352},"i-lucide-star",[431,1354,1355,1356,1359,1360,1363],{},"⭐ ",[442,1357,1358],{},"Câu PV kinh điển:"," index composite ",[509,1361,1362],{},"(A, B, C)"," dùng được cho:",[431,1365,1366,1367,1370,1371,1373,1374,1376],{},"✅ WHERE A = ?",[1368,1369],"br",{},"\n✅ WHERE A = ? AND B = ?",[1368,1372],{},"\n✅ WHERE A = ? AND B = ? AND C = ?",[1368,1375],{},"\n✅ WHERE A = ? AND C = ? (dùng được A, không dùng C)",[431,1378,1379,1380,1382],{},"❌ WHERE B = ? (bỏ qua A) — KHÔNG dùng được",[1368,1381],{},"\n❌ WHERE C = ? — KHÔNG dùng được",[431,1384,1385,1386,1389],{},"→ Phải dùng cột ",[442,1387,1388],{},"đầu tiên"," của composite mới được. Đó là vì index sorted theo (A, B, C) — không seek được nếu không biết A.",[497,1391,1393],{"id":1392},"_26-khi-nào-nên-không-nên-tạo-index","2.6. Khi nào nên \u002F không nên tạo INDEX?",[478,1395,1398,1404],{"color":1396,"icon":1397},"success","i-lucide-check-circle-2",[431,1399,1400,1401],{},"🔵 ",[442,1402,1403],{},"Nên index:",[435,1405,1406,1409,1416],{},[438,1407,1408],{},"Cột thường trong WHERE, JOIN, ORDER BY, GROUP BY.",[438,1410,1411,1412,1415],{},"Cột có ",[442,1413,1414],{},"selectivity cao"," (nhiều giá trị distinct, vd Email).",[438,1417,1418],{},"Foreign key (SQL Server KHÔNG tự tạo!).",[478,1420,1423,1428],{"color":1421,"icon":1422},"error","i-lucide-x-circle",[431,1424,1400,1425],{},[442,1426,1427],{},"KHÔNG nên index:",[435,1429,1430,1433,1436,1439],{},[438,1431,1432],{},"Bảng nhỏ (vài nghìn row) — scan có khi nhanh hơn.",[438,1434,1435],{},"Cột thay đổi rất thường xuyên (UPDATE phải update cả index).",[438,1437,1438],{},"Selectivity thấp (Gender: 2 giá trị → index gần vô dụng).",[438,1440,1441],{},"Bảng heavy INSERT, ít SELECT.",[497,1443,1445],{"id":1444},"_27-sargable-vs-non-sargable","2.7. Sargable vs Non-sargable",[478,1447,1134,1449,1452,1453,1456],{"color":1421,"icon":1448},"i-lucide-alert-octagon",[442,1450,1451],{},"Non-sargable"," = query mà engine không dùng được index dù có. Vì áp ",[442,1454,1455],{},"hàm\u002Fbiểu thức"," lên cột.",[502,1458,1460],{"className":504,"code":1459,"language":506,"meta":507,"style":507},"-- ❌ Non-sargable — function lên cột\nWHERE YEAR(OrderDate) = 2026         -- engine phải tính YEAR cho mỗi row\nWHERE UPPER(Email) = 'A@B.COM'       -- function lên cột\nWHERE Total + Tax > 100              -- biểu thức lên cột\nWHERE Status LIKE '%Active%'         -- wildcard ở đầu\n\n-- ✅ Sargable\nWHERE OrderDate >= '2026-01-01' AND OrderDate \u003C '2027-01-01'\nWHERE Email = 'a@b.com'              -- nếu collation case-insensitive\nWHERE Total > 100 - Tax\nWHERE Status LIKE 'Active%'          -- wildcard cuối OK\n",[509,1461,1462,1467,1472,1477,1482,1487,1491,1496,1501,1506,1511],{"__ignoreMap":507},[512,1463,1464],{"class":514,"line":515},[512,1465,1466],{},"-- ❌ Non-sargable — function lên cột\n",[512,1468,1469],{"class":514,"line":521},[512,1470,1471],{},"WHERE YEAR(OrderDate) = 2026         -- engine phải tính YEAR cho mỗi row\n",[512,1473,1474],{"class":514,"line":527},[512,1475,1476],{},"WHERE UPPER(Email) = 'A@B.COM'       -- function lên cột\n",[512,1478,1479],{"class":514,"line":533},[512,1480,1481],{},"WHERE Total + Tax > 100              -- biểu thức lên cột\n",[512,1483,1484],{"class":514,"line":539},[512,1485,1486],{},"WHERE Status LIKE '%Active%'         -- wildcard ở đầu\n",[512,1488,1489],{"class":514,"line":545},[512,1490,561],{"emptyLinePlaceholder":560},[512,1492,1493],{"class":514,"line":551},[512,1494,1495],{},"-- ✅ Sargable\n",[512,1497,1498],{"class":514,"line":557},[512,1499,1500],{},"WHERE OrderDate >= '2026-01-01' AND OrderDate \u003C '2027-01-01'\n",[512,1502,1503],{"class":514,"line":564},[512,1504,1505],{},"WHERE Email = 'a@b.com'              -- nếu collation case-insensitive\n",[512,1507,1508],{"class":514,"line":570},[512,1509,1510],{},"WHERE Total > 100 - Tax\n",[512,1512,1513],{"class":514,"line":576},[512,1514,1515],{},"WHERE Status LIKE 'Active%'          -- wildcard cuối OK\n",[431,1517,1355,1518,1521,1522,1530,1531,1533],{},[442,1519,1520],{},"Bẫy PV:"," ",[1523,1524,1525,1526,1529],"em",{},"\"Tại sao ",[509,1527,1528],{},"WHERE YEAR(date) = 2026"," chậm dù có index?\""," → ",[442,1532,1451],{},". DB phải compute YEAR cho mọi row → full scan.",[497,1535,1537],{"id":1536},"_28-verify-index-có-được-dùng","2.8. Verify index có được dùng",[502,1539,1541],{"className":504,"code":1540,"language":506,"meta":507,"style":507},"SET STATISTICS IO ON;\nSET STATISTICS TIME ON;\n\nSELECT * FROM Orders WHERE CustomerId = 1;\n\n-- Output:\n-- Table 'Orders'. Scan count 1, logical reads 8, physical reads 2\n-- CPU time = 0 ms, elapsed time = 12 ms\n",[509,1542,1543,1548,1553,1557,1562,1566,1571,1576],{"__ignoreMap":507},[512,1544,1545],{"class":514,"line":515},[512,1546,1547],{},"SET STATISTICS IO ON;\n",[512,1549,1550],{"class":514,"line":521},[512,1551,1552],{},"SET STATISTICS TIME ON;\n",[512,1554,1555],{"class":514,"line":527},[512,1556,561],{"emptyLinePlaceholder":560},[512,1558,1559],{"class":514,"line":533},[512,1560,1561],{},"SELECT * FROM Orders WHERE CustomerId = 1;\n",[512,1563,1564],{"class":514,"line":539},[512,1565,561],{"emptyLinePlaceholder":560},[512,1567,1568],{"class":514,"line":545},[512,1569,1570],{},"-- Output:\n",[512,1572,1573],{"class":514,"line":551},[512,1574,1575],{},"-- Table 'Orders'. Scan count 1, logical reads 8, physical reads 2\n",[512,1577,1578],{"class":514,"line":557},[512,1579,1580],{},"-- CPU time = 0 ms, elapsed time = 12 ms\n",[431,1582,1583,1586],{},[509,1584,1585],{},"logical reads"," = số 8KB page đọc. Chỉ số quan trọng nhất để so trước\u002Fsau optimize.",[484,1588],{},[426,1590,1592],{"id":1591},"_3-join-sâu-hơn","3. JOIN — sâu hơn",[497,1594,1596],{"id":1595},"_31-5-loại-join","3.1. 5 loại JOIN",[502,1598,1600],{"className":504,"code":1599,"language":506,"meta":507,"style":507},"-- INNER — chỉ row match cả 2\nSELECT c.Name, o.Total\nFROM Customers c\nINNER JOIN Orders o ON o.CustomerId = c.Id;\n\n-- LEFT — tất cả Customers + matching Orders (NULL nếu không có)\nSELECT c.Name, o.Total\nFROM Customers c\nLEFT JOIN Orders o ON o.CustomerId = c.Id;\n\n-- RIGHT — đảo lại (hiếm dùng, swap LEFT thuận)\n-- FULL OUTER — tất cả row 2 bên\n-- CROSS — tích Descartes m×n\n",[509,1601,1602,1607,1612,1617,1622,1626,1631,1635,1639,1644,1648,1653,1658],{"__ignoreMap":507},[512,1603,1604],{"class":514,"line":515},[512,1605,1606],{},"-- INNER — chỉ row match cả 2\n",[512,1608,1609],{"class":514,"line":521},[512,1610,1611],{},"SELECT c.Name, o.Total\n",[512,1613,1614],{"class":514,"line":527},[512,1615,1616],{},"FROM Customers c\n",[512,1618,1619],{"class":514,"line":533},[512,1620,1621],{},"INNER JOIN Orders o ON o.CustomerId = c.Id;\n",[512,1623,1624],{"class":514,"line":539},[512,1625,561],{"emptyLinePlaceholder":560},[512,1627,1628],{"class":514,"line":545},[512,1629,1630],{},"-- LEFT — tất cả Customers + matching Orders (NULL nếu không có)\n",[512,1632,1633],{"class":514,"line":551},[512,1634,1611],{},[512,1636,1637],{"class":514,"line":557},[512,1638,1616],{},[512,1640,1641],{"class":514,"line":564},[512,1642,1643],{},"LEFT JOIN Orders o ON o.CustomerId = c.Id;\n",[512,1645,1646],{"class":514,"line":570},[512,1647,561],{"emptyLinePlaceholder":560},[512,1649,1650],{"class":514,"line":576},[512,1651,1652],{},"-- RIGHT — đảo lại (hiếm dùng, swap LEFT thuận)\n",[512,1654,1655],{"class":514,"line":582},[512,1656,1657],{},"-- FULL OUTER — tất cả row 2 bên\n",[512,1659,1660],{"class":514,"line":588},[512,1661,1662],{},"-- CROSS — tích Descartes m×n\n",[497,1664,1666],{"id":1665},"_32-anti-join-tìm-không-có","3.2. 🟡 Anti-join — tìm \"không có\"",[502,1668,1670],{"className":504,"code":1669,"language":506,"meta":507,"style":507},"-- Tìm khách hàng chưa mua đơn nào — 3 cách:\n\n-- Cách 1: LEFT JOIN ... IS NULL\nSELECT c.* FROM Customers c\nLEFT JOIN Orders o ON o.CustomerId = c.Id\nWHERE o.Id IS NULL;\n\n-- Cách 2: NOT EXISTS (THƯỜNG TỐT NHẤT)\nSELECT c.* FROM Customers c\nWHERE NOT EXISTS (SELECT 1 FROM Orders o WHERE o.CustomerId = c.Id);\n\n-- Cách 3: NOT IN (cẩn thận NULL!)\nSELECT c.* FROM Customers c\nWHERE c.Id NOT IN (SELECT CustomerId FROM Orders WHERE CustomerId IS NOT NULL);\n",[509,1671,1672,1677,1681,1686,1691,1696,1701,1705,1710,1714,1719,1723,1728,1732],{"__ignoreMap":507},[512,1673,1674],{"class":514,"line":515},[512,1675,1676],{},"-- Tìm khách hàng chưa mua đơn nào — 3 cách:\n",[512,1678,1679],{"class":514,"line":521},[512,1680,561],{"emptyLinePlaceholder":560},[512,1682,1683],{"class":514,"line":527},[512,1684,1685],{},"-- Cách 1: LEFT JOIN ... IS NULL\n",[512,1687,1688],{"class":514,"line":533},[512,1689,1690],{},"SELECT c.* FROM Customers c\n",[512,1692,1693],{"class":514,"line":539},[512,1694,1695],{},"LEFT JOIN Orders o ON o.CustomerId = c.Id\n",[512,1697,1698],{"class":514,"line":545},[512,1699,1700],{},"WHERE o.Id IS NULL;\n",[512,1702,1703],{"class":514,"line":551},[512,1704,561],{"emptyLinePlaceholder":560},[512,1706,1707],{"class":514,"line":557},[512,1708,1709],{},"-- Cách 2: NOT EXISTS (THƯỜNG TỐT NHẤT)\n",[512,1711,1712],{"class":514,"line":564},[512,1713,1690],{},[512,1715,1716],{"class":514,"line":570},[512,1717,1718],{},"WHERE NOT EXISTS (SELECT 1 FROM Orders o WHERE o.CustomerId = c.Id);\n",[512,1720,1721],{"class":514,"line":576},[512,1722,561],{"emptyLinePlaceholder":560},[512,1724,1725],{"class":514,"line":582},[512,1726,1727],{},"-- Cách 3: NOT IN (cẩn thận NULL!)\n",[512,1729,1730],{"class":514,"line":588},[512,1731,1690],{},[512,1733,1734],{"class":514,"line":594},[512,1735,1736],{},"WHERE c.Id NOT IN (SELECT CustomerId FROM Orders WHERE CustomerId IS NOT NULL);\n",[478,1738,1134,1740,1743,1744,1747],{"color":1131,"icon":1739},"i-lucide-alert-triangle",[442,1741,1742],{},"Bẫy NOT IN:"," nếu subquery có NULL, ",[509,1745,1746],{},"x NOT IN (1, 2, NULL)"," luôn UNKNOWN → query trả 0 rows. Tránh dùng NOT IN với subquery có thể NULL — dùng NOT EXISTS.",[497,1749,1751],{"id":1750},"_33-bẫy-left-join-where","3.3. 🔴 Bẫy LEFT JOIN + WHERE",[478,1753,1754,1759,1800],{"color":1131,"icon":1352},[431,1755,1355,1756],{},[442,1757,1758],{},"Câu PV cực hay:",[502,1760,1762],{"className":504,"code":1761,"language":506,"meta":507,"style":507},"-- ❌ Sai — biến LEFT JOIN thành INNER vô tình\nSELECT c.* FROM Customers c\nLEFT JOIN Orders o ON o.CustomerId = c.Id\nWHERE o.Status = 'Paid';      -- ⚠ o.Status NULL bị loại → mất KH chưa mua\n\n-- ✅ Đúng — điều kiện vào ON\nSELECT c.* FROM Customers c\nLEFT JOIN Orders o ON o.CustomerId = c.Id AND o.Status = 'Paid';\n",[509,1763,1764,1769,1773,1777,1782,1786,1791,1795],{"__ignoreMap":507},[512,1765,1766],{"class":514,"line":515},[512,1767,1768],{},"-- ❌ Sai — biến LEFT JOIN thành INNER vô tình\n",[512,1770,1771],{"class":514,"line":521},[512,1772,1690],{},[512,1774,1775],{"class":514,"line":527},[512,1776,1695],{},[512,1778,1779],{"class":514,"line":533},[512,1780,1781],{},"WHERE o.Status = 'Paid';      -- ⚠ o.Status NULL bị loại → mất KH chưa mua\n",[512,1783,1784],{"class":514,"line":539},[512,1785,561],{"emptyLinePlaceholder":560},[512,1787,1788],{"class":514,"line":545},[512,1789,1790],{},"-- ✅ Đúng — điều kiện vào ON\n",[512,1792,1793],{"class":514,"line":551},[512,1794,1690],{},[512,1796,1797],{"class":514,"line":557},[512,1798,1799],{},"LEFT JOIN Orders o ON o.CustomerId = c.Id AND o.Status = 'Paid';\n",[431,1801,1802,1805],{},[442,1803,1804],{},"Hiểu cơ chế:"," LEFT JOIN tạo row có NULL bên phải nếu không match. WHERE chạy SAU, lọc NULL → biến thành INNER.",[497,1807,1809],{"id":1808},"_34-self-join-hierarchy","3.4. SELF JOIN — hierarchy",[502,1811,1813],{"className":504,"code":1812,"language":506,"meta":507,"style":507},"-- Employees có ManagerId trỏ về Employees.Id\nSELECT e.Name AS Employee, m.Name AS Manager\nFROM Employees e\nLEFT JOIN Employees m ON m.Id = e.ManagerId;\n\n-- Output:\n-- CEO An | NULL\n-- CTO Bao | CEO An\n-- Lead Dev Dao | CTO Bao\n-- ...\n",[509,1814,1815,1820,1825,1830,1835,1839,1843,1848,1853,1858],{"__ignoreMap":507},[512,1816,1817],{"class":514,"line":515},[512,1818,1819],{},"-- Employees có ManagerId trỏ về Employees.Id\n",[512,1821,1822],{"class":514,"line":521},[512,1823,1824],{},"SELECT e.Name AS Employee, m.Name AS Manager\n",[512,1826,1827],{"class":514,"line":527},[512,1828,1829],{},"FROM Employees e\n",[512,1831,1832],{"class":514,"line":533},[512,1833,1834],{},"LEFT JOIN Employees m ON m.Id = e.ManagerId;\n",[512,1836,1837],{"class":514,"line":539},[512,1838,561],{"emptyLinePlaceholder":560},[512,1840,1841],{"class":514,"line":545},[512,1842,1570],{},[512,1844,1845],{"class":514,"line":551},[512,1846,1847],{},"-- CEO An | NULL\n",[512,1849,1850],{"class":514,"line":557},[512,1851,1852],{},"-- CTO Bao | CEO An\n",[512,1854,1855],{"class":514,"line":564},[512,1856,1857],{},"-- Lead Dev Dao | CTO Bao\n",[512,1859,1860],{"class":514,"line":570},[512,1861,1862],{},"-- ...\n",[484,1864],{},[426,1866,1868],{"id":1867},"_4-window-function-đột-phá-sql-hiện-đại","4. Window function — đột phá SQL hiện đại",[497,1870,1872],{"id":1871},"_41-cấu-trúc","4.1. Cấu trúc",[502,1874,1876],{"className":504,"code":1875,"language":506,"meta":507,"style":507},"function_name() OVER (\n    [PARTITION BY col1, col2 ...]\n    [ORDER BY col1 ...]\n    [ROWS|RANGE BETWEEN ... AND ...]\n)\n",[509,1877,1878,1883,1888,1893,1898],{"__ignoreMap":507},[512,1879,1880],{"class":514,"line":515},[512,1881,1882],{},"function_name() OVER (\n",[512,1884,1885],{"class":514,"line":521},[512,1886,1887],{},"    [PARTITION BY col1, col2 ...]\n",[512,1889,1890],{"class":514,"line":527},[512,1891,1892],{},"    [ORDER BY col1 ...]\n",[512,1894,1895],{"class":514,"line":533},[512,1896,1897],{},"    [ROWS|RANGE BETWEEN ... AND ...]\n",[512,1899,1900],{"class":514,"line":539},[512,1901,1902],{},")\n",[497,1904,1906],{"id":1905},"_42-ranking-row_number-rank-dense_rank","4.2. Ranking — ROW_NUMBER \u002F RANK \u002F DENSE_RANK",[502,1908,1910],{"className":504,"code":1909,"language":506,"meta":507,"style":507},"-- Cùng 100, 100, 90, 80\nSELECT\n    Value,\n    ROW_NUMBER() OVER (ORDER BY Value DESC) AS Rn,    -- 1, 2, 3, 4\n    RANK()       OVER (ORDER BY Value DESC) AS Rk,    -- 1, 1, 3, 4 (skip)\n    DENSE_RANK() OVER (ORDER BY Value DESC) AS Dk     -- 1, 1, 2, 3 (no skip)\nFROM Scores;\n",[509,1911,1912,1917,1922,1927,1932,1937,1942],{"__ignoreMap":507},[512,1913,1914],{"class":514,"line":515},[512,1915,1916],{},"-- Cùng 100, 100, 90, 80\n",[512,1918,1919],{"class":514,"line":521},[512,1920,1921],{},"SELECT\n",[512,1923,1924],{"class":514,"line":527},[512,1925,1926],{},"    Value,\n",[512,1928,1929],{"class":514,"line":533},[512,1930,1931],{},"    ROW_NUMBER() OVER (ORDER BY Value DESC) AS Rn,    -- 1, 2, 3, 4\n",[512,1933,1934],{"class":514,"line":539},[512,1935,1936],{},"    RANK()       OVER (ORDER BY Value DESC) AS Rk,    -- 1, 1, 3, 4 (skip)\n",[512,1938,1939],{"class":514,"line":545},[512,1940,1941],{},"    DENSE_RANK() OVER (ORDER BY Value DESC) AS Dk     -- 1, 1, 2, 3 (no skip)\n",[512,1943,1944],{"class":514,"line":551},[512,1945,1946],{},"FROM Scores;\n",[497,1948,1950],{"id":1949},"_43-top-n-per-group-câu-pv-hot","4.3. Top N per group — câu PV hot",[502,1952,1954],{"className":504,"code":1953,"language":506,"meta":507,"style":507},"-- Đơn hàng mới nhất của MỖI khách\nWITH Ranked AS (\n    SELECT *,\n        ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY OrderDate DESC) AS rn\n    FROM Orders\n)\nSELECT * FROM Ranked WHERE rn = 1;\n",[509,1955,1956,1961,1966,1971,1976,1981,1985],{"__ignoreMap":507},[512,1957,1958],{"class":514,"line":515},[512,1959,1960],{},"-- Đơn hàng mới nhất của MỖI khách\n",[512,1962,1963],{"class":514,"line":521},[512,1964,1965],{},"WITH Ranked AS (\n",[512,1967,1968],{"class":514,"line":527},[512,1969,1970],{},"    SELECT *,\n",[512,1972,1973],{"class":514,"line":533},[512,1974,1975],{},"        ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY OrderDate DESC) AS rn\n",[512,1977,1978],{"class":514,"line":539},[512,1979,1980],{},"    FROM Orders\n",[512,1982,1983],{"class":514,"line":545},[512,1984,1902],{},[512,1986,1987],{"class":514,"line":551},[512,1988,1989],{},"SELECT * FROM Ranked WHERE rn = 1;\n",[478,1991,1355,1992,1521,1995,1998,1999,2002],{"color":1131,"icon":1352},[442,1993,1994],{},"PV cực phổ biến:",[1523,1996,1997],{},"\"Lấy đơn mới nhất của mỗi khách\""," — đáp án chuẩn là dùng ",[509,2000,2001],{},"ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...)",". Cách cũ (correlated subquery) chậm hơn nhiều.",[497,2004,2006],{"id":2005},"_44-running-total-moving-average","4.4. Running total + Moving average",[502,2008,2010],{"className":504,"code":2009,"language":506,"meta":507,"style":507},"SELECT\n    OrderDate, Total,\n    SUM(Total) OVER (ORDER BY OrderDate) AS RunningTotal,\n    AVG(Total) OVER (\n        ORDER BY OrderDate\n        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW\n    ) AS MovingAvg7Days\nFROM Orders;\n",[509,2011,2012,2016,2021,2026,2031,2036,2041,2046],{"__ignoreMap":507},[512,2013,2014],{"class":514,"line":515},[512,2015,1921],{},[512,2017,2018],{"class":514,"line":521},[512,2019,2020],{},"    OrderDate, Total,\n",[512,2022,2023],{"class":514,"line":527},[512,2024,2025],{},"    SUM(Total) OVER (ORDER BY OrderDate) AS RunningTotal,\n",[512,2027,2028],{"class":514,"line":533},[512,2029,2030],{},"    AVG(Total) OVER (\n",[512,2032,2033],{"class":514,"line":539},[512,2034,2035],{},"        ORDER BY OrderDate\n",[512,2037,2038],{"class":514,"line":545},[512,2039,2040],{},"        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW\n",[512,2042,2043],{"class":514,"line":551},[512,2044,2045],{},"    ) AS MovingAvg7Days\n",[512,2047,2048],{"class":514,"line":557},[512,2049,2050],{},"FROM Orders;\n",[484,2052],{},[426,2054,2056],{"id":2055},"_5-transaction-acid","5. Transaction & ACID",[497,2058,2060],{"id":2059},"_51-cú-pháp-transaction","5.1. Cú pháp transaction",[502,2062,2064],{"className":504,"code":2063,"language":506,"meta":507,"style":507},"BEGIN TRANSACTION;\nBEGIN TRY\n    UPDATE Accounts SET Balance = Balance - 1000 WHERE Id = 1;\n    UPDATE Accounts SET Balance = Balance + 1000 WHERE Id = 2;\n    \n    IF (SELECT Balance FROM Accounts WHERE Id = 1) \u003C 0\n        THROW 50001, 'Insufficient funds', 1;\n    \n    COMMIT TRANSACTION;\nEND TRY\nBEGIN CATCH\n    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;\n    THROW;\nEND CATCH\n",[509,2065,2066,2071,2076,2081,2086,2091,2096,2101,2105,2110,2115,2120,2125,2130],{"__ignoreMap":507},[512,2067,2068],{"class":514,"line":515},[512,2069,2070],{},"BEGIN TRANSACTION;\n",[512,2072,2073],{"class":514,"line":521},[512,2074,2075],{},"BEGIN TRY\n",[512,2077,2078],{"class":514,"line":527},[512,2079,2080],{},"    UPDATE Accounts SET Balance = Balance - 1000 WHERE Id = 1;\n",[512,2082,2083],{"class":514,"line":533},[512,2084,2085],{},"    UPDATE Accounts SET Balance = Balance + 1000 WHERE Id = 2;\n",[512,2087,2088],{"class":514,"line":539},[512,2089,2090],{},"    \n",[512,2092,2093],{"class":514,"line":545},[512,2094,2095],{},"    IF (SELECT Balance FROM Accounts WHERE Id = 1) \u003C 0\n",[512,2097,2098],{"class":514,"line":551},[512,2099,2100],{},"        THROW 50001, 'Insufficient funds', 1;\n",[512,2102,2103],{"class":514,"line":557},[512,2104,2090],{},[512,2106,2107],{"class":514,"line":564},[512,2108,2109],{},"    COMMIT TRANSACTION;\n",[512,2111,2112],{"class":514,"line":570},[512,2113,2114],{},"END TRY\n",[512,2116,2117],{"class":514,"line":576},[512,2118,2119],{},"BEGIN CATCH\n",[512,2121,2122],{"class":514,"line":582},[512,2123,2124],{},"    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;\n",[512,2126,2127],{"class":514,"line":588},[512,2128,2129],{},"    THROW;\n",[512,2131,2132],{"class":514,"line":594},[512,2133,2134],{},"END CATCH\n",[497,2136,2138],{"id":2137},"_52-acid-định-nghĩa-cốt-lõi","5.2. ACID — định nghĩa cốt lõi",[478,2140,2141],{"color":480,"icon":481},"🟢 ACID đảm bảo transaction đáng tin cậy:",[2143,2144,2145,2161],"table",{},[2146,2147,2148],"thead",{},[2149,2150,2151,2155,2158],"tr",{},[2152,2153,2154],"th",{},"Letter",[2152,2156,2157],{},"Tên",[2152,2159,2160],{},"Ý nghĩa",[2162,2163,2164,2179,2193,2207],"tbody",{},[2149,2165,2166,2173,2176],{},[2167,2168,2169,2172],"td",{},[442,2170,2171],{},"A","tomicity",[2167,2174,2175],{},"Nguyên tử",[2167,2177,2178],{},"Tất cả hoặc không gì — commit hết hoặc rollback hết",[2149,2180,2181,2187,2190],{},[2167,2182,2183,2186],{},[442,2184,2185],{},"C","onsistency",[2167,2188,2189],{},"Nhất quán",[2167,2191,2192],{},"Trước\u002Fsau transaction, DB ở trạng thái hợp lệ (PK, FK, CHECK)",[2149,2194,2195,2201,2204],{},[2167,2196,2197,2200],{},[442,2198,2199],{},"I","solation",[2167,2202,2203],{},"Cô lập",[2167,2205,2206],{},"Transaction không thấy nháp của transaction khác",[2149,2208,2209,2215,2218],{},[2167,2210,2211,2214],{},[442,2212,2213],{},"D","urability",[2167,2216,2217],{},"Bền vững",[2167,2219,2220],{},"Sau COMMIT, dữ liệu lưu chắc chắn (kể cả crash)",[431,2222,2223,2226],{},[442,2224,2225],{},"Ví dụ chuyển khoản:"," trừ 1tr tài khoản A, cộng 1tr tài khoản B:",[435,2228,2229,2234,2239,2244],{},[438,2230,2231,2233],{},[442,2232,2171],{},": nếu trừ A xong mà cộng B fail → rollback cả 2 → không mất tiền.",[438,2235,2236,2238],{},[442,2237,2185],{},": balance không bao giờ âm (CHECK constraint).",[438,2240,2241,2243],{},[442,2242,2199],{},": transaction khác query A đang chạy → không thấy state \"đã trừ A nhưng chưa cộng B\".",[438,2245,2246,2248],{},[442,2247,2213],{},": COMMIT xong, crash server → khởi động lại, transaction vẫn được áp dụng.",[497,2250,2252],{"id":2251},"_53-durability-hoạt-động-ra-sao","5.3. Durability — hoạt động ra sao?",[478,2254,2255,2261,2283],{"color":1131,"icon":268},[431,2256,1134,2257,2260],{},[442,2258,2259],{},"WAL (Write-Ahead Log)"," — cơ chế thực hiện Durability.",[2262,2263,2264,2271,2277,2280],"ol",{},[438,2265,2266,2267,2270],{},"Mọi thay đổi ghi vào ",[442,2268,2269],{},"transaction log"," trước.",[438,2272,2273,2274,466],{},"Khi COMMIT, đảm bảo log đã ",[442,2275,2276],{},"flush xuống disk",[438,2278,2279],{},"Sau đó data page có thể flush async.",[438,2281,2282],{},"Crash → khởi động lại → replay log từ checkpoint → restore state.",[431,2284,2285,2286,2289],{},"→ Hiệu năng tốt vì log là ",[442,2287,2288],{},"sequential write"," (nhanh), data page random write (chậm) được phép trễ.",[484,2291],{},[426,2293,2295],{"id":2294},"_6-isolation-level-4-anomaly","6. Isolation level — 4 anomaly",[497,2297,2299],{"id":2298},"_61-3-anomaly-cần-thuộc","6.1. 3 anomaly cần thuộc",[478,2301,2302,2309],{"color":480,"icon":481},[431,2303,2304,2305,2308],{},"🟢 ",[442,2306,2307],{},"3 vấn đề"," mà isolation level chống:",[2262,2310,2311,2317,2323],{},[438,2312,2313,2316],{},[442,2314,2315],{},"Dirty read",": đọc data CHƯA commit của transaction khác.",[438,2318,2319,2322],{},[442,2320,2321],{},"Non-repeatable read",": đọc cùng row 2 lần, lần 2 thấy khác (do transaction khác UPDATE+commit giữa chừng).",[438,2324,2325,2328],{},[442,2326,2327],{},"Phantom read",": query 1 range 2 lần, lần 2 thấy thêm\u002Fbớt row (do transaction khác INSERT\u002FDELETE).",[497,2330,2332],{"id":2331},"_62-4-isolation-level","6.2. 4 isolation level",[2143,2334,2335,2351],{},[2146,2336,2337],{},[2149,2338,2339,2342,2345,2348],{},[2152,2340,2341],{},"Level",[2152,2343,2344],{},"Dirty",[2152,2346,2347],{},"Non-rep",[2152,2349,2350],{},"Phantom",[2162,2352,2353,2366,2381,2392,2403],{},[2149,2354,2355,2358,2361,2364],{},[2167,2356,2357],{},"Read Uncommitted",[2167,2359,2360],{},"✅ Có",[2167,2362,2363],{},"✅",[2167,2365,2363],{},[2149,2367,2368,2374,2377,2379],{},[2167,2369,2370,2373],{},[442,2371,2372],{},"Read Committed"," (default SQL Server)",[2167,2375,2376],{},"❌",[2167,2378,2363],{},[2167,2380,2363],{},[2149,2382,2383,2386,2388,2390],{},[2167,2384,2385],{},"Repeatable Read",[2167,2387,2376],{},[2167,2389,2376],{},[2167,2391,2363],{},[2149,2393,2394,2397,2399,2401],{},[2167,2395,2396],{},"Serializable",[2167,2398,2376],{},[2167,2400,2376],{},[2167,2402,2376],{},[2149,2404,2405,2408,2410,2412],{},[2167,2406,2407],{},"Snapshot (extra)",[2167,2409,2376],{},[2167,2411,2376],{},[2167,2413,2414],{},"❌ (MVCC)",[502,2416,2418],{"className":504,"code":2417,"language":506,"meta":507,"style":507},"SET TRANSACTION ISOLATION LEVEL READ COMMITTED;\nBEGIN TRANSACTION;\n-- ...\nCOMMIT;\n",[509,2419,2420,2425,2429,2433],{"__ignoreMap":507},[512,2421,2422],{"class":514,"line":515},[512,2423,2424],{},"SET TRANSACTION ISOLATION LEVEL READ COMMITTED;\n",[512,2426,2427],{"class":514,"line":521},[512,2428,2070],{},[512,2430,2431],{"class":514,"line":527},[512,2432,1862],{},[512,2434,2435],{"class":514,"line":533},[512,2436,2437],{},"COMMIT;\n",[497,2439,2441],{"id":2440},"_63-sql-server-default-vs-postgres-default-vs-mysql-default","6.3. 🟡 SQL Server default vs Postgres default vs MySQL default",[478,2443,2444,2453,2479],{"color":1131,"icon":1352},[431,2445,1355,2446,2449,2450],{},[442,2447,2448],{},"PV cực hay",": ",[1523,2451,2452],{},"\"Default isolation level của 3 DB?\"",[435,2454,2455,2460,2470],{},[438,2456,2457,2459],{},[442,2458,168],{},": READ COMMITTED (lock-based mặc định, có thể bật snapshot).",[438,2461,2462,2465,2466,2469],{},[442,2463,2464],{},"Postgres",": READ COMMITTED nhưng ",[442,2467,2468],{},"dùng MVCC"," — đọc không block ghi.",[438,2471,2472,2449,2475,2478],{},[442,2473,2474],{},"MySQL InnoDB",[442,2476,2477],{},"REPEATABLE READ"," (cao hơn 2 cái trên) — chọn để statement-based replication consistent.",[431,2480,2481,2482,2485],{},"→ Code app ",[442,2483,2484],{},"không nên assume isolation level"," giống nhau giữa các DB.",[497,2487,2489],{"id":2488},"_64-mvcc-multi-version-concurrency-control","6.4. 🔴 MVCC — Multi-Version Concurrency Control",[478,2491,2492,2507,2513,2519,2528,2531],{"color":1131,"icon":268},[431,2493,2494,2495,2498,2499,2502,2503,2506],{},"🔴 ",[442,2496,2497],{},"MVCC"," = mỗi UPDATE\u002FDELETE ",[442,2500,2501],{},"không xoá row ngay",", tạo ",[442,2504,2505],{},"version mới",". Mỗi transaction thấy snapshot tại thời điểm nó bắt đầu.",[431,2508,2509,2510],{},"→ ",[442,2511,2512],{},"Đọc không block ghi, ghi không block đọc.",[431,2514,2515,2518],{},[442,2516,2517],{},"Postgres + MySQL InnoDB"," dùng MVCC natively.",[431,2520,2521,2523,2524,2527],{},[442,2522,168],{}," mặc định lock-based, có thể bật ",[509,2525,2526],{},"READ_COMMITTED_SNAPSHOT ON"," để dùng MVCC variant.",[431,2529,2530],{},"Trade-off MVCC:",[435,2532,2533,2536],{},[438,2534,2535],{},"✅ Concurrency cực tốt.",[438,2537,2538,2539,2542],{},"❌ Bảng phình to với version cũ → cần ",[442,2540,2541],{},"VACUUM"," (Postgres) \u002F undo cleanup (InnoDB).",[497,2544,2546],{"id":2545},"_65-nolock-đừng-lạm-dụng","6.5. NOLOCK — đừng lạm dụng",[502,2548,2550],{"className":504,"code":2549,"language":506,"meta":507,"style":507},"SELECT * FROM Orders WITH (NOLOCK);\n-- ↑ = READ UNCOMMITTED cho query này — cho phép dirty read\n",[509,2551,2552,2557],{"__ignoreMap":507},[512,2553,2554],{"class":514,"line":515},[512,2555,2556],{},"SELECT * FROM Orders WITH (NOLOCK);\n",[512,2558,2559],{"class":514,"line":521},[512,2560,2561],{},"-- ↑ = READ UNCOMMITTED cho query này — cho phép dirty read\n",[478,2563,2564,2569,2577],{"color":1421,"icon":1448},[431,2565,1134,2566],{},[442,2567,2568],{},"NOLOCK chấp nhận sai số:",[435,2570,2571,2574],{},[438,2572,2573],{},"Có thể đọc data đã rollback (dirty).",[438,2575,2576],{},"Có thể đọc row 2 lần hoặc miss row (do page split khi đang scan).",[431,2578,2579,2580,2583,2584,2587],{},"Dùng cho ",[442,2581,2582],{},"báo cáo"," không cần chính xác từng đồng. ",[442,2585,2586],{},"TRÁNH"," trong code nghiệp vụ (banking, e-commerce).",[484,2589],{},[426,2591,2593],{"id":2592},"_7-deadlock","7. Deadlock",[478,2595,2304,2596,2599],{"color":480,"icon":481},[442,2597,2598],{},"Deadlock"," = 2+ transaction giữ lock và chờ nhau, bế tắc.",[502,2601,2604],{"className":2602,"code":2603,"language":1174},[1172],"Transaction A:                  Transaction B:\n  UPDATE Account 1 (lock A1)      UPDATE Account 2 (lock A2)\n  UPDATE Account 2 ← chờ A2       UPDATE Account 1 ← chờ A1\n  \n  (chờ vô tận — DEADLOCK)\n",[509,2605,2603],{"__ignoreMap":507},[431,2607,2608,2609,2612],{},"SQL Server tự ",[442,2610,2611],{},"detect"," deadlock và pick \"victim\" (transaction tốn ít work) → rollback.",[497,2614,2616],{"id":2615},"_71-cách-tránh-deadlock","7.1. Cách tránh deadlock",[478,2618,2619,2622],{"color":1396,"icon":1397},[431,2620,2621],{},"🟡",[2262,2623,2624,2630,2637,2640,2643],{},[438,2625,2626,2629],{},[442,2627,2628],{},"Lock cùng thứ tự"," trong mọi transaction (vd: luôn UPDATE Account nhỏ ID trước lớn).",[438,2631,2632,2633,2636],{},"Giữ ",[442,2634,2635],{},"transaction ngắn"," (commit sớm).",[438,2638,2639],{},"Update đúng cột cần, không lock thừa.",[438,2641,2642],{},"Isolation thấp hơn nếu được (Snapshot thay vì Repeatable Read).",[438,2644,2645],{},"Index tốt → giảm scope lock (lock row thay vì lock page\u002Ftable).",[484,2647],{},[426,2649,2651],{"id":2650},"_8-query-optimization-10-step","8. Query optimization — 10 step",[478,2653,2654,2657],{"color":1396,"icon":383},[431,2655,2656],{},"🔵 Checklist mỗi khi query chậm:",[2262,2658,2659,2662,2672,2675,2678,2685,2688,2698,2708,2711],{},[438,2660,2661],{},"✅ EXPLAIN \u002F Actual Execution Plan — xem operator gì đắt.",[438,2663,2664,2665,2668,2669,2671],{},"✅ ",[509,2666,2667],{},"SET STATISTICS IO ON"," — ",[509,2670,1585],{}," chỉ số quan trọng nhất.",[438,2673,2674],{},"✅ Có index trên cột WHERE\u002FJOIN\u002FORDER BY chưa?",[438,2676,2677],{},"✅ WHERE sargable (không function lên cột)?",[438,2679,2680,2681,2684],{},"✅ Tránh ",[509,2682,2683],{},"SELECT *"," — chọn cột cần (phá covering index).",[438,2686,2687],{},"✅ JOIN cùng kiểu dữ liệu (tránh implicit conversion).",[438,2689,2664,2690,2693,2694,2697],{},[509,2691,2692],{},"EXISTS"," thay vì ",[509,2695,2696],{},"IN"," với subquery lớn.",[438,2699,2664,2700,2703,2704,2707],{},[509,2701,2702],{},"UNION ALL"," thay ",[509,2705,2706],{},"UNION"," nếu chắc không trùng.",[438,2709,2710],{},"✅ Update statistics nếu plan dùng row estimate cũ.",[438,2712,2713],{},"✅ Defrag index khi fragmentation > 30%.",[484,2715],{},[426,2717,2719],{"id":2718},"_9-câu-hỏi-tự-test-cuối-ngày","9. Câu hỏi tự test cuối ngày",[478,2721,2723,2728,2739,2751,2757],{"color":480,"icon":2722},"i-lucide-help-circle",[431,2724,2725],{},[442,2726,2727],{},"🟢 Intern:",[2262,2729,2730,2733,2736],{},[438,2731,2732],{},"ACID là gì? Mỗi chữ giải thích bằng ví dụ chuyển khoản.",[438,2734,2735],{},"INNER JOIN vs LEFT JOIN khác gì?",[438,2737,2738],{},"Primary Key vs Unique Key khác ra sao?",[431,2740,2741,2744,2745,2747,2748,2750],{},[442,2742,2743],{},"🔵 Junior:","\n4. Index hoạt động ra sao? Vì sao O(log n)?\n5. Composite index ",[509,2746,1362],{}," — query nào dùng được, query nào không?\n6. Vì sao ",[509,2749,1528],{}," chậm dù có index trên date?\n7. Bẫy LEFT JOIN + WHERE — giải thích.",[431,2752,2753,2756],{},[442,2754,2755],{},"🟡 Mid:","\n8. Default isolation 3 DB (SQL Server, Postgres, MySQL) khác nhau gì?\n9. MVCC là gì? Trade-off?\n10. WAL (Write-Ahead Log) — vai trò Durability ra sao?\n11. Top N per group — viết query bằng window function.",[431,2758,2759,2762],{},[442,2760,2761],{},"🔴 Senior:","\n12. B+ tree khác B-tree ra sao? Vì sao DB chọn B+?\n13. Clustered index thay đổi → ảnh hưởng non-clustered ra sao?\n14. SNAPSHOT isolation vs READ_COMMITTED_SNAPSHOT — khác gì?\n15. Parameter sniffing (SQL Server) là gì? Fix sao?",[431,2764,2765,1521,2768,466],{},[442,2766,2767],{},"Đáp án:",[2769,2770,2771],"a",{"href":84},"Ngân hàng câu hỏi SQL",[484,2773],{},[431,2775,2776,2777],{},"➡️ Ngày mai: ",[2769,2778,2779],{"href":53},"Ngày 5 — ASP.NET Core + EF Core",[2781,2782,2783],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":507,"searchDepth":521,"depth":521,"links":2785},[2786,2787,2791,2801,2807,2813,2818,2825,2828,2829],{"id":428,"depth":521,"text":429},{"id":488,"depth":521,"text":489,"children":2788},[2789,2790],{"id":499,"depth":527,"text":500},{"id":861,"depth":527,"text":862},{"id":1103,"depth":521,"text":1104,"children":2792},[2793,2794,2795,2796,2797,2798,2799,2800],{"id":1107,"depth":527,"text":1108},{"id":1127,"depth":527,"text":1128},{"id":1189,"depth":527,"text":1190},{"id":1237,"depth":527,"text":1238},{"id":1348,"depth":527,"text":1349},{"id":1392,"depth":527,"text":1393},{"id":1444,"depth":527,"text":1445},{"id":1536,"depth":527,"text":1537},{"id":1591,"depth":521,"text":1592,"children":2802},[2803,2804,2805,2806],{"id":1595,"depth":527,"text":1596},{"id":1665,"depth":527,"text":1666},{"id":1750,"depth":527,"text":1751},{"id":1808,"depth":527,"text":1809},{"id":1867,"depth":521,"text":1868,"children":2808},[2809,2810,2811,2812],{"id":1871,"depth":527,"text":1872},{"id":1905,"depth":527,"text":1906},{"id":1949,"depth":527,"text":1950},{"id":2005,"depth":527,"text":2006},{"id":2055,"depth":521,"text":2056,"children":2814},[2815,2816,2817],{"id":2059,"depth":527,"text":2060},{"id":2137,"depth":527,"text":2138},{"id":2251,"depth":527,"text":2252},{"id":2294,"depth":521,"text":2295,"children":2819},[2820,2821,2822,2823,2824],{"id":2298,"depth":527,"text":2299},{"id":2331,"depth":527,"text":2332},{"id":2440,"depth":527,"text":2441},{"id":2488,"depth":527,"text":2489},{"id":2545,"depth":527,"text":2546},{"id":2592,"depth":521,"text":2593,"children":2826},[2827],{"id":2615,"depth":527,"text":2616},{"id":2650,"depth":521,"text":2651},{"id":2718,"depth":521,"text":2719},"B-tree INDEX internals, JOIN sâu, MVCC, ACID, isolation level mechanism, query plan. Mock data thật để test query.","md",null,{},{"title":47,"icon":50},{"title":47,"description":2830},"bMQydTZarQSVy04s2lwJltrtI2brkT_bjfXWc8uEX6I",[2838,2840],{"title":42,"path":43,"stem":44,"description":2839,"icon":45,"children":-1},"Generic internals, LINQ deferred execution, async\u002Fawait state machine, delegate vs event, extension method. Giải thích sâu cho mọi level.",{"title":52,"path":53,"stem":54,"description":2841,"icon":55,"children":-1},"Middleware pipeline trace, DI lifetimes + captive dependency, EF Core change tracking internals, loading strategies với N+1 demo, migrations.",1783490353589]