- COUNT(字段) 不会统计 NULL 值,但是COUNT(*)会
- 只要有子查询,就需要给子查询定义别名!
- where 后面的条件表达式中不能存在聚合函数,但是 Having 可以
- 聚合函数基本上都是需要配合 group by 使用(除非把当前全局的数据当做一个分组),否则查询粒度无法保证,一般聚合函数之外的字段都要放到 group by 之后
- 执行顺序:from > on > where > group by > having > select > distinct > order by > top。但是 group by 和 having 都可以使用 select 后面定义的别名,但是 where 后面不能使用 select 中定义的别名
- where 是基于行进行过滤,而 having 是基于组进行过滤
- NULL 占用空间(不管是 MySQL 还是 Hive),但是 '' 不占用空间
- MySQL中没有Boolean,而是用Tinyint(1)去接收。TINYINT(1) 类型可以存储 0 或 1,分别对应 false 或 true。
- 笛卡尔积可以通过 join 但是忽略 on 条件实现(MySQL 还提供了 cross join,但是 Hive 没有)
- 聚合函数中并不是必须得是字段名,也可以是表达式
-- 查询每个部门中年龄大于 50 的员工数 SELECT dept_id, COUNT(age) cnt FROM department GROUP BY dept_id HAVING age > 50 -- 等同于 SELECT dept_id, COUNT(age > 50) cnt FROM department GROUP BY dept_id
- select 语句也可以作为一个字段,前提是查询结果只能有一个字段
-- 有两张表:Register 和 Users -- 查询用户的注册率 SELECT contest_id, ROUND(COUNT(DISTINCT user_id)/(SELECT COUNT(*) FROM Users)*100,2) percentage FROM Register GROUP BY contest_id ORDER BY percentage DESC,contest_id