至此,SELECT查询的基础学完了,这一节的练习题有一些很不容易写出来,只能先这样,之后温故知识,多练习,慢慢熟悉。
基础语法
一个完整的的SELECT查询
SELECT DISTINCT column, AGG_FUNC(column_or_expression), …
FROM mytable
JOIN another_table
ON mytable.column = another_table.column
WHERE constraint_expression
GROUP BY column
HAVING constraint_expression
ORDER BY column ASC/DESC
LIMIT count OFFSET COUNT;
- FROM 和 JOIN
我们确定了数据来源
FROM
或 JOIN
会第一个执行,确定一个整体的数据范围. 如果要JOIN不同表,可能会生成一个临时Table来用于 下面的过程。总之第一步可以简单理解为确定一个数据源表(含临时表)。
- WHERE
按要求进行数据筛选,丢弃不符合要求的数据行。
- GROUP BY
GROUP BY 将对之前的数据进行分组,统计等,并将是结果集缩小为分组数.这意味着 其他的数据在分组后丢弃.
- HAVING
如果你用了 GROUP BY 分组, HAVING 会在分组完成后对结果集再次筛选。AS别名也不能在这个阶段使用.
- SELECT
确定结果之后,SELECT用来对结果col简单筛选或计算,决定输出什么数据.
- DISTINCT
如果数据行有重复DISTINCT 将负责排重.
- ORDER BY
排序
- LIMIT / OFFSET
截取
练习
练习题出自自学SQL。
- 统计出每一个导演的电影数量(列出导演名字和数量)
SELECT director,COUNT(director) FROM movies
GROUP by director;
查询所有的director数据,并新增一列熟练。GROUP by对director进行分组。
下面这些初学就不是很容易写出来了,参考答案理解语句
- 统计一下每个导演的销售总额(列出导演名字和销售总额)
SELECT director,SUM(Domestic_sales+International_sales)as sales FROM movies
LEFT JOIN Boxoffice
ON movies.Id=Boxoffice.Movie_id
GROUP BY director;
- 按导演分组计算销售总额,求出平均销售额冠军(统计结果过滤掉只有单部电影的导演,列出导演名,总销量,电影数量,平均销量)
SELECT director,sum(Domestic_sales+International_sales)as sales,COUNT(director),
SUM(Domestic_sales+International_sales)/COUNT(director) as avgsales FROM movies
LEFT JOIN Boxoffice
ON movies.Id=Boxoffice.Movie_id
GROUP BY director
HAVING Count(Director)>1
ORDER BY Avgsales DESC
LIMIT 1
- 找出每部电影和单部电影销售冠军之间的销售差,列出电影名,销售额差额
SELECT title ,(SELECT max(international_sales+domestic_sales) FROM boxoffice)-(international_sales+domestic_sales) FROM movies
LEFT JOIN boxoffice ON movies.id=boxoffice.movie_id