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()

  1. set @dt = now();
  2. select date_add(@dt, interval 1 day); - 1
  3. select date_add(@dt, interval 1 hour); -加1小时
  4. select date_add(@dt, interval 1 minute); - 1分钟
  5. select date_add(@dt, interval 1 second); -加1
  6. select date_add(@dt, interval 1 microsecond);-加1毫秒
  7. select date_add(@dt, interval 1 week);-加1
  8. select date_add(@dt, interval 1 month);-加1
  9. select date_add(@dt, interval 1 quarter);-加1
  10. select date_add(@dt, interval 1 year);-加1