面试基础:
Q1:简单概念问题:左联结右链接内连接的区别;
Q2:max()函数简单应用;自己考虑太复杂;
Q3:一个很难问题,N多张汽车信息表,每张表都没有主键,每张表信息字段合并之后都会与其中一个字段重合,但是重合的那个字段信息不完整,如何把数据表整理出一个主键的新表呢,获取每辆汽车的信息。用到正则表达式可能。(带思考)
书籍:MYSQL必知必会,SQL-sever , MY_SQL经典教程;
LEETCODE一共19个题目,自己已经第70天还没有刷完,不能埋怨任何人,都是因为自己自信心导致自己遇到困难就放弃,然后重新建立自信,重新学习,以及没有规律的把自己时间固定起来进行学习。严格的输出机制来逼自己学习。
现阶段,自己的情绪控制很重要;专注于SQL题目的解决上,其他一且问题都忽视不要去向,发现自己思想情绪出问题时候,就赶紧去跑步;
反思:机会总是留给有准备的人;
那么好的机会留给自己的时候,自己能力不足,没有匹配上,导致自己失之交臂,不要后悔,也不要难过,只能说明自己能力没有达到要求,所以自己当下应该专注于提升自己的工作技能,让自己匹配上机会给自己的好处,有很多机会都是自己能力匹配不上,上天赐予自己那么多次好机会。让自己具备抓住机会的能力,是目前当务之急。一且情绪都是阻碍自己抓住机会的绊脚石,专注于个人能力的刻意练习中,摆脱消极情绪的方法,就是运动+++++专注,运动自己做到了,专注的可以练习,专注于一个个技能提升上,让自己更加自己,这样就治愈自己的焦虑;
自己现阶段为什么焦虑,因为自信问题,问什么技能练习不上去,因为自己没遇到一个问题解决不动,就会半途而废,或者专注力被带走导致自己最终解决的思路被打断。自己解决不了学习过程中出现的问题因为自己基础薄弱,导致自己自信心严重受挫,再加上自己上大学 之后到现在从来没有被任何肯定过,从2012年到现在否定了7年导致自己现在嫉妒的不自信,这是一种病,需要自己慢慢治愈。
自己为什么学习?就为了工作过程中那么些许的成就感,因为它反应自己作为一个人还有一点点价值,可以给自己很大的自信心,对自己来说这么好的福利,不需要去求着别人来肯定自己,自己只需要通过学习过程中解决的问题获得成就感就可以治愈自己。
学习:是为了让自己能力匹配上,上天给自己安排的机会,自己生命中有很多机会,都是因为自己的不专注学习导致。
阻碍自己学习的有如下:
1.解决不动的问题,就放弃,半途而废。
2.成就感的缺失,三心二意,急于求成,只看短期收益。
178SQL分数排名:
编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”
+----+-------+ | Id | Score | +----+-------+ | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | +----+-------+
例如,根据上述给定的 Scores
表,你的查询应该返回(按分数从高到低排列):
+-------+------+ | Score | Rank | +-------+------+ | 4.00 | 1 | | 4.00 | 1 | | 3.85 | 2 | | 3.65 | 3 | | 3.65 | 3 | | 3.50 | 4 | +-------+------+
https://leetcode-cn.com/problems/rank-scores/comments/
解答1:SELECT Score, (SELECT count(DISTINCT score) FROM Scores WHERE score >= s.score) AS Rank FROM Scores s ORDER BY Score DESC ;
思路:
从表scores中排序desc后,为S表,从s表中找到字段score大于S表中score,重点注意一定要对score进行去重计数,
SELECT Score, (SELECT count(DISTINCT score) FROM Scores WHERE score >= s.score) AS Rank FROM Scores s ;结果是没有排序的Rank列,
注意先第一个select1 > from1 >select2 > from 2 中where结果先返回 > select2中去重计数,返回rank > select1给出desc排序后的结果。
缺点:
查询次数为 (记录条数^2),会很慢,而且在数据量稍大的情况下计算效率低
知识点:子查询嵌套,自己目前有点看不懂执行顺序,查顺序引出如下:
使用子查询可以进行select语句的嵌套查询,即一个人select查询的结果作为另一个select语句的条件。但是查询效率很低,用连接(JOIN)查询来替代子查询。连接查询不需要创建临时表,其速度比子查询要快,且查询中使用索引性能会更好;
查询顺序的详细解答高阶教程。
https://blog.csdn.net/jiankunking/article/details/23591267
总结印象笔记190411
解法2
select a.Score, sum(case when b.Score>=a.Score then 1 end) as Rank
from Scores a, (select distinct Score from Scores ) b group by a.id order by a.Score desc;
思路:a表,b表 :按照a表的id进行 groupby分组后进行去重操作,
不懂此处操作,为什么求和且会生成顺序,sum(case when b.Score>=a.Score then 1 end) as Rank
a表
| Id | Score | +----+-------+ b表 | 1 | 3.50 | 4 4.00 4 | 2 | 3.65 | 3 3.85 3 | 3 | 4.00 | 1 3.65 2 | 4 | 3.85 | 2 3.5 1 | 5 | 4.00 | 1 | 6 | 3.65 | 3
网友解释:
如果a的score和b的score相同,那么b的id就是a的排名),这样sum(case when b.Score>=a.Score then 1 end) 这里就是b中有x个比a的score高或者相等的值。这样只有一个相等的就是第一名,rank就是1.一个高一个相等就是第二名,rank就是2.(也可以理解成等于几,就是前面排序好的id。这样会更容易理解一点。sum相当于是给b表附了一个自增的从1开始的值)
将生成结果自己详细写一遍了解,对每一个b.score大于a.score 计数1,然后求和
第三种方法:
select Scores.Score, (select count(*) from(select distinct Score from Scores) as temp where temp.Score >= Scores.Score) as Rank from Scores order by Score desc;