1a. 找出包含song(歌曲) ‘Alison‘的专辑 title(名称) 和 artist(作者)
SELECT title, artist
FROM album JOIN track ON (album.asin=track.album)
WHERE song = ‘Alison‘
这种表与表之间的连接方式也称为笛卡尔积。也就是第一张表上的一行都会逐个与第二张表的所有行连接,然后再喊另外一行,依次类推,直到第一张表的所有行都连接完。那么连接后的行数就是第一张表的行数*第二张表的行数。可见这样的连接非常的消耗资源浪费空间,因此我们需要在两张表上建立一种关系,通过这种关系去掉所有多余的行。这里我们就使用了album.asin=track.album来建立两张表的关系。
1b. 哪个artist(作者)录制了song(歌曲) ‘Exodus‘?
SELECT artist
FROM album JOIN track ON (asin=album)
WHERE song = ‘Exodus‘
1c. 列出track(曲目表)中所有属于‘Blur‘album(专辑)的 song(歌曲)
SELECT song
FROM album JOIN track ON (asin=album)
WHERE title = ‘Blur‘
2a. 显示每张album(专辑)的title(名称) 和包含的track曲目数.
SELECT title, COUNT(*)
FROM album JOIN track ON (asin=album)
GROUP BY title
这道题在连接两张表后又加上了分组。当两张表连接完后,就相当于在一张表上操作。
2b. 显示每张album(专辑)的 title(名称) 以及曲目名称中包含‘Heart‘的曲目总数. (如果专辑中如果没有满足条件的曲目,则不要显示该专辑.).
SELECT title, COUNT(*)
FROM album JOIN track ON (asin=album)
WHERE song LIKE ‘%Heart%‘
GROUP BY title
注意:如果要在分组的表上使用WHERE过滤,那么必须将WHERE语句写在GROUP BY 的前面
2c. "title track" (主打曲目)就是song(歌名)和 title(专辑名)相同的曲目. 请找出所有的title tracks(主打曲目).
SELECT song
FROM album JOIN track ON (asin=album)
WHERE song = title
2d. An "eponymous" album(同名专辑)就是专辑名和artist(作者名)相同的专辑. (例如,乐队 ‘Blur‘的专辑‘Blur‘就是同名专辑 ). 请列出eponymous albums(同名专辑).
SELECT title
FROM album
WHERE artist = title
这道题并没有使用表连接。
3a. 找出在两张以上专辑中出现过的歌曲.同时包含出现的次数.
SELECT song, COUNT(*)
FROM album JOIN track ON asin=album
GROUP BY song
HAVING COUNT(*)>2
这道题使用了Having语句,因为只有having语句可以使用聚合函数,Where语句则不行。
3b. A "good value" album (一张物超所值的专辑)就是专辑中每首歌曲的定价低于 50 pence(便士)的专辑.请找出这些专辑,并显示 title(专辑标题), the price(专辑价格)和 the number of tracks(曲目总数).
SELECT title, price, COUNT(song)
FROM album JOIN track ON asin=album
GROUP BY title, price
HAVING price/COUNT(song) < 0.50
我在做这道题的时候想了很久,结果老是不正确,并不是这道题的SQL语法有多难,而是这道题的题意不好理解,起初我以为50便士就是50元,直接用< 50来做,怎么也不对,后来我才知道50便士其实相当于RMB的5毛,那么就应该是0.5,看来地域的差异也会影响到程序的不同。
3c. Wagner‘s Ring cycle 的专辑有 173 tracks(曲目), Bing Crosby 的专辑包含101 tracks(曲目).请根据专辑中包含曲目的多少,从多到少依次列出这些专辑的名称和包含的总曲目数.
SELECT title, COUNT(asin)
FROM album JOIN track ON asin=album
GROUP BY asin,title
ORDER BY 2 DESC