SELECT 查询 101
Id | Title | Director | Year | Length_minutes |
---|---|---|---|---|
1 | Toy Story | John Lasseter | 1995 | 81 |
2 | A Bug\'s Life | John Lasseter | 1998 | 95 |
3 | Toy Story 2 | John Lasseter | 1999 | 93 |
4 | Monsters, Inc. | Pete Docter | 2001 | 92 |
5 | Finding Nemo | Finding Nemo | 2003 | 107 |
6 | The Incredibles | Brad Bird | 2004 | 116 |
7 | Cars | John Lasseter | 2006 | 117 |
8 | Ratatouille | Brad Bird | 2007 | 115 |
9 | WALL-E | Andrew Stanton | 2008 | 104 |
10 | Up | Pete Docter | 2009 | 101 |
11 | Toy Story 3 | Lee Unkrich | 2010 | 103 |
12 | Cars 2 | John Lasseter | 2011 | 120 |
13 | Brave | Brenda Chapman | 2012 | 102 |
14 | Monsters University | Dan Scanlon | 2013 | 110 |
-
【简单查询】找到所有电影的名称
title
SELECT title FROM movies;
-
【简单查询】找到所有电影的导演
select director from movies;
-
【简单查询】找到所有电影的名称和导演
select title, director from movies;
-
【简单查询】找到所有电影的名称和上映年份
select title, year from movies;
-
【简单查询】找到所有电影的所有信息
select * from movies;
-
【简单查询】找到所有电影的名称,Id和播放时长
select title, id, Length_minutes from movies;
条件查询 (constraints) (Pt. 1)
Id | Title | Director | Year | Length_minutes |
---|---|---|---|---|
1 | Toy Story | John Lasseter | 1995 | 81 |
2 | A Bug\'s Life | John Lasseter | 1998 | 95 |
3 | Toy Story 2 | John Lasseter | 1999 | 93 |
-
【简单条件】找到
id
为6的电影select * from movies where id = 6;
-
【简单条件】找到在2000-2010年间
year
上映的电影select * from movies where year >= 2000 and year <= 2010;
-
【简单条件】找到不是在2000-2010年间
year
上映的电影select * from movies where year < 2000 or year > 2010;
-
【简单条件】找到头5部电影
select * from movies where id <= 5;
-
【简单条件】找到2010(含)年之后的电影里片长小于两个小时的片子
select * from movies where year >= 2010 and Length_minutes < 120;
条件查询(constraints) (Pt. 2)
Operator(操作符) | Condition(解释) | Example(例子) |
---|---|---|
= | Case sensitive exact string comparison (notice the single equals)完全等于 | col_name = \"abc\" |
!= or <> | Case sensitive exact string inequality comparison 不等于 | col_name != \"abcd\" |
LIKE | Case insensitive exact string comparison 没有用通配符等价于 = | col_name LIKE \"ABC\" |
NOT LIKE | Case insensitive exact string inequality comparison 没有用通配符等价于 != | col_name NOT LIKE \"ABCD\" |
% | Used anywhere in a string to match a sequence of zero or more characters (only with LIKE or NOT LIKE) 通配符,代表匹配0个以上的字符 | col_name LIKE \"%AT%\" (matches \"AT\", \"ATTIC\", \"CAT\" or even \"BATS\") \"%AT%\" 代表AT 前后可以有任意字符 |
_ | Used anywhere in a string to match a single character (only with LIKE or NOT LIKE) 和% 相似,代表1个字符 | col_name LIKE \"AN_\" (matches \"AND\", but not \"AN\") |
IN (…) | String exists in a list 在列表 | col_name IN (\"A\", \"B\", \"C\") |
NOT IN (…) | String does not exist in a list 不在列表 | col_name NOT IN (\"D\", \"E\", \"F\") |
Id | Title | Director | Year | Length_minutes |
---|---|---|---|---|
1 | Toy Story | John Lasseter | 1995 | 81 |
2 | A Bug\'s Life | John Lasseter | 1998 | 95 |
3 | Toy Story 2 | John Lasseter | 1999 | 93 |
-
【复杂条件】找到所有
Toy Story
系列电影select * from movies where title like \"Toy Story%\";
-
【复杂条件】找到所有
John Lasseter
导演的电影select * from movies where director = \"John Lasseter\";
-
【复杂条件】找到所有不是
John Lasseter
导演的电影select * from movies where director <> \"John Lasseter\";
-
【复杂条件】找到所有电影名为
\"WALL-\"
开头的电影select * from movies where title like \"WALL-%\";
-
【复杂条件】有一部98年电影中文名《虫虫危机》请给我找出来
select * from movies where year = 1998;
查询结果Filtering过滤 和 sorting排序
DISTINCT
DISTINCT
语法介绍,以Movies表为例,可能很多电影都是同一年Year发布的,如果想要按年份排重,一年只能出现一部电影到结果中, 可以用 DISTINCT
关键字来指定某个或某些属性列唯一返回。写作:DISTINCT Year
选取出唯一的结果的语法:
SELECT DISTINCT column, another_column, …
FROM mytable
WHERE condition(s);
因为 DISTINCT
语法会直接删除重复的行, 我们还会学习 GROUP BY
语句, GROUP BY
也会返回唯一的行,不过可以对具有相同的 属性值的行做一些统计计算,比如:求和.
结果排序 (Ordering results)
为了解决结果排序问题, 我们可以用 ORDER BY col_name
排序的语法来让结果按一个或多个属性列做排序.
结果排序(ordered results)
SELECT column, another_column, …
FROM mytable WHERE condition(s)
ORDER BY column ASC/DESC;
ORDER BY col_name
这句话的意思就是让结果按照 col_name 列的具体值做 ASC升序 或 DESC 降序,对数字来说就是升序 1,2,3,... 或降序 ... 3,2,1 . 对于文本列,升序和降序指的是按文本的字母序。
通过Limit选取部分结果
LIMIT
和 OFFSET
子句通常和ORDER BY
语句一起使用,当我们对整个结果集排序之后,我们可以 LIMIT
来指定只返回多少行结果 ,用 OFFSET
来指定从哪一行开始返回。你可以想象一下从一条长绳子剪下一小段的过程,我们通过 OFFSET
指定从哪里开始剪,用 LIMIT
指定剪下多少长度。
limited查询
SELECT column, another_column, …
FROM mytable
WHERE condition(s)
ORDER BY column ASC/DESC
LIMIT num_limit OFFSET num_offset;
你可以想象一下一个新闻网站的新闻条目数据,他们在页面上是按热度和时间排序的,每一个页面只显示10条数据,在所有这些属性都是不断变化的情况下。我们可以想见通过SQL的ORDER LIMIT OFFSET
句法,我们可以根据要求从数据库筛选出需要的新闻条目.
题目
Id | Title | Director | Year | Length_minutes |
---|---|---|---|---|
1 | Toy Story | John Lasseter | 1995 | 81 |
2 | A Bug\'s Life | John Lasseter | 1998 | 95 |
3 | Toy Story 2 | John Lasseter | 1999 | 93 |
-
【结果排序】按导演名
排重
列出所有电影(只显示导演),并按导演名正序排列select distinct director from movies;
-
【结果排序】列出按上映年份
最新
上线的4部电影select * from movies order by year desc limit 4;
-
【结果排序】按电影名字母序
升序
排列,列出前5部电影select * from movies order by title asc limit 5;
-
【结果排序】按电影名字母序升序排列,列出上一题
之后
的5部电影select * from movies order by title asc limit 5 offset 5;
-
【结果排序】如果按片长排列,John Lasseter导演导过片长第3长的电影是哪部,列出名字即可
select title from movies where director = \"John Lasseter\" order by Length_minutes desc limit 1 offset 2;
复习 SELECT 查询
Table(表): North_american_cities
City | Country | Population | Latitude | Longitude |
---|---|---|---|---|
Guadalajara | Mexico | 1500800 | 20.659699 | -103.349609 |
Toronto | Canada | 2795060 | 43.653226 | -79.383184 |
Houston | United States | 2195914 | 29.760427 | -95.369803 |
在这个数据表中,你需要熟悉一下latitudes(纬度)和 longitudes(经度)的概念, latitudes在赤道以北是正数,以南是负数;longitudes在子午线东部是正数,以西是负数, 在查询中需要注意 经纬度和东西南北方向的对应关系。
-
【复习】列出所有加拿大人的信息(包括所有字段)
select * from north_american_cities where country = \"Canada\";
-
【复习】列出所有在
Chicago
西部的城市,从西到东排序(包括所有字段)select * from north_american_cities where Longitude < (select Longitude from north_american_cities where city = \"Chicago\") order by Longitude asc;
-
【复习】用人口数
population
排序,列出墨西哥Mexico
最大的2个城市(包括所有字段)select * from north_american_cities where country = \"Mexico\" order by population desc limit 2;
-
【复习】列出美国
United States
人口3-4位的两个城市和他们的人口(包括所有字段)select * from north_american_cities where country = \"United States\" order by population desc limit 2 offset 2;
-
列出所有美国United States的城市按纬度从北到南排序(包括所有字段)
select * from north_american_cities where country = \"United States\" order by Latitude desc;
-
北美所有城市,请按国家名字母序从A-Z再按人口从多到少排列看下前10位的城市(包括所有字段)
select * from north_american_cities order by Country asc, Population desc limit 10;
用JOINs进行多表联合查询
用JOINs进行多表联合查询
借助主键(primary key)
(当然其他唯一性的属性也可以),我们可以把两个表中具有相同 主键ID的数据连接起来(因为一个ID可以简要的识别一条数据,所以连接之后还是表达的同一条数据)(你可以想象一个左右连线游戏)。具体我们用到 JOIN
关键字。我们先来学习 INNER JOIN
.
用INNER JOIN 连接表的语法
SELECT column, another_table_column, …
FROM mytable (主表)
INNER JOIN another_table (要连接的表)
ON mytable.id = another_table.id
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
通过ON
条件描述的关联关系;INNER JOIN
先将两个表数据连接到一起. 两个表中如果通过ID互相找不到的数据将会舍弃。此时,你可以将连表后的数据看作两个表的合并,SQL中的其他语句会在这个合并基础上 继续执行(想一下和之前的单表操作就一样了).
练习
Table: Movies
Id | Title | Director | Year | Length_minutes |
---|---|---|---|---|
1 | Toy Story | John Lasseter | 1995 | 81 |
2 | A Bug\'s Life | John Lasseter | 1998 | 95 |
3 | Toy Story 2 | John Lasseter | 1999 | 93 |
Table: Boxoffice
Movie_id | Rating | Domestic_sales | International_sales |
---|---|---|---|
5 | 8.2 | 380843261 | 555900000 |
14 | 7.4 | 268492764 | 475066843 |
8 | 8 | 206445654 | 417277164 |
Id | Title | Director | Year | Length_minutes |
---|---|---|---|---|
1 | Toy Story | John Lasseter | 1995 | 81 |
2 | A Bug\'s Life | John Lasseter | 1998 | 95 |
3 | Toy Story 2 | John Lasseter | 1999 | 93 |
-
【联表】找到所有电影的国内
Domestic_sales
和国际销售额International_sales
Movies表+Boxoffice表的两个字段
select * from Movies inner join Boxoffice where Movies.id = Boxoffice.Movie_id;
Id Title Director Year Length_minutes Movie_id Rating Domestic_sales International_sales 1 Toy Story John Lasseter 1995 81 1 8.3 191796233 170162503 2 A Bug\'s Life John Lasseter 1998 95 2 7.2 162798565 200600000 -
【联表】找到所有国际销售额比国内销售大的电影
select * from Movies inner join Boxoffice where Movies.id = Boxoffice.Movie_id and Domestic_sales < International_sales;
-
【联表】找出所有电影按市场占有率
rating
倒序排列select * from Movies inner join Boxoffice where Movies.id = Boxoffice.Movie_id order by rating desc;
-
【联表】每部电影按国际销售额比较,排名最靠前的导演是谁,国际销量多少
select director, International_sales from Movies inner join Boxoffice where Movies.id = Boxoffice.Movie_id order by International_sales desc limit 1;
-
John Lasseter导演的每部电影每分钟值多少钱,告诉我最高的3个电影名和价值就可以
select title, (Domestic_sales + International_sales) / Length_minutes as min_val from Movies inner join Boxoffice on Movies.id = Boxoffice.Movie_id where Director = \"John Lasseter\" order by min_val desc limit 3;
外连接(OUTER JOINs)
INNER JOIN
只会保留两个表都存在的数据(还记得之前的交集吗),这看起来意味着一些数据的丢失,在某些场景下会有问题.
真实世界中两个表存在差异很正常,所以我们需要更多的连表方式,也就是本节要介绍的左连接LEFT JOIN
,右连接RIGHT JOIN
和 全连接FULL JOIN
. 这几个 连接方式都会保留不能匹配的行。
用LEFT/RIGHT/FULL JOINs 做多表查询
SELECT column, another_column, …
FROM mytable
INNER/LEFT/RIGHT/FULL JOIN another_table
ON mytable.id = another_table.matching_id
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
和INNER JOIN
语法几乎是一样的. 我们看看这三个连接方法的工作原理:
在表A 连接 B, LEFT JOIN
保留A的所有行,不管有没有能匹配上B 反过来 RIGHT JOIN
则保留所有B里的行。最后FULL JOIN
不管有没有匹配上,同时保留A和B里的所有行
练习
Table: Employees
Role | Name | Building | Years_employed |
---|---|---|---|
Engineer | Becky A. | 1e | 4 |
Engineer | Dan B. | 1e | 2 |
Engineer | Sharon F. | 1e | 6 |
Table: Buildings
Building_name | Capacity |
---|---|
1e | 24 |
1w | 32 |
2e | 16 |
-
【复习】找到所有有雇员的办公室(
buildings
)名字select distinct building from Employees where Building is not null;
-
【复习】找到所有办公室里的所有角色(包含没有雇员的),并做唯一输出(
DISTINCT
)select distinct Buildings.building_name, Employees.Role from Buildings left join Employees on Employees.Building = Buildings.Building_name;
-
【难题】找到所有有雇员的办公室(
buildings
)和对应的容量select distinct Building, Capacity from Buildings left join Employees on Employees.Building = Buildings.Building_name where Building is not null;
on & where 的区别
在使用left jion时,on和where条件的区别如下:
- on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
- where条件是在临时表生成 好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
关于特殊关键字 NULLs
Table: Employees
Role | Name | Building | Years_employed |
---|---|---|---|
Engineer | Becky A. | 1e | 4 |
Engineer | Dan B. | 1e | 2 |
Engineer | Sharon F. | 1e | 6 |
Table: Buildings
Building_name | Capacity |
---|---|
1e | 24 |
1w | 32 |
2e | 16 |
-
【复习】找到雇员里还没有分配办公室的(列出名字和角色就可以)
select distinct Name, Role from Employees left join Buildings where Building is null;
-
【难题】找到还没有雇员的办公室
select Building_name from Buildings left join Employees on Buildings.Building_name = Employees.Building where name is null;
思路:
先进行联表查询
Building_name Capacity Role Name Building Years_employed 1e 24 Engineer Becky A. 1e 4 1e 24 Engineer Dan B. 1e 2 1e 24 Engineer Dan M. 1e 4 1e 24 Engineer Malcom S. 1e 1 1e 24 Engineer Sharon F. 1e 6 1e 24 Manager Scott K. 1e 9 1e 24 Manager Shirlee M. 1e 3 1w 32 null null null null 2e 16 null null null null 2w 20 Artist Brandon J. 2w 7 2w 20 Artist Jakob J. 2w 6 2w 20 Artist Lillia A. 2w 7 2w 20 Artist Sherman D. 2w 8 2w 20 Artist Tylar S. 2w 2 2w 20 Manager Daria O. 2w 6 可看到一些行Building存在而name为空,这就是没有雇员的房间
Building_name Capacity Role Name Building Years_employed 1w 32 null null null null 2e 16 null null null null
在查询中使用表达式
Table: Movies (Read-Only)
Id | Title | Director | Year | Length_minutes |
---|---|---|---|---|
1 | Toy Story | John Lasseter | 1995 | 81 |
2 | A Bug\'s Life | John Lasseter | 1998 | 95 |
3 | Toy Story 2 | John Lasseter | 1999 | 93 |
Table: Boxoffice (Read-Only)
Movie_id | Rating | Domestic_sales | International_sales |
---|---|---|---|
5 | 8.2 | 380843261 | 555900000 |
14 | 7.4 | 268492764 | 475066843 |
8 | 8 | 206445654 | 417277164 |
-
【计算】列出所有的电影ID,名字和销售总额(以百万美元为单位计算)
select id, title, (Domestic_sales + International_sales) / 1000000 as total from movies inner join Boxoffice on movies.Id = Boxoffice.Movie_id;
-
【计算】列出所有的电影ID,名字和市场指数(
Rating
的10倍为市场指数)select id, title, Rating * 10 MarketIndex from movies inner join Boxoffice on movies.Id = Boxoffice.Movie_id;
-
【计算】列出所有偶数年份的电影,需要电影ID,名字和年份
select id, title, year from movies inner join Boxoffice on movies.Id = Boxoffice.Movie_id where year % 2 = 0;
-
【难题】John Lasseter导演的每部电影每分钟值多少钱,告诉我最高的3个电影名和价值就可以
select title, (Domestic_sales + International_sales) / Length_minutes as min_val from Movies inner join Boxoffice on Movies.id = Boxoffice.Movie_id where Director = \"John Lasseter\" order by min_val desc limit 3;
在查询中进行统计I (Pt. 1)
对全部结果数据做统计
SELECT
AGG_FUNC(column_or_expression) AS aggregate_description, … FROM mytable
WHERE constraint_expression;
如果不指明如何分组,那统计函数将对查询结果全部数据进行统计,当然每一个统计也可以像之前用AS来取一个别名,以增加可读性。
常见统计函数
下面介绍几个常用统计函数:
Function | Description |
---|---|
COUNT(), COUNT(column*) | 计数!COUNT(*) 统计数据行数,COUNT(column) 统计column非NULL的行数. |
MIN(column) | 找column最小的一行. |
MAX(column) | 找column最大的一行. |
AVG(column) | 对column所有行取平均值. |
SUM(column) | 对column所有行求和. |
分组统计
GROUP BY
数据分组语法可以按某个col_name对数据进行分组,如:GROUP BY Year
指对数据按年份分组, 相同年份的分到一个组里。如果把统计函数和GROUP BY
结合,那统计结果就是对分组内的数据统计了.
GROUP BY
分组结果的数据条数,就是分组数量,比如:GROUP BY Year
,全部数据里有几年,就返回几条数据, 不管是否应用了统计函数.
用分组的方式统计
SELECT
AGG_FUNC(column_or_expression) AS aggregate_description, … FROM mytable
WHERE constraint_expression
GROUP BY column;
练习
Table(表): Employees 全表查看
Role | Name | Building | Years_employed |
---|---|---|---|
Engineer | Becky A. | 1e | 4 |
Engineer | Dan B. | 1e | 2 |
Engineer | Sharon F. | 1e | 6 |
-
【统计】找出就职年份最高的雇员(列出雇员名字+年份)
select Name, max(Years_employed) from Employees;
-
【分组】按角色(
Role
)统计一下每个角色的平均就职年份select Role, avg(Years_employed) from Employees group by Role;
-
【分组】按办公室名字总计一下就职年份总和
select Building, sum(Years_employed) from Employees group by Building;
-
【难题】每栋办公室按人数排名,不要统计无办公室的雇员
select Building, count(*) as count from Employees where Building is not null group by Building;
在查询中进行统计II (Pt. 2)
在 GROUP BY
分组语法中,我们知道数据库是先对数据做WHERE
,然后对结果做分组,如果我们要对分组完的数据再筛选出几条如何办? (想一下按年份统计电影票房,要筛选出>100万的年份?)
一个不常用的语法 HAVING
语法将用来解决这个问题,他可以对分组之后的数据再做SELECT筛选.
用HAVING进行筛选
SELECT group_by_column,
AGG_FUNC(column_expression) AS aggregate_result_alias, … FROM mytable
WHERE condition
GROUP BY column
HAVING group_condition;
HAVING
和 WHERE
语法一样,只不过作用的结果集不一样. 在我们例子数据表数据量小的情况下可能感觉 HAVING
没有什么用,但当你的数据量成千上万属性又很多时也许能帮上大忙 .
Table(表): Employees 全表查看
Role | Name | Building | Years_employed |
---|---|---|---|
Engineer | Becky A. | 1e | 4 |
Engineer | Dan B. | 1e | 2 |
Engineer | Sharon F. | 1e | 6 |
-
【统计】统计一下Artist角色的雇员数量
select count(*) from Employees where Role = \"Artist\";
-
【分组】按角色统计一下每个角色的雇员数量
select Role, count(*) from Employees group by Role;
-
【分组】算出Engineer角色的就职年份总计
select sum(Years_employed) from Employees where Role = \"Engineer\";
-
【难题】按角色分组算出每个角色按有办公室和没办公室的统计人数(列出角色,数量,有无办公室,注意一个角色如果部分有办公室,部分没有需分开统计)
select Role, count(Role) as count, case when Building is null then 0 else 1 end as bn from Employees group by Role, bn;
查询执行顺序
介绍完了所有查询相关的语法,我们来把之前的所有语法集中到一个句子中.
这才是完整的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;
一个查询SQL的执行总是先从数据里按条件选出数据,然后对这些数据再次做一些整理处理,按要求返回成结果,让结果尽可能是简单直接的。因为一个 查询SQL由很多部分组成,所以搞清楚这些部分的执行顺序还挺重要的,这有助于我们更深刻的理解SQL执行过程.
查询执行顺序
-
FROM
和JOIN
FROM
或JOIN
会第一个执行,确定一个整体的数据范围. 如果要JOIN不同表,可能会生成一个临时Table来用于 下面的过程。总之第一步可以简单理解为确定一个数据源表(含临时表) -
WHERE
我们确定了数据来源
WHERE
语句就将在这个数据源中按要求进行数据筛选,并丢弃不符合要求的数据行,所有的筛选col属性 只能来自FROM
圈定的表. AS别名还不能在这个阶段使用,因为可能别名是一个还没执行的表达式 -
GROUP BY
如果你用了
GROUP BY
分组,那GROUP BY
将对之前的数据进行分组,统计等,并将是结果集缩小为分组数.这意味着 其他的数据在分组后丢弃. -
HAVING
如果你用了
GROUP BY
分组,HAVING
会在分组完成后对结果集再次筛选。AS别名也不能在这个阶段使用. -
SELECT
确定结果之后,
SELECT
用来对结果col简单筛选或计算,决定输出什么数据. -
DISTINCT
如果数据行有重复
DISTINCT
将负责排重. -
ORDER BY
在结果集确定的情况下,
ORDER BY
对结果做排序。因为SELECT
中的表达式已经执行完了。此时可以用AS别名. -
LIMIT
/OFFSET
最后
LIMIT
和OFFSET
从排序的结果中截取部分数据.
练习
Table: Movies (Read-Only)
Id | Title | Director | Year | Length_minutes |
---|---|---|---|---|
1 | Toy Story | John Lasseter | 1995 | 81 |
2 | A Bug\'s Life | John Lasseter | 1998 | 95 |
3 | Toy Story 2 | John Lasseter | 1999 | 93 |
Table: Boxoffice (Read-Only)
Movie_id | Rating | Domestic_sales | International_sales |
---|---|---|---|
5 | 8.2 | 380843261 | 555900000 |
14 | 7.4 | 268492764 | 475066843 |
8 | 8 | 206445654 | 417277164 |
-
【复习】统计出每一个导演的电影数量(列出导演名字和数量)
select Director, count(*) as count from Movies group by Director;
-
【复习】统计一下每个导演的销售总额(列出导演名字和销售总额)
select Director, sum(Domestic_sales + International_sales) as total from Movies inner join Boxoffice on Movies.id = Boxoffice.Movie_id group by Director;
-
【难题】按导演分组计算销售总额,求出平均销售额冠军(统计结果过滤掉只有单部电影的导演,列出导演名,总销量,电影数量,平均销量)
select Director, sumSales, countMovies, sumSales / countMovies as avgSales from ( select Director, sum(Domestic_sales + International_sales) as sumSales, count(title) as countMovies from movies inner join Boxoffice on movies.id = Boxoffice.Movie_id group by director having count(title) <> 1 ) order by avgSales desc limit 1;
Director Sum_a Count_a Sum_a/Count_a Pete Docter 1294159000 2 647079500 -
【变态难】找出每部电影和单部电影销售冠军之间的销售差,列出电影名,销售额差额
select ( select (Domestic_sales + International_sales) as sumSales from movies inner join Boxoffice on Movies.id = boxoffice.movie_id order by sumSales desc limit 1 ) - (Domestic_sales+International_sales) as saleDiff, title from movies inner join Boxoffice on Movies.id = boxoffice.movie_id order by saleDiff desc;
来源:https://www.cnblogs.com/li-shui/p/16326714.html
本站部分图文来源于网络,如有侵权请联系删除。