1. List all year and “Events” (films released time, people births time, people deaths time) that occurred between 1930 and 1935
刚学了union all,老师也要求我们用union all解决这个问题~ 难度不算大hh
union all 就是把 若干个select的结果都列出来,并且不去除重复项
相比 union 效率高很多,因为不用去重。。
SELECT m.year_released AS year,
m.title || '(' || c.country_name || ') was released' AS event
FROM movies m
JOIN
countries c ON c.country_code = m.country
WHERE m.year_released BETWEEN 1930 AND 1935
UNION ALL
SELECT p.born,
trim(coalesce(p.first_name, '') || ' ' || surname || 'was born')
FROM people p
WHERE p.born BETWEEN 1930 AND 1935
UNION ALL
SELECT p.died,
trim(coalesce(p.first_name, '') || ' ' || surname || 'died')
FROM people p
WHERE p.died BETWEEN 1930 AND 1935
ORDER BY year
2. Same as question1, pushed into a subquery to add a sort key
SELECT year,
event
FROM (
SELECT m.year_released AS year,
m.title || '(' || c.country_name || ') was released' AS event,
m.title AS sort_key
FROM movies m
JOIN
countries c ON c.country_code = m.country
WHERE m.year_released BETWEEN 1930 AND 1935
UNION ALL
SELECT born,
trim(coalesce(first_name, '') || ' ' || surname || 'was born'),
surname AS sort_key
FROM people
WHERE born BETWEEN 1930 AND 1935
UNION ALL
SELECT died,
trim(coalesce(first_name, '') || ' ' || surname || 'died'),
surname AS sort_key
FROM people
WHERE died BETWEEN 1930 AND 1935
)
ORDER BY year,
sort_key
3. Events that happened the year when the earliest “Devdas” was released
WITH earliest_devdas AS (
SELECT min(year_released) AS year
FROM movies
WHERE title = 'Devdas'
)
SELECT m.year_released AS year,
m.title || '(' || c.country_name || ') was released' AS event
FROM movies m
JOIN
countries c ON c.country_code = m.country
WHERE m.year_released = (
SELECT year
FROM earliest_devdas
)
UNION ALL
SELECT born,
trim(coalesce(first_name, '') || ' ' || surname || 'was born')
FROM people
WHERE born = (
SELECT year
FROM earliest_devdas
)
UNION ALL
SELECT died,
trim(coalesce(first_name, '') || ' ' || surname || ' died')
FROM people
WHERE died = (
SELECT year
FROM earliest_devdas
)
5. Films where Qi Shu played without Ge You. Illustrates that “except” isn’t really necessary
这里给出两个查询版本
版本1
SELECT m.title, m.country, m.year_released FROM ( SELECT c.movieid FROM credits c JOIN people p ON p.peopleid = c.peopleid WHERE p.first_name = 'Qi' AND p.surname = 'Shu' AND c.credited_as = 'A' AND c.movieid NOT IN ( SELECT c.movieid FROM credits c JOIN people p ON p.peopleid = c.peopleid WHERE p.first_name = 'You' AND p.surname = 'Ge' AND c.credited_as = 'A' ) ) F JOIN movies m ON m.movieid = F.movieid ORDER BY m.year_released
版本2
SELECT m.title, m.country, m.year_released FROM ( SELECT c.movieid FROM credits c JOIN people p ON p.peopleid = c.peopleid WHERE p.first_name = 'Qi' AND p.surname = 'Shu' AND c.credited_as = 'A' EXCEPT SELECT c.movieid FROM credits c JOIN people p ON p.peopleid = c.peopleid WHERE p.first_name = 'You' AND p.surname = 'Ge' AND c.credited_as = 'A' ) F JOIN movies m ON m.movieid = F.movieid ORDER BY m.year_released