casewhen语句 原表 SELECT,CASEWHENage18THEN成年人ELSE未成年人ENDAS身份FROMstudent 查询结果 需要注意的是,CASEWHEN每个条件对应的数据类型必须是一致的,否则会报错。其它,在实际开发中还可以把参数传入insert、update、delete语句 insertintostudent(name,age)values(小周,casewhen{A}小周then18end); updatestudentsetage(casewhen{A}1then18when{A}2then19else20end) deletestudentwhereage(casewhen{A}18then18when{A}19then19end);行转列 原表 SELECTname, max(CASEWHENcourse语文THENscoreELSE0END)AS语文, max(CASEWHENcourse数学THENscoreELSE0END)AS数学 FROMscoreGROUPBYname 结果数据批量更新 mysql UPDATEscoreainnerjoinscorenewbONa。idb。idseta。scoreb。score sqlserver UPDATEscoreaseta。scoreb。scorefromscorenewbwherea。idb。id oracle用以下格式: UPDATEASET(A1,A2,A3)(SELECTB1,B2,B3FROMBWHEREA。IDB。ID)插入或者更新 INSERTINTOscoreVALUES(1,小明,语文,95)onDUPLICATEKEYUPDATEscore96 根据主键判断有记录存在时,只更新on后面的字段动态SQLdelimitercreateprocedureinsert(innamevarchar(250),incoursevarchar(250),inscoreINT)BEGINSETsqlStmtCONCAT(INSERTINTOscoreVALUES(1,,name,,,course,,,score,););PREPAREstmtFROMsqlSEXECUTE执行SQLDEALLOCATEPREPARE释放连接END;索引优化 应该建立索引的情况 1。在经常用在连接的列上创建索引,可以加快连接的速度; 2。在经常使用在Where子句中的列上面创建索引,加快条件的判断速度; 3。为经常出现在关键字orderby、groupby、distinct后面的字段,建立索引。 4。索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 应该避免建立索引的情况 1。频繁进行数据操作的表,尤其插入操作比较多的表,不要建立太多的索引; 2。无用的索引要及时删除,避免对执行计划造成负面影响; 索引失效的情况 有牛人总结为七字口诀:模型数空运最快,我直接拿来分享了 模:使用like进行模糊查询的时候,以百分号开头的,索引就会失效。 型:代表数据类型,数据类型错误了,索引也会失效。 数:函数,对索引的字段使用内部函数的,索引也会失效。这种情况,应该建立基于函数的索引。 空:null,索引不存储空值,如果没有声明nounull,数据库会认为有可能存在空值,也不会按照索引进行计算。 运:运算,对索引列进行加减乘除等运算的,会造成索引失效。 最:复合索引中索引列的顺序非常重要,如果不是按照索引列最左列开始查找,则无法使用索引。 快:全表扫描最快,如果数据库认为全表扫描更快的时候,它就不会使用索引。mysqldump导出 1。导出整个数据库 mysqldumpu用户名p数据库名导出的文件名 2。导出一个表 mysqldumpu用户名p数据库名表名导出的文件名 3。导入 mysqlsourced:dbname。sql 说明:大批量数据情况下推荐使用mysqldump,导入会很快刚踩了一个坑 有两个字段大小判断的SQL在命令窗口下执行没有问题,但是把SQL生成视图就有问题了。经过排查发现,原因是两个比较字段的字符集比一致(一个utf8mb4,另一个uft8),在生成视图时mysql会把字符集强行转为一致,这样就出现了问题。 上面的问题我在测试环境没有复现,但在生产环境下确实是修改完成字符集就解决问题了。我猜想与数据量有关系,因为生产环境那张表的数据量还是挺大的。有知道原因的小伙伴请留言,谢谢! 大家在用mysql创建表时,尽量选择utf8mb4字符集,在开发过程中还要确认每个字段的字符集情况。不然有可能出现不可描述的情况! 每天一个小知识,每天进步一点点!!!〔加油〕〔加油〕〔加油〕