- 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