记录生疏的知识点
组合
进行去重SELECT DISTINCT attack_range FROM heros # 只有近战和远程两个 SELECT DISTINCT attack_range FROM heros # 有69条记录了
SELECT NAME FROM heros ORDER BY hp_5s_growth DESC
重要
:图像化想象就是从中间回到头再转到尾巴。下面的这个例子可以很好理解SELECT DISTINCT player_id, player_name, count(*) as num # 顺序 5 FROM player JOIN team ON player.team_id = team.team_id # 顺序 1 注意是一个多表查询 WHERE height > 1.80 # 顺序 2 GROUP BY player.team_id # 顺序 3 HAVING num > 2 # 顺序 4 ORDER BY num DESC # 顺序 6 LIMIT 2 # 顺序 7
in
,not
SELECT NAME,birthdate FROM heros WHERE NAME LIKE '%太%' 结果:东皇太一、太乙真人
在实际中,尽量少用通配符。使用like检索字段,即使该字段有索引,也有可能使得索引失效。比如 name like '%太%' 或这 '%颇' 都会进行全表扫描。当匹配条件第一个字符不为 % 时,则不会全表
tips:
比如:date(birthdate) NOT BETWEEN '2016-01-01' AND '2017-01-01'
定义:对于一批次的数据进行处理,输出一个具体的值。(多个输入,单个输出)。比较复杂的情况下,会先进行筛选,再进行汇聚
分类:MAX、MIN、AVG、COUNT以及SUM
重要
:结合group by一起使用聚合函数SELECT COUNT(*) AS num, role_main FROM heros GROUP BY role_main HAVING num >= 10 # having 可以把select中的字段拿过来作为筛选的条件
3.1 字段为null也会被分成一个分组
3.2 where和having的区别
都是起到过滤的作用,只不过 WHERE 是用于数据行,而 HAVING 则作用于分组。 where是先对原始表中的数据进行过滤,having再在其基础之上对过滤后的数据进行分组。用 WHERE 进行数据量的过滤,用 GROUP BY 进行分组
例子:筛选最大生命值大于 6000 的英雄,按照主要定位、次要定位进行分组,并且显示分组中英雄数量大于 5 的分组,按照数量从高到低进行排序。
SELECT COUNT(*) AS num, role_main, role_assist FROM heros WHERE hp_max > 6000 # 先筛选数据表中的数据 GROUP BY role_main, role_assist # 根据上面筛选后的数据再进行分组 HAVING num > 5 ORDER BY num DESC
练习题
1.筛选最大生命值大于 6000 的英雄,按照主要定位进行分组,选择分组英雄数量大于 5 的分组,按照分组英雄数从高到低进行排序,并显示每个分组的英雄数量、主要定位和平均最大生命值。
SELECT COUNT(*) AS num, role_main, AVG(hp_max) FROM heros WHERE hp_max > 6000 GROUP BY role_main HAVING num > 5 ORDER BY num DESC
2.筛选最大生命值与最大法力值之和大于 7000 的英雄,按照攻击范围来进行分组,显示分组的英雄数量,以及分组英雄的最大生命值与法力值之和的平均值、最大值和最小值,并按照分组英雄数从高到低进行排序,其中聚集函数的结果包括小数点后两位。
SELECT COUNT(*) hero_nums, ROUND(AVG(hp_max + mp_max), 2) AS avg_hpmp, ROUND(MAX(hp_max + mp_max), 2) AS max_hpmp, ROUND(MIN(hp_max + mp_max), 2) AS min_hpmp FROM heros WHERE (hp_max + mp_max) > 7000 GROUP BY attack_range ORDER BY hero_nums