首页 > 试题广场 >

数据库简答题 1、 请简单回答数据库中union 和

[问答题]
数据库简答题
1、 请简单回答数据库中union union all 的区别。

2、 已知关系模式:

S (SNO,SNAME) 学生关系。SNO为学号,SNAME为姓名;

C (CNO,CNAME,CTEACHER) 课程关系。CNO为课程号,CNAME为课程名,CTEACHER为任课教师;

SC(SNO,CNO,SCGRADE)选课关系。SCGRADE为成绩。

1)   找出没有选修过“李明”老师讲授课程的所有学生姓名;

2)   列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩;

3)   列出既学过课程名为“1”的课程,又学过课程名为“2”的课程的所有学生姓名;

4)   列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩。

//2)
select s.sname, avg(sc.scgrade)
from s
inner join sc
on s.sno = sc.sno
group by s.sno
having count(if (sc.scgrade < 60, 1, 0)) >= 2;

//3)
select s.sname
from
s
inner join sc
on s.sno = sc.sno
inner join sc as s1
on sc.sno = s1.sno
and sc.cno+1 = s1.cno
where sc.cno = '1' and s1.cno = '2';

//4)
select s.sname, sc.scgrade, s1.scgrade
from
s
inner join sc
on s.sno = sc.sno
inner join sc as s1
on sc.sno = s1.sno
and sc.cno+1 = s1.cno
where sc.cno = '1' and s1.cno = '2'
and sc.scgrade > s1.scgrade;
编辑于 2019-09-10 00:08:51 回复(0)
2)
SELECT s.sname,AVG(scgrade) FROM s,sc
WHERE s.sno=sc.sno AND s.sno IN(
SELECT sno FROM sc
where scgrade<60
GROUP BY sno 
HAVING COUNT(*)>=2)
GROUP BY sc.sno;
3)
SELECT s.sname FROM s,sc,c
WHERE s.sno = sc.sno AND
			sc.cno = c.cno AND
			c.cname = "english" AND
			s.sname IN (
				SELECT s.sname FROM s,sc,c
				WHERE s.sno = sc.sno AND
					sc.cno = c.cno AND
					c.cname = "math");

4)
SELECT sc.sno,sc.scgrade '1号课成绩',b.scgrade '2号课成绩' FROM sc
JOIN sc AS b
WHERE sc.sno = b.sno AND
			sc.cno = '1' AND
			b.cno = '2' AND
			sc.scgrade>b.scgrade;


编辑于 2019-09-12 21:49:23 回复(0)

1 Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

2.1 select SNAME from S where not exists(select * from SC, C where SC.CNO = C.CNO AND CNAME = '李明' and SC.SNO = S.SNO);

2.2 select S.SNO, S.SNAME, avg(SC.SCGRADE) AVG_SCGRADE from S, SC, (select SNO from SC where SCGRADE < 60 group by SNO having count(distinct CNO) >= 2)A where S.SNO = A.SNO AND SC.SNO = A.SNO group by S.SNO, S.SNAME;

2.3 select S.SNO, S.SNAME from S, (select SC.SNO from SC, C where SC.CNO = C.CNO and C.CNAME in ('1', '2') group by SNO having count(distinct CNO) = 2)SC where S.SNO = SC.SNO;

2.4 select S.SNO, S.SNAME, SC.1号课成绩,SC.2号课成绩 from S, (select SC1.SNO, SC1.SCGRADE 1号课成绩, SC2.SCGRADE 2号课成绩 from SC SC1, C C1, SC SC2, C C2 where SC1.CNO = C1.CNO and C1.NAME = '1' and SC2.CNO = C2.CNO and C2.NAME = '2' and SC1.SCGRADE > SC2.SCGRADE)SC where S.SNO = SC.SNO;

发表于 2019-09-21 22:16:10 回复(5)
sql 书写,(3)和(4)有问题(在mysql 5.6下报错,具体错误不再这里列出 -- 3语法错误;4运行错误);
个人修正的正确sql:
(3)
-- 答案的(3) (经修正)
select S.SNO, S.SNAME 
from S, (select SC.SNO 
                 from SC, C 
                 where SC.CNO = C.CNO and
                             C.CNAME in ('1', '2') 
                 group by SNO 
                 having count(*) = 2) SC 
where S.SNO = SC.SNO;

-- 我自己写的 (运行正确)
SELECT S1.SNAME
FROM S S1, SC SC1, C C1
WHERE S1.SNO = SC1.SNO AND
      SC1.CNO = C1.CNO AND
      C1.CNAME = '1' AND
      S1.SNO IN (SELECT S2.SNO
                 FROM S S2, SC SC2, C C2
                 WHERE S2.SNO = SC2.SNO AND
                        SC2.CNO = C2.CNO AND 
                        C2.CNAME = '2'
      );

(4)
-- 答案 修正
select S.SNO, S.SNAME, SC.1号课成绩,SC.2号课成绩 
from S, (select SC1.SNO, SC1.SCGRADE 1号课成绩, SC2.SCGRADE 2号课成绩 
         from SC SC1, C C1, SC SC2, C C2 
         where SC1.CNO = C1.CNO and
                C1.CNAME = '1' and 
                SC2.CNO = C2.CNO and
               C2.CNAME = '2' and 
                 SC1.SCGRADE > SC2.SCGRADE AND
                             SC1.SNO = SC2.SNO) SC 
where S.SNO = SC.SNO;

-- 答案修正 再精简
select SC1.SNO, SC1.SCGRADE 1号课成绩, SC2.SCGRADE 2号课成绩 
         from SC SC1, C C1, SC SC2, C C2 
         where SC1.CNO = C1.CNO and
                C1.CNAME = '1' and 
                SC2.CNO = C2.CNO and
               C2.CNAME = '2' and 
                 SC1.SCGRADE > SC2.SCGRADE AND
                             SC1.SNO = SC2.SNO;

-- 我的  (运行正确)
SELECT SC1.SNO, SC1.SCGRADE '1号课成绩', 
    (SELECT SC3.SCGRADE
    FROM SC SC3
    WHERE SC3.SNO = SC1.SNO AND
          SC3.CNO = '2') '2号课成绩'
FROM SC SC1
WHERE SC1.CNO = '1' AND
      SC1.SCGRADE > (SELECT SC2.SCGRADE 
                     FROM SC SC2
                     WHERE SC2.CNO = '2' AND
                            SC2.SNO = SC1.SNO);
再附上我写的1、2 -- 都运行正确;
(1)
select SNAME
from S
where S.SNO not IN (select SNO
                  from SC, C
                  where C.CTEACHER = '李明' and
               		    C.CNO = SC.CNO);

(2)

SELECT S2.SNAME, AVG(SC2.SCGRADE) 
FROM S S2, SC SC2
WHERE S2.SNO IN (SELECT SC1.SNO
                FROM SC SC1
                WHERE SC1.SCGRADE < 60
                GROUP BY SC1.SNO
                HAVING COUNT(*) >= 2) AND
      S2.SNO = SC2.SNO
GROUP BY SC2.SNO, S2.SNAME;
-- 这里 GROUP BY SC2.SNO, S2.SNAME; 里的 SNAME并不会对分组结果造成影响,但是对于大部分数据库,select 只能直接选择group by 字段,由于需要在这里加上SNAME。 


编辑于 2022-02-22 18:42:24 回复(0)
2.1
select S.SNAME
from S
where not exists
  (select * from SC join C on SC.CNO=C.CNO where C.CTEACHER="李明" and S.SNO=SC.SNO);
  
2.2
select S.SNAME,avg(SC.SCGRADE)
from S
join SC on S.SNO = SC.SNO
where S.SNO in 
  (select SNO from 
     (select SNO,count(*) sum from SC where SCGRADE<60 group by SNO) t
   where t.sum>=2);
   
2.3
select S.SNAME
from S
join SC SC1 on S.SNO=SC1.SNO
where SC1.CNO = 1 and exists(select SNO from SC SC2 where SC2.CNO = 2 and SC1.SNO=SC2.SNO);

2.4
select a.SNO,a.SCGRADE '1',b.SCGRADE '2'
from (select SNO,SCGRADE from SC where CNO = 1) a
join (select SNO,SCGRADE from SC where CNO = 2) b on a.SNO = b.SNO 
where a.SCGRADE > b.SCGRADE;


发表于 2022-09-12 15:28:34 回复(0)
Union all是将查询的结果合并,Union是将查询结果合并并去重,排序
发表于 2021-03-09 13:28:13 回复(0)