MySQL 零碎笔记
聚合函数的用法:
concat 连接单行记录的不同字段, group_concat 连接多行记录的相同字段, concat_ws
count 按条件统计:
SELECT COUNT(*) AS `num` GROUP BY `age` > 24 —— 可能需要建立临时表排序(没有对分组条件建立索引话),效率低
COUNT( CASE WHEN `age` >24 THEN 1 ELSE NULL END )
COUNT(if(pay_status=1, true, NULL))
SELECT COUNT(id>4 or null), COUNT(id=1 OR NULL) from test
同时作用于字段与条件
select COUNT(DISTINCT t1.questionId, t1.createTime > CURDATE() OR NULL ) newNumber FROM stu_errbook t1
group by 分组统计:
SELECT name, address, MAX(age) FROM t GROUP BY name
这段 sql 可能成功,也可能报错。当 name 字段为主键或 unique not null 键,那么它会决定确定该行,因此 address 字段也被确定(依赖于分组字段)。否则的话,address 的值是randomness的,因此会拒绝此次查询( 只当 ONLY_FULL_GROUP_BY 开启 时, mysql 5.75 默认开启)。参考
mysql 随机数:
SELECT * FROM users WHERE userId >= ((SELECT MAX(userId) FROM users)-(SELECT MIN(userId) FROM users)) * RAND() + (SELECT MIN(userId) FROM users) LIMIT 1
判断空值:
ifnull is null is not null
建立唯一索引, 并删除重复数据
alter ignore table user add unique index(user_id,user_name);
按字符串中的数字排序(默认是字典序)
方法一
SELECT CAST(title AS UNSIGNED INTEGER) AS ORDER_FIELD ,title ORDER BY ORDER_FIELD ASC
方法二
SELECT * FROM table ORDER BY LENGTH(title), title
按两个字段中的较大值排序(注意空值判断时返回 null)
select IF(t1.createTime > MAX(t4.lastLearnTime) || MAX(t4.lastLearnTime) IS NULL, t1.createTime, MAX(t4.lastLearnTime)) AS orderTime from table1 t1, table4 t4 order by orderTime
233