SQL练习题02

面试基础:

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/23590239?spm=a2c4e.11153940.blogcont55154.4.252c67e4TfrSqB

查询顺序的详细解答高阶教程。

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;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值