Flychen
-- 筛选最大生命值大于 6000 的英雄,按照主要定位进行分组,
-- 选择分组英雄数量大于 5 的分组,按照分组英雄数从高到低进行排序,
-- 并显示每个分组的英雄数量、主要定位和平均最大生命值。
select count(*),role_main,AVG(hp_max)
from heros
where hp_max > 6000
GROUP BY role_main
HAVING COUNT(*) > 5
order by COUNT(*) DESC;
-- ------------------------------
-- 筛选最大生命值与最大法力值之和大于 7000 的英雄,按照攻击范围来进行分组,显示分组的英雄数量,
-- 以及分组英雄的最大生命值与法力值之和的平均值、最大值和最小值,并按照分组英雄数从高到低进行排序,
-- 其中聚集函数的结果包括小数点后两位。
SELECT count(*) '数量',attack_range,max(hp_max),sum(mp_max),ROUND(AVG(mp_max),2),max(mp_max),min(mp_max)
from heros
where (hp_max + mp_max) > 7000
group by attack_range
ORDER BY '数量' ;
2021-01-18
胡皓
对3NF的理解:
1NF:数据表的属性不能再拆分。
2NF:非主属性和数据表里的候选键有完全依赖关系
3NF:非主属性和候选键之间不存在传递依赖关系
1NF大部分数据表都会满足,我从另一个视角来看下2NF和3NF。在2NF和3NF中都涉及到了候选键,候选键包含能唯一标识元组的属性,标识能让我们找到对象的所有属性。2NF要求,只能根据候选键作为整体标识来确定对象的其他属性,而3NF要求所有其他属性只能根据候选键来直接查找,不能存在传递查找。
2020-11-21
小虾米
1.0412158966064453
1.049706220626831
感谢老师,初识redis
2020-11-10
硅谷居士
又看了一遍,感谢老师
2020-04-06
GISer_wfp
初学数据库,对select的理解是,它像一把神奇的大勺子,可以按照主人的想法从数据库里捞出主人想要的数据;
今天的作业:
mysql> select name, mp_max from heros order by hp_max desc limit 5;
+-----------+--------+
| name | mp_max |
+-----------+--------+
| 廉颇 | 1708 |
| 白起 | 1666 |
| 程咬金 | 0 |
| 刘禅 | 1694 |
| 牛魔 | 1926 |
+-----------+--------+
5 rows in set (0.00 sec)
2019-07-08
长安落雪
SELECT t1.team_name,t2.team_name FROM team as t1 LEFT JOIN team as t2 ON t1.team_id != t2.team_id
SELECT t1.team_name , t2.team_name FROM team as t1 ,team as t2 where t1.team_id<t2.team_id;
作者回复:正确,大家可以参考下这个。如果是分主客场的话,是第一个SQL。如果是不重复的两个球队的比赛的话,是第二个SQL。
2019-07-04
21
野马
那一个RDBMS支持多个SQL标准吗?
作者回复:这是一个好问题,有的时候是同时支持的,比如:
SELECT * FROM a, b 和 SELECT * FROM a JOIN b
但有的时候又不支持,比如在MySQL中不支持SQL92标准下的 +号方式的外连接,但是支持SQL99的外连接方式。
具体还需要参考RDBMS相关的文档,即使是同一个标准,每个RDBMS都有自己的“方言”,使用的语法也有差异。
2019-07-04
4
Yt
比较运算符:只有单纯的比较,查询的值比较(>,<,=,NULL判定)通过,则筛选通过
逻辑运算符:AND,OR,BETWEEN...AND,将比较运算符串联起来,组合成复杂的筛选条件
通配符:谈这个应该和正则表达式一起来讲,有点混乱易混淆。用于文本查询、匹配。LIKE比起REGEXP文本匹配更严格。LIKE是匹配的文本必须要有,且只能有这么多;REGEXP是匹配的文本段中有匹配的文本就行,所以REGEXP加入了控制匹配文本的位置功能。
SELECT name,role_main,role_assist,hp_max,mp_max
FROM heros
WHERE (role_main IN ('战士','坦克‘) AND role_assist IS NOT NULL) AND(hp_max>8000 OR mp_max<1500)
ORDER BY (hp_max+mp_max) DESC;
作者回复:SQL语句正确('坦克'需要注意下)。我在文章里主要讲解了LIKE操作符,也可以使用REGEXP操作符来进行正则表达式匹配。
2019-06-24
MJ
select name,role_main,role_assist,hp_max,mp_max from heros where (role_main in ('坦克','战士') and role_assist is not NULL) and (hp_max > 8000 or mp_max < 1500) order by (mp_max+hp_max) desc;
+-----------+-----------+-------------+--------+--------+
| name | role_main | role_assist | hp_max | mp_max |
+-----------+-----------+-------------+--------+--------+
| 牛魔 | 坦克 | 辅助 | 8476 | 1926 |
| 刘邦 | 坦克 | 辅助 | 8073 | 1940 |
| 程咬金 | 坦克 | 战士 | 8611 | 0 |
| 张飞 | 坦克 | 辅助 | 8341 | 100 |
| 亚瑟 | 战士 | 坦克 | 8050 | 0 |
| 吕布 | 战士 | 坦克 | 7344 | 0 |
| 关羽 | 战士 | 坦克 | 7107 | 10 |
| 花木兰 | 战士 | 刺客 | 5397 | 100 |
+-----------+-----------+-------------+--------+--------+
作者回复:正确,结果也显示出来了。
2019-06-24
2
奕
就是要避免全表扫描,所以我们会考虑在 WHERE 及 ORDER BY 涉及到的列上增加索引
-----------------------------------------------
where 条件字段上加索引是可以明白的,但是为什么 order by 字段上还要加索引呢?这个时候已经通过 where条件过滤得到了数据,已经不需要在筛选过滤数据了,只需要在排序的时候根据字段排序就好了。不是很明白
作者回复:这是一个很好的问题,关于ORDER BY字段是否增加索引:
在MySQL中,支持两种排序方式:FileSort和Index排序。Index排序的效率更高,
Index排序:索引可以保证数据的有序性,因此不需要再进行排序。
FileSort排序:一般在内存中进行排序,占用CPU较多。如果待排结果较大,会产生临时文件I/O到磁盘进行排序,效率较低。
所以使用ORDER BY子句时,应该尽量使用Index排序,避免使用FileSort排序。
当然具体优化器是否采用索引进行排序,你可以使用explain来进行执行计划的查看。
优化建议:
1、SQL中,可以在WHERE子句和ORDER BY子句中使用索引,目的是在WHERE子句中避免全表扫描,ORDER BY子句避免使用FileSort排序。
当然,某些情况下全表扫描,或者FileSort排序不一定比索引慢。但总的来说,我们还是要避免,以提高查询效率。
一般情况下,优化器会帮我们进行更好的选择,当然我们也需要建立合理的索引。
2、尽量Using Index完成ORDER BY排序。
如果WHERE和ORDER BY相同列就使用单索引列;如果不同使用联合索引。
3、无法Using Index时,对FileSort方式进行调优。
2019-06-24
104
编辑推荐
讲师的其他课程
包含这门课的学习路径
Java工程师
29门课程 154.7w人学习
测试工程师
18门课程 93.7w人学习
前端工程师
24门课程 109.3w人学习
Python工程师
19门课程 118.0w人学习
产品经理
13门课程 43.0w人学习
看过的人还看了