第六章 组合查询和联表查询
- 子查询概念:嵌套在其他查询中的查询被称为子查询。
- 组合查询:可以从多个表获取数据,然后将所有这些数据或者数据自己组合成一个结果集返回的查询为组合查询。
- 组合查询关键字:union、union all、intersect和except(oracle里是minus)
- 联表查询:分为内联接(join)和左外联接(left join),右外联接(right join)。
- 子查询示例:
-- 显示GDP超过所有Africa国家总和的国家
–通过第一次查询的结果作为第二次查询的条件
SELECT * FROM bbc WHERE gdp>(SELECT SUM(gdp) FROM bbc WHERE region='Africa' ); - 组合查询示例:
union关键字的使用:
-- 查询将表products和competitorProducts组合后三个列的数据
select productID,productName,productCost from products union select str(ID),Name,Cost from competitorProducts;-- 两个数据集联合后将包含每个数据集的每个成员,但是每个成员只被计数一次,如:{1,2,3,4}union{3,4,5,6}后得到的是{1,2,3,4,5,6}
union all关键字的使用:
-- 同样查询将表products和competitorProducts组合后三个列的数据
select productID,productName,productCost from products union select str(ID),Name,Cost from competitorProducts;-- 两个数据集联合后将包含每个数据集的所有成员,不考虑重复,如:{1,2,3,4}union{3,4,5,6}后得到的是{1,2,3,3,4,4,5,6}
intersect关键字的使用:
-- 同样查询将表products和competitorProducts组合后三个列的数据
select productID,productName,productCost from products union select str(ID),Name,Cost from competitorProducts;-- 两个数据集联合后只返回在两个查询都出现的行,如:{1,2,3,4}union{3,4,5,6}后得到的是{3,4}
except关键字的使用:
-- 同样查询将表products和competitorProducts组合后三个列的数据
select productID,productName,productCost from products union select str(ID),Name,Cost from competitorProducts;-- 两个数据集联合后只返回在一个查询中出现但是不在另个一个查询中出现的行,如:{1,2,3,4}union{3,4,5,6}后得到的是{1,2,5,6} - 联表查询示例:
`– 找出包含song(歌曲)’Alison’的专辑title(名称)和artist(作者)
SELECT album.title,album.artist FROM album LEFT JOIN track
ON track.album=album.albumCode WHERE track.song=’Alison’;
– 哪个artist(作者)录制了song(歌曲)’Exodus’
SELECT album.artist FROM album LEFT JOIN track ON track.album=album.albumCode
WHERE track.song=’Exodus’;
– 列出track(曲目表)中所有属于’Blur’ album(专辑)的song(歌曲)
SELECT a.title,t.song FROM album a LEFT JOIN track t ON t.album=a.albumCode
WHERE a.title=’Blur’;
– 显示每张album(专辑)的title(名称)和包含track曲目数
SELECT a.title,COUNT(t.song) FROM album a LEFT JOIN track t ON t.album=a.albumCode GROUP BY a.title;
– 显示每张album(专辑)的title(名称),以及曲目名称中包含’Heart’的曲目总数
SELECT a.title,COUNT(t.song) FROM album a LEFT JOIN track t
ON t.album=a.albumCode WHERE a.title LIKE ‘%Heart%’ GROUP BY a.title;
SELECT a.title,COUNT(t.song) FROM album a , track t
WHERE t.album=a.albumCode AND a.title LIKE ‘%Heart%’ GROUP BY a.title;
– 找出所有song(歌名)和title(专辑名)相同的曲目
SELECT t.song FROM track t LEFT JOIN album a ON t.album=a.albumCode WHERE t.song=a.title;
– 找出所有专辑名(title)和artist(作者名)相同的专辑
SELECT a.title FROM album a WHERE a.title=a.artist;
– 找出在两张以上专辑中出现过的歌曲,同时包含出现的次数
SELECT t.song,COUNT(t.song) FROM track t LEFT JOIN album a ON
t.album=a.albumCode GROUP BY t.song HAVING COUNT(t.song)>2;
– 找出每首歌曲的定价低于0.5的专辑,显示专辑标题、价格和曲目总数
SELECT a.title,a.price,COUNT(t.song)FROM album a LEFT JOIN track t
ON t.album=a.albumCode GROUP BY a.title HAVING a.price/COUNT(t.song)<=0.5;
– 按专辑包含曲目多少从多到少依次列出专辑名称(title)和包含曲目总数
SELECT a.title,COUNT(t.song) FROM album a LEFT JOIN track t
ON t.album=a.albumCode GROUP BY a.title ORDER BY COUNT(t.song) DESC;`