SQL细节
LIMIT可以传两个参数(分页)
表示第n行开始的m行
ORDER BY 多个参数
按第一个排序,若第一个相同,则才按第二个排序。
判断空值
判断空值是 xx is null
筛选时间年-月-日
UNION 或者UNION ALL
在多表 情形中更简洁。
UNION自动去除重复行,UNION ALL返回所有行。
所以WHERE可以代替UNION,但不能代替UNION ALL
可以ORDER BY,出现在最后一条SELECT后
要求:检索列数量相同,字段相容,顺序可以不同。
INSERT
最好包含所有的列,没被包含的列应该是具有默认值的。
利用INSERT LOW_PROPERTY来降低INSERT的优先级,让SELECT性能提升
利用一个INSERT插入多行语句有助于插入性能的提升
INSERT-SELECT语句可插入一个查询结果(插入值是依据位置而不是列名)
UPDATE
最好不要省略WHERE
可以在UPDATE中使用子查询
抹除某列的值可以update set null
可用INGNORE忽略发生在多个插入语句中,继续让其他语句执行
DELETE
最好不要省略WHERE
DELETE删除某行,若要删除某列用UPDATE
TRUNCATE TABLE可以更快的删除表中所有的行
UPDATE&&DELETE原则
在UPDATE或者DELETE之前必须SELECT确认一下,数据库没有UNDO
保证每个表都有主键
除非打算更新或删除每一行,否则必须有WHERE 语句
更改密码
alter user user() identified by “123456”;
having
由于COUNT()函数不可用于WHERE语句中,故使用HAVING语句来限定条件
联表&子查询
联表算法是Nest Loop Join
不能因为莫须有的原因去联表
能用left join写成更优化的查询就不要用子查询
能用exists 或 in等价改写sql 就不要用DISTINT
group by
group by 分组后只取每组的第一条数据
between
between Aliy(包括) and David(不包括)
时间加减
date_add(), date_sub()
set @dt = now();select date_add(@dt, interval 1 day); - 加1天select date_add(@dt, interval 1 hour); -加1小时select date_add(@dt, interval 1 minute); - 加1分钟select date_add(@dt, interval 1 second); -加1秒select date_add(@dt, interval 1 microsecond);-加1毫秒select date_add(@dt, interval 1 week);-加1周select date_add(@dt, interval 1 month);-加1月select date_add(@dt, interval 1 quarter);-加1季select date_add(@dt, interval 1 year);-加1年
