[{"data":1,"prerenderedAt":2997},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-database-mysql-cu-phap-co-ban":420,"-tu-hoc-database-mysql-cu-phap-co-ban-surround":2992},[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":2985,"extension":2986,"links":2987,"meta":2988,"navigation":2989,"path":232,"seo":2990,"stem":233,"__hash__":2991},"docs\u002F2.tu-hoc\u002F1.database\u002F4.mysql\u002F2.cu-phap-co-ban.md","Cú pháp MySQL cơ bản",{"type":424,"value":425,"toc":2943},"minimark",[426,431,436,555,596,608,612,714,758,762,827,841,844,906,912,916,999,1086,1089,1127,1145,1149,1163,1241,1251,1255,1258,1337,1389,2939],[427,428,430],"h2",{"id":429},"_1-kiểu-dữ-liệu","1. Kiểu dữ liệu",[432,433,435],"h3",{"id":434},"numeric","Numeric",[437,438,439,455],"table",{},[440,441,442],"thead",{},[443,444,445,449,452],"tr",{},[446,447,448],"th",{},"Kiểu",[446,450,451],{},"Range",[446,453,454],{},"Storage",[456,457,458,473,486,499,512,525,538],"tbody",{},[443,459,460,467,470],{},[461,462,463],"td",{},[464,465,466],"code",{},"TINYINT",[461,468,469],{},"-128 → 127 (hoặc 0 → 255 UNSIGNED)",[461,471,472],{},"1 byte",[443,474,475,480,483],{},[461,476,477],{},[464,478,479],{},"SMALLINT",[461,481,482],{},"±32K",[461,484,485],{},"2 bytes",[443,487,488,493,496],{},[461,489,490],{},[464,491,492],{},"MEDIUMINT",[461,494,495],{},"±8M",[461,497,498],{},"3 bytes",[443,500,501,506,509],{},[461,502,503],{},[464,504,505],{},"INT",[461,507,508],{},"±2.1B",[461,510,511],{},"4 bytes",[443,513,514,519,522],{},[461,515,516],{},[464,517,518],{},"BIGINT",[461,520,521],{},"±9.2 × 10¹⁸",[461,523,524],{},"8 bytes",[443,526,527,532,535],{},[461,528,529],{},[464,530,531],{},"DECIMAL(p, s)",[461,533,534],{},"Chính xác",[461,536,537],{},"Variable",[443,539,540,549,552],{},[461,541,542,545,546],{},[464,543,544],{},"FLOAT"," \u002F ",[464,547,548],{},"DOUBLE",[461,550,551],{},"Xấp xỉ",[461,553,554],{},"4 \u002F 8",[556,557,562],"pre",{"className":558,"code":559,"language":560,"meta":561,"style":561},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- UNSIGNED = chỉ số dương, gấp đôi range\nCREATE TABLE counts (\n    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    qty SMALLINT UNSIGNED NOT NULL DEFAULT 0\n);\n","sql","",[464,563,564,572,578,584,590],{"__ignoreMap":561},[565,566,569],"span",{"class":567,"line":568},"line",1,[565,570,571],{},"-- UNSIGNED = chỉ số dương, gấp đôi range\n",[565,573,575],{"class":567,"line":574},2,[565,576,577],{},"CREATE TABLE counts (\n",[565,579,581],{"class":567,"line":580},3,[565,582,583],{},"    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n",[565,585,587],{"class":567,"line":586},4,[565,588,589],{},"    qty SMALLINT UNSIGNED NOT NULL DEFAULT 0\n",[565,591,593],{"class":567,"line":592},5,[565,594,595],{},");\n",[597,598,601,607],"callout",{"color":599,"icon":600},"primary","i-lucide-info",[602,603,604],"strong",{},[464,605,606],{},"INT(11)"," không phải limit số chữ số. Đó chỉ là display width — không dùng nữa (deprecated từ 8.0). Bỏ qua.",[432,609,611],{"id":610},"chuỗi","Chuỗi",[437,613,614,623],{},[440,615,616],{},[443,617,618,620],{},[446,619,448],{},[446,621,622],{},"Ghi chú",[456,624,625,635,645,665,684,694,704],{},[443,626,627,632],{},[461,628,629],{},[464,630,631],{},"CHAR(n)",[461,633,634],{},"Cố định, pad space",[443,636,637,642],{},[461,638,639],{},[464,640,641],{},"VARCHAR(n)",[461,643,644],{},"Biến đổi đến n. Tới ~16K char tuỳ charset.",[443,646,647,662],{},[461,648,649,652,653,652,656,652,659],{},[464,650,651],{},"TINYTEXT",", ",[464,654,655],{},"TEXT",[464,657,658],{},"MEDIUMTEXT",[464,660,661],{},"LONGTEXT",[461,663,664],{},"Không giới hạn n, lưu out-of-row",[443,666,667,681],{},[461,668,669,652,672,652,675,652,678],{},[464,670,671],{},"TINYBLOB",[464,673,674],{},"BLOB",[464,676,677],{},"MEDIUMBLOB",[464,679,680],{},"LONGBLOB",[461,682,683],{},"Lưu binary (file, ảnh). Tương tự TEXT về kích thước.",[443,685,686,691],{},[461,687,688],{},[464,689,690],{},"ENUM('a','b')",[461,692,693],{},"Cố định trong list (1–2 bytes storage)",[443,695,696,701],{},[461,697,698],{},[464,699,700],{},"SET('a','b')",[461,702,703],{},"Subset của list (1–8 bytes)",[443,705,706,711],{},[461,707,708],{},[464,709,710],{},"JSON",[461,712,713],{},"Built-in từ 5.7",[597,715,718,730],{"color":716,"icon":717},"warning","i-lucide-star",[719,720,721,722,725,726],"p",{},"⭐ ",[602,723,724],{},"Câu PV MySQL:"," ",[727,728,729],"em",{},"\"VARCHAR vs TEXT khác gì?\"",[731,732,733,749],"blockquote",{},[719,734,735,736,738,739,741,742,745,746,748],{},"\"Cùng lưu chuỗi biến đổi. Khác chính: ",[464,737,641],{}," lưu inline trong row (faster), ",[464,740,655],{}," lưu out-of-row (con trỏ + data ngoài). ",[464,743,744],{},"VARCHAR"," index full được, ",[464,747,655],{}," chỉ index prefix.",[719,750,751,752,754,755,757],{},"Dùng ",[464,753,641],{}," cho dữ liệu \u003C 1KB. ",[464,756,655],{}," cho bài viết, content dài.\"",[432,759,761],{"id":760},"enum","ENUM",[556,763,765],{"className":558,"code":764,"language":560,"meta":561,"style":561},"CREATE TABLE tickets (\n    id BIGINT PRIMARY KEY AUTO_INCREMENT,\n    status ENUM('open', 'in_progress', 'resolved', 'closed') NOT NULL DEFAULT 'open'\n);\n\n-- ENUM lưu dưới dạng integer (1, 2, 3, 4) — rất tiết kiệm storage (1 byte với ≤ 255 giá trị)\nINSERT INTO tickets (status) VALUES ('open');        -- OK\nINSERT INTO tickets (status) VALUES ('unknown');     -- ERROR nếu strict mode\n\n-- Query theo index sẽ nhanh hơn query theo string\nSELECT * FROM tickets WHERE status = 2;              -- = 'in_progress'\n",[464,766,767,772,777,782,786,792,798,804,810,815,821],{"__ignoreMap":561},[565,768,769],{"class":567,"line":568},[565,770,771],{},"CREATE TABLE tickets (\n",[565,773,774],{"class":567,"line":574},[565,775,776],{},"    id BIGINT PRIMARY KEY AUTO_INCREMENT,\n",[565,778,779],{"class":567,"line":580},[565,780,781],{},"    status ENUM('open', 'in_progress', 'resolved', 'closed') NOT NULL DEFAULT 'open'\n",[565,783,784],{"class":567,"line":586},[565,785,595],{},[565,787,788],{"class":567,"line":592},[565,789,791],{"emptyLinePlaceholder":790},true,"\n",[565,793,795],{"class":567,"line":794},6,[565,796,797],{},"-- ENUM lưu dưới dạng integer (1, 2, 3, 4) — rất tiết kiệm storage (1 byte với ≤ 255 giá trị)\n",[565,799,801],{"class":567,"line":800},7,[565,802,803],{},"INSERT INTO tickets (status) VALUES ('open');        -- OK\n",[565,805,807],{"class":567,"line":806},8,[565,808,809],{},"INSERT INTO tickets (status) VALUES ('unknown');     -- ERROR nếu strict mode\n",[565,811,813],{"class":567,"line":812},9,[565,814,791],{"emptyLinePlaceholder":790},[565,816,818],{"class":567,"line":817},10,[565,819,820],{},"-- Query theo index sẽ nhanh hơn query theo string\n",[565,822,824],{"class":567,"line":823},11,[565,825,826],{},"SELECT * FROM tickets WHERE status = 2;              -- = 'in_progress'\n",[597,828,721,829,832,833,836,837,840],{"color":716,"icon":717},[602,830,831],{},"ENUM — lợi và hại:"," Tiết kiệm storage, query nhanh. Nhưng ",[602,834,835],{},"khó mở rộng"," — thêm giá trị mới cần ",[464,838,839],{},"ALTER TABLE"," (có thể rất chậm với bảng lớn). Nếu danh sách giá trị thay đổi thường xuyên, nên dùng bảng lookup riêng + FK thay vì ENUM.",[432,842,674],{"id":843},"blob",[556,845,847],{"className":558,"code":846,"language":560,"meta":561,"style":561},"-- BLOB = Binary Large Object — lưu file, ảnh, binary data\n-- 4 kích thước: TINYBLOB (255B), BLOB (64KB), MEDIUMBLOB (16MB), LONGBLOB (4GB)\n\nCREATE TABLE attachments (\n    id BIGINT PRIMARY KEY AUTO_INCREMENT,\n    filename VARCHAR(255) NOT NULL,\n    mime_type VARCHAR(100),\n    data LONGBLOB NOT NULL\n);\n\n-- BLOB không có charset, không convert encoding\n-- So sánh với TEXT: TEXT có charset + collation; BLOB là binary thuần\n",[464,848,849,854,859,863,868,872,877,882,887,891,895,900],{"__ignoreMap":561},[565,850,851],{"class":567,"line":568},[565,852,853],{},"-- BLOB = Binary Large Object — lưu file, ảnh, binary data\n",[565,855,856],{"class":567,"line":574},[565,857,858],{},"-- 4 kích thước: TINYBLOB (255B), BLOB (64KB), MEDIUMBLOB (16MB), LONGBLOB (4GB)\n",[565,860,861],{"class":567,"line":580},[565,862,791],{"emptyLinePlaceholder":790},[565,864,865],{"class":567,"line":586},[565,866,867],{},"CREATE TABLE attachments (\n",[565,869,870],{"class":567,"line":592},[565,871,776],{},[565,873,874],{"class":567,"line":794},[565,875,876],{},"    filename VARCHAR(255) NOT NULL,\n",[565,878,879],{"class":567,"line":800},[565,880,881],{},"    mime_type VARCHAR(100),\n",[565,883,884],{"class":567,"line":806},[565,885,886],{},"    data LONGBLOB NOT NULL\n",[565,888,889],{"class":567,"line":812},[565,890,595],{},[565,892,893],{"class":567,"line":817},[565,894,791],{"emptyLinePlaceholder":790},[565,896,897],{"class":567,"line":823},[565,898,899],{},"-- BLOB không có charset, không convert encoding\n",[565,901,903],{"class":567,"line":902},12,[565,904,905],{},"-- So sánh với TEXT: TEXT có charset + collation; BLOB là binary thuần\n",[597,907,908,911],{"color":599,"icon":600},[602,909,910],{},"Best practice:"," Với file lớn, không nên lưu trực tiếp BLOB trong DB. Lưu file lên object storage (S3, R2) và chỉ lưu URL\u002Fpath trong MySQL. DB không phải file server.",[432,913,915],{"id":914},"thời-gian","Thời gian",[437,917,918,928],{},[440,919,920],{},[443,921,922,924,926],{},[446,923,448],{},[446,925,451],{},[446,927,622],{},[456,929,930,943,956,971,987],{},[443,931,932,937,940],{},[461,933,934],{},[464,935,936],{},"DATE",[461,938,939],{},"1000 → 9999",[461,941,942],{},"Ngày",[443,944,945,950,953],{},[461,946,947],{},[464,948,949],{},"TIME",[461,951,952],{},"-838:59:59 → +838:59:59",[461,954,955],{},"Có thể negative",[443,957,958,963,965],{},[461,959,960],{},[464,961,962],{},"DATETIME",[461,964,939],{},[461,966,967,970],{},[602,968,969],{},"Không"," convert timezone",[443,972,973,978,981],{},[461,974,975],{},[464,976,977],{},"TIMESTAMP",[461,979,980],{},"1970 → 2038",[461,982,983,986],{},[602,984,985],{},"Convert UTC ↔ session timezone",", dễ Y2038 bug",[443,988,989,994,997],{},[461,990,991],{},[464,992,993],{},"YEAR",[461,995,996],{},"1901 → 2155",[461,998,472],{},[597,1000,1001,1006,1065,1083],{"color":716,"icon":717},[719,1002,721,1003],{},[602,1004,1005],{},"DATETIME vs TIMESTAMP — câu PV gãi đầu nhiều fresher:",[437,1007,1008,1018],{},[440,1009,1010],{},[443,1011,1012,1014,1016],{},[446,1013],{},[446,1015,962],{},[446,1017,977],{},[456,1019,1020,1030,1040,1051],{},[443,1021,1022,1024,1027],{},[461,1023,451],{},[461,1025,1026],{},"1000–9999",[461,1028,1029],{},"1970–2038 ⚠️",[443,1031,1032,1034,1037],{},[461,1033,454],{},[461,1035,1036],{},"5–8 bytes",[461,1038,1039],{},"4–7 bytes",[443,1041,1042,1045,1048],{},[461,1043,1044],{},"Timezone",[461,1046,1047],{},"Không convert",[461,1049,1050],{},"Convert UTC ↔ session",[443,1052,1053,1056,1059],{},[461,1054,1055],{},"Default",[461,1057,1058],{},"NULL hoặc value",[461,1060,1061,1064],{},[464,1062,1063],{},"CURRENT_TIMESTAMP"," phổ biến",[719,1066,1067,725,1070,1072,1073,1075,1076,652,1079,1082],{},[602,1068,1069],{},"Khuyến nghị:",[464,1071,962],{}," cho ngày sinh, ngày sự kiện. ",[464,1074,977],{}," cho ",[464,1077,1078],{},"created_at",[464,1080,1081],{},"updated_at"," (cần timezone aware).",[719,1084,1085],{},"Y2038 problem là vấn đề thật với TIMESTAMP — đã có patch nhưng cẩn thận.",[432,1087,710],{"id":1088},"json",[556,1090,1092],{"className":558,"code":1091,"language":560,"meta":561,"style":561},"CREATE TABLE events (\n    id BIGINT PRIMARY KEY AUTO_INCREMENT,\n    payload JSON NOT NULL,\n    -- Generated column từ JSON path\n    event_type VARCHAR(50) AS (payload->>'$.type') VIRTUAL,\n    INDEX idx_type (event_type)\n);\n",[464,1093,1094,1099,1103,1108,1113,1118,1123],{"__ignoreMap":561},[565,1095,1096],{"class":567,"line":568},[565,1097,1098],{},"CREATE TABLE events (\n",[565,1100,1101],{"class":567,"line":574},[565,1102,776],{},[565,1104,1105],{"class":567,"line":580},[565,1106,1107],{},"    payload JSON NOT NULL,\n",[565,1109,1110],{"class":567,"line":586},[565,1111,1112],{},"    -- Generated column từ JSON path\n",[565,1114,1115],{"class":567,"line":592},[565,1116,1117],{},"    event_type VARCHAR(50) AS (payload->>'$.type') VIRTUAL,\n",[565,1119,1120],{"class":567,"line":794},[565,1121,1122],{},"    INDEX idx_type (event_type)\n",[565,1124,1125],{"class":567,"line":800},[565,1126,595],{},[597,1128,1130,1139],{"color":599,"icon":1129},"i-lucide-arrow-right",[719,1131,1132,1133,1138],{},"Chi tiết về JSON functions, JSON path, multi-valued index xem tại ",[1134,1135,1137],"a",{"href":1136},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fjson","JSON trong MySQL"," — file 4 trong series.",[719,1140,1141,1144],{},[602,1142,1143],{},"MySQL 9.7+",": JSON Duality Views hỗ trợ DML (INSERT \u002F UPDATE \u002F DELETE) trên JSON document view trong Community Edition — trước đây chỉ có ở HeatWave\u002FEnterprise. Điều này cho phép vừa truy vấn relational, vừa thao tác JSON document qua cùng một view.",[432,1146,1148],{"id":1147},"uuid","UUID",[719,1150,1151,1152,1155,1156,545,1159,1162],{},"MySQL 8.0+ hỗ trợ UUID qua function ",[464,1153,1154],{},"UUID()"," và ",[464,1157,1158],{},"UUID_TO_BIN()",[464,1160,1161],{},"BIN_TO_UUID()"," để tối ưu storage:",[556,1164,1166],{"className":558,"code":1165,"language":560,"meta":561,"style":561},"-- Cách naive — lưu dạng CHAR(36), tốn 36 byte + index phình to\nCREATE TABLE t_naive (\n    id CHAR(36) DEFAULT (UUID()) PRIMARY KEY\n);\n\n-- Cách tối ưu — lưu BINARY(16), chỉ 16 byte, index gọn\nCREATE TABLE t_optimized (\n    id BINARY(16) DEFAULT (UUID_TO_BIN(UUID())) PRIMARY KEY\n);\n\n-- Đọc lại dạng chuẩn\nSELECT BIN_TO_UUID(id) AS uuid FROM t_optimized;\n\n-- Dùng UUID v7 (MySQL 8.0.40+) — time-ordered, thân thiện InnoDB index hơn UUID v4\n-- Cần cài plugin: INSTALL COMPONENT 'file:\u002F\u002Fcomponent_uuid_v7';\n",[464,1167,1168,1173,1178,1183,1187,1191,1196,1201,1206,1210,1214,1219,1224,1229,1235],{"__ignoreMap":561},[565,1169,1170],{"class":567,"line":568},[565,1171,1172],{},"-- Cách naive — lưu dạng CHAR(36), tốn 36 byte + index phình to\n",[565,1174,1175],{"class":567,"line":574},[565,1176,1177],{},"CREATE TABLE t_naive (\n",[565,1179,1180],{"class":567,"line":580},[565,1181,1182],{},"    id CHAR(36) DEFAULT (UUID()) PRIMARY KEY\n",[565,1184,1185],{"class":567,"line":586},[565,1186,595],{},[565,1188,1189],{"class":567,"line":592},[565,1190,791],{"emptyLinePlaceholder":790},[565,1192,1193],{"class":567,"line":794},[565,1194,1195],{},"-- Cách tối ưu — lưu BINARY(16), chỉ 16 byte, index gọn\n",[565,1197,1198],{"class":567,"line":800},[565,1199,1200],{},"CREATE TABLE t_optimized (\n",[565,1202,1203],{"class":567,"line":806},[565,1204,1205],{},"    id BINARY(16) DEFAULT (UUID_TO_BIN(UUID())) PRIMARY KEY\n",[565,1207,1208],{"class":567,"line":812},[565,1209,595],{},[565,1211,1212],{"class":567,"line":817},[565,1213,791],{"emptyLinePlaceholder":790},[565,1215,1216],{"class":567,"line":823},[565,1217,1218],{},"-- Đọc lại dạng chuẩn\n",[565,1220,1221],{"class":567,"line":902},[565,1222,1223],{},"SELECT BIN_TO_UUID(id) AS uuid FROM t_optimized;\n",[565,1225,1227],{"class":567,"line":1226},13,[565,1228,791],{"emptyLinePlaceholder":790},[565,1230,1232],{"class":567,"line":1231},14,[565,1233,1234],{},"-- Dùng UUID v7 (MySQL 8.0.40+) — time-ordered, thân thiện InnoDB index hơn UUID v4\n",[565,1236,1238],{"class":567,"line":1237},15,[565,1239,1240],{},"-- Cần cài plugin: INSTALL COMPONENT 'file:\u002F\u002Fcomponent_uuid_v7';\n",[597,1242,721,1243,1246,1247,1250],{"color":716,"icon":717},[602,1244,1245],{},"UUID vs AUTO_INCREMENT:"," UUID tránh collision khi phân tán (multi-master, sharding) nhưng index B-tree của InnoDB bị fragmentation nặng với UUID v4 (random). ",[464,1248,1249],{},"UUID v7"," (time-ordered) giải quyết vấn đề này — vừa unique toàn cầu, vừa thân thiện index.",[432,1252,1254],{"id":1253},"spatial-không-gian","Spatial (không gian)",[719,1256,1257],{},"MySQL hỗ trợ OpenGIS — dùng cho GIS, bản đồ, tìm kiếm gần vị trí:",[437,1259,1260,1269],{},[440,1261,1262],{},[443,1263,1264,1266],{},[446,1265,448],{},[446,1267,1268],{},"Mô tả",[456,1270,1271,1281,1291,1301,1311,1327],{},[443,1272,1273,1278],{},[461,1274,1275],{},[464,1276,1277],{},"GEOMETRY",[461,1279,1280],{},"Base type cho mọi spatial",[443,1282,1283,1288],{},[461,1284,1285],{},[464,1286,1287],{},"POINT",[461,1289,1290],{},"Một điểm (longitude, latitude)",[443,1292,1293,1298],{},[461,1294,1295],{},[464,1296,1297],{},"LINESTRING",[461,1299,1300],{},"Đường thẳng\u002Fđường gấp khúc",[443,1302,1303,1308],{},[461,1304,1305],{},[464,1306,1307],{},"POLYGON",[461,1309,1310],{},"Vùng\u002Fđa giác",[443,1312,1313,1324],{},[461,1314,1315,652,1318,652,1321],{},[464,1316,1317],{},"MULTIPOINT",[464,1319,1320],{},"MULTILINESTRING",[464,1322,1323],{},"MULTIPOLYGON",[461,1325,1326],{},"Collection",[443,1328,1329,1334],{},[461,1330,1331],{},[464,1332,1333],{},"GEOMETRYCOLLECTION",[461,1335,1336],{},"Tập hợp các loại trên",[556,1338,1340],{"className":558,"code":1339,"language":560,"meta":561,"style":561},"CREATE TABLE locations (\n    id BIGINT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(200),\n    coord POINT NOT NULL SRID 4326,  -- WGS 84 (GPS)\n    SPATIAL INDEX idx_coord (coord)\n);\n\n-- Tìm trong bán kính 5km\nSELECT name FROM locations\nWHERE ST_Distance_Sphere(coord, ST_GeomFromText('POINT(106.6297 10.8231)', 4326)) \u003C 5000;\n",[464,1341,1342,1347,1351,1356,1361,1366,1370,1374,1379,1384],{"__ignoreMap":561},[565,1343,1344],{"class":567,"line":568},[565,1345,1346],{},"CREATE TABLE locations (\n",[565,1348,1349],{"class":567,"line":574},[565,1350,776],{},[565,1352,1353],{"class":567,"line":580},[565,1354,1355],{},"    name VARCHAR(200),\n",[565,1357,1358],{"class":567,"line":586},[565,1359,1360],{},"    coord POINT NOT NULL SRID 4326,  -- WGS 84 (GPS)\n",[565,1362,1363],{"class":567,"line":592},[565,1364,1365],{},"    SPATIAL INDEX idx_coord (coord)\n",[565,1367,1368],{"class":567,"line":794},[565,1369,595],{},[565,1371,1372],{"class":567,"line":800},[565,1373,791],{"emptyLinePlaceholder":790},[565,1375,1376],{"class":567,"line":806},[565,1377,1378],{},"-- Tìm trong bán kính 5km\n",[565,1380,1381],{"class":567,"line":812},[565,1382,1383],{},"SELECT name FROM locations\n",[565,1385,1386],{"class":567,"line":817},[565,1387,1388],{},"WHERE ST_Distance_Sphere(coord, ST_GeomFromText('POINT(106.6297 10.8231)', 4326)) \u003C 5000;\n",[597,1390,1391,1397,1401,1510,1554,1563,1567,1606,1612,1616,1654,1664,1668,1672,1753,1760,1790,1824,1827,1880,1899,1903,1951,1955,2002,2006,2026,2030,2107,2131,2135,2169,2186,2190,2194,2254,2258,2312,2315,2396,2400,2424,2428,2432,2452,2456,2500,2520,2524,2569,2613,2617,2663,2684,2688,2775,2779,2910,2933],{"color":599,"icon":600},[719,1392,1393,1396],{},[602,1394,1395],{},"Spatial trong MySQL"," — đủ dùng cho ứng dụng đơn giản (tìm cửa hàng gần nhất). Với GIS nặng (postGIS, raster), Postgres + PostGIS là lựa chọn tốt hơn.\n:::",[427,1398,1400],{"id":1399},"_2-ddl","2. DDL",[556,1402,1404],{"className":558,"code":1403,"language":560,"meta":561,"style":561},"CREATE TABLE products (\n    id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(200) NOT NULL,\n    price DECIMAL(18, 2) NOT NULL CHECK (price >= 0),\n    category_id INT NOT NULL,\n    metadata JSON,\n    is_active TINYINT(1) NOT NULL DEFAULT 1,\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    \n    INDEX idx_category (category_id),\n    CONSTRAINT fk_products_cat FOREIGN KEY (category_id)\n        REFERENCES categories(id) ON DELETE RESTRICT\n) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;\n\n-- Add \u002F drop \u002F modify column\nALTER TABLE products ADD COLUMN description TEXT;\nALTER TABLE products DROP COLUMN description;\nALTER TABLE products MODIFY COLUMN name VARCHAR(300) NOT NULL;\nALTER TABLE products CHANGE COLUMN price unit_price DECIMAL(18, 2);\n",[464,1405,1406,1411,1416,1421,1426,1431,1436,1441,1446,1451,1456,1461,1466,1471,1476,1480,1486,1492,1498,1504],{"__ignoreMap":561},[565,1407,1408],{"class":567,"line":568},[565,1409,1410],{},"CREATE TABLE products (\n",[565,1412,1413],{"class":567,"line":574},[565,1414,1415],{},"    id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,\n",[565,1417,1418],{"class":567,"line":580},[565,1419,1420],{},"    name VARCHAR(200) NOT NULL,\n",[565,1422,1423],{"class":567,"line":586},[565,1424,1425],{},"    price DECIMAL(18, 2) NOT NULL CHECK (price >= 0),\n",[565,1427,1428],{"class":567,"line":592},[565,1429,1430],{},"    category_id INT NOT NULL,\n",[565,1432,1433],{"class":567,"line":794},[565,1434,1435],{},"    metadata JSON,\n",[565,1437,1438],{"class":567,"line":800},[565,1439,1440],{},"    is_active TINYINT(1) NOT NULL DEFAULT 1,\n",[565,1442,1443],{"class":567,"line":806},[565,1444,1445],{},"    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n",[565,1447,1448],{"class":567,"line":812},[565,1449,1450],{},"    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n",[565,1452,1453],{"class":567,"line":817},[565,1454,1455],{},"    \n",[565,1457,1458],{"class":567,"line":823},[565,1459,1460],{},"    INDEX idx_category (category_id),\n",[565,1462,1463],{"class":567,"line":902},[565,1464,1465],{},"    CONSTRAINT fk_products_cat FOREIGN KEY (category_id)\n",[565,1467,1468],{"class":567,"line":1226},[565,1469,1470],{},"        REFERENCES categories(id) ON DELETE RESTRICT\n",[565,1472,1473],{"class":567,"line":1231},[565,1474,1475],{},") ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;\n",[565,1477,1478],{"class":567,"line":1237},[565,1479,791],{"emptyLinePlaceholder":790},[565,1481,1483],{"class":567,"line":1482},16,[565,1484,1485],{},"-- Add \u002F drop \u002F modify column\n",[565,1487,1489],{"class":567,"line":1488},17,[565,1490,1491],{},"ALTER TABLE products ADD COLUMN description TEXT;\n",[565,1493,1495],{"class":567,"line":1494},18,[565,1496,1497],{},"ALTER TABLE products DROP COLUMN description;\n",[565,1499,1501],{"class":567,"line":1500},19,[565,1502,1503],{},"ALTER TABLE products MODIFY COLUMN name VARCHAR(300) NOT NULL;\n",[565,1505,1507],{"class":567,"line":1506},20,[565,1508,1509],{},"ALTER TABLE products CHANGE COLUMN price unit_price DECIMAL(18, 2);\n",[597,1511,1512,1528,1548],{"color":599,"icon":268},[719,1513,1514,1520,1521,1523,1524,1527],{},[602,1515,1516,1517],{},"MySQL 8.0+ ",[464,1518,1519],{},"ALGORITHM=INSTANT"," — thêm column, drop column, đổi tên column, set default, modify ENUM... đều có thể thực hiện instant (không copy bảng, không lock). Trước 8.0, ",[464,1522,839],{}," thường phải ",[464,1525,1526],{},"ALGORITHM=COPY"," (tạo bảng tạm, copy toàn bộ data — rất chậm với bảng lớn).",[556,1529,1531],{"className":558,"code":1530,"language":560,"meta":561,"style":561},"-- MySQL 8.0+ tự chọn INSTANT nếu có thể, hoặc ép buộc:\nALTER TABLE products ADD COLUMN tags JSON, ALGORITHM=INSTANT;\nALTER TABLE products DROP COLUMN description, ALGORITHM=INSTANT;\n",[464,1532,1533,1538,1543],{"__ignoreMap":561},[565,1534,1535],{"class":567,"line":568},[565,1536,1537],{},"-- MySQL 8.0+ tự chọn INSTANT nếu có thể, hoặc ép buộc:\n",[565,1539,1540],{"class":567,"line":574},[565,1541,1542],{},"ALTER TABLE products ADD COLUMN tags JSON, ALGORITHM=INSTANT;\n",[565,1544,1545],{"class":567,"line":580},[565,1546,1547],{},"ALTER TABLE products DROP COLUMN description, ALGORITHM=INSTANT;\n",[719,1549,1550,1551],{},"Kiểm tra operation nào được hỗ trợ INSTANT: ",[464,1552,1553],{},"SELECT * FROM information_schema.INNODB_COLUMNS;",[597,1555,721,1556,1562],{"color":599,"icon":717},[602,1557,1558,1559],{},"MySQL trick — ",[464,1560,1561],{},"ON UPDATE CURRENT_TIMESTAMP"," auto-update timestamp khi row thay đổi. Không có ở SQL Server \u002F Postgres (phải dùng trigger).",[432,1564,1566],{"id":1565},"check-constraint","CHECK constraint",[556,1568,1570],{"className":558,"code":1569,"language":560,"meta":561,"style":561},"-- MySQL 8.0.16+ thực sự enforce CHECK (trước 8.0.16 chỉ parse rồi ignore!)\nALTER TABLE products\n    ADD CONSTRAINT chk_price_positive CHECK (price >= 0);\n\n-- CHECK có thể reference nhiều column trong cùng row\nALTER TABLE orders\n    ADD CONSTRAINT chk_date_order CHECK (shipped_at >= created_at);\n",[464,1571,1572,1577,1582,1587,1591,1596,1601],{"__ignoreMap":561},[565,1573,1574],{"class":567,"line":568},[565,1575,1576],{},"-- MySQL 8.0.16+ thực sự enforce CHECK (trước 8.0.16 chỉ parse rồi ignore!)\n",[565,1578,1579],{"class":567,"line":574},[565,1580,1581],{},"ALTER TABLE products\n",[565,1583,1584],{"class":567,"line":580},[565,1585,1586],{},"    ADD CONSTRAINT chk_price_positive CHECK (price >= 0);\n",[565,1588,1589],{"class":567,"line":586},[565,1590,791],{"emptyLinePlaceholder":790},[565,1592,1593],{"class":567,"line":592},[565,1594,1595],{},"-- CHECK có thể reference nhiều column trong cùng row\n",[565,1597,1598],{"class":567,"line":794},[565,1599,1600],{},"ALTER TABLE orders\n",[565,1602,1603],{"class":567,"line":800},[565,1604,1605],{},"    ADD CONSTRAINT chk_date_order CHECK (shipped_at >= created_at);\n",[597,1607,721,1608,1611],{"color":716,"icon":717},[602,1609,1610],{},"CHECK constraint được enforce từ MySQL 8.0.16."," Trước đó, MySQL parse syntax nhưng âm thầm bỏ qua — data vi phạm vẫn insert bình thường. Đây là một trong những lý do MySQL bị chê \"thiếu data integrity\". Từ 8.0.16 đã full support.",[432,1613,1615],{"id":1614},"generated-column","Generated column",[556,1617,1619],{"className":558,"code":1618,"language":560,"meta":561,"style":561},"CREATE TABLE orders (\n    id BIGINT PRIMARY KEY AUTO_INCREMENT,\n    subtotal DECIMAL(18, 2),\n    tax_rate DECIMAL(5, 2),\n    total DECIMAL(18, 2) AS (subtotal * (1 + tax_rate \u002F 100)) STORED,\n    INDEX idx_total (total)\n);\n",[464,1620,1621,1626,1630,1635,1640,1645,1650],{"__ignoreMap":561},[565,1622,1623],{"class":567,"line":568},[565,1624,1625],{},"CREATE TABLE orders (\n",[565,1627,1628],{"class":567,"line":574},[565,1629,776],{},[565,1631,1632],{"class":567,"line":580},[565,1633,1634],{},"    subtotal DECIMAL(18, 2),\n",[565,1636,1637],{"class":567,"line":586},[565,1638,1639],{},"    tax_rate DECIMAL(5, 2),\n",[565,1641,1642],{"class":567,"line":592},[565,1643,1644],{},"    total DECIMAL(18, 2) AS (subtotal * (1 + tax_rate \u002F 100)) STORED,\n",[565,1646,1647],{"class":567,"line":794},[565,1648,1649],{},"    INDEX idx_total (total)\n",[565,1651,1652],{"class":567,"line":800},[565,1653,595],{},[719,1655,1656,1659,1660,1663],{},[464,1657,1658],{},"VIRTUAL"," = tính khi đọc (default). ",[464,1661,1662],{},"STORED"," = lưu vật lý, index trực tiếp tốt hơn.",[427,1665,1667],{"id":1666},"_3-dml","3. DML",[432,1669,1671],{"id":1670},"insert","INSERT",[556,1673,1675],{"className":558,"code":1674,"language":560,"meta":561,"style":561},"INSERT INTO products (name, price) VALUES ('Laptop', 32000000);\n\n-- Multi-row\nINSERT INTO products (name, price) VALUES\n    ('Mouse', 800000),\n    ('Keyboard', 2200000);\n\n-- INSERT IGNORE — bỏ qua row vi phạm unique\nINSERT IGNORE INTO users (email) VALUES ('alice@x.com');\n\n-- INSERT SELECT\nINSERT INTO archive_orders SELECT * FROM orders WHERE created_at \u003C '2025-01-01';\n\n-- Lấy ID vừa insert\nINSERT INTO users (email) VALUES ('alice@x.com');\nSELECT LAST_INSERT_ID();\n",[464,1676,1677,1682,1686,1691,1696,1701,1706,1710,1715,1720,1724,1729,1734,1738,1743,1748],{"__ignoreMap":561},[565,1678,1679],{"class":567,"line":568},[565,1680,1681],{},"INSERT INTO products (name, price) VALUES ('Laptop', 32000000);\n",[565,1683,1684],{"class":567,"line":574},[565,1685,791],{"emptyLinePlaceholder":790},[565,1687,1688],{"class":567,"line":580},[565,1689,1690],{},"-- Multi-row\n",[565,1692,1693],{"class":567,"line":586},[565,1694,1695],{},"INSERT INTO products (name, price) VALUES\n",[565,1697,1698],{"class":567,"line":592},[565,1699,1700],{},"    ('Mouse', 800000),\n",[565,1702,1703],{"class":567,"line":794},[565,1704,1705],{},"    ('Keyboard', 2200000);\n",[565,1707,1708],{"class":567,"line":800},[565,1709,791],{"emptyLinePlaceholder":790},[565,1711,1712],{"class":567,"line":806},[565,1713,1714],{},"-- INSERT IGNORE — bỏ qua row vi phạm unique\n",[565,1716,1717],{"class":567,"line":812},[565,1718,1719],{},"INSERT IGNORE INTO users (email) VALUES ('alice@x.com');\n",[565,1721,1722],{"class":567,"line":817},[565,1723,791],{"emptyLinePlaceholder":790},[565,1725,1726],{"class":567,"line":823},[565,1727,1728],{},"-- INSERT SELECT\n",[565,1730,1731],{"class":567,"line":902},[565,1732,1733],{},"INSERT INTO archive_orders SELECT * FROM orders WHERE created_at \u003C '2025-01-01';\n",[565,1735,1736],{"class":567,"line":1226},[565,1737,791],{"emptyLinePlaceholder":790},[565,1739,1740],{"class":567,"line":1231},[565,1741,1742],{},"-- Lấy ID vừa insert\n",[565,1744,1745],{"class":567,"line":1237},[565,1746,1747],{},"INSERT INTO users (email) VALUES ('alice@x.com');\n",[565,1749,1750],{"class":567,"line":1482},[565,1751,1752],{},"SELECT LAST_INSERT_ID();\n",[432,1754,1756,1757],{"id":1755},"upsert-on-duplicate-key-update","UPSERT — ",[464,1758,1759],{},"ON DUPLICATE KEY UPDATE",[556,1761,1763],{"className":558,"code":1762,"language":560,"meta":561,"style":561},"INSERT INTO users (email, login_count)\nVALUES ('alice@x.com', 1)\nON DUPLICATE KEY UPDATE\n    login_count = login_count + 1,\n    last_login = NOW();\n",[464,1764,1765,1770,1775,1780,1785],{"__ignoreMap":561},[565,1766,1767],{"class":567,"line":568},[565,1768,1769],{},"INSERT INTO users (email, login_count)\n",[565,1771,1772],{"class":567,"line":574},[565,1773,1774],{},"VALUES ('alice@x.com', 1)\n",[565,1776,1777],{"class":567,"line":580},[565,1778,1779],{},"ON DUPLICATE KEY UPDATE\n",[565,1781,1782],{"class":567,"line":586},[565,1783,1784],{},"    login_count = login_count + 1,\n",[565,1786,1787],{"class":567,"line":592},[565,1788,1789],{},"    last_login = NOW();\n",[597,1791,1792,1813],{"color":716,"icon":717},[719,1793,721,1794,725,1797,1800,1801,1804,1805,1808,1809,1812],{},[602,1795,1796],{},"Câu PV:",[727,1798,1799],{},"\"MySQL UPSERT làm sao?\""," → ",[464,1802,1803],{},"INSERT ... ON DUPLICATE KEY UPDATE ...",". Khác Postgres ",[464,1806,1807],{},"ON CONFLICT",", khác SQL Server ",[464,1810,1811],{},"MERGE",".",[719,1814,1815,1816,1819,1820,1823],{},"Hoặc dùng ",[464,1817,1818],{},"REPLACE INTO"," (= DELETE + INSERT, ",[602,1821,1822],{},"không khuyến nghị"," vì xoá row gốc, mất FK, mất AUTO_INCREMENT).",[432,1825,1818],{"id":1826},"replace-into",[556,1828,1830],{"className":558,"code":1829,"language":560,"meta":561,"style":561},"-- REPLACE = DELETE (nếu duplicate key) + INSERT\n-- Tương tự INSERT về syntax\nREPLACE INTO users (id, email, login_count)\nVALUES (1, 'alice@x.com', 1);\n\n-- Dạng SET\nREPLACE INTO users SET id = 1, email = 'alice@x.com', login_count = 1;\n\n-- Nếu id=1 đã tồn tại → DELETE row cũ → INSERT row mới\n-- ⚠️ Cảnh báo: DELETE rồi INSERT → mất AUTO_INCREMENT cũ, mất FK child rows (nếu ON DELETE CASCADE)\n",[464,1831,1832,1837,1842,1847,1852,1856,1861,1866,1870,1875],{"__ignoreMap":561},[565,1833,1834],{"class":567,"line":568},[565,1835,1836],{},"-- REPLACE = DELETE (nếu duplicate key) + INSERT\n",[565,1838,1839],{"class":567,"line":574},[565,1840,1841],{},"-- Tương tự INSERT về syntax\n",[565,1843,1844],{"class":567,"line":580},[565,1845,1846],{},"REPLACE INTO users (id, email, login_count)\n",[565,1848,1849],{"class":567,"line":586},[565,1850,1851],{},"VALUES (1, 'alice@x.com', 1);\n",[565,1853,1854],{"class":567,"line":592},[565,1855,791],{"emptyLinePlaceholder":790},[565,1857,1858],{"class":567,"line":794},[565,1859,1860],{},"-- Dạng SET\n",[565,1862,1863],{"class":567,"line":800},[565,1864,1865],{},"REPLACE INTO users SET id = 1, email = 'alice@x.com', login_count = 1;\n",[565,1867,1868],{"class":567,"line":806},[565,1869,791],{"emptyLinePlaceholder":790},[565,1871,1872],{"class":567,"line":812},[565,1873,1874],{},"-- Nếu id=1 đã tồn tại → DELETE row cũ → INSERT row mới\n",[565,1876,1877],{"class":567,"line":817},[565,1878,1879],{},"-- ⚠️ Cảnh báo: DELETE rồi INSERT → mất AUTO_INCREMENT cũ, mất FK child rows (nếu ON DELETE CASCADE)\n",[597,1881,721,1883,725,1886,1889,1890,1892,1893,1898],{"color":716,"icon":1882},"i-lucide-alert-triangle",[602,1884,1885],{},"REPLACE vs INSERT ... ON DUPLICATE KEY UPDATE:",[464,1887,1888],{},"REPLACE"," xoá row cũ rồi chèn mới — các column không được chỉ định sẽ reset về DEFAULT. ",[464,1891,1759],{}," chỉ update column được chỉ định, giữ nguyên phần còn lại. ",[602,1894,1895,1896],{},"Luôn dùng ",[464,1897,1759],{}," trừ khi bạn thực sự muốn xoá và tạo lại toàn bộ row.",[432,1900,1902],{"id":1901},"update","UPDATE",[556,1904,1906],{"className":558,"code":1905,"language":560,"meta":561,"style":561},"UPDATE products SET price = price * 1.1 WHERE category_id = 1;\n\n-- UPDATE từ JOIN\nUPDATE products p\nJOIN categories c ON c.id = p.category_id\nSET p.category_name = c.name;\n\n-- UPDATE với LIMIT (đặc thù MySQL)\nUPDATE products SET is_active = 0 WHERE last_used \u003C '2025-01-01' LIMIT 1000;\n",[464,1907,1908,1913,1917,1922,1927,1932,1937,1941,1946],{"__ignoreMap":561},[565,1909,1910],{"class":567,"line":568},[565,1911,1912],{},"UPDATE products SET price = price * 1.1 WHERE category_id = 1;\n",[565,1914,1915],{"class":567,"line":574},[565,1916,791],{"emptyLinePlaceholder":790},[565,1918,1919],{"class":567,"line":580},[565,1920,1921],{},"-- UPDATE từ JOIN\n",[565,1923,1924],{"class":567,"line":586},[565,1925,1926],{},"UPDATE products p\n",[565,1928,1929],{"class":567,"line":592},[565,1930,1931],{},"JOIN categories c ON c.id = p.category_id\n",[565,1933,1934],{"class":567,"line":794},[565,1935,1936],{},"SET p.category_name = c.name;\n",[565,1938,1939],{"class":567,"line":800},[565,1940,791],{"emptyLinePlaceholder":790},[565,1942,1943],{"class":567,"line":806},[565,1944,1945],{},"-- UPDATE với LIMIT (đặc thù MySQL)\n",[565,1947,1948],{"class":567,"line":812},[565,1949,1950],{},"UPDATE products SET is_active = 0 WHERE last_used \u003C '2025-01-01' LIMIT 1000;\n",[432,1952,1954],{"id":1953},"delete","DELETE",[556,1956,1958],{"className":558,"code":1957,"language":560,"meta":561,"style":561},"DELETE FROM products WHERE is_active = 0;\n\n-- DELETE từ JOIN\nDELETE p FROM products p\nJOIN categories c ON c.id = p.category_id\nWHERE c.is_archived = 1;\n\n-- DELETE với LIMIT\nDELETE FROM logs WHERE created_at \u003C '2025-01-01' ORDER BY id LIMIT 10000;\n",[464,1959,1960,1965,1969,1974,1979,1983,1988,1992,1997],{"__ignoreMap":561},[565,1961,1962],{"class":567,"line":568},[565,1963,1964],{},"DELETE FROM products WHERE is_active = 0;\n",[565,1966,1967],{"class":567,"line":574},[565,1968,791],{"emptyLinePlaceholder":790},[565,1970,1971],{"class":567,"line":580},[565,1972,1973],{},"-- DELETE từ JOIN\n",[565,1975,1976],{"class":567,"line":586},[565,1977,1978],{},"DELETE p FROM products p\n",[565,1980,1981],{"class":567,"line":592},[565,1982,1931],{},[565,1984,1985],{"class":567,"line":794},[565,1986,1987],{},"WHERE c.is_archived = 1;\n",[565,1989,1990],{"class":567,"line":800},[565,1991,791],{"emptyLinePlaceholder":790},[565,1993,1994],{"class":567,"line":806},[565,1995,1996],{},"-- DELETE với LIMIT\n",[565,1998,1999],{"class":567,"line":812},[565,2000,2001],{},"DELETE FROM logs WHERE created_at \u003C '2025-01-01' ORDER BY id LIMIT 10000;\n",[432,2003,2005],{"id":2004},"truncate","TRUNCATE",[556,2007,2009],{"className":558,"code":2008,"language":560,"meta":561,"style":561},"TRUNCATE TABLE logs;\n-- Reset AUTO_INCREMENT về 1.\n-- FK CASCADE không trigger — chỉ DELETE mới gọi trigger.\n",[464,2010,2011,2016,2021],{"__ignoreMap":561},[565,2012,2013],{"class":567,"line":568},[565,2014,2015],{},"TRUNCATE TABLE logs;\n",[565,2017,2018],{"class":567,"line":574},[565,2019,2020],{},"-- Reset AUTO_INCREMENT về 1.\n",[565,2022,2023],{"class":567,"line":580},[565,2024,2025],{},"-- FK CASCADE không trigger — chỉ DELETE mới gọi trigger.\n",[432,2027,2029],{"id":2028},"load-data-infile-select-into-outfile","LOAD DATA INFILE & SELECT INTO OUTFILE",[556,2031,2033],{"className":558,"code":2032,"language":560,"meta":561,"style":561},"-- Import CSV vào bảng (cần FILE privilege)\nLOAD DATA INFILE '\u002Ftmp\u002Fusers.csv'\nINTO TABLE users\nFIELDS TERMINATED BY ',' ENCLOSED BY '\"'\nLINES TERMINATED BY '\\n'\nIGNORE 1 ROWS                                  -- bỏ qua header\n(id, name, email, @created)\nSET created_at = STR_TO_DATE(@created, '%Y-%m-%d %H:%i:%s');\n\n-- Export kết quả SELECT ra file CSV\nSELECT id, name, email\nINTO OUTFILE '\u002Ftmp\u002Fusers_export.csv'\nFIELDS TERMINATED BY ',' ENCLOSED BY '\"'\nLINES TERMINATED BY '\\n'\nFROM users WHERE is_active = 1;\n",[464,2034,2035,2040,2045,2050,2055,2060,2065,2070,2075,2079,2084,2089,2094,2098,2102],{"__ignoreMap":561},[565,2036,2037],{"class":567,"line":568},[565,2038,2039],{},"-- Import CSV vào bảng (cần FILE privilege)\n",[565,2041,2042],{"class":567,"line":574},[565,2043,2044],{},"LOAD DATA INFILE '\u002Ftmp\u002Fusers.csv'\n",[565,2046,2047],{"class":567,"line":580},[565,2048,2049],{},"INTO TABLE users\n",[565,2051,2052],{"class":567,"line":586},[565,2053,2054],{},"FIELDS TERMINATED BY ',' ENCLOSED BY '\"'\n",[565,2056,2057],{"class":567,"line":592},[565,2058,2059],{},"LINES TERMINATED BY '\\n'\n",[565,2061,2062],{"class":567,"line":794},[565,2063,2064],{},"IGNORE 1 ROWS                                  -- bỏ qua header\n",[565,2066,2067],{"class":567,"line":800},[565,2068,2069],{},"(id, name, email, @created)\n",[565,2071,2072],{"class":567,"line":806},[565,2073,2074],{},"SET created_at = STR_TO_DATE(@created, '%Y-%m-%d %H:%i:%s');\n",[565,2076,2077],{"class":567,"line":812},[565,2078,791],{"emptyLinePlaceholder":790},[565,2080,2081],{"class":567,"line":817},[565,2082,2083],{},"-- Export kết quả SELECT ra file CSV\n",[565,2085,2086],{"class":567,"line":823},[565,2087,2088],{},"SELECT id, name, email\n",[565,2090,2091],{"class":567,"line":902},[565,2092,2093],{},"INTO OUTFILE '\u002Ftmp\u002Fusers_export.csv'\n",[565,2095,2096],{"class":567,"line":1226},[565,2097,2054],{},[565,2099,2100],{"class":567,"line":1231},[565,2101,2059],{},[565,2103,2104],{"class":567,"line":1237},[565,2105,2106],{},"FROM users WHERE is_active = 1;\n",[597,2108,2109,2118],{"color":599,"icon":268},[719,2110,721,2111,2114,2115,2117],{},[602,2112,2113],{},"LOAD DATA INFILE"," là cách nhanh nhất để import bulk data vào MySQL — nhanh hơn nhiều so với chạy 10,000 câu ",[464,2116,1671],{}," riêng lẻ. CSV import là câu hỏi phỏng vấn thường gặp.",[719,2119,2120,725,2123,2126,2127,2130],{},[602,2121,2122],{},"Lưu ý bảo mật:",[464,2124,2125],{},"local_infile"," bị tắt mặc định từ MySQL 8.0.22. Nếu dùng ",[464,2128,2129],{},"LOAD DATA LOCAL INFILE",", cần bật option này ở client và server.",[427,2132,2134],{"id":2133},"_4-null-handling","4. NULL handling",[556,2136,2138],{"className":558,"code":2137,"language":560,"meta":561,"style":561},"SELECT * FROM users WHERE email IS NULL;\nSELECT IFNULL(email, 'no-email') FROM users;       -- MySQL function\nSELECT COALESCE(email, phone, 'unknown') FROM users; -- chuẩn ANSI\n\n-- NULL-safe equality (đặc thù MySQL)\nSELECT * FROM users WHERE deleted_at \u003C=> NULL;     -- = NULL không work, \u003C=> work\n",[464,2139,2140,2145,2150,2155,2159,2164],{"__ignoreMap":561},[565,2141,2142],{"class":567,"line":568},[565,2143,2144],{},"SELECT * FROM users WHERE email IS NULL;\n",[565,2146,2147],{"class":567,"line":574},[565,2148,2149],{},"SELECT IFNULL(email, 'no-email') FROM users;       -- MySQL function\n",[565,2151,2152],{"class":567,"line":580},[565,2153,2154],{},"SELECT COALESCE(email, phone, 'unknown') FROM users; -- chuẩn ANSI\n",[565,2156,2157],{"class":567,"line":586},[565,2158,791],{"emptyLinePlaceholder":790},[565,2160,2161],{"class":567,"line":592},[565,2162,2163],{},"-- NULL-safe equality (đặc thù MySQL)\n",[565,2165,2166],{"class":567,"line":794},[565,2167,2168],{},"SELECT * FROM users WHERE deleted_at \u003C=> NULL;     -- = NULL không work, \u003C=> work\n",[597,2170,721,2171,2177,2178,2181,2182,2185],{"color":599,"icon":717},[602,2172,2173,2176],{},[464,2174,2175],{},"\u003C=>"," null-safe equal"," — đặc thù MySQL. ",[464,2179,2180],{},"NULL \u003C=> NULL"," → TRUE. ",[464,2183,2184],{},"1 \u003C=> NULL"," → FALSE.",[427,2187,2189],{"id":2188},"_5-function-thường-dùng","5. Function thường dùng",[432,2191,2193],{"id":2192},"string","String",[556,2195,2197],{"className":558,"code":2196,"language":560,"meta":561,"style":561},"SELECT\n    LENGTH('Hello'),                        -- byte (5 ASCII, ~15 cho UTF-8 tiếng Việt)\n    CHAR_LENGTH('Xin chào'),                -- ký tự (8)\n    LOWER('ABC'), UPPER('abc'),\n    SUBSTRING('Hello', 2, 3),               -- 'ell'\n    LEFT('Hello', 3), RIGHT('Hello', 2),\n    TRIM('  abc  '), TRIM(LEADING '0' FROM '000abc'),\n    REPLACE('abc', 'b', 'X'),\n    CONCAT('Hello', ' ', 'World'),\n    CONCAT_WS(', ', 'a', 'b', 'c'),         -- 'a, b, c'\n    GROUP_CONCAT(name ORDER BY name SEPARATOR ', ');  -- aggregate\n",[464,2198,2199,2204,2209,2214,2219,2224,2229,2234,2239,2244,2249],{"__ignoreMap":561},[565,2200,2201],{"class":567,"line":568},[565,2202,2203],{},"SELECT\n",[565,2205,2206],{"class":567,"line":574},[565,2207,2208],{},"    LENGTH('Hello'),                        -- byte (5 ASCII, ~15 cho UTF-8 tiếng Việt)\n",[565,2210,2211],{"class":567,"line":580},[565,2212,2213],{},"    CHAR_LENGTH('Xin chào'),                -- ký tự (8)\n",[565,2215,2216],{"class":567,"line":586},[565,2217,2218],{},"    LOWER('ABC'), UPPER('abc'),\n",[565,2220,2221],{"class":567,"line":592},[565,2222,2223],{},"    SUBSTRING('Hello', 2, 3),               -- 'ell'\n",[565,2225,2226],{"class":567,"line":794},[565,2227,2228],{},"    LEFT('Hello', 3), RIGHT('Hello', 2),\n",[565,2230,2231],{"class":567,"line":800},[565,2232,2233],{},"    TRIM('  abc  '), TRIM(LEADING '0' FROM '000abc'),\n",[565,2235,2236],{"class":567,"line":806},[565,2237,2238],{},"    REPLACE('abc', 'b', 'X'),\n",[565,2240,2241],{"class":567,"line":812},[565,2242,2243],{},"    CONCAT('Hello', ' ', 'World'),\n",[565,2245,2246],{"class":567,"line":817},[565,2247,2248],{},"    CONCAT_WS(', ', 'a', 'b', 'c'),         -- 'a, b, c'\n",[565,2250,2251],{"class":567,"line":823},[565,2252,2253],{},"    GROUP_CONCAT(name ORDER BY name SEPARATOR ', ');  -- aggregate\n",[432,2255,2257],{"id":2256},"date","Date",[556,2259,2261],{"className":558,"code":2260,"language":560,"meta":561,"style":561},"SELECT\n    NOW(), CURRENT_TIMESTAMP, UTC_TIMESTAMP(),\n    CURDATE(), CURTIME(),\n    DATE_ADD(NOW(), INTERVAL 7 DAY),\n    DATE_SUB(NOW(), INTERVAL 1 MONTH),\n    DATEDIFF('2026-12-31', NOW()),          -- số ngày\n    TIMESTAMPDIFF(HOUR, '2026-01-01', NOW()),\n    YEAR(NOW()), MONTH(NOW()), DAY(NOW()),\n    DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i'),\n    LAST_DAY(NOW());\n",[464,2262,2263,2267,2272,2277,2282,2287,2292,2297,2302,2307],{"__ignoreMap":561},[565,2264,2265],{"class":567,"line":568},[565,2266,2203],{},[565,2268,2269],{"class":567,"line":574},[565,2270,2271],{},"    NOW(), CURRENT_TIMESTAMP, UTC_TIMESTAMP(),\n",[565,2273,2274],{"class":567,"line":580},[565,2275,2276],{},"    CURDATE(), CURTIME(),\n",[565,2278,2279],{"class":567,"line":586},[565,2280,2281],{},"    DATE_ADD(NOW(), INTERVAL 7 DAY),\n",[565,2283,2284],{"class":567,"line":592},[565,2285,2286],{},"    DATE_SUB(NOW(), INTERVAL 1 MONTH),\n",[565,2288,2289],{"class":567,"line":794},[565,2290,2291],{},"    DATEDIFF('2026-12-31', NOW()),          -- số ngày\n",[565,2293,2294],{"class":567,"line":800},[565,2295,2296],{},"    TIMESTAMPDIFF(HOUR, '2026-01-01', NOW()),\n",[565,2298,2299],{"class":567,"line":806},[565,2300,2301],{},"    YEAR(NOW()), MONTH(NOW()), DAY(NOW()),\n",[565,2303,2304],{"class":567,"line":812},[565,2305,2306],{},"    DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i'),\n",[565,2308,2309],{"class":567,"line":817},[565,2310,2311],{},"    LAST_DAY(NOW());\n",[432,2313,710],{"id":2314},"json-1",[556,2316,2318],{"className":558,"code":2317,"language":560,"meta":561,"style":561},"SELECT\n    payload->'$.type',                       -- trả JSON\n    payload->>'$.type',                      -- trả TEXT (unquoted)\n    JSON_EXTRACT(payload, '$.user.name'),\n    JSON_UNQUOTE(JSON_EXTRACT(payload, '$.tags[0]')),\n    JSON_CONTAINS(payload, '\"vue\"', '$.tags'),\n    JSON_KEYS(payload),\n    JSON_LENGTH(payload, '$.tags');\n\n-- Modify\nUPDATE events\nSET payload = JSON_SET(payload, '$.processed', true)\nWHERE id = 1;\n\nUPDATE events\nSET payload = JSON_REMOVE(payload, '$.temp');\n",[464,2319,2320,2324,2329,2334,2339,2344,2349,2354,2359,2363,2368,2373,2378,2383,2387,2391],{"__ignoreMap":561},[565,2321,2322],{"class":567,"line":568},[565,2323,2203],{},[565,2325,2326],{"class":567,"line":574},[565,2327,2328],{},"    payload->'$.type',                       -- trả JSON\n",[565,2330,2331],{"class":567,"line":580},[565,2332,2333],{},"    payload->>'$.type',                      -- trả TEXT (unquoted)\n",[565,2335,2336],{"class":567,"line":586},[565,2337,2338],{},"    JSON_EXTRACT(payload, '$.user.name'),\n",[565,2340,2341],{"class":567,"line":592},[565,2342,2343],{},"    JSON_UNQUOTE(JSON_EXTRACT(payload, '$.tags[0]')),\n",[565,2345,2346],{"class":567,"line":794},[565,2347,2348],{},"    JSON_CONTAINS(payload, '\"vue\"', '$.tags'),\n",[565,2350,2351],{"class":567,"line":800},[565,2352,2353],{},"    JSON_KEYS(payload),\n",[565,2355,2356],{"class":567,"line":806},[565,2357,2358],{},"    JSON_LENGTH(payload, '$.tags');\n",[565,2360,2361],{"class":567,"line":812},[565,2362,791],{"emptyLinePlaceholder":790},[565,2364,2365],{"class":567,"line":817},[565,2366,2367],{},"-- Modify\n",[565,2369,2370],{"class":567,"line":823},[565,2371,2372],{},"UPDATE events\n",[565,2374,2375],{"class":567,"line":902},[565,2376,2377],{},"SET payload = JSON_SET(payload, '$.processed', true)\n",[565,2379,2380],{"class":567,"line":1226},[565,2381,2382],{},"WHERE id = 1;\n",[565,2384,2385],{"class":567,"line":1231},[565,2386,791],{"emptyLinePlaceholder":790},[565,2388,2389],{"class":567,"line":1237},[565,2390,2372],{},[565,2392,2393],{"class":567,"line":1482},[565,2394,2395],{},"SET payload = JSON_REMOVE(payload, '$.temp');\n",[432,2397,2399],{"id":2398},"conversion","Conversion",[556,2401,2403],{"className":558,"code":2402,"language":560,"meta":561,"style":561},"SELECT\n    CAST('123' AS UNSIGNED),\n    CAST('2026-01-01' AS DATE),\n    CONVERT('abc', BINARY);\n",[464,2404,2405,2409,2414,2419],{"__ignoreMap":561},[565,2406,2407],{"class":567,"line":568},[565,2408,2203],{},[565,2410,2411],{"class":567,"line":574},[565,2412,2413],{},"    CAST('123' AS UNSIGNED),\n",[565,2415,2416],{"class":567,"line":580},[565,2417,2418],{},"    CAST('2026-01-01' AS DATE),\n",[565,2420,2421],{"class":567,"line":586},[565,2422,2423],{},"    CONVERT('abc', BINARY);\n",[427,2425,2427],{"id":2426},"_6-variable-stored-program","6. Variable & stored program",[432,2429,2431],{"id":2430},"user-defined-variable","User-defined variable",[556,2433,2435],{"className":558,"code":2434,"language":560,"meta":561,"style":561},"SET @x = 10;\nSELECT @x;\nSELECT @max := MAX(price) FROM products;       -- := trong SELECT\n",[464,2436,2437,2442,2447],{"__ignoreMap":561},[565,2438,2439],{"class":567,"line":568},[565,2440,2441],{},"SET @x = 10;\n",[565,2443,2444],{"class":567,"line":574},[565,2445,2446],{},"SELECT @x;\n",[565,2448,2449],{"class":567,"line":580},[565,2450,2451],{},"SELECT @max := MAX(price) FROM products;       -- := trong SELECT\n",[432,2453,2455],{"id":2454},"stored-procedure","Stored procedure",[556,2457,2459],{"className":558,"code":2458,"language":560,"meta":561,"style":561},"DELIMITER \u002F\u002F\nCREATE PROCEDURE get_users_by_city(IN p_city VARCHAR(50))\nBEGIN\n    SELECT id, name FROM users WHERE city = p_city;\nEND \u002F\u002F\nDELIMITER ;\n\nCALL get_users_by_city('HCM');\n",[464,2460,2461,2466,2471,2476,2481,2486,2491,2495],{"__ignoreMap":561},[565,2462,2463],{"class":567,"line":568},[565,2464,2465],{},"DELIMITER \u002F\u002F\n",[565,2467,2468],{"class":567,"line":574},[565,2469,2470],{},"CREATE PROCEDURE get_users_by_city(IN p_city VARCHAR(50))\n",[565,2472,2473],{"class":567,"line":580},[565,2474,2475],{},"BEGIN\n",[565,2477,2478],{"class":567,"line":586},[565,2479,2480],{},"    SELECT id, name FROM users WHERE city = p_city;\n",[565,2482,2483],{"class":567,"line":592},[565,2484,2485],{},"END \u002F\u002F\n",[565,2487,2488],{"class":567,"line":794},[565,2489,2490],{},"DELIMITER ;\n",[565,2492,2493],{"class":567,"line":800},[565,2494,791],{"emptyLinePlaceholder":790},[565,2496,2497],{"class":567,"line":806},[565,2498,2499],{},"CALL get_users_by_city('HCM');\n",[597,2501,2502,2509,2510,2513,2514,2517,2518,1812],{"color":599,"icon":600},[602,2503,2504,2505,2508],{},"Vì sao ",[464,2506,2507],{},"DELIMITER","?"," Vì thân SP có nhiều ",[464,2511,2512],{},";",". Đổi delimiter sang ",[464,2515,2516],{},"\u002F\u002F"," để mysql CLI không break statement khi gặp ",[464,2519,2512],{},[432,2521,2523],{"id":2522},"function","Function",[556,2525,2527],{"className":558,"code":2526,"language":560,"meta":561,"style":561},"DELIMITER \u002F\u002F\nCREATE FUNCTION full_name(first VARCHAR(50), last VARCHAR(50))\nRETURNS VARCHAR(101) DETERMINISTIC\nBEGIN\n    RETURN CONCAT(first, ' ', last);\nEND \u002F\u002F\nDELIMITER ;\n\nSELECT full_name(first_name, last_name) FROM users;\n",[464,2528,2529,2533,2538,2543,2547,2552,2556,2560,2564],{"__ignoreMap":561},[565,2530,2531],{"class":567,"line":568},[565,2532,2465],{},[565,2534,2535],{"class":567,"line":574},[565,2536,2537],{},"CREATE FUNCTION full_name(first VARCHAR(50), last VARCHAR(50))\n",[565,2539,2540],{"class":567,"line":580},[565,2541,2542],{},"RETURNS VARCHAR(101) DETERMINISTIC\n",[565,2544,2545],{"class":567,"line":586},[565,2546,2475],{},[565,2548,2549],{"class":567,"line":592},[565,2550,2551],{},"    RETURN CONCAT(first, ' ', last);\n",[565,2553,2554],{"class":567,"line":794},[565,2555,2485],{},[565,2557,2558],{"class":567,"line":800},[565,2559,2490],{},[565,2561,2562],{"class":567,"line":806},[565,2563,791],{"emptyLinePlaceholder":790},[565,2565,2566],{"class":567,"line":812},[565,2567,2568],{},"SELECT full_name(first_name, last_name) FROM users;\n",[597,2570,2571,2576,2607],{"color":599,"icon":268},[719,2572,2573],{},[602,2574,2575],{},"Function trong MySQL bắt buộc khai báo deterministic property:",[2577,2578,2579,2586,2596],"ul",{},[2580,2581,2582,2585],"li",{},[464,2583,2584],{},"DETERMINISTIC",": cùng input luôn cho cùng output.",[2580,2587,2588,2591,2592,2595],{},[464,2589,2590],{},"NOT DETERMINISTIC",": phụ thuộc state (",[464,2593,2594],{},"NOW()",", random).",[2580,2597,2598,545,2601,545,2604,1812],{},[464,2599,2600],{},"READS SQL DATA",[464,2602,2603],{},"MODIFIES SQL DATA",[464,2605,2606],{},"NO SQL",[719,2608,2609,2610,2612],{},"Mặc định ",[464,2611,2590],{}," — không cho tạo function ở chế độ binlog mặc định nếu không khai báo. Khai báo đúng nếu cần.",[427,2614,2616],{"id":2615},"_7-trigger","7. Trigger",[556,2618,2620],{"className":558,"code":2619,"language":560,"meta":561,"style":561},"DELIMITER \u002F\u002F\nCREATE TRIGGER trg_orders_audit\nAFTER UPDATE ON orders\nFOR EACH ROW\nBEGIN\n    INSERT INTO orders_audit (order_id, old_status, new_status, changed_at)\n    VALUES (OLD.id, OLD.status, NEW.status, NOW());\nEND \u002F\u002F\nDELIMITER ;\n",[464,2621,2622,2626,2631,2636,2641,2645,2650,2655,2659],{"__ignoreMap":561},[565,2623,2624],{"class":567,"line":568},[565,2625,2465],{},[565,2627,2628],{"class":567,"line":574},[565,2629,2630],{},"CREATE TRIGGER trg_orders_audit\n",[565,2632,2633],{"class":567,"line":580},[565,2634,2635],{},"AFTER UPDATE ON orders\n",[565,2637,2638],{"class":567,"line":586},[565,2639,2640],{},"FOR EACH ROW\n",[565,2642,2643],{"class":567,"line":592},[565,2644,2475],{},[565,2646,2647],{"class":567,"line":794},[565,2648,2649],{},"    INSERT INTO orders_audit (order_id, old_status, new_status, changed_at)\n",[565,2651,2652],{"class":567,"line":800},[565,2653,2654],{},"    VALUES (OLD.id, OLD.status, NEW.status, NOW());\n",[565,2656,2657],{"class":567,"line":806},[565,2658,2485],{},[565,2660,2661],{"class":567,"line":812},[565,2662,2490],{},[719,2664,2665,2666,545,2669,2672,2673,545,2675,545,2677,2679,2680,2683],{},"MySQL hỗ trợ ",[464,2667,2668],{},"BEFORE",[464,2670,2671],{},"AFTER"," × ",[464,2674,1671],{},[464,2676,1902],{},[464,2678,1954],{},". Không có ",[464,2681,2682],{},"INSTEAD OF"," (phải dùng updatable view).",[427,2685,2687],{"id":2686},"_8-đặc-thù-sql-nhỏ-cần-nhớ","8. Đặc thù SQL nhỏ cần nhớ",[556,2689,2691],{"className":558,"code":2690,"language":560,"meta":561,"style":561},"-- LIMIT 2 cú pháp\nSELECT ... LIMIT 10;            -- 10 đầu\nSELECT ... LIMIT 10 OFFSET 20;\nSELECT ... LIMIT 20, 10;        -- (offset, count) - cũ\n\n-- IF expression\nSELECT IF(price > 1000000, 'expensive', 'cheap') FROM products;\n\n-- CASE\nSELECT CASE\n    WHEN price \u003C 100000 THEN 'cheap'\n    WHEN price \u003C 1000000 THEN 'medium'\n    ELSE 'expensive'\nEND AS tier FROM products;\n\n-- REGEXP (RLIKE)\nSELECT * FROM products WHERE name REGEXP '^[A-Z]';\n",[464,2692,2693,2698,2703,2708,2713,2717,2722,2727,2731,2736,2741,2746,2751,2756,2761,2765,2770],{"__ignoreMap":561},[565,2694,2695],{"class":567,"line":568},[565,2696,2697],{},"-- LIMIT 2 cú pháp\n",[565,2699,2700],{"class":567,"line":574},[565,2701,2702],{},"SELECT ... LIMIT 10;            -- 10 đầu\n",[565,2704,2705],{"class":567,"line":580},[565,2706,2707],{},"SELECT ... LIMIT 10 OFFSET 20;\n",[565,2709,2710],{"class":567,"line":586},[565,2711,2712],{},"SELECT ... LIMIT 20, 10;        -- (offset, count) - cũ\n",[565,2714,2715],{"class":567,"line":592},[565,2716,791],{"emptyLinePlaceholder":790},[565,2718,2719],{"class":567,"line":794},[565,2720,2721],{},"-- IF expression\n",[565,2723,2724],{"class":567,"line":800},[565,2725,2726],{},"SELECT IF(price > 1000000, 'expensive', 'cheap') FROM products;\n",[565,2728,2729],{"class":567,"line":806},[565,2730,791],{"emptyLinePlaceholder":790},[565,2732,2733],{"class":567,"line":812},[565,2734,2735],{},"-- CASE\n",[565,2737,2738],{"class":567,"line":817},[565,2739,2740],{},"SELECT CASE\n",[565,2742,2743],{"class":567,"line":823},[565,2744,2745],{},"    WHEN price \u003C 100000 THEN 'cheap'\n",[565,2747,2748],{"class":567,"line":902},[565,2749,2750],{},"    WHEN price \u003C 1000000 THEN 'medium'\n",[565,2752,2753],{"class":567,"line":1226},[565,2754,2755],{},"    ELSE 'expensive'\n",[565,2757,2758],{"class":567,"line":1231},[565,2759,2760],{},"END AS tier FROM products;\n",[565,2762,2763],{"class":567,"line":1237},[565,2764,791],{"emptyLinePlaceholder":790},[565,2766,2767],{"class":567,"line":1482},[565,2768,2769],{},"-- REGEXP (RLIKE)\n",[565,2771,2772],{"class":567,"line":1488},[565,2773,2774],{},"SELECT * FROM products WHERE name REGEXP '^[A-Z]';\n",[432,2776,2778],{"id":2777},"mysql-cli-các-lệnh-hữu-ích","mysql CLI — các lệnh hữu ích",[556,2780,2782],{"className":558,"code":2781,"language":560,"meta":561,"style":561},"-- Kết nối\nmysql -u root -p -h localhost mydatabase\n\n-- Liệt kê database \u002F table \u002F column\nSHOW DATABASES;\nSHOW TABLES;\nSHOW CREATE TABLE products;                     -- xem full DDL\nDESCRIBE products;                              -- hoặc DESC products; xem schema\nSHOW COLUMNS FROM products;\nSHOW INDEX FROM products;\nSHOW TABLE STATUS LIKE 'products';              -- engine, row count estimate, collation\n\n-- Xem process đang chạy\nSHOW PROCESSLIST;\nSHOW FULL PROCESSLIST;                          -- xem full query text\nKILL 42;                                        -- kill connection ID\n\n-- Xem biến hệ thống\nSHOW VARIABLES LIKE '%innodb%';\nSHOW STATUS LIKE '%connections%';\n\n-- Import \u002F Export từ CLI\nmysql -u root -p mydb \u003C backup.sql              -- import\nmysqldump -u root -p mydb > backup.sql          -- export toàn bộ DB\nmysqldump -u root -p mydb products > products.sql -- export 1 bảng\n",[464,2783,2784,2789,2794,2798,2803,2808,2813,2818,2823,2828,2833,2838,2842,2847,2852,2857,2862,2866,2871,2876,2881,2886,2892,2898,2904],{"__ignoreMap":561},[565,2785,2786],{"class":567,"line":568},[565,2787,2788],{},"-- Kết nối\n",[565,2790,2791],{"class":567,"line":574},[565,2792,2793],{},"mysql -u root -p -h localhost mydatabase\n",[565,2795,2796],{"class":567,"line":580},[565,2797,791],{"emptyLinePlaceholder":790},[565,2799,2800],{"class":567,"line":586},[565,2801,2802],{},"-- Liệt kê database \u002F table \u002F column\n",[565,2804,2805],{"class":567,"line":592},[565,2806,2807],{},"SHOW DATABASES;\n",[565,2809,2810],{"class":567,"line":794},[565,2811,2812],{},"SHOW TABLES;\n",[565,2814,2815],{"class":567,"line":800},[565,2816,2817],{},"SHOW CREATE TABLE products;                     -- xem full DDL\n",[565,2819,2820],{"class":567,"line":806},[565,2821,2822],{},"DESCRIBE products;                              -- hoặc DESC products; xem schema\n",[565,2824,2825],{"class":567,"line":812},[565,2826,2827],{},"SHOW COLUMNS FROM products;\n",[565,2829,2830],{"class":567,"line":817},[565,2831,2832],{},"SHOW INDEX FROM products;\n",[565,2834,2835],{"class":567,"line":823},[565,2836,2837],{},"SHOW TABLE STATUS LIKE 'products';              -- engine, row count estimate, collation\n",[565,2839,2840],{"class":567,"line":902},[565,2841,791],{"emptyLinePlaceholder":790},[565,2843,2844],{"class":567,"line":1226},[565,2845,2846],{},"-- Xem process đang chạy\n",[565,2848,2849],{"class":567,"line":1231},[565,2850,2851],{},"SHOW PROCESSLIST;\n",[565,2853,2854],{"class":567,"line":1237},[565,2855,2856],{},"SHOW FULL PROCESSLIST;                          -- xem full query text\n",[565,2858,2859],{"class":567,"line":1482},[565,2860,2861],{},"KILL 42;                                        -- kill connection ID\n",[565,2863,2864],{"class":567,"line":1488},[565,2865,791],{"emptyLinePlaceholder":790},[565,2867,2868],{"class":567,"line":1494},[565,2869,2870],{},"-- Xem biến hệ thống\n",[565,2872,2873],{"class":567,"line":1500},[565,2874,2875],{},"SHOW VARIABLES LIKE '%innodb%';\n",[565,2877,2878],{"class":567,"line":1506},[565,2879,2880],{},"SHOW STATUS LIKE '%connections%';\n",[565,2882,2884],{"class":567,"line":2883},21,[565,2885,791],{"emptyLinePlaceholder":790},[565,2887,2889],{"class":567,"line":2888},22,[565,2890,2891],{},"-- Import \u002F Export từ CLI\n",[565,2893,2895],{"class":567,"line":2894},23,[565,2896,2897],{},"mysql -u root -p mydb \u003C backup.sql              -- import\n",[565,2899,2901],{"class":567,"line":2900},24,[565,2902,2903],{},"mysqldump -u root -p mydb > backup.sql          -- export toàn bộ DB\n",[565,2905,2907],{"class":567,"line":2906},25,[565,2908,2909],{},"mysqldump -u root -p mydb products > products.sql -- export 1 bảng\n",[597,2911,721,2912,725,2914,1800,2917,2920,2921,2924,2925,2928,2929,2932],{"color":716,"icon":717},[602,2913,1796],{},[727,2915,2916],{},"\"Làm sao xem schema của bảng trong MySQL?\"",[464,2918,2919],{},"DESCRIBE table_name;"," hoặc ",[464,2922,2923],{},"SHOW CREATE TABLE table_name;",". Khác Postgres (",[464,2926,2927],{},"\\d table","), khác SQL Server (",[464,2930,2931],{},"sp_help table","). Đây là câu hỏi \"bạn đã thực sự dùng MySQL chưa?\".",[597,2934,2935,2936],{"color":599,"icon":1129},"Tiếp theo: ",[1134,2937,2938],{"href":235},"Truy vấn MySQL nâng cao",[2940,2941,2942],"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":561,"searchDepth":574,"depth":574,"links":2944},[2945,2955,2959,2969,2970,2976,2981,2982],{"id":429,"depth":574,"text":430,"children":2946},[2947,2948,2949,2950,2951,2952,2953,2954],{"id":434,"depth":580,"text":435},{"id":610,"depth":580,"text":611},{"id":760,"depth":580,"text":761},{"id":843,"depth":580,"text":674},{"id":914,"depth":580,"text":915},{"id":1088,"depth":580,"text":710},{"id":1147,"depth":580,"text":1148},{"id":1253,"depth":580,"text":1254},{"id":1399,"depth":574,"text":1400,"children":2956},[2957,2958],{"id":1565,"depth":580,"text":1566},{"id":1614,"depth":580,"text":1615},{"id":1666,"depth":574,"text":1667,"children":2960},[2961,2962,2964,2965,2966,2967,2968],{"id":1670,"depth":580,"text":1671},{"id":1755,"depth":580,"text":2963},"UPSERT — ON DUPLICATE KEY UPDATE",{"id":1826,"depth":580,"text":1818},{"id":1901,"depth":580,"text":1902},{"id":1953,"depth":580,"text":1954},{"id":2004,"depth":580,"text":2005},{"id":2028,"depth":580,"text":2029},{"id":2133,"depth":574,"text":2134},{"id":2188,"depth":574,"text":2189,"children":2971},[2972,2973,2974,2975],{"id":2192,"depth":580,"text":2193},{"id":2256,"depth":580,"text":2257},{"id":2314,"depth":580,"text":710},{"id":2398,"depth":580,"text":2399},{"id":2426,"depth":574,"text":2427,"children":2977},[2978,2979,2980],{"id":2430,"depth":580,"text":2431},{"id":2454,"depth":580,"text":2455},{"id":2522,"depth":580,"text":2523},{"id":2615,"depth":574,"text":2616},{"id":2686,"depth":574,"text":2687,"children":2983},[2984],{"id":2777,"depth":580,"text":2778},"Kiểu dữ liệu, DDL, DML, UPSERT (ON DUPLICATE KEY), function — gốc MySQL 8.4 \u002F 9.x.","md",null,{},{"title":178,"icon":181},{"title":422,"description":2985},"hWv3xK_8oECueVFOZX6T5dlyDikzKGMqIrSd08Qa3eI",[2993,2995],{"title":173,"path":229,"stem":230,"description":2994,"icon":176,"children":-1},"MySQL — RDBMS open-source phổ biến nhất. Bản 9.7 LTS mới (04\u002F2026, đến ~2034) với Hypergraph Optimizer vào Community, PBKDF2+SHA512, JavaScript in-database.",{"title":183,"path":235,"stem":236,"description":2996,"icon":186,"children":-1},"JOIN, subquery, derived tables & LATERAL (8.0.14+), set operations, CTE recursive, window function (8.0+), regular expressions, JSON query, transaction, InnoDB locking, EXPLAIN, Hypergraph Optimizer (9.7), index.",1783490366539]