sqlzoo错题解析汇总

1.world

sqlzoo错题解析汇总_第1张图片

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

sqlzoo错题解析汇总_第2张图片

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

sqlzoo错题解析汇总_第3张图片

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

sqlzoo错题解析汇总_第4张图片

④AND的优先级优于OR

sqlzoo错题解析汇总_第5张图片

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

sqlzoo错题解析汇总_第6张图片

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

sqlzoo错题解析汇总_第7张图片

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

sqlzoo错题解析汇总_第8张图片

⑧% %排除或者包含字符

sqlzoo错题解析汇总_第9张图片

2.nobel

sqlzoo错题解析汇总_第10张图片

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

sqlzoo错题解析汇总_第11张图片

②两个不同的人用OR连接

sqlzoo错题解析汇总_第12张图片

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

sqlzoo错题解析汇总_第13张图片

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

sqlzoo错题解析汇总_第14张图片

sqlzoo错题解析汇总_第15张图片

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

sqlzoo错题解析汇总_第16张图片

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

sqlzoo错题解析汇总_第17张图片

⑦没有即不等于,用NOT IN

sqlzoo错题解析汇总_第18张图片

sqlzoo错题解析汇总_第19张图片

⑧子查询里面也要用yr


sqlzoo错题解析汇总_第20张图片

sqlzoo错题解析汇总_第21张图片

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

sqlzoo错题解析汇总_第22张图片

sqlzoo错题解析汇总_第23张图片

3.select tutorial

sqlzoo错题解析汇总_第24张图片

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

sqlzoo错题解析汇总_第25张图片

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

sqlzoo错题解析汇总_第26张图片

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

sqlzoo错题解析汇总_第27张图片

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

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

sqlzoo错题解析汇总_第28张图片

⑤ALL的用法

sqlzoo错题解析汇总_第29张图片

⑥NULL的存在

sqlzoo错题解析汇总_第30张图片

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

sqlzoo错题解析汇总_第31张图片

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

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条数据

sqlzoo错题解析汇总_第32张图片

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


sqlzoo错题解析汇总_第33张图片

⑨ALL的用法

sqlzoo错题解析汇总_第34张图片

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

sqlzoo错题解析汇总_第35张图片

4.sum and count

sqlzoo错题解析汇总_第36张图片

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

sqlzoo错题解析汇总_第37张图片

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

sqlzoo错题解析汇总_第38张图片

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

sqlzoo错题解析汇总_第39张图片

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


sqlzoo错题解析汇总_第40张图片

5.join

sqlzoo错题解析汇总_第41张图片

sqlzoo错题解析汇总_第42张图片

sqlzoo错题解析汇总_第43张图片

①两张表合并

sqlzoo错题解析汇总_第44张图片

sqlzoo错题解析汇总_第45张图片

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

sqlzoo错题解析汇总_第46张图片

sqlzoo错题解析汇总_第47张图片

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

sqlzoo错题解析汇总_第48张图片

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

sqlzoo错题解析汇总_第49张图片

⑤按照条件分组

sqlzoo错题解析汇总_第50张图片

sqlzoo错题解析汇总_第51张图片

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

sqlzoo错题解析汇总_第52张图片

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

sqlzoo错题解析汇总_第53张图片

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

sqlzoo错题解析汇总_第54张图片

sqlzoo错题解析汇总_第55张图片

6.more join

sqlzoo错题解析汇总_第56张图片

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

sqlzoo错题解析汇总_第57张图片

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


sqlzoo错题解析汇总_第58张图片

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


sqlzoo错题解析汇总_第59张图片

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

sqlzoo错题解析汇总_第60张图片

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


sqlzoo错题解析汇总_第61张图片

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


sqlzoo错题解析汇总_第62张图片

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

④列出哪位演员曾做30次第一主角
sqlzoo错题解析汇总_第64张图片

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

sqlzoo错题解析汇总_第65张图片

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

sqlzoo错题解析汇总_第66张图片

7.using null

sqlzoo错题解析汇总_第67张图片

sqlzoo错题解析汇总_第68张图片

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

sqlzoo错题解析汇总_第69张图片

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

sqlzoo错题解析汇总_第70张图片

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

sqlzoo错题解析汇总_第71张图片

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

sqlzoo错题解析汇总_第72张图片

⑤Select 也要将dept.name放进去

sqlzoo错题解析汇总_第73张图片

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

sqlzoo错题解析汇总_第74张图片

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

sqlzoo错题解析汇总_第75张图片

8.self join



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

sqlzoo错题解析汇总_第76张图片


sqlzoo错题解析汇总_第77张图片


sqlzoo错题解析汇总_第78张图片


sqlzoo错题解析汇总_第79张图片


sqlzoo错题解析汇总_第80张图片









你可能感兴趣的:(sqlzoo错题解析汇总)