SQL入门笔记2——子查询,JOIN,GROUP BY
一、SELECT 子查询
例1.SQLZOO:SELECT within SELECT
T7、在每一個州中找出最大面積的國家,列出洲份 continent, 國家名字 name 及面積 area。 (有些國家的記錄中,AREA是NULL,沒有填入資料的。)
SELECT continent,name,area FROM world x WHERE x.area >=ALL (SELECT area FROM world y WHERE x.continent=y.continent AND area>0)
在子查询句子中,如果需要将表中的数据自己与自己对比,就需要将表的名字加一个别名,如上例中的x,y
例1.SQLZOO:SELECT within SELECT
T8.列出洲份名稱,和每個洲份中國家名字按子母順序是排首位的國家名。(即每洲只有列一國)
SELECT continent,name FROM world x WHERE x.name=(SELECT name FROM world y WHERE x.continent=y.continent ORDER BY name LIMIT 1) /*LIMIT 用在SELECT中,强制返回指定的记录数。LIMIT n(LIMIT 0,n)返回前n条记录*/
二、JOIN和GROUP BY
例一:SQLZOO:The JOIN operation
T9:列出隊伍名稱 teamname 和該隊入球總數
COUNT and GROUP BY
SELECT teamname,COUNT(teamid) FROM eteam JOIN goal ON eteam.id=goal.teamid GROUP BY goal.teamid
提示:gisq:eteam.teamname isn’t in group by
SELECT teamname,COUNT(teamid) FORM eteam JOIN goal ON eteam.id=goal.teamid GROUP BY eteam.teamname
该答案正确,猜想:是否group by 后面一定要跟SELECT后的列名
例二:T13:List every match with the goals scored by each team as shown. This will use “CASE WHEN” which has not been explained in any previous exercises.
mdate team1 score1 team2 score2
1 July 2012 ESP 4 ITA 0
10 June 2012 ESP 1 ITA 1
10 June 2012 IRL 1 CRO 3
…
Notice in the query given every goal is listed. If it was a team1 goal then a 1 appears in score1, otherwise there is a 0. You could SUM this column to get a count of the goals scored by team1. Sort your result by mdate, matchid, team1 and team2.
SELECT mdate,team1,SUM( CASE WHEN game.team1=goal.teamid THEN 1 ELSE 0 END) AS score1, team2,SUM( CASE WHEN game.team2=goal.teamid THEN 1 ELSE 0 END)AS score2 From game LEFT JOIN goal ON game.id=goal.matchid GROUP BY mdate,matchid,team1,team2
注:
1、在上题正确结果中,group by中的参数多于SELECT后的,因而推断GROUP BY后的必须有SELECT中的,但可以比它多
验证:将上题中的GROUP BY 后的mdate删除,果然提示错误:’gisq.game.mdate’ isn’t in GROUP BY
2、上题中的JOIN 是使用的 “LEFT JOIN”,因为有可能一场比赛中有可能两个球队没有得分,若是用JOIN 则是至少有一个得分才显示,可能将都没有得分的忽略
例三:SQLZOO:More JOIN operation
T12:尊·特拉華達’John Travolta’最忙是哪一年? 顯示年份和該年的電影數目。
SELECT yr,COUNT(title) FROM movie JOIN casting ON movie.id=movieid JOIN actor ON actorid=actor.id where name='John Travolta' GROUP BY yr HAVING COUNT(title)=(SELECT MAX(c) FROM (SELECT yr,COUNT(title) AS c FROM movie JOIN casting ON movie.id=movieid JOIN actor ON actorid=actor.id where name='John Travolta' GROUP BY yr) AS t )
以上为原文提示答案
个人答案
SELECT yr,COUNT(title) FROM movie JOIN casting ON movie.id=casting.movieid JOIN actor ON actor.id=casting.actorid WHERE actor.name='John Travolta' GROUP BY yr OEDER BY COUNT(title) DESC LIMIT 1
以上主要示例三个表如何连接
阅读更多- sql 入门经典(第五版) Ryan Stephens 学习笔记 第四部分:建立复杂的数据库查询/
- 笔记:Oracle SQL 高级查询简介 (1) case、层次化、扩展group by
- java 从零开始,学习笔记之基础入门<SQL_Server_常用查询>(二十二)
- 小白入门笔记——sql查询200项以后的数据
- SQL查询艺术学习笔记--SQL事务处理 隔离 锁 与 并发操作
- hadoop学习笔记之HiveSQL 数据查询
- Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页
- 浅谈SQL优化入门:1、SQL查询语句的执行顺序
- 关于SQLServer2005的学习笔记——SQL查询解析步骤
- SQL入门学习笔记1.0
- SQL查询入门(上篇) 推荐收藏
- SQL:查询学习笔记
- SQL学习笔记4 分组 子查询 联结
- SQL 学习笔记<三> SELECT之连接查询
- 数据库排名sql,group by 分组查询按照时间最大值
- SQL查询入门(下篇)
- sql联合查询 JOIN和UNION区别
- 两个sql查询语句之间的左连接left join
- SQL笔记(7)_第七章 数据库查询
- Blog.objects.filter()反查外键,django数据库models中的跨表查询,相当于sql的join