[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"\u002Fresource\u002Fdocument\u002Flist?undefined":3,"\u002Fresource\u002Fdocument\u002Fquery\u002Fsauvq105istskjaz?undefined":462,"\u002Fresource\u002Fadvertise\u002Flist?type=all?undefined":465},{"data":4,"status":460,"success":461},[5,148,202,291,332,370,420],{"books":6,"desc":145,"id":8,"image":146,"title":147},[7,40,63,78,93,105,117],{"cateId":8,"chapters":9,"desc":36,"id":11,"time":37,"title":38,"video":39},1,[10,15,18,21,24,27,30,33],{"bookId":11,"id":12,"indexOrder":13,"name":14},24,"8egfulw98v3h680j",0,"JavaSE 笔记（一）走进Java语言",{"bookId":11,"id":16,"indexOrder":13,"name":17},"pew6po6wrou23pk3","JavaSE 笔记（二）面向过程编程",{"bookId":11,"id":19,"indexOrder":13,"name":20},"eldst1fgrbdkmfs7","JavaSE 笔记（三）面向对象基础",{"bookId":11,"id":22,"indexOrder":13,"name":23},"48zphgkpjto8cath","JavaSE 笔记（四）面向对象高级篇",{"bookId":11,"id":25,"indexOrder":13,"name":26},"6r4llai92yc15j98","JavaSE 笔记（五）泛型程序设计",{"bookId":11,"id":28,"indexOrder":13,"name":29},"k6fmxd6qabgkwm9i","JavaSE 笔记（六）集合类与IO",{"bookId":11,"id":31,"indexOrder":13,"name":32},"qrd0xfttsz32gpqg","JavaSE 笔记（七）多线程与反射",{"bookId":11,"id":34,"indexOrder":13,"name":35},"td5tgn04nqmkrryt","JavaSE 笔记（八）GUI程序开发","基于Java25全新录制的SE课程",2025,"JavaSE 核心内容","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV163GGz2E8c",{"cateId":8,"chapters":41,"desc":59,"id":8,"time":60,"title":61,"video":62},[42,44,46,49,51,53,55,57],{"bookId":8,"id":43,"indexOrder":13,"name":14},"ibeeuwsbbi00undq",{"bookId":8,"id":45,"indexOrder":13,"name":17},"dncxjecdv4wciqcp",{"bookId":8,"id":47,"indexOrder":13,"name":48},"jviyz2hsht9ete5k","JavaSE 笔记（三）面向对象基础篇",{"bookId":8,"id":50,"indexOrder":13,"name":23},"qb9i6q9fap7bg1cc",{"bookId":8,"id":52,"indexOrder":13,"name":26},"hnkrjrkm3hjzeq6s",{"bookId":8,"id":54,"indexOrder":13,"name":29},"erpm32wduoaaqmrx",{"bookId":8,"id":56,"indexOrder":13,"name":32},"lfqtvxr7azumcwja",{"bookId":8,"id":58,"indexOrder":13,"name":35},"qs7gqok56gzc6idr","2022年制作的JavaSE版本",2022,"JavaSE 22年旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1YP4y1o75f\u002F",{"cateId":8,"chapters":64,"desc":75,"id":66,"time":60,"title":76,"video":77},[65,69,72],{"bookId":66,"id":67,"indexOrder":13,"name":68},2,"g96k66kczovvbm1i","JVM 笔记（一）走进JVM",{"bookId":66,"id":70,"indexOrder":13,"name":71},"ydd7n3jg8unc3clg","JVM 笔记（二）内存管理",{"bookId":66,"id":73,"indexOrder":13,"name":74},"r9dq37de0kaeauoi","JVM 笔记（三）类与类加载","了解Java的底层运作机制","Java JVM 虚拟机","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Er4y1r7as\u002F",{"cateId":8,"chapters":79,"desc":90,"id":81,"time":60,"title":91,"video":92},[80,84,87],{"bookId":81,"id":82,"indexOrder":13,"name":83},3,"asncyye9ya18gfar","JUC 笔记（一）再谈多线程",{"bookId":81,"id":85,"indexOrder":13,"name":86},"5tr1sm4ho6ygpt9q","JUC 笔记（二）并发编程核心",{"bookId":81,"id":88,"indexOrder":13,"name":89},"1scf51z5300mzxkh","JUC 笔记（三）并发编程进阶","你也可以成为多线程的主宰者","Java JUC 并发编程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1JT4y1S7K8\u002F",{"cateId":8,"chapters":94,"desc":102,"id":96,"time":60,"title":103,"video":104},[95,99],{"bookId":96,"id":97,"indexOrder":13,"name":98},4,"eedesc445ygiqhil","NIO 笔记（一）基础内容",{"bookId":96,"id":100,"indexOrder":13,"name":101},"ndz9t0uunrmfmv4n","NIO 笔记（二）Netty框架专题","编写畅快的高性能网络服务器","Java NIO 网络编程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1ar4y1J7mC\u002F",{"cateId":8,"chapters":106,"desc":114,"id":108,"time":60,"title":115,"video":116},[107,111],{"bookId":108,"id":109,"indexOrder":13,"name":110},5,"9890i8ofuadpwy2b","[扩展篇] Java 9-17新特性介绍",{"bookId":108,"id":112,"indexOrder":13,"name":113},"tsrkqvb6zpmtwh0n","[扩展篇] JavaSE关键字总结 笔记","精彩仍在继续，不要停止脚步","其他内容","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1tU4y1y7Fg\u002F",{"cateId":8,"chapters":118,"desc":141,"id":120,"time":142,"title":143,"video":144},[119,123,126,129,132,135,138],{"bookId":120,"id":121,"indexOrder":13,"name":122},6,"4db9h32opv7imszh","JavaSE 笔记（一）面向过程编程",{"bookId":120,"id":124,"indexOrder":13,"name":125},"c93u3v37br7hgn1q","JavaSE 笔记（二）面向对象基础篇",{"bookId":120,"id":127,"indexOrder":13,"name":128},"yglsjde9gi1jxkcb","JavaSE 笔记（三）泛型与集合类",{"bookId":120,"id":130,"indexOrder":13,"name":131},"ilhi987n986rmvo3","JavaSE 笔记（四）异常机制",{"bookId":120,"id":133,"indexOrder":13,"name":134},"pqv38vexmenglk4k","JavaSE 笔记（五）IO",{"bookId":120,"id":136,"indexOrder":13,"name":137},"jiq41n87i9ia7ilw","JavaSE 笔记（六）多线程",{"bookId":120,"id":139,"indexOrder":13,"name":140},"wn7x2mge9ws79zps","JavaSE 笔记（七）反射","此版本为早期录制的旧版本",2021,"JavaSE 21年旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Gv411T7pi\u002F","包含JavaSE基础路线全部教程笔记，打下坚实的基础","https:\u002F\u002Fpic2.zhimg.com\u002F80\u002Fv2-bf1a927f037a79f4d57d9ae543430a0d_1440w.webp","JavaSE 系列笔记 ☕️",{"books":149,"desc":199,"id":66,"image":200,"title":201},[150,166,178],{"cateId":66,"chapters":151,"desc":162,"id":153,"time":163,"title":164,"video":165},[152,156,159],{"bookId":153,"id":154,"indexOrder":13,"name":155},21,"iqbc2haub31bwqtz","Lombok 极速上手",{"bookId":153,"id":157,"indexOrder":13,"name":158},"ijay2hay19kn1k031","Mybatis 快速上手",{"bookId":153,"id":160,"indexOrder":13,"name":161},"ru4ogh2waocpn4jo","Maven 快速上手","JavaWeb阶段必须扩展知识点",2024,"常用知识讲解","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1gb421J7ok\u002F",{"cateId":66,"chapters":167,"desc":175,"id":169,"time":163,"title":176,"video":177},[168,172],{"bookId":169,"id":170,"indexOrder":13,"name":171},22,"ek20yvb6huhxizx7","JavaWeb 笔记（一）计算机网络基础",{"bookId":169,"id":173,"indexOrder":13,"name":174},"pgevws6w2krkffa4","JavaWeb笔记（二）Java与数据库","全面升级的JavaWeb课程","JavaWeb 网站开发","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1kS421X7rq\u002F",{"cateId":66,"chapters":179,"desc":196,"id":181,"time":142,"title":197,"video":198},[180,184,187,190,193],{"bookId":181,"id":182,"indexOrder":13,"name":183},7,"ggwwj09j2vkfftvd","JavaWeb 笔记（一）Java网络编程",{"bookId":181,"id":185,"indexOrder":13,"name":186},"sauvq105istskjaz","JavaWeb 笔记（二）数据库基础",{"bookId":181,"id":188,"indexOrder":13,"name":189},"xgbeasmvrhxx9tn4","JavaWeb 笔记（三）Java与数据库",{"bookId":181,"id":191,"indexOrder":13,"name":192},"k7dfwua3bsezvw9q","JavaWeb 笔记（四）前端基础",{"bookId":181,"id":194,"indexOrder":13,"name":195},"ycpagby2v7j4p728","JavaWeb 笔记（五）后端开发","搭建属于自己的Web网站","JavaWeb 旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1CL4y1i7qR\u002F","包含JavaWeb路线全套笔记，从零开始搭建自己的网站！","https:\u002F\u002Fpic3.zhimg.com\u002F80\u002Fv2-df3b38e3012258ed70c23b586309e3f6_1440w.webp","JavaWeb 系列笔记 🚛",{"books":203,"desc":288,"id":81,"image":289,"title":290},[204,220,235,255,273],{"cateId":81,"chapters":205,"desc":216,"id":207,"time":217,"title":218,"video":219},[206,210,213],{"bookId":207,"id":208,"indexOrder":13,"name":209},8,"h7sjo5oy0l03607e","SSM笔记（一）Spring基础",{"bookId":207,"id":211,"indexOrder":13,"name":212},"eve8gq72qmdb46sg","SSM笔记（二）SpringMvc基础",{"bookId":207,"id":214,"indexOrder":13,"name":215},"63v73g0zh1qlr6fk","SSM笔记（三）SpringSecurity基础","Spring的探索之路从这里开始",2023,"JavaSSM 基础部分","[\"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Kv4y1x7is\u002F\", \"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Lh4y1M7kx\u002F\", \"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1fV411M7aS\u002F\"]",{"cateId":81,"chapters":221,"desc":232,"id":223,"time":217,"title":233,"video":234},[222,226,229],{"bookId":223,"id":224,"indexOrder":13,"name":225},16,"0k66v5r6slsfuog4","SpringBoot笔记（一）核心内容",{"bookId":223,"id":227,"indexOrder":13,"name":228},"bqlrnc2yvkaxo8s1","SpringBoot笔记（二）数据交互",{"bookId":223,"id":230,"indexOrder":13,"name":231},"wci9lb9tgea866jt","SpringBoot笔记（三）前后端分离","SpringBoot全新重制版","SpringBoot 新版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1xu4y1m7UP\u002F",{"cateId":81,"chapters":236,"desc":252,"id":238,"time":60,"title":253,"video":254},[237,240,243,246,249],{"bookId":238,"id":239,"indexOrder":13,"name":225},9,"e43gl1ilygps032v",{"bookId":238,"id":241,"indexOrder":13,"name":242},"emnmd8nzfdb3hr50","SpringBoot笔记（二）Git版本控制",{"bookId":238,"id":244,"indexOrder":13,"name":245},"jjlolj5igvttvyhv","SpringBoot笔记（三）Redis数据库",{"bookId":238,"id":247,"indexOrder":13,"name":248},"skgr4ivb5curdoux","SpringBoot笔记（四）其他框架介绍",{"bookId":238,"id":250,"indexOrder":13,"name":251},"le91fqhu4dqui1k4","SpringBoot笔记（五）Linux系统","逐步走向企业级开发","SpringBoot 旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1UL411V7f3\u002F",{"cateId":81,"chapters":256,"desc":270,"id":258,"time":60,"title":271,"video":272},[257,261,264,267],{"bookId":258,"id":259,"indexOrder":13,"name":260},10,"oejzo0l77zeb6a7e","SpringCloud笔记（一）微服务基础",{"bookId":258,"id":262,"indexOrder":13,"name":263},"f6eya9taaelsl35p","SpringCloud笔记（二）微服务进阶",{"bookId":258,"id":265,"indexOrder":13,"name":266},"35v1hbsfcdgagdnw","SpringCloud笔记（三）微服务应用",{"bookId":258,"id":268,"indexOrder":13,"name":269},"a782u84512tyuo1m","SpringCloud笔记（四）消息队列","体验微服务架构带来的魅力","SpringCloud 进阶","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1AL4y1j7RY\u002F",{"cateId":81,"chapters":274,"desc":285,"id":276,"time":142,"title":286,"video":287},[275,278,280,282],{"bookId":276,"id":277,"indexOrder":13,"name":209},11,"efjw75u8a251qxk5",{"bookId":276,"id":279,"indexOrder":13,"name":212},"guc134xb7sl78vju",{"bookId":276,"id":281,"indexOrder":13,"name":215},"u8ekxxucowr2b1tm",{"bookId":276,"id":283,"indexOrder":13,"name":284},"vkpmw9wbej21nei6","SSM笔记（四）MySQL进阶","此教程为2021年旧版教程","JavaSSM 旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1xL4y1H7Tq\u002F","包含Spring全套框架笔记，从开始到Spring Boot，以及众多运维小知识。","https:\u002F\u002Fpic4.zhimg.com\u002F80\u002Fv2-28c3144421220d7c048703281bc34f63_1440w.webp","Spring 系列笔记 🍏",{"books":292,"desc":329,"id":96,"image":330,"title":331},[293,308],{"cateId":96,"chapters":294,"desc":305,"id":296,"time":60,"title":306,"video":307},[295,299,302],{"bookId":296,"id":297,"indexOrder":13,"name":298},12,"jd3e8u5cmvx5gco6","C语言（一）计算机思维导论",{"bookId":296,"id":300,"indexOrder":13,"name":301},"lqv77apvx82nkkio","C语言（二）基础语法",{"bookId":296,"id":303,"indexOrder":13,"name":304},"xb0b9t37gyv96xns","C语言（三）高级特性","包含高等院校需要教授的全部内容","C语言程序设计","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Cr4y137os\u002F",{"cateId":96,"chapters":309,"desc":326,"id":311,"time":60,"title":327,"video":328},[310,314,317,320,323],{"bookId":311,"id":312,"indexOrder":13,"name":313},13,"8a046ps2e4w6k4py","数据结构与算法（一）线性结构篇",{"bookId":311,"id":315,"indexOrder":13,"name":316},"3ma8db91f9zrnkja","数据结构与算法（二）树形结构篇",{"bookId":311,"id":318,"indexOrder":13,"name":319},"0lsjm59k7cgu4tpr","数据结构与算法（三）散列表篇",{"bookId":311,"id":321,"indexOrder":13,"name":322},"0qzy7bogo0g2pusa","数据结构与算法（四）图结构篇",{"bookId":311,"id":324,"indexOrder":13,"name":325},"6gmcxcikcilyxblj","数据结构与算法（五）排序算法篇","虽然很难，但是它是考研必学科目","数据结构与算法","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV13W4y127Ey\u002F","你的内心一直有一个坚定的声音在告诉你，一定要考上一名研究生，向着未来前进吧！","https:\u002F\u002Fpic2.zhimg.com\u002F80\u002Fv2-ac128404efb29ce1c9d1ccc61024f1d1_1440w.webp","C语言 系列笔记 🥬",{"books":333,"desc":367,"id":108,"image":368,"title":369},[334,349,358],{"cateId":108,"chapters":335,"desc":346,"id":337,"time":163,"title":347,"video":348},[336,340,343],{"bookId":337,"id":338,"indexOrder":13,"name":339},17,"urw2e6gg1lprv65w","Kotlin（一）基础语法",{"bookId":337,"id":341,"indexOrder":13,"name":342},"t7lnl87f74f3v1ju","Kotlin（二）类与对象",{"bookId":337,"id":344,"indexOrder":13,"name":345},"v1zzvki0knb1xvml","Kotlin（三）高级特性","包含Kotlin语言完整基础部分","Kotlin程序设计基础","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1P94y1c7tV\u002F",{"cateId":108,"chapters":350,"desc":355,"id":352,"time":163,"title":356,"video":357},[351],{"bookId":352,"id":353,"indexOrder":13,"name":354},18,"ovbzpe7065bye1st","Kotlin扩展（一）","包含Kotlin额外扩展知识","Kotlin扩展篇","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Hg4y1m7Ca\u002F",{"cateId":108,"chapters":359,"desc":364,"id":361,"time":163,"title":365,"video":366},[360],{"bookId":361,"id":362,"indexOrder":13,"name":363},19,"3at7ybv04dmjc0wp","Gradle基础教程","Gradle配置教程（Kotlin）","Gradle教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Fc411x7xF\u002F","Kotlin让JVM平台焕发新的生机，让语言的表达更加优美","https:\u002F\u002Fpic2.zhimg.com\u002F80\u002Fv2-be815568f7c79c64cdaa171b0409786d_1440w.webp","Kotlin 系列笔记 ☘️",{"books":371,"desc":418,"id":120,"title":419},[372,391,403],{"cateId":120,"chapters":373,"desc":387,"id":375,"time":388,"title":389,"video":390},[374,378,381,384],{"bookId":375,"id":376,"indexOrder":13,"name":377},26,"zjf5qapwqtqiohcn","JavaScript笔记（一）基础语法",{"bookId":375,"id":379,"indexOrder":13,"name":380},"95jc6sjyjwcp9pvp","JavaScript笔记（二）核心知识",{"bookId":375,"id":382,"indexOrder":13,"name":383},"j35cdc1qz8dzq7pn","JavaScript笔记（三）进阶知识",{"bookId":375,"id":385,"indexOrder":13,"name":386},"sdhodlihphnpcg37","JavaScript笔记（四）前端基础","包含JavaScript最新语法规范讲解",2026,"JavaScript教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1xq6gBgESU",{"cateId":120,"chapters":392,"desc":400,"id":394,"time":37,"title":401,"video":402},[393,397],{"bookId":394,"id":395,"indexOrder":13,"name":396},23,"bsisgazdftiz3o9c","HTML5笔记（一）基础内容",{"bookId":394,"id":398,"indexOrder":13,"name":399},"njol93fs34gfwuzf","HTML5笔记（二）高级内容","包含HTML基础内容和相关知识点","HTML5核心教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1BrBiYNEWg",{"cateId":120,"chapters":404,"desc":415,"id":406,"time":37,"title":416,"video":417},[405,409,412],{"bookId":406,"id":407,"indexOrder":13,"name":408},25,"jo74ciirtg8wh90y","CSS笔记（一）基础入门",{"bookId":406,"id":410,"indexOrder":13,"name":411},"ap5ixyomoejuw4ue","CSS笔记（二）盒模型和布局",{"bookId":406,"id":413,"indexOrder":13,"name":414},"4djgk5xy1lzpiuf2","CSS笔记（三）变换和过渡","包含CSS3基础内容和相关知识点","CSS3核心教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1sQeEzFEKi","包含Web前端学习路径全部教程笔记，打下坚实的基础","Web前端 系列笔记",{"books":421,"desc":458,"id":423,"image":368,"title":459},[422,432,450],{"cateId":423,"chapters":424,"desc":429,"id":426,"time":163,"title":430,"video":431},100,[425],{"bookId":426,"id":427,"indexOrder":13,"name":428},20,"o0ab271mkdsas87","Markdown基础语法","编写简洁而又优美的文档","Markdown教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1eJ4m157kC",{"cateId":423,"chapters":433,"desc":447,"id":435,"time":60,"title":448,"video":449},[434,438,441,444],{"bookId":435,"id":436,"indexOrder":13,"name":437},14,"6386mh7anqt4tzyv","设计模式（一）面向对象设计原则",{"bookId":435,"id":439,"indexOrder":13,"name":440},"8ftkb38wfn6ox0ug","设计模式（二）创建型",{"bookId":435,"id":442,"indexOrder":13,"name":443},"i1msql1k8y70etey","设计模式（三）结构型",{"bookId":435,"id":445,"indexOrder":13,"name":446},"5434a3cyyjvwhs8s","设计模式（四）行为型","使你的编码水平得到质的飞跃","设计模式系列","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1u3411P7Na\u002F",{"cateId":423,"chapters":451,"desc":456,"id":453,"time":60,"title":457},[452],{"bookId":453,"id":454,"indexOrder":13,"name":455},15,"zj9uvg0sp3b0sok8","Docker 容器技术 笔记","这里包含其他中间件课程笔记","其他中间件笔记","我们对知识的探索从未停止，只有不断地学习，才能走向美好的未来！","其他笔记分类 🌽",200,true,{"data":463,"status":460,"success":461},{"bookId":181,"content":464,"id":185,"indexOrder":66,"name":186},"# 数据库基础\n\n数据库是学习JavaWeb的一个前置，只有了解了数据库的操作和使用，我们才能更好地组织和管理网站应用产生的数据。\n\n![image-20230306163247003](https:\u002F\u002Fs2.loli.net\u002F2023\u002F03\u002F06\u002Fyv4AMh7eIq23Yns.png)\n\n## 什么是数据库\n\n数据库是数据管理的有效技术，是由一批数据构成的有序集合，这些数据被存放在结构化的数据表里。数据表之间相互关联，反映客观事物间的本质联系。数据库能有效地帮助一个组织或企业科学地管理各类信息资源。简而言之，我们的数据可以交给数据库来帮助我们进行管理，同时数据库能够为我们提供高效的访问性能。\n\n在JavaSE学习阶段中，我们学习了如何使用文件I\u002FO来将数据保存到本地，这样就可以将一个数据持久地存储在本地，即使程序重新打开，我们也能加载回上一次的数据，但是当我们的数据变得非常多的时候，这样的方式就显得不太方便了。同时我们如果需要查找众多数据的中的某一个，就只能加载到内存再进行查找，这样显然是很难受的！\n\n而数据库就是专门做这事的，我们可以快速查找想要的数据，便捷地插入、修改和删除数据，并且数据库不仅能做这些事，还能提供更多便于管理数据和操作数据的功能！\n\n### 常见的数据库\n\n常见的数据库有很多种，包括但不限于：\n\n* MySQL - 免费，用的最多的，开源数据库，适用于中小型\n* Microsoft SQL Server - 收钱的，但是提供技术支持，适用于Windows Server\n* Oracle - 收钱的，大型数据库系统\n\n而我们要学习的是MySQL数据，其实无论学习哪种数据库，SQL语句大部分都是通用的，只有少许语法是不通用的，因此我们只需要学习一种数据库其他的也就差不多都会了。\n\n### 数据模型\n\n数据模型与现实世界中的模型一样，是对现实世界数据特征的一种抽象。实际上，我们之前学习的类就是对现实世界数据的一种抽象，比如一个学生的特征包括姓名，年龄，年级，学号，专业等，这些特征也称为实体的一种属性，属性具有以下特点：\n\n* 属性不可再分\n* 一个实体的属性可以有很多个\n* 用于唯一区分不同实体的的属性，称为Key，比如每个同学的学号都是不一样的\n* 属性取值可以有一定的约束，比如性别只能是男或是女\n\n实体或是属性之间可以具有一定的联系，比如一个老师可以教很多个学生，而学生相对于老师就是被教授的关系；又比如每个同学都有一个学号与其唯一对应，因此学号和学生之间也有一种联系。而像一个老师教多个学生的联系就是一种一对多的联系（1:n），而学号唯一对应，就是一种一对一的联系（1:1）；每一个老师不仅可以教多个学生，每一个学生也可以有多个教师，这就是一种多对多的联系（n:m）\n\nMySQL就是一种关系型数据库，通过使用关系型数据库，我们就可以很好地存储这样带有一定联系的数据。\n\n![img](https:\u002F\u002Fs2.loli.net\u002F2023\u002F03\u002F06\u002FW6NHkfmyZCGpJx7.jpg)\n\n通过构建一个ER图，我们就能很好地理清不同数据模型之间的关系和特点。\n\n## 数据库的创建\n\n既然了解了属性和联系，那么我们就来尝试创建一个数据库，并在数据库中添加用于存放数据的表，每一张表都代表一种实体的数据。首先我们要明确，我们需要创建什么样子的表：\n\n* 学生表：用于存放所有学生的数据，学生（\u003Cu>学号\u003C\u002Fu>，姓名，性别）\n* 教师表：用于存放所有教师的数据，教师（\u003Cu>教师号\u003C\u002Fu>，姓名）\n* 授课表：用于存放教师与学生的授课信息，授课（学号，教师号）\n\n其中，标注下划线的属性，作为Key，用于区别于其他实体数据的唯一标记。\n\n为了理解起来更加轻松，我们从图形界面操作再讲到SQL语句，请不要着急。我们现在通过Navicat或idea自带的数据库客户端来创建一个数据库和上述三个表。\n\n## 数据库的规范化\n\n要去设计存放一个实体的表，我们就需要了解数据库的关系规范化，尽可能减少“不好”的关系存在，如何设计一个优良的关系模型是最关键的内容！简而言之，我们要学习一下每一个表该如何去设计。\n\n### 第一范式（1NF）\n\n第一范式是指数据库的每一列都是不可分割的基本数据项，而下面这样的就存在可分割的情况：\n\n* 学生（姓名，电话号码）\n\n电话号码实际上包括了`家用座机电话`和`移动电话`，因此它可以被拆分为：\n\n* 学生（姓名，座机号码，手机号码）\n\n满足第一范式是关系型数据库最基本的要求！\n\n### 第二范式（2NF）\n\n第二范式要求表中必须存在主键，且其他的属性必须完全依赖于主键，比如：\n\n* 学生（\u003Cu>学号\u003C\u002Fu>，姓名，性别）\n\n学号是每个学生的唯一标识，每个学生都有着不同的学号，因此此表中存在一个主键，并且每个学生的所有属性都依赖于学号，学号发生改变就代表学生发生改变，姓名和性别都会因此发生改变，所有此表满足第二范式。\n\n### 第三范式（3NF）\n\n在满足第二范式的情况下，所有的属性都不传递依赖于主键，满足第三范式。\n\n* 学生借书情况（\u003Cu>借阅编号\u003C\u002Fu>，学生学号，书籍编号，书籍名称，书籍作者）\n\n实际上书籍编号依赖于借阅编号，而书籍名称和书籍作者依赖于书籍编号，因此存在传递依赖的情况，我们可以将书籍信息进行单独拆分为另一张表：\n\n* 学生借书情况（\u003Cu>借阅编号\u003C\u002Fu>，学生学号，书籍编号）\n* 书籍（\u003Cu>书籍编号\u003C\u002Fu>，书籍名称，书籍作者）\n\n这样就消除了传递依赖，从而满足第三范式。\n\n### BCNF\n\nBCNF作为第三范式的补充，假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量)，且有一个管理员只在一个仓库工作；一个仓库可以存储多种物品。这个数据库表中存在如下决定关系：\n\n(仓库ID, 存储物品ID) →(管理员ID, 数量)\n\n(管理员ID, 存储物品ID) → (仓库ID, 数量)\n\n所以，(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字，表中的唯一非关键字段为数量，它是符合第三范式的。但是，由于存在如下决定关系：\n\n(仓库ID) → (管理员ID)\n\n(管理员ID) → (仓库ID)\n\n即存在关键字段决定关键字段的情况，如果修改管理员ID，那么就必须逐一进行修改，所以其不符合BCNF范式。\n\n***\n\n## 认识SQL语句\n\n结构化查询语言（Structured Query Language）简称SQL，这是一种特殊的语言，它专门用于数据库的操作。每一种数据库都支持SQL，但是他们之间会存在一些细微的差异，因此不同的数据库都存在自己的“方言”。\n\nSQL语句不区分大小写（关键字推荐使用大写），它支持多行，并且需要使用`;`进行结尾！\n\nSQL也支持注释，通过使用`--`或是`#`来编写注释内容，也可以使用`\u002F*`来进行多行注释。\n\n我们要学习的就是以下四种类型的SQL语言：\n\n* 数据查询语言（Data Query Language, DQL）基本结构是由SELECT子句，FROM子句，WHERE子句组成的查询块。\n* 数据操纵语言（Data Manipulation Language, DML）是SQL语言中，负责对数据库对象运行数据访问工作的指令集，以INSERT、UPDATE、DELETE三种指令为核心，分别代表插入、更新与删除，是开发以数据为中心的应用程序必定会使用到的指令。\n* 数据库定义语言DDL(Data Definition Language)，是用于描述数据库中要存储的现实世界实体的语言。\n* DCL（Data Control Language）是数据库控制语言。是用来设置或更改数据库用户或角色权限的语句，包括（grant,deny,revoke等）语句。在默认状态下，只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL。\n\n我们平时所说的CRUD其实就是增删改查（Create\u002FRetrieve\u002FUpdate\u002FDelete）\n\n***\n\n## 数据库定义语言（DDL）\n\n### 数据库操作\n\n我们可以通过`create database`来创建一个数据库：\n\n```sql\ncreate database 数据库名\n```\n\n为了能够支持中文，我们在创建时可以设定编码格式：\n\n```sql\nCREATE DATABASE IF NOT EXISTS 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;\n```\n\n如果我们创建错误了，我们可以将此数据库删除，通过使用`drop database`来删除一个数据库：\n\n```sql\ndrop database 数据库名\n```\n\n### 创建表\n\n数据库创建完成后，我们一般通过`create table`语句来创建一张表：\n\n```sql\ncreate table 表名(列名 数据类型[列级约束条件],\n             列名 数据类型[列级约束条件],\n             ...\n             [,表级约束条件])\n```\n\n### SQL数据类型\n\n以下的数据类型用于字符串存储：\n\n* char(n)可以存储任意字符串，但是是固定长度为n，如果插入的长度小于定义长度时，则用空格填充。\n* varchar(n)也可以存储任意数量字符串，长度不固定，但不能超过n，不会用空格填充。\n\n以下数据类型用于存储数字：\n\n* smallint用于存储小的整数，范围在 (-32768，32767)\n* int用于存储一般的整数，范围在 (-2147483648，2147483647)\n* bigint用于存储大型整数，范围在 (-9,223,372,036,854,775,808，9,223,372,036,854,775,807)\n* float用于存储单精度小数\n* double用于存储双精度的小数\n\n以下数据类型用于存储时间：\n\n* date存储日期\n* time存储时间\n* year存储年份\n* datetime用于混合存储日期+时间\n\n### 列级约束条件\n\n列级约束有六种：主键Primary key、外键foreign key 、唯一 unique、检查 check （MySQL不支持）、默认default 、非空\u002F空值 not null\u002F null\n\n### 表级约束条件\n\n表级约束有四种：主键、外键、唯一、检查\n\n现在我们通过SQL语句来创建我们之前提到的三张表。\n\n```sql\n[CONSTRAINT \u003C外键名>] FOREIGN KEY 字段名 [，字段名2，…] REFERENCES \u003C主表名> 主键列1 [，主键列2，…]\n```\n\n### 修改表\n\n如果我们想修改表结构，我们可以通过`alter table`来进行修改：\n\n```sql\nALTER TABLE 表名[ADD 新列名 数据类型[列级约束条件]]\n\t\t\t\t\t\t\t [DROP COLUMN 列名[restrict|cascade]]\n\t\t\t\t\t\t\t [ALTER COLUMN 列名 新数据类型]\n```\n\n我们可以通过ADD来添加一个新的列，通过DROP来删除一个列，不过我们可以添加restrict或cascade，默认是restrict，表示如果此列作为其他表的约束或视图引用到此列时，将无法删除，而cascade会强制连带引用此列的约束、视图一起删除。还可以通过ALTER来修改此列的属性。\n\n### 删除表\n\n我们可以通过`drop table`来删除一个表：\n\n```sql\nDROP TABLE 表名[restrict|cascade]\n```\n\n其中restrict和cascade上面的效果一致。\n\n***\n\n## 数据库操纵语言（DML）\n\n前面我们已经学习了如何使用SQL语句来创建、修改、删除数据库以及表，而如何向数据库中插入、删除、更新数据，将是本版块讨论的重点。\n\n### 插入数据\n\n通过使用`insert into`语句来向数据库中插入一条数据（一条记录）：\n\n```sql\nINSERT INTO 表名 VALUES(值1, 值2, 值3)\n```\n\n如果插入的数据与列一一对应，那么可以省略列名，但是如果希望向指定列上插入数据，就需要给出列名：\n\n```sql\nINSERT INTO 表名(列名1, 列名2) VALUES(值1, 值2)\n```\n\n我们也可以一次性向数据库中插入多条数据：\n\n```sql\nINSERT INTO 表名(列名1, 列名2) VALUES(值1, 值2), (值1, 值2), (值1, 值2)\n```\n\n我们来试试看向我们刚刚创建的表中添加三条数据。\n\n### 修改数据\n\n我们可以通过`update`语句来更新表中的数据：\n\n```sql\nUPDATE 表名 SET 列名=值,... WHERE 条件\n```\n\n注意，SQL语句中的等于判断是`=`\n\n**警告：** 如果忘记添加`WHERE`字句来限定条件，将使得整个表中此列的所有数据都被修改！\n\n### 删除数据\n\n我们可以通过使用`delete`来删除表中的数据：\n\n```sql\nDELETE FROM 表名\n```\n\n通过这种方式，将删除表中全部数据，我们也可以使用`where`来添加条件，只删除指定的数据：\n\n```sql\nDELETE FROM 表名 WHERE 条件\n```\n\n***\n\n## 数据库查询语言（DQL）\n\n数据库的查询是我们整个数据库学习中的重点内容，面对数据库中庞大的数据，该如何去寻找我们想要的数据，就是我们主要讨论的问题。\n\n### 单表查询\n\n单表查询是最简单的一种查询，我们只需要在一张表中去查找数据即可，通过使用`select`语句来进行单表查询：\n\n```sql\n-- 指定查询某一列数据\nSELECT 列名[,列名] FROM 表名\n-- 会以别名显示此列\nSELECT 列名 别名 FROM 表名\n-- 查询所有的列数据\nSELECT * FROM 表名\n-- 只查询不重复的值\nSELECT DISTINCT 列名 FROM 表名\n```\n\n我们也可以添加`where`字句来限定查询目标：\n\n```sql\nSELECT * FROM 表名 WHERE 条件\n```\n\n### 常用查询条件\n\n* 一般的比较运算符，包括=、>、\u003C、>=、\u003C=、!=等。\n* 是否在集合中：in、not in\n* 字符模糊匹配：like，not like\n* 多重条件连接查询：and、or、not\n\n我们来尝试使用一下上面这几种条件。\n\n### 排序查询\n\n我们可以通过`order by`来将查询结果进行排序：\n\n```sql\nSELECT * FROM 表名 WHERE 条件 ORDER BY 列名 ASC|DESC\n```\n\n使用ASC表示升序排序，使用DESC表示降序排序，默认为升序。\n\n我们也可以可以同时添加多个排序：\n\n```sql\nSELECT * FROM 表名 WHERE 条件 ORDER BY 列名1 ASC|DESC, 列名2 ASC|DESC\n```\n\n这样会先按照列名1进行排序，每组列名1相同的数据再按照列名2排序。\n\n### 聚集函数\n\n聚集函数一般用作统计，包括：\n\n* `count([distinct]*)`统计所有的行数（distinct表示去重再统计，下同）\n* `count([distinct]列名)`统计某列的值总和\n* `sum([distinct]列名)`求一列的和（注意必须是数字类型的）\n* `avg([distinct]列名)`求一列的平均值（注意必须是数字类型）\n* `max([distinct]列名)`求一列的最大值\n* `min([distinct]列名)`求一列的最小值\n\n一般聚集函数是这样使用的：\n\n```sql\nSELECT count(distinct 列名) FROM 表名 WHERE 条件 \n```\n\n### 分组和分页查询\n\n通过使用`group by`来对查询结果进行分组，它需要结合聚合函数一起使用：\n\n```sql\nSELECT sum(*) FROM 表名 WHERE 条件 GROUP BY 列名\n```\n\n我们还可以添加`having`来限制分组条件：\n\n```sql\nSELECT sum(*) FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 约束条件\n```\n\n我们可以通过`limit`来限制查询的数量，只取前n个结果：\n\n```sql\nSELECT * FROM 表名 LIMIT 数量\n```\n\n我们也可以进行分页：\n\n```sql\nSELECT * FROM 表名 LIMIT 起始位置,数量\n```\n\n### 多表查询\n\n多表查询是同时查询的两个或两个以上的表，多表查询会提通过连接转换为单表查询。\n\n```sql\nSELECT * FROM 表1, 表2\n```\n\n直接这样查询会得到两张表的笛卡尔积，也就是每一项数据和另一张表的每一项数据都结合一次，会产生庞大的数据。\n\n```sql\nSELECT * FROM 表1, 表2 WHERE 条件\n```\n\n这样，只会从笛卡尔积的结果中得到满足条件的数据。\n\n**注意：** 如果两个表中都带有此属性吗，需要添加表名前缀来指明是哪一个表的数据。\n\n### 自身连接查询\n\n自身连接，就是将表本身和表进行笛卡尔积计算，得到结果，但是由于表名相同，因此要先起一个别名：\n\n```sql\nSELECT * FROM 表名 别名1, 表名 别名2\n```\n\n其实自身连接查询和前面的是一样的，只是连接对象变成自己和自己了。\n\n### 外连接查询\n\n外连接就是专门用于联合查询情景的，比如现在有一个存储所有用户的表，还有一张用户详细信息的表，我希望将这两张表结合到一起来查看完整的数据，我们就可以通过使用外连接来进行查询，外连接有三种方式：\n\n* 通过使用`inner join`进行内连接，只会返回两个表满足条件的交集部分：\n\n![在这里插入图片描述](https:\u002F\u002Fs2.loli.net\u002F2023\u002F03\u002F06\u002FEDihOjuk8X2t3KW.png)\n\n* 通过使用`left join`进行左连接，不仅会返回两个表满足条件的交集部分，也会返回左边表中的全部数据，而在右表中缺失的数据会使用`null`来代替（右连接`right join`同理，只是反过来而已，这里就不再介绍了）：\n\n![在这里插入图片描述](https:\u002F\u002Fs2.loli.net\u002F2023\u002F03\u002F06\u002F1VYXgZjiBhRrudy.png)\n\n### 嵌套查询\n\n我们可以将查询的结果作为另一个查询的条件，比如：\n\n```sql\nSELECT * FROM 表名 WHERE 列名 = (SELECT 列名 FROM 表名 WHERE 条件)\n```\n\n我们来再次尝试编写一下在最开始我们查找某教师所有学生的SQL语句。\n\n***\n\n## 数据库控制语言（DCL）\n\n庞大的数据库不可能由一个人来管理，我们需要更多的用户来一起管理整个数据库。\n\n### 创建用户\n\n我们可以通过`create user`来创建用户：\n\n```sql\nCREATE USER 用户名 identified by 密码;\n```\n\n也可以不带密码：\n\n```sql\nCREATE USER 用户名;\n```\n\n我们可以通过@来限制用户登录的登录IP地址，`%`表示匹配所有的IP地址，默认使用的就是任意IP地址。\n\n### 登陆用户\n\n首先需要添加一个环境变量，然后我们通过cmd去登陆mysql：\n\n```sql\nlogin -u 用户名 -p\n```\n\n输入密码后即可登陆此用户，我们输入以下命令来看看能否访问所有数据库：\n\n```sql\nshow databases;\n```\n\n我们发现，虽然此用户能够成功登录，但是并不能查看完整的数据库列表，这是因为此用户还没有权限！\n\n### 用户授权\n\n我们可以通过使用`grant`来为一个数据库用户进行授权：\n\n```sql\ngrant all|权限1,权限2...(列1,...) on 数据库.表 to 用户 [with grant option]\n```\n\n其中all代表授予所有权限，当数据库和表为`*`，代表为所有的数据库和表都授权。如果在最后添加了`with grant option`，那么被授权的用户还能将已获得的授权继续授权给其他用户。\n\n我们可以使用`revoke`来收回一个权限：\n\n```sql\nrevoke all|权限1,权限2...(列1,...) on 数据库.表 from 用户\n```\n\n***\n\n## 视图\n\n视图本质就是一个查询的结果，不过我们每次都可以通过打开视图来按照我们想要的样子查看数据。既然视图本质就是一个查询的结果，那么它本身就是一个虚表，并不是真实存在的，数据实际上还是存放在原来的表中。\n\n我们可以通过`create view`来创建视图;\n\n```sql\nCREATE VIEW 视图名称(列名) as 子查询语句 [WITH CHECK OPTION];\n```\n\nWITH CHECK OPTION是指当创建后，如果更新视图中的数据，是否要满足子查询中的条件表达式，不满足将无法插入，创建后，我们就可以使用`select`语句来直接查询视图上的数据了，因此，还能在视图的基础上，导出其他的视图。\n\n1. 若视图是由两个以上基本表导出的，则此视图不允许更新。\n2. 若视图的字段来自字段表达式或常数，则不允许对此视图执行INSERT和UPDATE操作，但允许执行DELETE操作。\n3. 若视图的字段来自集函数，则此视图不允许更新。\n4. 若视图定义中含有GROUP BY子句，则此视图不允许更新。\n5. 若视图定义中含有DISTINCT短语，则此视图不允许更新。\n6. 若视图定义中有嵌套查询，并且内层查询的FROM子句中涉及的表也是导出该视图的基本表，则此视图不允许更新。例如将成绩在平均成绩之上的元组定义成一个视图GOOD_SC： CREATE VIEW GOOD_SC AS SELECT Sno, Cno, Grade FROM SC WHERE Grade > (SELECT AVG(Grade) FROM SC); 　　导出视图GOOD_SC的基本表是SC，内层查询中涉及的表也是SC，所以视图GOOD_SC是不允许更新的。\n7. 一个不允许更新的视图上定义的视图也不允许更新\n\n通过`drop`来删除一个视图：\n\n```sql\ndrop view apptest\n```\n\n***\n\n## 索引\n\n在数据量变得非常庞大时，通过创建索引，能够大大提高我们的查询效率，就像Hash表一样，它能够快速地定位元素存放的位置，我们可以通过下面的命令创建索引：\n\n```sql\n-- 创建索引\nCREATE INDEX 索引名称 ON 表名 (列名)\n-- 查看表中的索引\nshow INDEX FROM student\n```\n\n我们也可以通过下面的命令删除一个索引：\n\n```sql\ndrop index 索引名称 on 表名\n```\n\n虽然添加索引后会使得查询效率更高，但是我们不能过度使用索引，索引为我们带来高速查询效率的同时，也会在数据更新时产生额外建立索引的开销，同时也会占用磁盘资源。\n\n***\n\n## 触发器\n\n触发器就像其名字一样，在某种条件下会自动触发，在`select`\u002F`update`\u002F`delete`时，会自动执行我们预先设定的内容，触发器通常用于检查内容的安全性，相比直接添加约束，触发器显得更加灵活。\n\n触发器所依附的表称为基本表，当触发器表上发生`select`\u002F`update`\u002F`delete`等操作时，会自动生成两个临时的表（new表和old表，只能由触发器使用）\n\n比如在`insert`操作时，新的内容会被插入到new表中；在`delete`操作时，旧的内容会被移到old表中，我们仍可在old表中拿到被删除的数据；在`update`操作时，旧的内容会被移到old表中，新的内容会出现在new表中。\n\n```sql\nCREATE TRIGGER 触发器名称 [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON 表名\u002F视图名 FOR EACH ROW DELETE FROM student WHERE student.sno = new.sno\n```\n\n FOR EACH ROW表示针对每一行都会生效，无论哪行进行指定操作都会执行触发器！\n\n通过下面的命令来查看触发器：\n\n```sql\nSHOW TRIGGERS\n```\n\n如果不需要，我们就可以删除此触发器：\n\n```sql\nDROP TRIGGER 触发器名称\n```\n\n***\n\n## 事务\n\n当我们要进行的操作非常多时，比如要依次删除很多个表的数据，我们就需要执行大量的SQL语句来完成，这些数据库操作语句就可以构成一个事务！只有Innodb引擎支持事务，我们可以这样来查看支持的引擎：\n\n```sql\nSHOW ENGINES;\n```\n\nMySQL默认采用的是Innodb引擎，我们也可以去修改为其他的引擎。\n\n事务具有以下特性：\n\n- **原子性：** 一个事务（transaction）中的所有操作，要么全部完成，要么全部不完成，不会结束在中间某个环节。事务在执行过程中发生错误，会被回滚（Rollback）到事务开始前的状态，就像这个事务从来没有执行过一样。\n- **一致性：** 在事务开始之前和事务结束以后，数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则，这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。\n- **隔离性：** 数据库允许多个并发事务同时对其数据进行读写和修改的能力，隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别，包括读未提交（Read uncommitted）、读提交（read committed）、可重复读（repeatable read）和串行化（Serializable）。\n- **持久性：** 事务处理结束后，对数据的修改就是永久的，即便系统故障也不会丢失。\n\n我们通过以下例子来探究以下事务：\n\n```sql\nbegin;   #开始事务\n...\nrollback;  #回滚事务\nsavepoint 回滚点;  #添加回滚点\nrollback to 回滚点; #回滚到指定回滚点\n...\ncommit; #提交事务\n-- 一旦提交，就无法再进行回滚了！\n```\n\n***\n\n## 选学内容\n\n**函数**和**存储过程**并没有包含在我们的教程当中，但是这并不代表它们就不重要，通过学习它们能够让你的数据库管理能力更上一层楼，它们能够捆绑一组SQL语句运行，并且可以反复使用，大大提高工作效率。\n\n",{"data":466,"status":460,"success":461},[467,472],{"id":8,"image":468,"link":469,"name":470,"type":471},"\u002Fimage\u002Fadv\u002Frainyun-2025-06.webp","https:\u002F\u002Fwww.rainyun.com\u002Fitbaima_","雨云优惠购","cloud",{"id":66,"image":473,"link":474,"name":475,"type":476},"\u002Fimage\u002Fadv\u002Fsimcard-2025-11.webp","https:\u002F\u002Fmall.itbaima.cn","号卡优惠","simcard"]