首页 > 试题广场 >

大学生春季运动会的数据库,保存了比赛信息的三个表如下:运动员

[单选题]
大学生春季运动会的数据库,保存了比赛信息的三个表如下:
运动员 sporter(运动员编号 sporterid,姓名name,性别 sex,所属系号 department),
项目 item(项目编号 itemid,名称 itemname,比赛地点 location), 成绩 grade(运动员编号 id,项目编号 itemid,积分 mark)。
用SQL语句完成在“体育馆”进行比赛的各项目名称及其冠军的姓名,正确的是:(      )。
  • SELECT i.itemname,s.name FROM grade g,
    (SELECT itemid iid,MAX(mark) max FROM grade WHERE itemid IN ( SELECT itemid FROM item WHERE location='体育馆') GROUP BY itemid) temp,item i,sporter s
    WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;
  • SELECT i.itemname,s.name FROM grade g,
    (SELECT itemid iid,MIN(mark) max FROM grade WHERE itemid IN ( SELECT itemid FROM item WHERE location='体育馆') GROUP BY itemid) temp,item i,sporter s
    WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;
  • SELECT i.itemname,s.name FROM grade g,
    (SELECT itemid iid,MAX(mark) max FROM grade WHERE itemid IN ( SELECT itemid FROM item WHERE location='体育馆') ) temp,item i,sporter s
    WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;
  • SELECT i.itemname,s.name FROM grade g,
    (SELECT itemid iid,MIN(mark) max FROM grade WHERE itemid IN ( SELECT itemid FROM item WHERE location='体育馆') GROUP BY itemid) temp,item i,sporter s
    WHERE g.itemid=temp.iid AND g.mark=temp.max AND
这样应该能清晰一点
1,首先找出在“体育馆”中进行的比赛项目id;
SELECT itemid
FROM item
WHERE location='体育馆'
2,然后在成绩表中根据项目id进行分组后找出单个项目最高分;
SELECT itemid iid,MAX(mark) max 
FROM grade 
WHERE itemid IN ( SELECT itemid FROM item WHERE location='体育馆') //条件限制地点在体育馆
GROUP BY itemid
3,接下来将上面含有项目id和项目最高分信息的表与另外三张表连接;
grade g, (上面含有项目最高分信息的表) temp, item i,sporter s 
WHERE g.itemid=temp.iid 
AND g.mark=temp.max 
AND temp.iid=i.itemid 
AND s.sporterid=g.sporterid
4,最后按要求从连接后的表中选出项目名称和冠军姓名。
SELECT i.itemname,s.name 
FROM (以上连接后的表)
发表于 2020-05-12 11:33:45 回复(21)
首先要根据条件“体育馆” 在item表中进行查询;但还有条件,"各项目名称"为返回结果,故这里应该有一个分组;所以C直接排出;而D明显是sql语句错误故排除;剩下AB选项;又因为要查询"冠军",所以就要查询第一名喽,只能用MAX函数;故A
发表于 2021-07-02 18:30:44 回复(0)
已经晕了
发表于 2021-02-18 17:47:46 回复(0)
<p>。。这题是考眼力呢吧</p>
发表于 2020-09-10 10:59:58 回复(0)

1、先找到体育馆的所有项目id: SELECT itemid FROM item WHERE location='体育馆' = xid(假设是xid)

2、再找到所有项目对应的最高分: SELECT itemid iid ,MAX(mark) max  FROM grade   WHERE itemid IN (xid…)  GROUP BY itemid = Temp

3、输出复合条件的结果: SELECT i.itemname,s.name FROM grade g,Temp temp,item i,sporter s WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;

发表于 2020-04-23 17:20:36 回复(0)
不用group by会怎样?

发表于 2020-03-05 10:48:11 回复(2)

大家一起找不同,将三个表连接起来需要2个AND,挑最大分数需要1个AND,所以where中一共需3个AND。故排除D。A和B的不同在于MAX、MIN函数,排除B。各项目的冠军,所以得有Group By,故排除C。

编辑于 2020-04-17 20:00:31 回复(6)
这题字太多了,

SELECT i.itemname,s.name

FROM grade g,

(SELECT itemid iid,MAX(mark) max 

FROM grade  

WHERE itemid IN (

SELECT itemid

FROM item 

WHERE location='体育馆')        

GROUP BY itemid) as temp

temp,item i,sporter s

WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;

分段看就明白了。
编辑于 2019-09-09 16:39:53 回复(10)

这道题,我直接

起飞!

先蒙一手C

不慌

有缘再见

芜湖!

发表于 2020-09-25 20:06:46 回复(0)

先写出一个含有最高成绩表temp(对项目进行分组求最高分,不会单独显示运动员id了,因此之后要联结这个原grade表才能有运动员id才能再联结sporter来确定name):

(select itemid iid,max(mark) max from grade where itemid in(select itemid from item where location=’体育馆’ ) group by itemid) temp;

要根据最高成绩表temp中itemid→联结项目表item得到itemname

原成绩表grade中运动员id→联结运动员表sporter得到姓名name

因此,是要把temp与其他3个表联结起来:

Select i.itemname,s.name from grade g,(select itemid iid,max(mark) max from grade where itemid in(select itemid from item where location=’体育馆’ ) temp,item i,sporter s where g.itemid=temp.iid and g.mark=temp.max and temp.itemid=i.itemid and s.sporterid=g.id;

编辑于 2020-07-04 11:23:31 回复(2)
其实A 选项也不够严谨, 最后条件s.sporterid=g.sporterid 改为s.sporterid=g.id 
发表于 2020-02-25 10:38:11 回复(3)
SELECT 
  i.itemname,
  s.name 
FROM
  grade g,
  (SELECT 
    itemid iid,
    MAX(mark) max
  FROM
    grade 
  WHERE itemid IN 
    (SELECT 
      itemid 
    FROM
      item 
    WHERE location = '体育馆&(5597)#39;) 
  GROUP BY itemid) temp,
  item i,
  sporter s 
WHERE g.itemid = temp.iid 
  AND g.mark = temp.max 
  AND temp.iid = i.itemid 
  AND s.sporterid = g.sporterid ;

结构:
1:查出 在体育馆 比赛,含有冠军信息的项目。
2:四表 进行一个 联立,查出信息。
总觉得 还可以优化,来个 高手优化下。

发表于 2020-04-23 10:38:15 回复(0)
答案A的思路:
1. 按照项目编号分组,提取体育馆的项目编号以及项目最高分,做成一个含有冠军信息的临时表temp
2.四表相连:grade.id=sporter.sporterid, grade.itemid=item.itemid,  temp.itemid=item.ietmid,  grade.mark=max(mark)     以便提取项目名称、冠军姓名
编辑于 2020-04-06 19:02:50 回复(0)
针对这眼花缭乱的代码题,本SQL白菜选择最傻瓜最快速完成的排除法~先找出四个选项最显而易见的不同点:就是MIN / MAX!题干要求选出冠军—&gt;分数最高—&gt;MAX—&gt;排除B、D;再看A、C最大的差异点:有无GROUP BY。题干要求选出每个项目的冠军—&gt;需要GROUP BY对不同项目分组—&gt;选A就完事了!
发表于 2021-03-05 20:02:51 回复(0)
这么长的语句,不分行,真的窒息
发表于 2020-09-15 16:52:00 回复(0)
表的连接

发表于 2021-11-28 18:59:19 回复(0)
SELECT i.itemname,s.name 
FROM grade g,
(SELECT itemid iid,MAX(mark) max  FROM grade   WHERE itemid IN ( SELECT itemid FROM item  WHERE location='体育馆')  GROUP BY itemid) temp,item i,sporter s 
WHERE temp.iid=i.itemid AND s.sporterid=temp.sporterid;
我这个可以不咯
发表于 2021-07-21 10:39:40 回复(0)
//要查询的信息 : 项目的名称, 运动员的姓名
SELECT i.itemname, s.name
//要查询的表 : 1. 包含项目编号和最高积分的表 temp
//           2. 项目表 item i
//	         3. 运动员表 sporter s	
FROM grade AS g,
(SELECT itemid AS iid, MAX(mark) AS max_socre
FROM grade
WHERE itemid IN (SELECT itemid FROM item WHERE location='体育馆')
GROUP BY itemid) AS temp,
item AS i,
sporter s
//条件判断
WHERE g.itemid = temp.iid //成绩表的项目编号itemid = temp表的项目编号iid
AND g.mark = temp.max_score //成绩表的积分 = temp表的最高分
AND temp.iid = i.itemid //temp表的项目编号 = 项目表的itemid
AND s.sporterid = g.id  //运动员表的运动员编号sporterid = 成绩表的运动员编号id

发表于 2021-04-17 14:43:55 回复(0)
感觉就是看max还有连接对不对
发表于 2021-04-03 10:14:56 回复(0)
A和B就一个max和min的区别,这是考验眼力吗?
发表于 2020-03-27 21:40:30 回复(1)