sqlzoo错题解析汇总

1.world


①当列表中没有gdp/population时,直接写在SELECT后面


②WHERE中用单引号;population/1000000也可以直接写出


③以United开头的,应该用谓词LIKE下的前方一致查询


④AND的优先级优于OR


⑤ROUND(x,2)即对x保留两位小数

⑥ROUND(x,-3)即对x取整至千位,负数是向左进行保留eg:66443~66000

⑦LEFT(x,1)表示x的首字母;<>表示不等于


⑧% %排除或者包含字符

2.nobel


①时间的连接不可用&,应用AND


②两个不同的人用OR连接


③注意几个AND连接时的优先以及不等号的书写,先算术运算符+,-,再关系运算符>、<、=,再逻辑运算符AND,OR,而且subject要重复写两次

④对单引号的书写,有两种方式,通过在前面加\或者’



⑤以SIR…开始要用LIKE,不可直接用=;一般排序里面默认按升序,从低到高,此时要先展示最新获奖者,则按降序,从高到低,加上DESC;此时按名称排序应该是指按winner,而不是subject,而且指定先选出winner,再yr,再subject,就不可以用*代替,即对显示出来的字段有顺序要求,不能直接 select * from 否则会出错


⑥对于subject IN(‘chemistry’,’physics’),翻译的大概意思是 按照获奖的科学领域跟获奖者的名字来排序,但是 化学和物理要被排在最后。
难点在 subject in (xxx)这个表达式,排除后两个表达式,这是一个分组排序,
subject in(xxx)为0的分成一组 排序,subject in(xxx)为1的分成一组 排序
得到结果连接起来就是新的排序表

⑦没有即不等于,用NOT IN



⑧子查询里面也要用yr




⑨同上,在子查询里面仍然要写yr


3.select tutorial


①同上,where的子查询中查的是什么,子查询中也要是什么


②谓词IN是OR的简单用法,阿根廷和澳大利亚明显是属于两个洲,因此需要用OR连接,前面也应该用OR,而不应该用=


③用大于等于连接时,补足符号前的主语,此时在<之前的population不可以掉

④可以使用函數ROUND 刪除小數,可以使用函數 CONCAT 增加的百分比符號

函数CONCAT函数用于将两个字符串连接为一个字符串


⑤ALL的用法

⑥NULL的存在

⑦理解成两个嵌套的for循环,y.continent=x.continent保证两个比较的对象在同一个洲份,也就是说对同一个洲份的进行一轮操作


⑧直接在子查询里面取每个洲里国家名字的字母排序最小的一个国家名字

LIMIT用法:sql语句根据条件查询指定数量的数据

SELECT * form 表名 WHERE 条件 limit m,n; //检索m+1到m+n条数据
SELECT * form 表名 WHERE 条件 limit m,-1; //检索m+1到最后一条数据
SELECT * form 表名 WHERE 条件 limit x; //检索前x条数据


或者从外部取名字的字母排序最小的国家



⑨ALL的用法


⑩符合条件的国家它的人口不会满足题目要求,所以要去掉,此处若不带y.name != x.name 条件,得不到任何结果 (一般遇到“所有”,考虑ALL,想办法将ALL放到子查询前。注意:有些情况需要去除某条件为空,或者外查询和子查询重复的情况)

4.sum and count


①每个只有一次就是指没有重复值,用distinct函数


②Having用来指定分组对应的条件,having在group by后面;此时用having会出问题,不知道指定的条件在哪一列,若列名不包含在group by子句中,则不允许在having中出现;当不可以用having时,Having也可以用where代替,但写在group by前面


③当结果中有重复时,用distinct去除重复值;当结果仍然出错,理解清楚题目的意思,可以理解为对于每一个洲,即按照洲分组;用group by时,用having的话,可以是having后的条件是sum或者count等函数引导的,而且对于洲,应该为总人口


此时用where后面跟sum是错误的


5.join




①两张表合并



②Where在on的后面,通过联结条件ON,将两个表联结在一起(可不用括号联结),然后通过select语句查询只需要的变量,此时的变量包括两个表中的,通过where语句可以指定表里变量所指定的条件



③因为在表game中有id一列,表eteam中也有id一列,而且两者对应不同的内容,因此,需要再一个的前面加上表的名称,不能只写id


④球可以直接射入对方球门而得分, 求射入德国球门的球员名字,则参赛两队必然有一方为“德国”,其次射入德国球门的球员必然不是“德国”对的,应该是“德国”队的对手,所以入球球员的队伍编号不能为“德国”“GER”,所以必须加上条件 teamid!=“GER”, 可以用DISTINCT來防止球員出現兩次以上。


⑤按照条件分组



⑥goal.matchid, game.mdate在各自的表中都不唯一,即会重复出现,而我们想要展示的是一个赛事编号和一个日期想对应的,所以两者同时使用GROUP BY;对于是否在变量前加上表名,为了严谨最好都加上


⑦Select语句中的变量名写对,=不要写成==


⑧left join:是SQL语言中的查询类型,即连接查询。它的全称为左外连接(left outer join),是外连接的一种. left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的。换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID)。B表记录不足的地方均为NULL。此时order by也可以去除


6.more join

①从三张表中获取数据需要用两个join连接,而且需要用ON,AND连接两个条件


②求某明星最忙的一年,首先求出电影数目以及对应的年份



再求出电影数目最多所对应的年份,在原来代码上加上求最大值的限制作为HAVING语句,即先令电影数为c,再求MAX(C),此时不要忘了加AS t


将上面两部分组合后,需要求出电影数目最大的值和年份,注意最后的AS t,没有这个是不行的,注意嵌套的使用,having的使用


③求某明星出演过的电影以及第一主角,首先求出演員茱莉·安德絲'Julie Andrews'出演过哪些电影(电影名称)



这样是可以求出演过的电影名称,但是因为题目中已经提示有一个电影的名称出现了2次,对于后续的运算不好计算,因此通过id进行,将出演过得id作为where中的条件,再求这些电影中的第一主角



此时,编号20136有重复,放在子查询where中的第二个条件IN后面,此时应该用IN而不是=,因为有很多编号,而不是只有一个,通过distinct去除重复值,通过id索引方便点,用title会对重复值清不干净

④列出哪位演员曾做30次第一主角

⑤当直接通过count函数降序会出错,考虑先令其为一个变量,例如a,通过a排序


⑥先求出该演员曾经出演过得电影的编号,再通过编号去找除了这个演员之外的演员,将上面部分作为where子句中的IN后面的条件

7.using null



①inner join(等值连接) 只返回两个表中联结字段相等的行(交集)


②left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录


③right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

④COALESCE(x,y,z)按顺序取x或者y或者z的值,当x不为NULL,取x;当x为NULL,取y


⑤Select 也要将dept.name放进去

⑥Case when放在select后面,用,连接

⑦对3个条件时,用两次when,then

8.self join



①自连接(self join)是SQL语句中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。有点像LEFT JOIN。
inner join 在和自己连接时,虽然效果是一样的,但是在处理过程上,仍然是被当成了两张表,只不过这两张表是名称、结构都一样的表。在使用时,这样的连接是进行了笛卡尔集的连接,笛卡尔集进行的是自然连接,要去除重复的行。


















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

推荐阅读更多精彩内容

  • 感慨那些一路上陪我走过一段时间就消失的熟悉的陌生人。从小到大和父母在外地呆着,初中过后又回到了家乡,所以我没有发...
    浅笑只为你回眸阅读 177评论 0 0
  • 嘿,还记得这幅图吗? 让我想起了今早跑步的场景。 有条河边的路,我几个月前跑的时候,知道在它的尽头是个死胡同。所以...
    沐沐希阅读 252评论 0 3