sql(oracle)练习题

    科技2022-08-16  113

    **

    练习题

    **

    –1.看到一张新表(或者一套新表)应该做什么 1.首先看表里的字段有什么内容,整张表是关于什么的 2.判断这张表里的首要字段是什么(后边会涉及到主键-即唯一非空的那个字段,能够与其他数据区分开的字段) 3.如果是多张表,判断表与表之间的联系(尤其是通过什么字段有联系) 4.看一下具体内容,哪些字段是主要的,哪些字段是存的具体数据,哪些字段是存的码值

    select * from students; select * from courses; select * from scores; select * from teachers;

    –2.如何判断何时使用表连接,何时使用子查询 1.若查询时用于展示的数据来源于不同表,必须使用表连接(员工及其部门信息,员工与上级) 2.若查询时用于判断的条件来源于不同表,可以使用子查询(某部门名称下的员工信息)

    –3.子查询与表连接的思路区别 子查询(多步):先理解题意,将题目拆解成多个步骤,前一步放在后一步的子查询中 表连接(多表):先判断需要哪些表的数据,然后通过表之间的关联关系将其连接,最后将连接产生的结果集当做一个普通的表进行后续的查询

    试题 1、 查询Student表中的所有记录的Sname、Ssex和Class列。

    select sname,ssex,class from students;

    2、 查询教师所有的单位即不重复的Depart列.

    select distinct depart from teachers;

    3、 查询Student表的所有记录。

    select * from students;

    4、 查询Score表中成绩在60到80之间的所有记录。

    select * from scores where score between 60 and 80;

    5、 查询Score表中成绩为85,86或88的记录。

    select * from scores where score in (85,86,88)

    6、 查询Student表中“95031”班或性别为“女”的同学记录。

    select * from students where class=95031 or ssex ='女';

    7、 以class降序查询Student表的所有记录。

    select * from students order by class desc;

    8、 以Cno升序、score降序查询Score表的所有记录。

    select * from scores order by cno,score desc;

    9、 查询“95031”班的学生人数。

    select count(sno) from students where class=95031;

    10、查询Score表中的最高分的学生学号和课程号。

    select sno,cno from scores where score =(select max(score) from scores );

    11、查询‘3-105’号课程的平均分。

    select avg(score ) from scores where cno='3-105';

    12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。

    select cno, avg(score) from scores where cno like '3%' group by cno having count(sno) >= 5;

    13、查询最低分大于70,最高分小于90的Sno列。

    select sno from scores group by sno having min(score)>70 and max(score)<90;

    14、查询所有学生的Sname、Cno和score列。–开始表连接

    select t1.sname,t2.cno ,t2.score from students t1 join scores t2 on t1.sno=t2.sno;

    15、查询所有学生的Sno、Cname和score列。

    select t1.sno , t2.cname , t1.score from scores t1 join courses t2 on t1.cno=t2.cno

    16、查询每个班级的平均分。

    select t1.class , avg(score) from students t1 join scores t2 on t1.sno=t2.sno group by t1.class

    17、查询“95033”班所选课程的平均分。

    select cno ,avg(score) from scores t1 join students t2 on t1.sno=t2.sno where t2 .class =95033 group by t1.cno

    19、查询选修“3-105”课程的、成绩高于“109”号同学成绩的所有同学的记录。

    select * from scores t1 where exists (select 1 from scores t2 where t1.cno = t2.cno and t1.score > t2.score and t2.sno = 109 and t2.cno = '3-105');

    20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。–多个子查询,可以使用开窗排序(用哪个?)

    select * from socres t1 join (select sno, max(score) max_score from scores group by sno having count(cno) >= 2) t2 on t1.sno = t2.sno where t1.score <> t2.max_score;

    21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。–与19一样

    22、查询和学号为105的同学同年出生的所有学生的Sno、Sname和

    Sbirthday列。--EXISTS? select t1.sno, t1.sname, t1.Sbirthday from students t1 where exists (select 1 from students t2 where substr(t1.Sbirthday, 1, 4) = substr(t2.Sbirthday, 1, 4) and t2.sno = 105 and t1.sno <> 105);

    23、查询“张旭“教师任课的学生成绩。–子查询?表连接?

    select t1.score from scores t1 join courses t2 on t1.cno = t2.cno join teachers t3 on t2.tno = t3.tno where t3.tname = '张旭';

    24、查询选修某课程的同学人数多t于5人的教师姓名。–子查询?表连接?

    1.select tname from teachers t1 where exists (select 1 from courses t2 where exists (select 1 from scores t3 where t2.cno = t3.cno group by t3.cno having count(sno) > 5) and t2.tno = t1.tno);

    25、查询95033班和95031班全体学生的记录。

    select * from students where class in (95033,95031);

    26、查询存在有85分以上成绩的课程Cno.

    select distinct cno from scores where score>85;

    27、查询出“计算机系“教师所教课程的成绩表。

    select * from scores t1 join courses t2 on t1.cno=t2.cno join teachers t3 on t2.tno=t3.tno where t3.depart ='计算机系';

    28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。

    select tname ,prof from teachers t1 where prof in (select prof from teachers t2 group by prof having count(1)<2) and depart in('计算机系','电子工程系');

    29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和score,并按score从高到低次序排序。

    select cno , sno , score from scores t1 where exists ( select 1 from scores t2 where t2.cno='3-245' and t1.cno='3-105' group by t2.cno having t1.score>min(t2.score )) order by t1.score desc;

    30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和score.

    select cno , sno , score from scores t1 where exists ( select 1 from scores t2 where t2.cno='3-245' and t1.cno='3-105' group by t2.cno having t1.score>max(t2.score ));

    31、查询所有教师和同学的name、sex和birthday.

    select sname name ,ssex sex ,sbirthday birthday from students union all select tname ,tsex ,tbirthday from teachers;

    32、查询所有“女”教师和“女”同学的name、sex和birthday.

    select sname name ,ssex sex ,sbirthday birthday from students where ssex='女' union all select tname ,tsex ,tbirthday from teachers where tsex='女' ;

    33、查询成绩比该课程平均成绩低的同学的成绩表。

    select * from scores t1 join (select cno ,avg(score) avg_score from scores group by cno ) t2 on t1.cno=t2.cno where t1.score < t2.avg_score;

    34、查询所有任课教师的Tname和Depart.

    select tname, depart from teachers t1 where exists (select 1 from courses t2 join scores t3 on t2.cno = t3.cno where t2.tno = t1.tno)

    35 查询所有未讲课的教师的Tname和Depart. --NOT EXISTS

    select tname, depart from teachers t1 where not exists (select 1 from courses t2 join scores t3 on t2.cno = t3.cno where t2.tno = t1.tno) select * from teachers t1 left join courses t2 on t1.tno = t2.tno left join scores t3 on t2.cno = t3.cno where t2.cname is null;

    36、查询至少有2名男生的班号。

    select class from students where ssex ='男' group by class having count(*)>=2;

    37、查询Student表中不姓“王”的同学记录。

    select * from students where sname not like '王%';

    38、查询Student表中每个学生的姓名和年龄。

    select sname,to_char(sysdate,'yyyy')-substr(sbirthday,1,4) age from students

    39、查询Student表中最大和最小的Sbirthday日期值。

    select max(sbirthday),min(sbirthday) from students

    40、以班号和年龄从大到小的顺序查询Student表中的全部记录。

    select * from students order by class desc ,sbirthday ;

    41、查询“男”教师及其所上的课程。

    select cname from teachers t1 join courses t2 on t1.tno =t2.tno where t1.tsex='男';

    42、查询最高分同学的Sno、Cno和score列。

    select sno ,cno ,score from scores where score = (select max(score ) from scores )

    43、查询和“李军”同性别的所有同学的Sname.

    select sname from students where ssex in (select ssex from students where sname='李军') and sname<>'李军';

    44、查询和“李军”同性别并同班的同学Sname.

    select sname from students where (class,ssex) in (select class,ssex from students where sname='李军') and sname<>'李军';

    45、查询所有选修“计算机导论”课程的“男”同学的成绩表

    select * from scores t1 left join students t2 on t1.sno=t2.sno left join courses t3 on t1.cno=t3.cno where t3.cname='计算机导论' and t2 .ssex ='男';

    建表语句

    create table student( sno varchar2(20) primary key, sname varchar2(30), 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(30), tno varchar2(20), constraint pk_course primary key (cno,tno) ); create table sc( sno varchar2(10), cno varchar2(10), score number(5,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; CREATE TABLE students--学生表 (sno VARCHAR(10) NOT NULL,--学生编号 sname VARCHAR(20) NOT NULL,--学生姓名 ssex VARCHAR(20) NOT NULL,--性别 sbirthday VARCHAR(20),--出生日期 class VARCHAR(5));--班级 CREATE TABLE courses--课程表 (cno VARCHAR(5) NOT NULL,--课程编号 cname VARCHAR(20) NOT NULL,--课程姓名 tno VARCHAR(20) NOT NULL);--教师编号 CREATE TABLE scores--成绩表 (sno VARCHAR(5) NOT NULL,--学生编号 cno VARCHAR(20) NOT NULL,--课程编号 score NUMERIC(10, 1) NOT NULL);--成绩 CREATE TABLE teachers --教师表 (tno VARCHAR(5) NOT NULL, --教师编号 tname VARCHAR(20) NOT NULL, --教师姓名 tsex VARCHAR(20) NOT NULL, --教师性别 tbirthday VARCHAR(20) NOT NULL, --教师出生日期 prof VARCHAR(20), --教师职位 depart VARCHAR(20) NOT NULL);--教师工作单位 INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾华' ,'男' ,'1977-09-01',95033); INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' ,'男' ,'1975-10-02',95031); INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王丽' ,'女' ,'1976-01-23',95033); INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李军' ,'男' ,'1976-02-20',95033); INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' ,'女' ,'1975-02-10',95031); INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陆君' ,'男' ,'1974-06-03',95031); INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('3-105' ,'计算机导论',825); INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('3-245' ,'操作系统' ,804); INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('6-166' ,'数据电路' ,856); INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('9-888' ,'高等数学' ,100); INSERT INTO SCORES(SNO,CNO,score)VALUES (103,'3-245',86); INSERT INTO SCORES(SNO,CNO,score)VALUES (105,'3-245',75); INSERT INTO SCORES(SNO,CNO,score)VALUES (109,'3-245',68); INSERT INTO SCORES(SNO,CNO,score)VALUES (103,'3-105',92); INSERT INTO SCORES(SNO,CNO,score)VALUES (105,'3-105',88); INSERT INTO SCORES(SNO,CNO,score)VALUES (109,'3-105',76); INSERT INTO SCORES(SNO,CNO,score)VALUES (101,'3-105',64); INSERT INTO SCORES(SNO,CNO,score)VALUES (107,'3-105',91); INSERT INTO SCORES(SNO,CNO,score)VALUES (108,'3-105',78); INSERT INTO SCORES(SNO,CNO,score)VALUES (101,'6-166',85); INSERT INTO SCORES(SNO,CNO,score)VALUES (107,'6-106',79); INSERT INTO SCORES(SNO,CNO,score)VALUES (108,'6-166',81); INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (804,'李诚','男','1958-12-02','副教授','计算机系'); INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (856,'张旭','男','1969-03-12','讲师','电子工程系'); INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (825,'王萍','女','1972-05-05','助教','计算机系'); INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (831,'刘冰','女','1977-08-14','助教','电子工程系'); commit;
    Processed: 0.021, SQL: 9