[{"data":1,"prerenderedAt":2029},["ShallowReactive",2],{"navigation_docs":3,"-phong-van-ngan-hang-cau-hoi-sql":420,"-phong-van-ngan-hang-cau-hoi-sql-surround":2024},[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":422,"body":423,"description":2017,"extension":2018,"links":2019,"meta":2020,"navigation":2021,"path":84,"seo":2022,"stem":85,"__hash__":2023},"docs\u002F1.phong-van\u002F3.ngan-hang-cau-hoi\u002F3.sql.md","Ngân hàng câu hỏi SQL",{"type":424,"value":425,"toc":1945},"minimark",[426,431,436,445,449,519,523,578,582,589,604,621,625,650,654,658,696,700,736,740,775,782,797,801,812,849,853,860,864,871,891,895,899,902,906,922,926,932,936,950,954,957,997,1001,1004,1029,1033,1043,1055,1085,1089,1112,1125,1128,1148,1152,1203,1207,1237,1241,1266,1277,1307,1318,1335,1339,1343,1363,1367,1370,1374,1385,1389,1392,1396,1400,1426,1430,1450,1454,1520,1524,1527,1541,1545,1549,1648,1652,1656,1659,1670,1674,1691,1695,1698,1712,1715,1719,1726,1737,1747,1763,1767,1770,1790,1797,1817,1821,1846,1850,1853,1892,1895,1903,1906,1931,1934,1941],[427,428,430],"h2",{"id":429},"a-cơ-bản","A. Cơ bản",[432,433,435],"h3",{"id":434},"_1-sql-là-gì-khác-nosql-chỗ-nào","1. SQL là gì? Khác NoSQL chỗ nào?",[437,438,439,440,444],"p",{},"SQL = Structured Query Language, dùng cho ",[441,442,443],"strong",{},"RDBMS",". Schema cố định, ACID transaction, JOIN mạnh.\nNoSQL (MongoDB, Redis...) thường schema-less, scale ngang dễ, không có JOIN\u002FACID đầy đủ.",[432,446,448],{"id":447},"_2-ddl-dml-dcl-tcl-là-gì","2. DDL, DML, DCL, TCL là gì?",[450,451,452,474,492,504],"ul",{},[453,454,455,458,459,463,464,463,467,463,470,473],"li",{},[441,456,457],{},"DDL"," (Define): ",[460,461,462],"code",{},"CREATE",", ",[460,465,466],{},"ALTER",[460,468,469],{},"DROP",[460,471,472],{},"TRUNCATE",".",[453,475,476,479,480,463,483,463,486,463,489,473],{},[441,477,478],{},"DML"," (Manipulate): ",[460,481,482],{},"SELECT",[460,484,485],{},"INSERT",[460,487,488],{},"UPDATE",[460,490,491],{},"DELETE",[453,493,494,497,498,463,501,473],{},[441,495,496],{},"DCL"," (Control): ",[460,499,500],{},"GRANT",[460,502,503],{},"REVOKE",[453,505,506,509,510,463,513,463,516,473],{},[441,507,508],{},"TCL"," (Transaction): ",[460,511,512],{},"BEGIN",[460,514,515],{},"COMMIT",[460,517,518],{},"ROLLBACK",[432,520,522],{"id":521},"_3-primary-key-vs-unique-key","3. Primary Key vs Unique Key?",[524,525,526,541],"table",{},[527,528,529],"thead",{},[530,531,532,535,538],"tr",{},[533,534],"th",{},[533,536,537],{},"Primary Key",[533,539,540],{},"Unique Key",[542,543,544,556,567],"tbody",{},[530,545,546,550,553],{},[547,548,549],"td",{},"NULL",[547,551,552],{},"❌ Không cho",[547,554,555],{},"✅ Cho 1 NULL (SQL Server)",[530,557,558,561,564],{},[547,559,560],{},"Số lượng \u002F bảng",[547,562,563],{},"1",[547,565,566],{},"Nhiều",[530,568,569,572,575],{},[547,570,571],{},"Default index",[547,573,574],{},"Clustered",[547,576,577],{},"Non-clustered",[432,579,581],{"id":580},"_4-foreign-key-để-làm-gì","4. Foreign Key để làm gì?",[437,583,584,585,588],{},"Tham chiếu PK của bảng khác — đảm bảo ",[441,586,587],{},"referential integrity",". Tránh con (orphan) không có cha.",[432,590,592,593,596,597,596,600,603],{"id":591},"_5-char10-vs-varchar10-vs-nvarchar10","5. ",[460,594,595],{},"CHAR(10)"," vs ",[460,598,599],{},"VARCHAR(10)",[460,601,602],{},"NVARCHAR(10)","?",[450,605,606,611,616],{},[453,607,608,610],{},[460,609,595],{},": cố định 10 byte, pad bằng space.",[453,612,613,615],{},[460,614,599],{},": biến đổi tới 10 byte, 1 byte\u002Fký tự ASCII.",[453,617,618,620],{},[460,619,602],{},": Unicode (UTF-16), 2 byte\u002Fký tự — dùng cho tiếng Việt, Nhật, Trung.",[432,622,624],{"id":623},"_6-null-vs-0-vs-khác-gì","6. NULL vs 0 vs '' khác gì?",[450,626,627,638,644],{},[453,628,629,631,632,634,635,473],{},[460,630,549],{}," = không xác định, không bằng bất cứ thứ gì kể cả ",[460,633,549],{},". So sánh dùng ",[460,636,637],{},"IS NULL",[453,639,640,643],{},[460,641,642],{},"0"," = số 0 cụ thể.",[453,645,646,649],{},[460,647,648],{},"''"," = chuỗi rỗng, có giá trị.",[427,651,653],{"id":652},"b-join","B. JOIN",[432,655,657],{"id":656},"_7-các-loại-join-trong-sql","7. Các loại JOIN trong SQL?",[450,659,660,666,672,678,684,690],{},[453,661,662,665],{},[460,663,664],{},"INNER JOIN",": chỉ rows match cả 2.",[453,667,668,671],{},[460,669,670],{},"LEFT JOIN",": tất cả rows trái + match phải.",[453,673,674,677],{},[460,675,676],{},"RIGHT JOIN",": ngược lại.",[453,679,680,683],{},[460,681,682],{},"FULL OUTER JOIN",": tất cả rows hai bên.",[453,685,686,689],{},[460,687,688],{},"CROSS JOIN",": tích Descartes.",[453,691,692,695],{},[460,693,694],{},"SELF JOIN",": join với chính nó.",[432,697,699],{"id":698},"_8-phân-biệt-join-bằng-hình-venn","8. Phân biệt JOIN bằng hình Venn?",[450,701,702,708,714,720,726],{},[453,703,704,707],{},[460,705,706],{},"INNER",": phần giao 2 hình.",[453,709,710,713],{},[460,711,712],{},"LEFT",": hình trái (gồm cả phần giao).",[453,715,716,719],{},[460,717,718],{},"RIGHT",": hình phải.",[453,721,722,725],{},[460,723,724],{},"FULL",": cả 2 hình.",[453,727,728,731,732,735],{},[460,729,730],{},"LEFT EXCLUSIVE",": hình trái trừ phần giao (",[460,733,734],{},"LEFT JOIN ... WHERE right.PK IS NULL",").",[432,737,739],{"id":738},"_9-câu-hỏi-tìm-khách-hàng-chưa-từng-đặt-đơn","9. Câu hỏi: tìm khách hàng chưa từng đặt đơn?",[741,742,747],"pre",{"className":743,"code":744,"language":745,"meta":746,"style":746},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","SELECT c.*\nFROM Customers c\nLEFT JOIN Orders o ON o.CustomerId = c.Id\nWHERE o.Id IS NULL;\n","sql","",[460,748,749,757,763,769],{"__ignoreMap":746},[750,751,754],"span",{"class":752,"line":753},"line",1,[750,755,756],{},"SELECT c.*\n",[750,758,760],{"class":752,"line":759},2,[750,761,762],{},"FROM Customers c\n",[750,764,766],{"class":752,"line":765},3,[750,767,768],{},"LEFT JOIN Orders o ON o.CustomerId = c.Id\n",[750,770,772],{"class":752,"line":771},4,[750,773,774],{},"WHERE o.Id IS NULL;\n",[437,776,777,778,781],{},"Hoặc dùng ",[460,779,780],{},"NOT EXISTS",":",[741,783,785],{"className":743,"code":784,"language":745,"meta":746,"style":746},"SELECT c.* FROM Customers c\nWHERE NOT EXISTS (SELECT 1 FROM Orders o WHERE o.CustomerId = c.Id);\n",[460,786,787,792],{"__ignoreMap":746},[750,788,789],{"class":752,"line":753},[750,790,791],{},"SELECT c.* FROM Customers c\n",[750,793,794],{"class":752,"line":759},[750,795,796],{},"WHERE NOT EXISTS (SELECT 1 FROM Orders o WHERE o.CustomerId = c.Id);\n",[432,798,800],{"id":799},"_10-bẫy-left-join-với-where","10. Bẫy LEFT JOIN với WHERE?",[437,802,803,804,807,808,811],{},"Điều kiện trên bảng phải đặt vào ",[460,805,806],{},"ON",", không phải ",[460,809,810],{},"WHERE",", để giữ NULL.",[741,813,815],{"className":743,"code":814,"language":745,"meta":746,"style":746},"-- ❌ Bị biến thành INNER JOIN\nLEFT JOIN Orders o ON o.CustomerId = c.Id\nWHERE o.Status = 'Paid';\n\n-- ✅ Đúng\nLEFT JOIN Orders o ON o.CustomerId = c.Id AND o.Status = 'Paid';\n",[460,816,817,822,826,831,837,843],{"__ignoreMap":746},[750,818,819],{"class":752,"line":753},[750,820,821],{},"-- ❌ Bị biến thành INNER JOIN\n",[750,823,824],{"class":752,"line":759},[750,825,768],{},[750,827,828],{"class":752,"line":765},[750,829,830],{},"WHERE o.Status = 'Paid';\n",[750,832,833],{"class":752,"line":771},[750,834,836],{"emptyLinePlaceholder":835},true,"\n",[750,838,840],{"class":752,"line":839},5,[750,841,842],{},"-- ✅ Đúng\n",[750,844,846],{"class":752,"line":845},6,[750,847,848],{},"LEFT JOIN Orders o ON o.CustomerId = c.Id AND o.Status = 'Paid';\n",[432,850,852],{"id":851},"_11-cross-join-dùng-làm-gì","11. Cross JOIN dùng làm gì?",[437,854,855,856,859],{},"Tạo tất cả các cặp — ví dụ tạo matrix ",[460,857,858],{},"Date × Product"," để fill báo cáo có cả ngày không bán.",[432,861,863],{"id":862},"_12-self-join-ví-dụ-thực-tế","12. SELF JOIN — ví dụ thực tế?",[437,865,866,867,870],{},"Bảng ",[460,868,869],{},"Employees(Id, Name, ManagerId)"," — tìm tên manager của mỗi nhân viên:",[741,872,874],{"className":743,"code":873,"language":745,"meta":746,"style":746},"SELECT e.Name AS Employee, m.Name AS Manager\nFROM Employees e\nLEFT JOIN Employees m ON m.Id = e.ManagerId;\n",[460,875,876,881,886],{"__ignoreMap":746},[750,877,878],{"class":752,"line":753},[750,879,880],{},"SELECT e.Name AS Employee, m.Name AS Manager\n",[750,882,883],{"class":752,"line":759},[750,884,885],{},"FROM Employees e\n",[750,887,888],{"class":752,"line":765},[750,889,890],{},"LEFT JOIN Employees m ON m.Id = e.ManagerId;\n",[427,892,894],{"id":893},"c-index","C. INDEX",[432,896,898],{"id":897},"_13-index-là-gì-hoạt-động-ra-sao","13. INDEX là gì? Hoạt động ra sao?",[437,900,901],{},"Cấu trúc dữ liệu phụ (B-tree) giúp tìm row nhanh. Trade-off: tốn space + slow ghi để nhanh đọc.",[432,903,905],{"id":904},"_14-clustered-index-vs-non-clustered-index","14. Clustered index vs Non-clustered index?",[450,907,908,917],{},[453,909,910,912,913,916],{},[441,911,574],{},": sắp xếp vật lý dữ liệu theo key. Mỗi bảng ",[441,914,915],{},"1 clustered",". PK mặc định clustered.",[453,918,919,921],{},[441,920,577],{},": cấu trúc B-tree riêng trỏ về row gốc. Nhiều index\u002Fbảng.",[432,923,925],{"id":924},"_15-composite-index-thứ-tự-cột-quan-trọng-ra-sao","15. Composite index — thứ tự cột quan trọng ra sao?",[437,927,928,931],{},[460,929,930],{},"INDEX(A, B, C)"," chỉ dùng được nếu query lọc theo prefix bên trái: A, hoặc A+B, hoặc A+B+C. Lọc theo B mình nó → không dùng được index này.",[432,933,935],{"id":934},"_16-khi-nào-không-nên-tạo-index","16. Khi nào KHÔNG nên tạo INDEX?",[450,937,938,941,944,947],{},[453,939,940],{},"Bảng nhỏ (vài nghìn rows).",[453,942,943],{},"Cột thay đổi rất thường xuyên.",[453,945,946],{},"Cột có selectivity thấp (Gender, Status với vài giá trị).",[453,948,949],{},"Bảng heavy INSERT, ít SELECT.",[432,951,953],{"id":952},"_17-query-non-sargable-là-gì","17. Query non-sargable là gì?",[437,955,956],{},"Query mà engine không dùng được index dù có. Vì áp hàm\u002Fbiểu thức lên cột:",[741,958,960],{"className":743,"code":959,"language":745,"meta":746,"style":746},"-- ❌ Non-sargable\nWHERE YEAR(OrderDate) = 2026\nWHERE UPPER(Email) = 'A@B.COM'\nWHERE Total + Tax > 100\n\n-- ✅ Sargable\nWHERE OrderDate >= '2026-01-01' AND OrderDate \u003C '2027-01-01'\n",[460,961,962,967,972,977,982,986,991],{"__ignoreMap":746},[750,963,964],{"class":752,"line":753},[750,965,966],{},"-- ❌ Non-sargable\n",[750,968,969],{"class":752,"line":759},[750,970,971],{},"WHERE YEAR(OrderDate) = 2026\n",[750,973,974],{"class":752,"line":765},[750,975,976],{},"WHERE UPPER(Email) = 'A@B.COM'\n",[750,978,979],{"class":752,"line":771},[750,980,981],{},"WHERE Total + Tax > 100\n",[750,983,984],{"class":752,"line":839},[750,985,836],{"emptyLinePlaceholder":835},[750,987,988],{"class":752,"line":845},[750,989,990],{},"-- ✅ Sargable\n",[750,992,994],{"class":752,"line":993},7,[750,995,996],{},"WHERE OrderDate >= '2026-01-01' AND OrderDate \u003C '2027-01-01'\n",[432,998,1000],{"id":999},"_18-cover-index-covering-index","18. Cover index (covering index)?",[437,1002,1003],{},"Index bao luôn các cột query cần — engine không cần seek về bảng gốc.",[741,1005,1007],{"className":743,"code":1006,"language":745,"meta":746,"style":746},"CREATE INDEX IX_Orders_Cover ON Orders(CustomerId)\nINCLUDE (Total, OrderDate);\n-- SELECT Total, OrderDate FROM Orders WHERE CustomerId = ?\n-- → query chạy hoàn toàn trong index\n",[460,1008,1009,1014,1019,1024],{"__ignoreMap":746},[750,1010,1011],{"class":752,"line":753},[750,1012,1013],{},"CREATE INDEX IX_Orders_Cover ON Orders(CustomerId)\n",[750,1015,1016],{"class":752,"line":759},[750,1017,1018],{},"INCLUDE (Total, OrderDate);\n",[750,1020,1021],{"class":752,"line":765},[750,1022,1023],{},"-- SELECT Total, OrderDate FROM Orders WHERE CustomerId = ?\n",[750,1025,1026],{"class":752,"line":771},[750,1027,1028],{},"-- → query chạy hoàn toàn trong index\n",[427,1030,1032],{"id":1031},"d-aggregate-window-function-subquery","D. Aggregate, Window function, Subquery",[432,1034,1036,1037,596,1039,1042],{"id":1035},"_19-where-vs-having-khác-gì","19. ",[460,1038,810],{},[460,1040,1041],{},"HAVING"," khác gì?",[450,1044,1045,1050],{},[453,1046,1047,1049],{},[460,1048,810],{}," lọc rows trước GROUP BY.",[453,1051,1052,1054],{},[460,1053,1041],{}," lọc group sau GROUP BY (dùng được hàm aggregate).",[741,1056,1058],{"className":743,"code":1057,"language":745,"meta":746,"style":746},"SELECT City, COUNT(*) cnt\nFROM Customers\nWHERE Status = 'Active'         -- pre-group filter\nGROUP BY City\nHAVING COUNT(*) > 10;           -- post-group filter\n",[460,1059,1060,1065,1070,1075,1080],{"__ignoreMap":746},[750,1061,1062],{"class":752,"line":753},[750,1063,1064],{},"SELECT City, COUNT(*) cnt\n",[750,1066,1067],{"class":752,"line":759},[750,1068,1069],{},"FROM Customers\n",[750,1071,1072],{"class":752,"line":765},[750,1073,1074],{},"WHERE Status = 'Active'         -- pre-group filter\n",[750,1076,1077],{"class":752,"line":771},[750,1078,1079],{},"GROUP BY City\n",[750,1081,1082],{"class":752,"line":839},[750,1083,1084],{},"HAVING COUNT(*) > 10;           -- post-group filter\n",[432,1086,1088],{"id":1087},"_20-các-hàm-aggregate-phổ-biến","20. Các hàm aggregate phổ biến?",[437,1090,1091,463,1094,463,1097,463,1100,463,1103,463,1106,1109,1110,473],{},[460,1092,1093],{},"COUNT(*)",[460,1095,1096],{},"COUNT(DISTINCT col)",[460,1098,1099],{},"SUM",[460,1101,1102],{},"AVG",[460,1104,1105],{},"MIN",[460,1107,1108],{},"MAX",". Bỏ qua NULL trừ ",[460,1111,1093],{},[432,1113,1115,1116,463,1119,463,1122,1042],{"id":1114},"_21-row_number-rank-dense_rank-khác-gì","21. ",[460,1117,1118],{},"ROW_NUMBER()",[460,1120,1121],{},"RANK()",[460,1123,1124],{},"DENSE_RANK()",[437,1126,1127],{},"Có 3 row giá trị 100, 100, 90:",[450,1129,1130,1136,1142],{},[453,1131,1132,1135],{},[460,1133,1134],{},"ROW_NUMBER",": 1, 2, 3",[453,1137,1138,1141],{},[460,1139,1140],{},"RANK",": 1, 1, 3 (skip)",[453,1143,1144,1147],{},[460,1145,1146],{},"DENSE_RANK",": 1, 1, 2 (no skip)",[432,1149,1151],{"id":1150},"_22-tìm-lương-cao-thứ-2","22. Tìm lương cao thứ 2?",[741,1153,1155],{"className":743,"code":1154,"language":745,"meta":746,"style":746},"-- Cách 1\nSELECT MAX(Salary) FROM Employees\nWHERE Salary \u003C (SELECT MAX(Salary) FROM Employees);\n\n-- Cách 2 (general top-N)\nSELECT Salary FROM (\n    SELECT Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) rk\n    FROM Employees\n) x WHERE rk = 2;\n",[460,1156,1157,1162,1167,1172,1176,1181,1186,1191,1197],{"__ignoreMap":746},[750,1158,1159],{"class":752,"line":753},[750,1160,1161],{},"-- Cách 1\n",[750,1163,1164],{"class":752,"line":759},[750,1165,1166],{},"SELECT MAX(Salary) FROM Employees\n",[750,1168,1169],{"class":752,"line":765},[750,1170,1171],{},"WHERE Salary \u003C (SELECT MAX(Salary) FROM Employees);\n",[750,1173,1174],{"class":752,"line":771},[750,1175,836],{"emptyLinePlaceholder":835},[750,1177,1178],{"class":752,"line":839},[750,1179,1180],{},"-- Cách 2 (general top-N)\n",[750,1182,1183],{"class":752,"line":845},[750,1184,1185],{},"SELECT Salary FROM (\n",[750,1187,1188],{"class":752,"line":993},[750,1189,1190],{},"    SELECT Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) rk\n",[750,1192,1194],{"class":752,"line":1193},8,[750,1195,1196],{},"    FROM Employees\n",[750,1198,1200],{"class":752,"line":1199},9,[750,1201,1202],{},") x WHERE rk = 2;\n",[432,1204,1206],{"id":1205},"_23-lấy-đơn-hàng-mới-nhất-của-mỗi-khách","23. Lấy đơn hàng mới nhất của mỗi khách?",[741,1208,1210],{"className":743,"code":1209,"language":745,"meta":746,"style":746},"SELECT *\nFROM (\n    SELECT o.*, ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY OrderDate DESC) rn\n    FROM Orders o\n) x WHERE rn = 1;\n",[460,1211,1212,1217,1222,1227,1232],{"__ignoreMap":746},[750,1213,1214],{"class":752,"line":753},[750,1215,1216],{},"SELECT *\n",[750,1218,1219],{"class":752,"line":759},[750,1220,1221],{},"FROM (\n",[750,1223,1224],{"class":752,"line":765},[750,1225,1226],{},"    SELECT o.*, ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY OrderDate DESC) rn\n",[750,1228,1229],{"class":752,"line":771},[750,1230,1231],{},"    FROM Orders o\n",[750,1233,1234],{"class":752,"line":839},[750,1235,1236],{},") x WHERE rn = 1;\n",[432,1238,1240],{"id":1239},"_24-tìm-email-trùng","24. Tìm email trùng?",[741,1242,1244],{"className":743,"code":1243,"language":745,"meta":746,"style":746},"SELECT Email, COUNT(*) cnt\nFROM Users\nGROUP BY Email\nHAVING COUNT(*) > 1;\n",[460,1245,1246,1251,1256,1261],{"__ignoreMap":746},[750,1247,1248],{"class":752,"line":753},[750,1249,1250],{},"SELECT Email, COUNT(*) cnt\n",[750,1252,1253],{"class":752,"line":759},[750,1254,1255],{},"FROM Users\n",[750,1257,1258],{"class":752,"line":765},[750,1259,1260],{},"GROUP BY Email\n",[750,1262,1263],{"class":752,"line":771},[750,1264,1265],{},"HAVING COUNT(*) > 1;\n",[432,1267,1269,1270,596,1273,1276],{"id":1268},"_25-đếm-paid-vs-pending-mỗi-tháng","25. Đếm ",[460,1271,1272],{},"Paid",[460,1274,1275],{},"Pending"," mỗi tháng?",[741,1278,1280],{"className":743,"code":1279,"language":745,"meta":746,"style":746},"SELECT FORMAT(OrderDate, 'yyyy-MM') AS Month,\n       SUM(CASE WHEN Status='Paid'    THEN 1 ELSE 0 END) AS Paid,\n       SUM(CASE WHEN Status='Pending' THEN 1 ELSE 0 END) AS Pending\nFROM Orders\nGROUP BY FORMAT(OrderDate, 'yyyy-MM');\n",[460,1281,1282,1287,1292,1297,1302],{"__ignoreMap":746},[750,1283,1284],{"class":752,"line":753},[750,1285,1286],{},"SELECT FORMAT(OrderDate, 'yyyy-MM') AS Month,\n",[750,1288,1289],{"class":752,"line":759},[750,1290,1291],{},"       SUM(CASE WHEN Status='Paid'    THEN 1 ELSE 0 END) AS Paid,\n",[750,1293,1294],{"class":752,"line":765},[750,1295,1296],{},"       SUM(CASE WHEN Status='Pending' THEN 1 ELSE 0 END) AS Pending\n",[750,1298,1299],{"class":752,"line":771},[750,1300,1301],{},"FROM Orders\n",[750,1303,1304],{"class":752,"line":839},[750,1305,1306],{},"GROUP BY FORMAT(OrderDate, 'yyyy-MM');\n",[432,1308,1310,1311,596,1314,1317],{"id":1309},"_26-exists-vs-in-cái-nào-nhanh-hơn","26. ",[460,1312,1313],{},"EXISTS",[460,1315,1316],{},"IN"," — cái nào nhanh hơn?",[450,1319,1320,1325,1330],{},[453,1321,1322,1324],{},[460,1323,1316],{},": tốt với danh sách giá trị nhỏ.",[453,1326,1327,1329],{},[460,1328,1313],{},": tốt với subquery, dừng ngay khi tìm thấy match đầu tiên.",[453,1331,1332,1333,473],{},"Với subquery lớn → ưu tiên ",[460,1334,1313],{},[427,1336,1338],{"id":1337},"e-normalization","E. Normalization",[432,1340,1342],{"id":1341},"_27-1nf-2nf-3nf-định-nghĩa","27. 1NF, 2NF, 3NF — định nghĩa?",[450,1344,1345,1351,1357],{},[453,1346,1347,1350],{},[441,1348,1349],{},"1NF",": Mỗi ô atomic (không list, không nested).",[453,1352,1353,1356],{},[441,1354,1355],{},"2NF",": 1NF + không có partial dependency vào PK composite.",[453,1358,1359,1362],{},[441,1360,1361],{},"3NF",": 2NF + không có transitive dependency (cột non-key phụ thuộc cột non-key khác).",[432,1364,1366],{"id":1365},"_28-bcnf-khác-3nf-chỗ-nào","28. BCNF khác 3NF chỗ nào?",[437,1368,1369],{},"Boyce-Codd: chặt hơn 3NF — mọi determinant phải là superkey. Khắc phục trường hợp 3NF chưa xử được khi key composite phụ thuộc lẫn nhau.",[432,1371,1373],{"id":1372},"_29-khi-nào-nên-de-normalize","29. Khi nào nên de-normalize?",[450,1375,1376,1379,1382],{},[453,1377,1378],{},"Báo cáo \u002F OLAP \u002F data warehouse.",[453,1380,1381],{},"Bảng hot, JOIN nhiều, đọc nhiều hơn ghi.",[453,1383,1384],{},"Chấp nhận lặp dữ liệu để giảm JOIN cost.",[432,1386,1388],{"id":1387},"_30-ưunhược-điểm-của-normalization","30. Ưu\u002Fnhược điểm của normalization?",[437,1390,1391],{},"✅ Tránh dữ liệu trùng, dễ maintain, integrity.\n❌ JOIN nhiều → chậm hơn cho query phức tạp.",[427,1393,1395],{"id":1394},"f-transaction-acid","F. Transaction & ACID",[432,1397,1399],{"id":1398},"_31-acid-là-gì","31. ACID là gì?",[450,1401,1402,1408,1414,1420],{},[453,1403,1404,1407],{},[441,1405,1406],{},"Atomicity",": tất cả hoặc không.",[453,1409,1410,1413],{},[441,1411,1412],{},"Consistency",": DB trước-sau transaction vẫn hợp lệ.",[453,1415,1416,1419],{},[441,1417,1418],{},"Isolation",": transaction không thấy nháp của transaction khác.",[453,1421,1422,1425],{},[441,1423,1424],{},"Durability",": commit xong, dữ liệu bền (kể cả crash).",[432,1427,1429],{"id":1428},"_32-dirty-read-non-repeatable-read-phantom-read","32. Dirty read, Non-repeatable read, Phantom read?",[450,1431,1432,1438,1444],{},[453,1433,1434,1437],{},[441,1435,1436],{},"Dirty read",": đọc data của transaction chưa commit.",[453,1439,1440,1443],{},[441,1441,1442],{},"Non-repeatable read",": đọc 1 row 2 lần thấy khác (do transaction khác UPDATE).",[453,1445,1446,1449],{},[441,1447,1448],{},"Phantom read",": query lại thấy thêm row mới (do transaction khác INSERT).",[432,1451,1453],{"id":1452},"_33-4-isolation-level-chuẩn","33. 4 Isolation Level chuẩn?",[524,1455,1456,1472],{},[527,1457,1458],{},[530,1459,1460,1463,1466,1469],{},[533,1461,1462],{},"Level",[533,1464,1465],{},"Dirty",[533,1467,1468],{},"Non-rep",[533,1470,1471],{},"Phantom",[542,1473,1474,1486,1498,1509],{},[530,1475,1476,1479,1482,1484],{},[547,1477,1478],{},"Read Uncommitted",[547,1480,1481],{},"✅",[547,1483,1481],{},[547,1485,1481],{},[530,1487,1488,1491,1494,1496],{},[547,1489,1490],{},"Read Committed (default)",[547,1492,1493],{},"❌",[547,1495,1481],{},[547,1497,1481],{},[530,1499,1500,1503,1505,1507],{},[547,1501,1502],{},"Repeatable Read",[547,1504,1493],{},[547,1506,1493],{},[547,1508,1481],{},[530,1510,1511,1514,1516,1518],{},[547,1512,1513],{},"Serializable",[547,1515,1493],{},[547,1517,1493],{},[547,1519,1493],{},[432,1521,1523],{"id":1522},"_34-deadlock-là-gì-tránh-thế-nào","34. Deadlock là gì? Tránh thế nào?",[437,1525,1526],{},"2+ transaction giữ lock và chờ nhau → bế tắc. Tránh:",[450,1528,1529,1532,1535,1538],{},[453,1530,1531],{},"Luôn lock theo cùng thứ tự.",[453,1533,1534],{},"Giữ transaction ngắn.",[453,1536,1537],{},"Dùng isolation thấp hơn nếu được.",[453,1539,1540],{},"SQL Server tự pick \"deadlock victim\" và rollback.",[427,1542,1544],{"id":1543},"g-delete-truncate-drop","G. DELETE \u002F TRUNCATE \u002F DROP",[432,1546,1548],{"id":1547},"_35-delete-vs-truncate-vs-drop","35. DELETE vs TRUNCATE vs DROP?",[524,1550,1551,1563],{},[527,1552,1553],{},[530,1554,1555,1557,1559,1561],{},[533,1556],{},[533,1558,491],{},[533,1560,472],{},[533,1562,469],{},[542,1564,1565,1576,1586,1598,1610,1624,1636],{},[530,1566,1567,1570,1572,1574],{},[547,1568,1569],{},"Loại",[547,1571,478],{},[547,1573,457],{},[547,1575,457],{},[530,1577,1578,1580,1582,1584],{},[547,1579,810],{},[547,1581,1481],{},[547,1583,1493],{},[547,1585,1493],{},[530,1587,1588,1591,1593,1595],{},[547,1589,1590],{},"Reset IDENTITY",[547,1592,1493],{},[547,1594,1481],{},[547,1596,1597],{},"N\u002FA",[530,1599,1600,1603,1606,1608],{},[547,1601,1602],{},"Trigger",[547,1604,1605],{},"✅ chạy",[547,1607,1493],{},[547,1609,1597],{},[530,1611,1612,1615,1618,1621],{},[547,1613,1614],{},"Tốc độ",[547,1616,1617],{},"Chậm (log mỗi row)",[547,1619,1620],{},"Nhanh (deallocate page)",[547,1622,1623],{},"Nhanh nhất",[530,1625,1626,1629,1631,1633],{},[547,1627,1628],{},"Bảng còn sau khi chạy",[547,1630,1481],{},[547,1632,1481],{},[547,1634,1635],{},"❌ (xoá luôn)",[530,1637,1638,1641,1643,1646],{},[547,1639,1640],{},"Rollback trong transaction",[547,1642,1481],{},[547,1644,1645],{},"✅ (SQL Server)",[547,1647,1481],{},[427,1649,1651],{"id":1650},"h-view-sp-function-trigger","H. View, SP, Function, Trigger",[432,1653,1655],{"id":1654},"_36-view-là-gì-khi-nào-dùng","36. View là gì? Khi nào dùng?",[437,1657,1658],{},"Query lưu sẵn, dùng như table. Dùng để:",[450,1660,1661,1664,1667],{},[453,1662,1663],{},"Abstract query phức tạp.",[453,1665,1666],{},"Phân quyền (expose 1 phần bảng).",[453,1668,1669],{},"Indexed view: cải thiện performance (SQL Server).",[432,1671,1673],{"id":1672},"_37-stored-procedure-vs-function","37. Stored Procedure vs Function?",[450,1675,1676,1685],{},[453,1677,1678,1681,1682,473],{},[441,1679,1680],{},"Stored Procedure",": thực thi logic, có thể trả nhiều resultset, INSERT\u002FUPDATE\u002FDELETE, gọi bằng ",[460,1683,1684],{},"EXEC",[453,1686,1687,1690],{},[441,1688,1689],{},"Function",": trả về 1 giá trị scalar hoặc table, dùng được trong SELECT, không SIDE-EFFECT.",[432,1692,1694],{"id":1693},"_38-trigger-là-gì-loại","38. Trigger là gì? Loại?",[437,1696,1697],{},"Code chạy tự động khi event trên bảng:",[450,1699,1700,1706],{},[453,1701,1702,1705],{},[441,1703,1704],{},"AFTER trigger",": sau INSERT\u002FUPDATE\u002FDELETE.",[453,1707,1708,1711],{},[441,1709,1710],{},"INSTEAD OF trigger",": thay thế event (thường cho View).",[437,1713,1714],{},"Nên hạn chế — debug khó, dễ tạo logic ẩn.",[427,1716,1718],{"id":1717},"i-query-tối-ưu","I. Query tối ưu",[432,1720,1722,1723,603],{"id":1721},"_39-vì-sao-tránh-select","39. Vì sao tránh ",[460,1724,1725],{},"SELECT *",[450,1727,1728,1731,1734],{},[453,1729,1730],{},"Lấy thừa cột → tốn băng thông, RAM.",[453,1732,1733],{},"Phá covering index (engine phải seek về bảng).",[453,1735,1736],{},"Khi bảng thêm cột mới, query thay đổi hành vi bất ngờ.",[432,1738,1740,1741,596,1744,1317],{"id":1739},"_40-union-vs-union-all-cái-nào-nhanh-hơn","40. ",[460,1742,1743],{},"UNION",[460,1745,1746],{},"UNION ALL",[450,1748,1749,1754],{},[453,1750,1751,1753],{},[460,1752,1743],{},": loại trùng (giống SELECT DISTINCT). Tốn extra cost.",[453,1755,1756,1758,1759,1762],{},[460,1757,1746],{},": gộp thẳng, ",[441,1760,1761],{},"nhanh hơn",". Dùng khi biết chắc không trùng.",[432,1764,1766],{"id":1765},"_41-pagination-cách-hiệu-quả","41. Pagination — cách hiệu quả?",[437,1768,1769],{},"SQL Server 2012+:",[741,1771,1773],{"className":743,"code":1772,"language":745,"meta":746,"style":746},"SELECT * FROM Orders\nORDER BY Id\nOFFSET 100 ROWS FETCH NEXT 20 ROWS ONLY;\n",[460,1774,1775,1780,1785],{"__ignoreMap":746},[750,1776,1777],{"class":752,"line":753},[750,1778,1779],{},"SELECT * FROM Orders\n",[750,1781,1782],{"class":752,"line":759},[750,1783,1784],{},"ORDER BY Id\n",[750,1786,1787],{"class":752,"line":765},[750,1788,1789],{},"OFFSET 100 ROWS FETCH NEXT 20 ROWS ONLY;\n",[437,1791,1792,1793,1796],{},"Với bảng cực lớn → ",[441,1794,1795],{},"keyset pagination"," hiệu quả hơn:",[741,1798,1800],{"className":743,"code":1799,"language":745,"meta":746,"style":746},"SELECT TOP 20 * FROM Orders\nWHERE Id > @lastId\nORDER BY Id;\n",[460,1801,1802,1807,1812],{"__ignoreMap":746},[750,1803,1804],{"class":752,"line":753},[750,1805,1806],{},"SELECT TOP 20 * FROM Orders\n",[750,1808,1809],{"class":752,"line":759},[750,1810,1811],{},"WHERE Id > @lastId\n",[750,1813,1814],{"class":752,"line":765},[750,1815,1816],{},"ORDER BY Id;\n",[432,1818,1820],{"id":1819},"_42-cách-điều-tra-query-chậm","42. Cách điều tra query chậm?",[1822,1823,1824,1831,1834,1837,1843],"ol",{},[453,1825,1826,1827,1830],{},"Bật ",[441,1828,1829],{},"Actual Execution Plan"," trong SSMS.",[453,1832,1833],{},"Tìm operator có cost cao (Table Scan, Key Lookup nhiều).",[453,1835,1836],{},"Check thiếu index — SSMS gợi ý.",[453,1838,1839,1840,735],{},"Kiểm tra statistics có outdated không (",[460,1841,1842],{},"UPDATE STATISTICS",[453,1844,1845],{},"Xem có parameter sniffing không.",[432,1847,1849],{"id":1848},"_43-cte-là-gì","43. CTE là gì?",[437,1851,1852],{},"Common Table Expression — query tạm tên có thể tham chiếu trong cùng câu:",[741,1854,1856],{"className":743,"code":1855,"language":745,"meta":746,"style":746},"WITH TopCustomers AS (\n    SELECT TOP 10 CustomerId, SUM(Total) total\n    FROM Orders GROUP BY CustomerId\n    ORDER BY total DESC\n)\nSELECT c.* FROM Customers c\nJOIN TopCustomers t ON t.CustomerId = c.Id;\n",[460,1857,1858,1863,1868,1873,1878,1883,1887],{"__ignoreMap":746},[750,1859,1860],{"class":752,"line":753},[750,1861,1862],{},"WITH TopCustomers AS (\n",[750,1864,1865],{"class":752,"line":759},[750,1866,1867],{},"    SELECT TOP 10 CustomerId, SUM(Total) total\n",[750,1869,1870],{"class":752,"line":765},[750,1871,1872],{},"    FROM Orders GROUP BY CustomerId\n",[750,1874,1875],{"class":752,"line":771},[750,1876,1877],{},"    ORDER BY total DESC\n",[750,1879,1880],{"class":752,"line":839},[750,1881,1882],{},")\n",[750,1884,1885],{"class":752,"line":845},[750,1886,791],{},[750,1888,1889],{"class":752,"line":993},[750,1890,1891],{},"JOIN TopCustomers t ON t.CustomerId = c.Id;\n",[437,1893,1894],{},"Hỗ trợ recursive (tree, graph).",[432,1896,1898,1899,1902],{"id":1897},"_44-merge-statement","44. ",[460,1900,1901],{},"MERGE"," statement?",[437,1904,1905],{},"Upsert atomic — INSERT nếu chưa có, UPDATE nếu đã có, DELETE nếu không match.",[741,1907,1909],{"className":743,"code":1908,"language":745,"meta":746,"style":746},"MERGE INTO Target t\nUSING Source s ON s.Id = t.Id\nWHEN MATCHED THEN UPDATE SET t.Name = s.Name\nWHEN NOT MATCHED THEN INSERT (Id, Name) VALUES (s.Id, s.Name);\n",[460,1910,1911,1916,1921,1926],{"__ignoreMap":746},[750,1912,1913],{"class":752,"line":753},[750,1914,1915],{},"MERGE INTO Target t\n",[750,1917,1918],{"class":752,"line":759},[750,1919,1920],{},"USING Source s ON s.Id = t.Id\n",[750,1922,1923],{"class":752,"line":765},[750,1924,1925],{},"WHEN MATCHED THEN UPDATE SET t.Name = s.Name\n",[750,1927,1928],{"class":752,"line":771},[750,1929,1930],{},"WHEN NOT MATCHED THEN INSERT (Id, Name) VALUES (s.Id, s.Name);\n",[1932,1933],"hr",{},[437,1935,1936,1937],{},"➡️ Tiếp theo: ",[1938,1939,1940],"a",{"href":89},"Ngân hàng câu hỏi ASP.NET Core & EF Core",[1942,1943,1944],"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":746,"searchDepth":759,"depth":759,"links":1946},[1947,1956,1964,1972,1986,1992,1998,2001,2006],{"id":429,"depth":759,"text":430,"children":1948},[1949,1950,1951,1952,1953,1955],{"id":434,"depth":765,"text":435},{"id":447,"depth":765,"text":448},{"id":521,"depth":765,"text":522},{"id":580,"depth":765,"text":581},{"id":591,"depth":765,"text":1954},"5. CHAR(10) vs VARCHAR(10) vs NVARCHAR(10)?",{"id":623,"depth":765,"text":624},{"id":652,"depth":759,"text":653,"children":1957},[1958,1959,1960,1961,1962,1963],{"id":656,"depth":765,"text":657},{"id":698,"depth":765,"text":699},{"id":738,"depth":765,"text":739},{"id":799,"depth":765,"text":800},{"id":851,"depth":765,"text":852},{"id":862,"depth":765,"text":863},{"id":893,"depth":759,"text":894,"children":1965},[1966,1967,1968,1969,1970,1971],{"id":897,"depth":765,"text":898},{"id":904,"depth":765,"text":905},{"id":924,"depth":765,"text":925},{"id":934,"depth":765,"text":935},{"id":952,"depth":765,"text":953},{"id":999,"depth":765,"text":1000},{"id":1031,"depth":759,"text":1032,"children":1973},[1974,1976,1977,1979,1980,1981,1982,1984],{"id":1035,"depth":765,"text":1975},"19. WHERE vs HAVING khác gì?",{"id":1087,"depth":765,"text":1088},{"id":1114,"depth":765,"text":1978},"21. ROW_NUMBER(), RANK(), DENSE_RANK() khác gì?",{"id":1150,"depth":765,"text":1151},{"id":1205,"depth":765,"text":1206},{"id":1239,"depth":765,"text":1240},{"id":1268,"depth":765,"text":1983},"25. Đếm Paid vs Pending mỗi tháng?",{"id":1309,"depth":765,"text":1985},"26. EXISTS vs IN — cái nào nhanh hơn?",{"id":1337,"depth":759,"text":1338,"children":1987},[1988,1989,1990,1991],{"id":1341,"depth":765,"text":1342},{"id":1365,"depth":765,"text":1366},{"id":1372,"depth":765,"text":1373},{"id":1387,"depth":765,"text":1388},{"id":1394,"depth":759,"text":1395,"children":1993},[1994,1995,1996,1997],{"id":1398,"depth":765,"text":1399},{"id":1428,"depth":765,"text":1429},{"id":1452,"depth":765,"text":1453},{"id":1522,"depth":765,"text":1523},{"id":1543,"depth":759,"text":1544,"children":1999},[2000],{"id":1547,"depth":765,"text":1548},{"id":1650,"depth":759,"text":1651,"children":2002},[2003,2004,2005],{"id":1654,"depth":765,"text":1655},{"id":1672,"depth":765,"text":1673},{"id":1693,"depth":765,"text":1694},{"id":1717,"depth":759,"text":1718,"children":2007},[2008,2010,2012,2013,2014,2015],{"id":1721,"depth":765,"text":2009},"39. Vì sao tránh SELECT *?",{"id":1739,"depth":765,"text":2011},"40. UNION vs UNION ALL — cái nào nhanh hơn?",{"id":1765,"depth":765,"text":1766},{"id":1819,"depth":765,"text":1820},{"id":1848,"depth":765,"text":1849},{"id":1897,"depth":765,"text":2016},"44. MERGE statement?","40+ câu hỏi SQL\u002FSQL Server fresher .NET hay gặp — JOIN, INDEX, normalization, transaction, query thực tế.","md",null,{},{"title":83,"icon":86},{"title":422,"description":2017},"ctFdQQVX0TL5FBfo07gZIGuH1p0IFwSq300cxTUsCcU",[2025,2027],{"title":78,"path":79,"stem":80,"description":2026,"icon":81,"children":-1},"40+ câu hỏi OOP, SOLID, Design Pattern cho fresher .NET — kèm đáp án ngắn.",{"title":88,"path":89,"stem":90,"description":2028,"icon":91,"children":-1},"50+ câu hỏi ASP.NET Core, Web API, Middleware, DI, EF Core, JWT cho fresher\u002Fjunior .NET.",1783490354739]