1 .MySQL中不要出现过多的嵌套,增加冗余来达到简化sql语句的效果
例如:问题管理流程业务表需要取同一个环节最后一次处理该环节的信息.
1、 先取到最大时间 begin_time
2、 再取最新的process_no
例如:SELECT MAX(a.process_no) FROM sp_process a WHERE a.begin_time = (SELECT b.begin_time FROM sp_process b WHERE b.item_code = ‘230‘ ORDER BY b.begin_time DESC LIMIT 1) AND a.item_code=‘230‘
2.Like操作
一般情况下不鼓励使用like操作,like “?a%” 不会使用索引,而like “aaa%”可以使用索引
3 不要再列上进行运算,会使索引失效
例如:如果查询2013年以来的问题管理工单:
SELECT * FROM sp_issue a WHERE YEAR(a.`oper_time`) > 2013; 这样写将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成 SELECT * FROM sp_issue a WHERE a.`oper_time` > ‘2013-01-01‘;
4 索引列排序
MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引
5 from 后面的子查询别名问题
MySQL的delete语句必须加from
MySQL的delete语句表名加别名,前面也需要加别名:
例如:DELETE FROM t1 a;--存在问题
正确写法:DELETE a FROM t1 a;
DELETE a FROM SP_PROCESS_OPER a WHERE a.app_no = ‘0008695930‘;
6 MySQL连接符问题与NULL处理
MySQL不能使用“||”进行字符串连接操作,在mysql中“||”和“&&”代表逻辑or和and的意思。使用concat连接.
注意一下,MySQ concat函数连接字符串的时候,如果字符串有null值,最后连接结果也是null,而oracle是不一样的。
mysql
SELECT CONCAT(‘aa‘,‘bbb‘,‘ccc‘,null) 结果为空
oracle
select ‘aa‘||‘bbb‘||‘ccc‘||null from dual
结果为 aabbbccc
MySQ中的null和‘’(空值)是不一样的
select concat(col1,col2,...,case when coln is null then ‘‘ else coln end coln) from tableName;
MySQL实现Oracle的decode功能是用case when来实现
ifnull也可以