SQLZOO MORE JOIN參考答案(含表格樣式和解題思路)

通過這段時間做SQL 的題目,我發現解題思路難點主要有三個:
1:逆向思考,需要你從想要的答案逆向思考到如何從很多表中以怎樣的方式取出。
2:所以程序是從內至外而寫。
3:正確的找到每個表連接的主鍵,以合理的順序應用JOIN和GROUP BY
在這裏插入圖片描述
這次是針對SQLZOO中多表查詢所寫的練習題。

我是從第六題開始寫,前5題省略。

  1. Cast list for Casablanca

Obtain the cast list for ‘Casablanca’.

The cast list is the names of the actors who were in the movie.

Use movieid=11768, (or whatever value you got from the previous question)

思路:
1: 從 casting 表中 找到 movieid 對應的 actorid
2: 從actor 表中 找到 actorid 對應的 name

SELECT ac.name
FROM actor AS ac inner join casting AS ca
ON ac.id=ca.actorid
AND ca.movieid=11768

這種由於連接的表不多,我們也可以用子查詢的方法:

SELECT name 
FROM actor 
WHERE id in 
(SELECT actorid
FROM casting 
WHERE movieid = 11768)

可以注意到雖然列的名字不一樣(actorid & id)但是 子查詢的時候他也可以進行自動匹配

  1. Alien cast list

Obtain the cast list for the film ‘Alien’

思路:
1:從 movie 表中 找到 ‘Alien’ 對應的 id
2: 從 casting 表中 找到 movieid(1的 id) 對應的 actorid
3: 從actor 表中 找到 actorid 對應的 name

Select a.name from actor as a inner join (
Select c.actorid
From movie as m inner join casting as c
On m.id=c.movieid
And m.title Like 'Alien') as tmp
On tmp.actorid=a.id
  1. Harrison Ford movies

List the films in which ‘Harrison Ford’ has appeared

思路:
1:從 actor 表中 找到’Harrison Ford’ 對應的 id
2: 從 casting 表中 找到 actorid(1的 id) 對應的 movieid
3: 從 movie 表中 找到 id(2的movieid) 對應的 title

混淆點:
1:在SELECT 後面要知道自己提出來的是movieid 還是 actorid。


SELECT m.title
FROM movie m INNER JOIN
(SELECT c.movieid 
FROM actor a INNER JOIN casting c
ON a.id=c.actorid
AND a.name LIKE "Harrison Ford")tmp
ON tmp.movieid=m.id

  1. Harrison Ford as a supporting actor

List the films where ‘Harrison Ford’ has appeared - but not in the starring role. [Note: the ord field of casting gives the position of the actor. If ord=1 then this actor is in the starring role]

思路:
1:再上一題目的基礎上還要加一個ord!=1 的過濾

SELECT m.title
FROM movie m INNER JOIN
(SELECT c.movieid 
FROM actor a INNER JOIN casting c
ON a.id=c.actorid
AND a.name LIKE "Harrison Ford"
AND c.ord!=1)tmp
ON tmp.movieid=m.id
  1. Lead actors in 1962 movies

List the films together with the leading star for all 1962 films.

思路:
1.這個就在一個表上的簡單的條件查詢,答案如下 。

SELECT title ,directore
FROM movie
WHERE yr=1962

Harder Questions

  1. Busy years for Rock Hudson

Which were the busiest years for ‘Rock Hudson’, show the year and the number of movies he made each year for any year in which he made more than 2 movies.

SELECT yr
FROM movie m INNER JOIN
(SELECT a.name,b.movieid
FROM actor a INNER JOIN casting c
ON a.id=c.actorid
WHERE a.name LIKE 'Rock Hudson' ) tmp
ON m.id=tmp.movieid
GROUP BY yr
HAVING count(title)>2

簡單一點的寫法也可以先通過JOIN 建立一張大表,之後直接在裏面對你想要的條件進行搜索。

SELECT yr,count(title)
FROM movie m JOIN casting c
ON m.id=c.movieid
JOIN actor a 
ON a.id=c.actorid
WHERE a.name LIKE 'Rock Hudson'
GROUP BY yr
HAVING count(title)>2
  1. Lead actor in Julie Andrews movies

List the film title and the leading actor for all of the films ‘Julie Andrews’ played in.

#選出film title & leading actor
SELECT distinct(title),name
FROM movie m JOIN casting c
ON m.id=c.movieid
JOIN actor a 
ON a.id=c.actorid
WHERE c.ord=1
AND movieid IN
#他參演的所有電影的Movieid
(SELECT movieid
FROM casting c JOIN actor a
ON c.actorid=a.id
AND a.name='Julie Andrews')
  1. Actors with 15 leading roles

Obtain a list, in alphabetical order, of actors who’ve had at least 15 starring roles.

SELECT name 
FROM actor a 
JOIN casting c 
ON c.actorid = a.id 
WHERE c.ord=1 
GROUP BY a.name 
HAVING COUNT(movieid)>=15
ORDER BY name

  1. List the films released in the year 1978 ordered by the number of actors in the cast, then by title.

考點:

  1. JOIN
  2. GROUP BY
  3. order by

思路:
1:需要title & # of actor 說明需要從movie 和 casting 2個表中取出(JOIN)
2:# of actor需要分組求和之後求出(GROUP BY)

注意由於GB的特殊性,他的SELECT後面所能列出的列名有限,所以我傾向先將我們需要的所有信息儘可能用JOIN列在一張大表裏,在用GB進行分組。

3: 最後需要對NUM進行降序排列(desc)

SELECT m.title, COUNT(actorid) 
FROM movie m JOIN casting c
ON m.id=c.movieid
WHERE m.yr = 1978
GROUP BY title
ORDER BY COUNT(actorid) DESC,title 
  1. List all the people who have worked with ‘Art Garfunkel’.

考點:
存在類問題(很像Harder裏的第2題,應用到日常工作就是選取特定的某人蔘與的項目,購買的商品等)
我們用子查詢的方法獲得需要的數據,
再和另外的條件合在一起進行拼接

思路:

  1. 首先找到有他參加的movieid
  2. 最後把這些movieid對應的actorid找到再連接到對應的name
#將所有這些找到的數據列出,用!=將本人排除
SELECT a.name
FROM actor a 
JOIN casting c
on a.id=c.actorid
WHERE a.name!='Art Garfunkel'
#找到他所參演的movieid
AND c.movieid IN
( SELECT m.id
FROM movie m
JOIN casting c 
ON m.id=c.movieid
JOIN actor a
ON a.id=c.actorid
WHERE a.name='Art Garfunkel')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章