网上做题随笔--MySql

网上写写题 提高下自己的能力。

Mysql平时写的是真的很少,所以训练一下下。

1.查找重复的电子邮箱

https://leetcode-cn.com/problems/duplicate-emails/

我的解法:

select distinct(t1.Email) from Person t1,Person t2 where t1.Id != t2.Id and t1.Email = t2.Email;

官方题解:

select email from Person group by email having count(email) > 1;

学习了下having的用法。(在此之前没听过。。)

where 是检索前的筛选,而having是检索后的组再筛选。

WHERE 子句作用于表和视图,HAVING 子句作用于组。

2.大的国家

https://leetcode-cn.com/problems/big-countries/

我的解法:

select t1.name,t1.population,t1.area from world t1 where t1.area>3000000 or t1.population>25000000;

3.有趣的电影

https://leetcode-cn.com/problems/not-boring-movies/

我的解法:

select * from cinema t1 where t1.description != ‘boring‘ and t1.id % 2 != 0 group by rating desc;

官方解法:

select * from cinema where mod(id, 2) = 1 and description != ‘boring‘ order by rating DESC;

4.组合两个表

https://leetcode-cn.com/problems/combine-two-tables/

我的解法:

select t1.firstname,t1.lastname,t2.city,t2.state from person t1 left join address t2 on t1.personid = t2.personid;

这题就是考 left join的用法。

我一开始写错了。。写成join left 而且不知道要加on。。

5.交换工资

https://leetcode-cn.com/problems/swap-salary/

这题考的是  case then的用法。。但是我忘了。。就。。

官方解法:

update salary set sex = case sex when ‘m‘ then ‘f‘ else ‘m‘ End;

6.超过经理收入的员工

https://leetcode-cn.com/problems/employees-earning-more-than-their-managers/

我的解法:

select t1.name as Employee from Employee t1,Employee t2 where t1.managerid = t2.id and t1.salary > t2.salary;

别人的解法:

select t1.name Employee from Employee as t1 where salary > (select salary from Employee where id = t1.managerid);

学习一下嵌套查询。

7.从不订购的客户

https://leetcode-cn.com/problems/customers-who-never-order/

emm...基础太差。

用left join 代替 exists

别人的解法:

select t1.Name Customers from Customers t1 left join orders t2 on t1.id = t2.customerid where t2.id is null;

8.删除重复的电子邮箱

https://leetcode-cn.com/problems/delete-duplicate-emails/

看了下题解。。

解法:

delete t1 from person t1,person t2 where t1.email = t2.email and t1.id > t2.id;

9.上升的温度

https://leetcode-cn.com/problems/rising-temperature/

我的解法:

select t.id from weather t,weather t2 where t.RecordDate = t2.RecordDate + 1 and t.temperature > t2.temperature;

但是这个解法过不了。应该是时间计算的问题。

测试了一下,直接相减的值。

分析一下,估计是先转换成整数再相减,比如2019-6-17 14:33:37-2019-6-17 14:32:47 = 2019617143337-2019617143247 = 90。

怎么说呢,如果日期值是YYYY-MM-DD型 且同一个月的话 直接相减可以算天数。 但是还是用datediff靠谱。因为数据不可控。

然后看了下官解:

select t.id from weather t JOIN weather t2 ON  datediff(t.RecordDate,t2.RecordDate) = 1 and t.temperature > t2.temperature;

一个新认识的函数吧。datediff。

10.超过5名学生的课

https://leetcode-cn.com/problems/classes-more-than-5-students/

基础太差太差了。

解法:

select class from courses group by class having count(distinct student) > 4;

group by 用的不熟练 having 也不熟练 考虑的点不全面。

11.第二高的薪水

https://leetcode-cn.com/problems/second-highest-salary/

解法:

select (select distinct Salary from Employee group by Salary desc limit 1,1) as SecondHighestSalary;

这题我缺的几个点:

1.limit 1 offset 1(基础问题) limit 省略写法的话 第一个参数是偏移量 第二个参数是返回数量

2.分析问题,看了别人表示要去考虑相同第一的问题,因此加了个distinct。解决办法是自己想的,但是分析不是自己分析的。

3.无值时取null,再select一次。

目前都是简单难度的题。

接下来写中等难度的。

12.第N高的薪水

https://leetcode-cn.com/problems/nth-highest-salary/

解法一:

类似与上一题

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N-1;# 这个更改值要先改 不能再limit那里进行运算 那里只接受常数
RETURN (
  # Write your MySQL query statement below.
  select distinct salary from employee order by salary desc limit N, 1
);
END

解法二:

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
  # Write your MySQL query statement below.
  select max(t1.Salary) from Employee t1
  where N-1 = (
    select count(distinct t2.Salary) from Employee t2 where t2.Salary > t1.Salary
  )
);
END

这个解法的意思呢就是 让N-1条t2数据都大于t1 然后返回剩下数据中的最大值

这个解法就是不用在BEGIN后写东西。但是效率好像不是很高。

顺便学习一下sql中函数的写法。

13.分数排名

https://leetcode-cn.com/problems/rank-scores/

解法:

select Score,(select count(distinct t2.Score) from Scores t2 where t2.score >= s.score) AS Rank from Scores s order by score desc;

要学会用count。

挺神奇的吧。

未完待续。

原文地址:https://www.cnblogs.com/lighter-jh/p/11038755.html

时间: 2024-09-29 17:42:41

网上做题随笔--MySql的相关文章

USACO 做题小结

还记得之前,发过一篇阶段性总结与未来规划..结果由于最近rp爆发(保研成功+进wf)后者显然靠bin神,前者也是运气.因此,放松了一段时间.然后就开始刷usaco了,原因是不用花时间找解题报告在NOCOW上全部都有,很是方便.所以只需单独开一片随笔把每天做题总结一下. Chapter1-Getting started(入门) 都是超级大水题就略过了. Chapter2-Bigger Challenges(更大的挑战) 2.1 castle  这是一道基本的搜索题目,很基础.前面两个值直接搜的,后

不去死记硬背,大量重复做题的原因

网上看到,稍作整理. ...那是20多年前关于学生学习成绩的事情.那时我想,做父母的都是有文化的人,小孩都是独生子女,学生的学习一定会很优秀的.而事实上,却恰恰相反,初中里有很多学习成绩差的学生. 有个校长对我说,我们学校对学习成绩差的学生没有方法,普通班的学生不愿意学,老师也不愿意教普通班,我对普通班的老师的要求是,学生不要出事就可以了.这些不可救药的差生是怎样冒出来的呢?其实,在小学里就存在着差生隐患,只是在初中隐患爆发了.就是有好多小学生的思辨能力没有跟上去,初中知识对学生的思辨能力要求更

做题细节

1. 如果题目是枚举的话,即最后化成十分简单的形式比较小, 可以直接将各种不同状态的结果运算过程写出来,但是这并不见得比写函数要快多少 而且比较容易出错,比如下标没有更改之类,这种错误比较烦人,因为你会查看算法, 但是算法本身并没有错误,所以如果复制粘贴的话,注意不同情况的不同点,如果自己 不够细心,最好写成函数的形式(注意判断边界),以防出错.//16:35 2004-4-17 2. 在编程之后检查的第一件事就是初始化, 你的初始化也许写在循环体之外,故只能AC一组测试数据,sample. /

python做题

Python题目 1.打印一个九九乘法表 #!/usr/bin/env python # -*- coding: utf-8 -*- """ __author__ = 'YeXiaodong' __QQ__= '12519460' __Email__ = '[email protected]' """ x = 1 list_table = [] print('九九乘法表'.center(100,' ')) while x < 10: lis

做题神器风靡:在线教育虚火旺盛的罪魁祸首是谁?

在线教育的巨大潜力有目共睹,不管是创业者还是巨头都纷纷杀入其中.在线教育本身囊括的范围极其广阔,从胎教.学龄前教育.中小学教育.高等教育,再到职业教育,乃至细分化的英语教育.技能教育等,构成一个完整的教育生态圈.但让人无奈的是,国内在线教育最火爆的却还是中小学教育. 而且由于国内教育体系本身存在的弊端,导致中小学教育主要以书山题海为工具,向高分发起追逐.在这样的大背景下,在线教育最火爆的是各种做题神器App.做题神器的风靡,让整个在线教育行业看起来形势一片大好.然而,做题神器真的就是解决在线教育

acm做题心得&amp;&amp;语录

1.切一道难题,总比做百道水题轻松,而且显然前者对你有本质的提升.(后续更新) acm做题心得&&语录,布布扣,bubuko.com

我做题、比赛的头文件,不断更新中

我做题.比赛的头文件~ 特别是那个rep特别好用,写起来明显速度快多了 #include <cstdio> #include <iostream> s#include <string.h> #include <cstdlib> #include <algorithm> #include <queue> #include <vector> #include <cmath> #include <map>

长对话做题规律

一.规律 1.题目与答案来源按照顺序分配,偶尔发生邻近错位: 2.对于大多数题目,都可以按照听啥选啥的原则,当所有选项都听到了,就按照3的方法: 3.做题三大规律:1)重复即所得 2)最后即所得 3)所听即所得 ,注意先后顺序 4.必须通过ABCD预判问题 5.注意个题目之间的逻辑和前后的一致性. 二.策略 1.历年真题反复听,注意对标志词的关注. 2.多记四级单词.

大一下学期以来做题总结、

这段时间以来.除了搜索专题和KMP专题 其他专题都不怎么愿意想了. 就比如今天的水题. 代码敲错. 输出格式没看清题意. 看题又不仔细. 等交上去错一发之后在回过头来看题目. 而且看题这方面真的好差. 经常性题目没读完就开始去敲代码.在敲代码过程中再去看题意. 希望自己读题的时候要认真.争取把题目读准.读快. 还有一个坏习惯.做题的时候喜欢听歌.这样在做思维题的时候多少会有点影响把. 这样好了,以后在做题时间一定一定不要听歌. 还有就是思维方面比以前欠缺一点了. 可能是因为没有比赛时的感觉的了.