create table student(
sno varchar2(10) primary key,
sname varchar2(20),
sage number(2),
ssex varchar2(5)
);
create table teacher(
tno varchar2(10) primary key,
tname varchar2(20)
);
create table course(
cno varchar2(10),
cname varchar2(20),
tno varchar2(20),
constraint pk_course primary key (cno,tno)
);
create table sc(
sno varchar2(10),
cno varchar2(10),
score number(4,2),
constraint pk_sc primary key (sno,cno)
);
/*******初始化學生表的數據******/
insert into student values ('s001','張三',23,'男');
insert into student values ('s002','李四',23,'男');
insert into student values ('s003','吳鵬',25,'男');
insert into student values ('s004','琴沁',20,'女');
insert into student values ('s005','王麗',20,'女');
insert into student values ('s006','李波',21,'男');
insert into student values ('s007','劉玉',21,'男');
insert into student values ('s008','蕭蓉',21,'女');
insert into student values ('s009','陳蕭曉',23,'女');
insert into student values ('s010','陳美',22,'女');
commit;
/******************初始化教師表***********************/
insert into teacher values ('t001', '劉陽');
insert into teacher values ('t002', '諶燕');
insert into teacher values ('t003', '胡明星');
commit;
/***************初始化課程表****************************/
insert into course values ('c001','J2SE','t002');
insert into course values ('c002','Java Web','t002');
insert into course values ('c003','SSH','t001');
insert into course values ('c004','Oracle','t001');
insert into course values ('c005','SQL SERVER 2005','t003');
insert into course values ('c006','C#','t003');
insert into course values ('c007','JavaScript','t002');
insert into course values ('c008','DIV+CSS','t001');
insert into course values ('c009','PHP','t003');
insert into course values ('c010','EJB3.0','t002');
commit;
/***************初始化成績表***********************/
insert into sc values ('s001','c001',78.9);
insert into sc values ('s002','c001',80.9);
insert into sc values ('s003','c001',81.9);
insert into sc values ('s004','c001',60.9);
insert into sc values ('s001','c002',82.9);
insert into sc values ('s002','c002',72.9);
insert into sc values ('s003','c002',81.9);
insert into sc values ('s001','c003','59');
commit;
練習:
注意:以下練習中的數據是根據初始化到數據庫中的數據來寫的SQL 語句,請大家務必注意。
--1、查詢“c001”課程比“c002”課程成績高的所有學生的學號;
select a.sno
from (select score aa, sno from sc where cno = 'c001') a,
(select score bb, sno from sc where cno = 'c002') b
where a.aa > b.bb
and a.sno = b.sno
--2、查詢平均成績大於60 分的同學的學號和平均成績;
SELECT
c.sno,
c.score
FROM
sc c
WHERE
c.score > 60
--3、查詢所有同學的學號、姓名、選課數、總成績;
select *
from student s,
(select sno, count(cno), sum(score) from sc group by sno) a
where s.sno = a.sno
--4、查詢姓“劉”的老師的個數;
SELECT
count( * )
FROM
teacher
WHERE
tname LIKE '劉%'
--5、查詢沒學過“諶燕”老師課的同學的學號、姓名;
select tno from teacher where tname='諶燕'
select * from sc
select * from course where tno=(select tno from teacher where tname='諶燕')
select z.sno 學號, z.sname 姓名
from student z,
(select distinct (a.sno) y
from sc a,
(select cno b
from course
where tno = (select tno from teacher where tname = '諶燕')) c
where a.cno not in (c.b)) x
where z.sno in x.y
--6、查詢學過“c001”並且也學過編號“c002”課程的同學的學號、姓名;
select distinct(s.sno),s.sname from student s,(select sno a from sc where cno in('c001','c002'))sss where sno in(sss.a) and s.sno=sss.a
--7、查詢學過“諶燕”老師所教的所有課的同學的學號、姓名;
select s.sno,s.sname,sss.cno from student s,(select cno c from course where tno=(select tno from teacher where tname='諶燕')) a,sc sss where sss.cno not in(a.c)
select sno a from sc where cno in(select tno from teacher where tname='諶燕')
select cno from course where tno=(select tno from teacher where tname='諶燕')
select distinct(a.sno) from sc a,(select cno b from course where tno=(select tno from teacher where tname='諶燕')) c where a.cno in(c.b)
select z.sno 學號, z.sname 姓名
from student z,
(select distinct (a.sno) y
from sc a,
(select cno b
from course
where tno = (select tno from teacher where tname = '諶燕')) c
where a.cno in (c.b)) x
where z.sno in x.y
--8、查詢課程編號“c002”的成績比課程編號“c001”課程低的所有同學的學號、姓名;
select sname, sno
from student
where sno = (select a.sno
from (select score aa, sno from sc where cno = 'c001') a,
(select score bb, sno from sc where cno = 'c002') b
where a.aa > b.bb
and a.sno = b.sno)
--9、查詢所有課程成績小於60 分的同學的學號、姓名;
select sno, sname
from student s
where sno in (select sno from sc where score < 60)
--10、查詢沒有學全所有課的同學的學號、姓名;
select * from sc
11、查詢至少有一門課與學號爲“s001”的同學所學相同的同學的學號和姓名;
12、查詢至少學過學號爲“s001”同學所有一門課的其他同學學號和姓名;
/13、把“SC”表中“諶燕”老師教的課的成績都更改爲此課程的平均成績;
--14、查詢和“s001”號的同學學習的課程完全相同的其他同學學號和姓名;
select s.sno, b.sname
from sc s, (select * from sc where sno = 's001') a, student b
where s.cno in (a.cno)
and a.sno = s.sno
and s.sno = b.sno
and s.sno <> 's001'
/15、刪除學習“諶燕”老師課的SC 表記錄;
/16、向SC 表中插入一些記錄,這些記錄要求符合以下條件:沒有上過編號“c002”課程的同學學號、“c002”號課的平均成績;
--17、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
select cno 課程ID, max(score) 最高分, min(score) 最低分
from sc
group by cno
--18、按各科平均成績從低到高和及格率的百分數從高到低順序
select avg(s.score) 平均成績, count(*) 及格率
from sc s, (select count(*),cno from sc where score > 60 group by cno) a
group by s.cno
order by avg(s.score), count(a.*) / count(*) desc
--19、查詢不同老師所教不同課程平均分從高到低顯示
select a.t, cno, avg(score)
from (select tno t from teacher) a, sc
group by cno, a.t
order by avg(score) desc
20、統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60]
21、查詢各科成績前三名的記錄:(不考慮成績並列情況)
--22、查詢每門課程被選修的學生數
select cno,count(sno) from sc group by cno
--3、查詢出只選修了一門課程的全部學生的學號和姓名
select cno from sc group by cno having count(*)=1
select sno from (select cno from sc group by cno having count(*)=1)t1,sc where t1.cno=sc.cno
select student.sno 學號,student.sname 姓名
from student,
(select sno
from (select cno from sc group by cno having count(*) = 1) t1, sc
where t1.cno = sc.cno) t2
where t2.sno = student.sno
--24、查詢男生、女生人數
select ssex,count(*)from student where ssex in ('男','女') group by ssex
--25、查詢姓“張”的學生名單
select * from student where sname like '張%'
26、查詢同名同性學生名單,並統計同名人數
27、1981 年出生的學生名單(注:Student 表中Sage 列的類型是number)
--28、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列
SELECT
cno,
avg( score )
FROM
sc
GROUP BY
cno
ORDER BY
avg( score ),
cno DESC 29、查詢平均成績大於85 的所有學生的學號、姓名和平均成績
--30、查詢課程名稱爲“數據庫”,且分數低於60 的學生姓名和分數
SELECT
a.*,
cname
FROM
course,
( SELECT sno, cno, score FROM sc WHERE score < 60 ) a
WHERE
cname = '數據庫' --31、查詢所有學生的選課情況;
SELECT DISTINCT
( t1.sname ),
t2.cno
FROM
student t1,
sc t2
WHERE
t1.sno = t2.sno (
+)
--32、查詢任何一門課程成績在70 分以上的姓名、課程名稱和分數;
select * from sc where score>70
SELECT t1.sname 姓名, t2.score 分數 FROM student t1, ( SELECT * FROM sc WHERE score > 70
) t2
WHERE
t1.sno = t2.sno
select t4.cname 課程名稱, t3.sname 姓名, t3.score 分數
from (select *
from student t1, (select * from sc where score > 70) t2
where t1.sno = t2.sno) t3,
course t4
where t3.cno = t4.cno
--33、查詢不及格的課程,並按課程號從大到小排列
select cno from sc where score<60 group by cno order by cno desc
--34、查詢課程編號爲c001 且課程成績在80 分以上的學生的學號和姓名;
select * from sc where cno='coo1' and score>80
select t1.sno 學號, t1.sname 姓名
from student t1,
(select *
from sc
where cno = 'coo1'
and score > 80) t2
where t1.sno = t2.sno
--35、求選了課程的學生人數
select count(s.sno)
from sc s, (select sno from sc group by sno) a
where s.sno in (a.sno)
--36、查詢選修“諶燕”老師所授課程的學生中,成績最高的學生姓名及其成績
select * from course t,(select tno from teacher where tname='諶燕') t1 where t.tno=t1.tno
select t3.sname, sc.score
from sc,
(select *
from course t, (select tno from teacher where tname = '諶燕') t1
where t.tno = t1.tno) t2,
(select * from student) t3
where sc.cno in (t2.cno)
and sc.sno = t3.sno
order by score desc
select *
from (select t3.sname, sc.score
from sc,
(select *
from course t,
(select tno from teacher where tname = '諶燕') t1
where t.tno = t1.tno) t2,
(select * from student) t3
where sc.cno in (t2.cno)
and sc.sno = t3.sno
order by score desc)
where rownum = 1
--37、查詢各個課程及相應的選修人數
select cno 課程, count(*) 人數 from sc group by cno
38、查詢不同課程成績相同的學生的學號、課程號、學生成績
select * from sc
39、查詢每門功課成績最好的前兩名
select cno from sc group by cno
select * from sc,(select cno from sc group by cno
) t1 where sc.cno in(t1.cselect cno from sc group by cno order by score desc
no) order by score desc
--40、統計每門課程的學生選修人數(超過10 人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
select cno 課程號, count(sno) 選修人數
from sc
group by cno
having count(sno) > 10
--41、檢索至少選修兩門課程的學生學號
select sno, count(cno) fr order by count(sno) desc, cno
om sc group by sno having count(cno) > 2
--42、查詢全部學生都選修的課程的課程號和課程名
select distinct(cno) from sc
select course.cno 課程號,course.cname 課程名 from course,(select distinct(cno) from sc) t1 where course.cno=t1.cno
--43、查詢沒學過“諶燕”老師講授的任一門課程的學生姓名
select student.sname
from student,
(select sc.*
from sc,
(select *
from course t,
(select tno from teacher where tname = '諶燕') t1
where t.tno = t1.tno) t2
where sc.cno = (t2.cno)
and sc.cno = t2.cno) t3
where student.sno = t3.sno
and student.sno not in (t3.sno)
--44、查詢兩門以上不及格課程的同學的學號及其平均成績
select sno,avg(score) from sc where score<60 group by sno having count(cno)>2
--45、檢索“c004”課程分數小於60,按分數降序排列的同學學號
select sno
from sc
where cno = 'c004'
and score < 60
order by score
/46、刪除“s002”同學的“c001”課程的成績