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 在和自己连接时,虽然效果是一样的,但是在处理过程上,仍然是被当成了两张表,只不过这两张表是名称、结构都一样的表。在使用时,这样的连接是进行了笛卡尔集的连接,笛卡尔集进行的是自然连接,要去除重复的行。
②
③
④
⑤
⑥
⑦
⑧