SQLzoo练习题 6 合拼兩個表格

该博客介绍了如何使用SQL查询来处理足球比赛和音乐数据库的数据,涉及了JOIN、CASE、GROUP BY等操作。通过示例查询展示了如何查找特定球队的进球数据、赛事详情、教练信息、进球球员以及歌曲在专辑中的分布情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

足球賽數據庫

CASE允许您在不同条件下返回不同的值。
如果没有条件匹配(并且没有ELSE),则返回NULL。

  CASE WHEN condition1 THEN value1 
       WHEN condition2 THEN value2  
       ELSE def_value 
  END

1.第一個例子列出球員姓氏為’Bender’的入球數據。 * 表示列出表格的全部欄位,簡化了寫matchid, teamid, player, gtime語句。
修改此SQL以列出 賽事編號matchid 和球員名 player ,該球員代表德國隊Germany入球的。要找出德國隊球員,要檢查: teamid = 'GER’

SELECT matchid,player
FROM goal 
WHERE teamid='GER'

2.由以上查詢,你可見Lars Bender’s 於賽事 1012入球。.現在我們想知道此賽事的對賽隊伍是哪一隊。
留意在 goal 表格中的欄位 matchid ,是對應表格game的欄位id。我們可以在表格 game中找出賽事1012的資料。
只顯示賽事1012的 id, stadium, team1, team2

SELECT id,stadium,team1,team2
FROM game
where id=1012

3.我們可以利用JOIN來同時進行以上兩個步驟。
SELECT *
FROM game JOIN goal ON (id=matchid)
語句FROM 表示合拼兩個表格game 和 goal的數據。語句 ON 表示如何找出 game中每一列應該配對goal中的哪一列 – goal的 id 必須配對game的 matchid 。 簡單來說,就是
ON (game.id=goal.matchid)
以下SQL列出每個入球的球員(來自goal表格)和場館名(來自game表格)
修改它來顯示每一個德國入球的球員名,隊伍名,場館和日期。

SELECT player,teamid,stadium,mdate
FROM game JOIN goal ON (id=matchid)
where teamid='GER'

4.使用上題相同的 JOIN語句,
列出球員名字叫Mario (player LIKE ‘Mario%’)有入球的 隊伍1 team1, 隊伍2 team2 和 球員名 player

select team1,team2,player
from game join goal on(id=matchid)
where player like 'Mario%'

5.表格eteam 貯存了每一國家隊的資料,包括教練。你可以使用語句 goal JOIN eteam on teamid=id來合拼 JOIN 表格goal 到 表格eteam。
列出每場球賽中首10分鐘gtime<=10有入球的球員 player, 隊伍teamid, 教練coach, 入球時間gtime

SELECT player,teamid,coach,gtime
FROM goal join eteam on(teamid=id)
WHERE gtime<=10

6.要合拼JOIN 表格game 和表格 eteam,你可以使用
game JOIN eteam ON (team1=eteam.id)
或game JOI

### 如何在 SQL Server 中使用 PIVOT 函数来并字符 在 SQL Server 中,`PIVOT` 运算符主要用于将行数据转换为列数据。然而,默认情况下 `PIVOT` 的聚函数通常是数值型操作(如求和、计数等),而直接用于字符串类型的字段则需要些额外处理[^1]。 为了实现通过 `PIVOT` 来并字符的功能,可以采用以下方式: #### 方法概述 由于 `PIVOT` 需要个聚函数作为其核心部分,在处理字符串时通常会结 `FOR XML PATH('')` 或者其他字符串连接技术来完成字符的接[^5]。 以下是具体示例代码展示如何利用 `PIVOT` 和辅助技巧来并字符: ```sql -- 创建测试表并插入样例数据 CREATE TABLE ExampleTable ( ID INT, Category NVARCHAR(50), Value NVARCHAR(50) ); INSERT INTO ExampleTable (ID, Category, Value) VALUES (1, 'A', 'Apple'), (2, 'B', 'Banana'), (3, 'A', 'Apricot'), (4, 'C', 'Cherry'); -- 查询前的数据结构 SELECT * FROM ExampleTable; -- 使用 STRING_AGG 替代复杂逻辑(适用于 SQL Server 2017 及以上版本) SELECT Category, STRING_AGG(Value, ', ') AS MergedValues FROM ExampleTable GROUP BY Category; -- 如果不支持 STRING_AGG,则可以通过 FOR XML PATH 实现类似的字符串接效果 WITH ConcatenatedData AS ( SELECT Category, STUFF(( SELECT ',' + T2.Value FROM ExampleTable T2 WHERE T1.Category = T2.Category ORDER BY T2.ID -- 确保顺序致 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') , 1, 1, '') AS CombinedValue FROM ExampleTable T1 GROUP BY Category ) -- 将接后的结果应用到 PIVOT 上 SELECT * FROM ConcatenatedData PIVOT ( MAX(CombinedValue) -- 使用最值或其他适的聚函数 FOR Category IN ([A], [B], [C]) ) AS PivotTable; ``` 上述代码展示了两种不同的方法: 1. **STRING_AGG**: 更加简洁高效的方式,适高版本 SQL Server。 2. **FOR XML PATH**: 对于低版本数据库环境下的替代方案,能够手动构建字符串组逻辑。 最终的结果将是按照指定类别汇总所有关联值,并将其展现在单行中的不同列上。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值