SQL语言 - 多表连接(1)

之前都是操作单张表的数据库。在真实的数据库中,肯定会大量的设计到多表之间的连接,多表的设计正是关系型数据库的一大特点之一。因此掌握多表的查询也是学习数据库的重点之一。多表连接一般分为内连接、外连接和自连接。下面仍然结合相关练习来学习内连接。
相关练习的数据库请参看:http://www.sqlzoo.cn/album.htm
练习题地址:http://www.sqlzoo.cn/3a.htm
练习题答案及分析:
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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值