SQL语法学习(1)
SQL语法学习(2)
继续学习GROUP BY
GROUP BY 有一点类似于Excel的数据透视表
先来看看数据:
按照不同制造商分组
SELECT * FROM new_schema20200309.new_table
GROUP BY Manufacturer;
因为进行了分组,每个制造商只返回一个结果,如下:
在部分数据库中可能报错,应该换为:
SELECT Manufacturer FROM new_schema20200309.new_table
GROUP BY Manufacturer
结果如下:
不同制造商下各个产品的数量
SELECT Manufacturer,COUNT(Product) FROM new_schema20200309.new_table
GROUP BY Manufacturer;
结果如下:
等价方法:COUNT(Product)=COUNT(1)=COUNT(*)
SELECT Manufacturer,COUNT(Product),COUNT(1),COUNT(*) FROM new_schema20200309.new_table
GROUP BY Manufacturer
DISTINCT去重:假设相同的一个产品会有不同的制造商来生产,这个时候我们要获取不同类别下产品的数量怎么办?
SELECT Category,COUNT(Product),COUNT(DISTINCT Manufacturer) FROM new_schema20200309.new_table
GROUP BY Category
多层分组:不同类别下不同制造商的产品数量
SELECT Category,Manufacturer,COUNT(Product) FROM new_schema20200309.new_table
GROUP BY Category,Manufacturer
GROUP BY的筛选:HAVING
类似于WHERE,但是HAVING针对GROUP BY
筛选出制造商中产品数量少于100的制造商
SELECT Manufacturer,COUNT(Product) FROM new_schema20200309.new_table
GROUP BY Manufacturer
HAVING COUNT(Product) <= 100
进阶(1)
SELECT city,count(1) FROM data.dataanalyst
WHERE industryField LIKE "%电子商务%"
GROUP BY city
HAVING COUNT(positionID) >= 50
解释:展示“电子商务”岗位数大于50个的城市情况
示例结果:
city | count(1) |
---|---|
上海 | 166 |
北京 | 150 |
深圳 | 98 |
杭州 | 75 |
上面语句用嵌套函数更改:
SELECT city,count(1) FROM data.dataanalyst
GROUP BY city
HAVING COUNT(if(industryField LIKE "%电子商务%",1,null) >= 50
这里要理解if中1和null
1:返回值,表示if条件成立返回1。这里的1换为2,3,4,甚至100都不影响计算结果,因为是对1出现的次数进行COUNT
null:表示if条件成立返回空值null,这里将不计数
进阶(2)
SELECT
city,
count(1),
COUNT(if(industryField LIKE "%电子商务%",1,null),
COUNT(if(industryField LIKE "%电子商务%",1,null)/count(1)
FROM data.dataanalyst
GROUP BY city
解释:展示各城市中岗位的总数和“电子商务”岗位数情况,可以依据此计算电子商务的岗位比例
示例结果:
city | count(1) | COUNT(if(industryField LIKE “%电子商务%” | COUNT(if(industryField LIKE “%电子商务%” |
---|---|---|---|
上海 | 166 | 80 | 0.48 |
北京 | 150 | 78 | 0.52 |
深圳 | 98 | 40 | 0.40 |
杭州 | 75 | 36 | 0.48 |
AS别名化
SELECT
city,
count(1) AS total,
COUNT(if(industryField LIKE "%电子商务%",1,null) AS emarket,
COUNT(if(industryField LIKE "%电子商务%",1,null)/count(1)
FROM data.dataanalyst
GROUP BY city
HAVING emarket > 30 #筛选出电商数大于30
ORDER BY emarket #按照电商数进行降序
解释:展示各城市中岗位的总数和“电子商务”岗位数情况,可以依据此计算电子商务的岗位比例
示例结果:
city | total | emarket | COUNT(if(industryField LIKE “%电子商务%” |
---|---|---|---|
上海 | 166 | 80 | 0.48 |
北京 | 150 | 78 | 0.52 |
深圳 | 98 | 40 | 0.40 |
杭州 | 75 | 36 | 0.48 |