leetcode数据库题解(一)

凡例:1.对于题目只放出题目的编号、题目和链接;
2.题目按照通过率排序;
3.解答会放出mysql语言的代码,其他语言我没写过,就不放出来了。

#595大的国家

这题比较简单,用个where查询就可以了

select name,population,area from World where population>25000000 or area>3000000;

#182查找重复的电子邮箱

这题也不难,用count函数,重复的邮箱会大于1,注意用having关键词时必须和分组group by一起使用,并且放在group by之后。

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

当然这题也可以用子查询,即先计数,创造一个临时表。注意,这里子查询的表要给出一个别名,我们记为counting。

select Email from (select Email , count(Email) as num from Person group by Email) as counting where num>1;

#627交换性别

这题考update和case的用法。

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

当然也可以这么写。

update salary set sex=case sex when 'm' then 'f' when 'f' then 'm';

用if也是可以的。if函数和excel的if函数很像。

update salary set sex=if(sex='m' ,'f' , 'm');

#620有趣的电影

这题也很简单,用where判断条件就行了。注意结果要按降序(desc)排列,升序是asc。判断奇数用mod函数也可以:MOD(id,2)=1。不等于用<>也可以,但是大多数语言只支持'!='。

select * from cinema where id%2==1 and description!='boring' order by rating desc;

#175组合两个表

这题也很基础,考组合的用法。这题要求无论Person是否有地址信息,都需要给Person提供地址信息。也就是说即使Person中有些条目在Address中找不到匹配的,也要选出来,那么符合条件的就是左交(left join)了。

select Person.FirstName , Person.LastName , Address.City,Address.State from Person left join Address on Person.PersonId=Address.Person order by Person.PersonId;

#181超过经理收入的员工

这类题要构造临时表,即把一个表用别名复制几次。第一个筛选员工,第二个表选出对应的manager。

select e1.Name as Employee from Employee e1,Employee e2 where e1.Salary>e2.Salary where e1.ManagerId=e2.Id; 

#183从不订购的客户

这题要从Customers表中筛选不在Orders表中的客户,可以延续上题的思路,先左交,再选出customerid为null的顾客。

select tmp.Name as Customers from 
(select Customers.Name,Orders.CustomerId as order as Customers from Customers left join Orders on Customers.Id=Orders.CustomerId) as tmp where tmp.order is null;

其实我上面写繁琐了,不需要用子查询,直接从组合的表中选择就好了。看别人的写法:

select c.Name as Customers from
 Customers c left join Orders o on c.Id=o.CustomerId 
where o.CustomerId is NULL;

注意这里在组合表后直接用了where,而且组合表中为空的CustomerId也可以用o.CustomerId引用。
不使用左交,用not in判断条件也是可以的。这种方法也比上面的简洁。

select Customers.Name as Customers from Customers where Customers.Id not in (select CustomerId from Orders);

#626换座位

这题比较难,需要用case和子查询。注意,counts要在后面单独算出来,因为前面id,student是绑定的,用count(student)是不行的,因为在select中的count(student)就限定了结果只能有1行。

select(case
      when id%2!=0 and id!=counts then id+1
      when id%2!=0 and id=counts then id
      else id-1 end)
      as id,student
      from seat,(select count(student) as counts from seat)seatCount 
      order by id;

#178分数排名

这题也有难度,也要构建临时表。还是要注意不要在select下直接写count,要放在子查询下。
第一种思路是查询有多少不重复的分数大于当前分数。

select s1.Score,
(select count(distinct s2.Score)+1 from Scores s2 where s2.Score>s1.Score) as Rank 
from Scores s1 order by s1.Score desc;

第二种思路是构建两个变量,其中一个变量代表Rank的值,另一个变量代表上一个Score的值,当Score按从高到低排序后,只需要比较前一个 Score是否等于当前Score,如果相等,则Rank不变,如果不想等,则Rank加1。用户变量这一块我也不是非常清楚,这里先看看大神的代码吧。

select 
    Score,  
    @i := @i + (@j <> (@j:= Score)) as Rank 
from 
    Scores, (select @i:=0,@j:=-1) init 
order by Score desc

#196删除重复的电子邮箱

delete p1 from Person p1,Person p2 where p1.Email=p2.Email and p1.Id>p2.Id;

这题用到的delete和我们学的有点不一样,一般delete后面是不带表名的,表名在from后,这里from后有两个表名,指明p1就删除p1的内容并返回p1,p2同理,如果同时指明p1和p2,返回的是p1,p2各自删除后的内交inner join,如下图:


同时删除p1,p2

运行结果

还有另一种思路,就是用正常的delete,条件是它不是最小的Id,这就要用到子查询和group分组了。

delete from Person where Id not in (select Id from (select min(Id) as Id from Person group by Email) as tmp) ;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,818评论 5 116
  • 观其大纲 page 01 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 M...
    周少言阅读 3,158评论 0 33
  • 坐在屋里看着阳光在窗外妩媚 冰冷的手划过湿润眼眸 思绪飞舞在记忆的废墟 离别不是伤愁的借口 对你的感觉渐渐消失 才...
    北国爱人阅读 184评论 0 0
  • - c o o l i n u - 原 创 时 尚 自 媒 体 + × 韩国性感小野马泫雅出道至今,性感的形象一直...
    coolinu阅读 1,632评论 0 1
  • 还是不能自律,懒癌复发。第一阶段考试过了,第二阶段时间更紧任务更重,加入007原本就是让自己更自律,成为少数人,这...
    吴世平阅读 208评论 0 0