• SQL基础习题及代码


    create table student(
    sno varchar(3) not null,
    sname varchar(4) not null,
    ssex varchar(2) not null,
    sbirthday datetime,
    class varchar(5)
     );
    create table course(
    cno varchar(5) not null,
    cname varchar(10) not null,
    tno varchar(10) not null  
    );
    create table score(
    sno varchar(3) not null,
    cno varchar(5) not null,
    degree numeric(10,1) not null
    
    );
    create table teacher(
    tno varchar(3) not null,
    tname varchar(4) not null,
    tsex varchar(2) not null,
    tbirthday datetime not null,
    prof varchar(10) not null,
    depart varchar(10) not null
    );
    insert into student values
    (108,"曾华","",1977-09-01,95033),
    (105,"匡明","",1975-10-02,95031),
    (107,"王丽","",1976-01-23,95033),
    (101,"李军","",1976-02-20,95033),
    (109,"王芳","",1975-02-10,95031),
    (103,"陆君","",1974-06-03,95031);
    
    insert into course values
    ("3-105","计算机导论",825),
    ("3-245","操作系统",825),
    ("6-166","数据电路",825),
    ("9-888","高等数学",100);
    
    insert into score values
    (103,"3-245",86),
    (105,"3-245",75),
    (109,"3-245",68),
    (103,"3-245",92),
    (105,"3-105",88),
    (109,"3-105",76),
    (101,"3-105",64),
    (107,"3-105",91),
    (108,"3-105",78),
    (101,"6-166",85),
    (107,"6-106",79),
    (108,"6-166",81);
    
    insert into teacher values
    (804,"李诚","","1958-12-02","副教授","计算机系"),
    (856,"张旭","","1969-03-12","讲师","电子工程系"),
    (825,"王萍","","1972-05-05","助教","计算机系"),
    (831,"刘冰","","1977-08-14","助教","电子工程系");
    
    题目:
    1、 查询Student表中的所有记录的Sname、Ssex和Class列。
    2、 查询教师所有的单位即不重复的Depart列。
    3、 查询Student表的所有记录。
    4、 查询Score表中成绩在60到80之间的所有记录。
    5、 查询Score表中成绩为85,86或88的记录。
    6、 查询Student表中“95031”班或性别为“女”的同学记录。
    7、 以Class降序查询Student表的所有记录。
    8、 以Cno升序、Degree降序查询Score表的所有记录。
    9、 查询“95031”班的学生人数。
    10、查询Score表中的最高分的学生学号和课程号。
    11、查询‘3-105’号课程的平均分。
    12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
    13、查询最低分大于70,最高分小于90的Sno列。
    答案:
    1select sname,ssex,class from student;
    2select distinct depart from teacher;
    3/ select * from student;
    4/ select * from score where degree between 60 and 80;
    5/  select * from score where  degree in(85,86,88);
    6/  select * from student where  class="95031" or ssex = "";
    7select * from student where order by class desc;
    8/  select * from student where order by cno asc,degree desc;
    9/  select sum(class="95031") from student;
       第二中写法
        SELECT  COUNT(*) FROM STUDENT WHERE CLASS='95031'; 
    10/  select max(degree),min(degree) from score;
        select sno,cno from score;
     最后结果为:  select sno,cno from score where degree=(select max(degree),min(degree) from score);
    11select avg(degree) from score where cno = "3-105";
    12/  select cno,avg(degree) from score where cno like "3%" groupd by cno having count(sno) >= 5;
    13/  select sno from score  group by sno having min(degree) > 70 and max(degree) < 90; 
    14、查询所有学生的Sname、Cno和Degree列。
    15、查询所有学生的Sno、Cname和Degree列。
    16、查询所有学生的Sname、Cname和Degree列。
    17、查询“95033”班所选课程的平均分。
    18、假设使用如下命令建立了一个grade表:
    create table grade(low   number(3,0),upp   number(3),rank   char(1));
    insert into grade values(90,100,’A’);
    insert into grade values(80,89,’B’);
    insert into grade values(70,79,’C’);
    insert into grade values(60,69,’D’);
    insert into grade values(0,59,’E’);
    commit;
    现查询所有同学的Sno、Cno和rank列。
    19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
    20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。
    21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
    22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
    23、查询“张旭“教师任课的学生成绩。
    24、查询选修某课程的同学人数多于5人的教师姓名。
    25、查询95033班和95031班全体学生的记录。
    26、查询存在有85分以上成绩的课程Cno.
    27、查询出“计算机系“教师所教课程的成绩表。
    28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
    29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
    30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.
    31、查询所有教师和同学的name、sex和birthday.
    32、查询所有“女”教师和“女”同学的name、sex和birthday.
    33、查询成绩比该课程平均成绩低的同学的成绩表。
    34、查询所有任课教师的Tname和Depart.
    35  查询所有未讲课的教师的Tname和Depart.
    36、查询至少有2名男生的班号。
    37、查询Student表中不姓“王”的同学记录。
    38、查询Student表中每个学生的姓名和年龄。
    39、查询Student表中最大和最小的Sbirthday日期值。
    40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
    41、查询“男”教师及其所上的课程。
    42、查询最高分同学的Sno、Cno和Degree列。
    43、查询和“李军”同性别的所有同学的Sname.
    44、查询和“李军”同性别并同班的同学Sname.
    45、查询所有选修“计算机导论”课程的“男”同学的成绩表
    答案:
    14.SELECT A.SNAME,B.CNO,B.DEGREE FROM STUDENT AS A JOIN SCORE AS B ON A.SNO=B.SNO;
    
    15.SELECT A.CNAME, B.SNO,B.DEGREE FROM COURSE AS A JOIN SCORE AS B ON A.CNO=B.CNO ;
    
    16.SELECT A.SNAME,B.CNAME,C.DEGREE FROM STUDENT A JOIN (COURSE B,SCORE C)
    ON A.SNO=C.SNO AND B.CNO =C.CNO;
    
    17.SELECT AVG(A.DEGREE) FROM SCORE A JOIN STUDENT B ON A.SNO = B.SNO WHERE B.CLASS='95033';
    
    18.SELECT A.SNO,A.CNO,B.RANK FROM SCORE A,GRADE B WHERE A.DEGREE BETWEEN B.LOW AND B.UPP
    
    ORDER BY RANK;
    
    19.SELECT A.* FROM SCORE A JOIN SCORE B WHERE A.CNO='3-105' AND A.DEGREE>B.DEGREE AND
    
    B.SNO='109' AND B.CNO='3-105';
    另一解法:SELECT A.* FROM SCORE A  WHERE A.CNO='3-105' AND A.DEGREE>ALL(SELECT DEGREE FROM
    
    SCORE B WHERE B.SNO='109' AND B.CNO='3-105');
    
    20.SELECT * FROM score s WHERE DEGREE<(SELECT MAX(DEGREE) FROM SCORE) GROUP BY SNO HAVING
    
    COUNT(SNO)>1 ORDER BY DEGREE ;
    
    21.见19的第二种解法
    
    22。SELECT SNO,SNAME,SBIRTHDAY FROM STUDENT WHERE YEAR(SBIRTHDAY)=(SELECT YEAR(SBIRTHDAY)
    
    FROM STUDENT WHERE SNO='108');
    ORACLE:select x.cno,x.Sno,x.degree from score x,score y where x.degree>y.degree and
    
    y.sno='109'and y.cno='3-105';
    select cno,sno,degree from score   where degree >(select degree from score where sno='109'
    
    and cno='3-105')
    
    23.SELECT A.SNO,A.DEGREE FROM SCORE A JOIN (TEACHER B,COURSE C)
    ON A.CNO=C.CNO AND B.TNO=C.TNO
    WHERE B.TNAME='张旭';
    另一种解法:select cno,sno,degree from score where cno=(select x.cno from course x,teacher y
    
    where x.tno=y.tno and y.tname='张旭');
    根据实际EXPLAIN此SELECT语句,第一个的扫描次数要小于第二个
    
    24.SELECT A.TNAME FROM TEACHER A JOIN (COURSE B, SCORE C) ON (A.TNO=B.TNO AND B.CNO=C.CNO)
    
    GROUP BY C.CNO HAVING COUNT(C.CNO)>5;
    另一种解法:select tname from teacher where tno in(select x.tno from course x,score y where
    
    x.cno=y.cno group by x.tno having count(x.tno)>5);
    实际测试1明显优于2
    
    
    25select cno,sno,degree from score where cno=(select x.cno from course x,teacher y where
    
    x.tno=y.tno and y.tname='张旭');
    
    26。SELECT CNO FROM SCORE GROUP BY CNO HAVING MAX(DEGREE)>85;
    另一种解法:select distinct cno from score where degree in (select degree from score where
    
    degree>85);
    
    27。SELECT A.* FROM SCORE A JOIN (TEACHER B,COURSE C) ON A.CNO=C.CNO AND B.TNO=C.TNO
    WHERE B.DEPART='计算机系';
    另一种解法:SELECT * from score where cno in (select a.cno from course a join teacher b on
    
    a.tno=b.tno and b.depart='计算机系');
    此时2略好于1,在多连接的境况下性能会迅速下降
    
    28select tname,prof from teacher where depart='计算机系' and prof not in (select prof from
    
    teacher where depart='电子工程系');
    
    29。SELECT * FROM SCORE WHERE DEGREE>ANY(SELECT DEGREE FROM SCORE WHERE CNO='3-245') ORDER
    
    BY DEGREE DESC;
    
    30。SELECT * FROM SCORE WHERE DEGREE>ALL(SELECT DEGREE FROM SCORE WHERE CNO='3-245') ORDER
    
    BY DEGREE DESC;
    
    31.SELECT SNAME AS NAME, SSEX AS SEX, SBIRTHDAY AS BIRTHDAY FROM STUDENT
    UNION
    SELECT TNAME AS NAME, TSEX AS SEX, TBIRTHDAY AS BIRTHDAY FROM TEACHER;
    
    32.SELECT SNAME AS NAME, SSEX AS SEX, SBIRTHDAY AS BIRTHDAY FROM STUDENT WHERE SSEX=''
    UNION
    SELECT TNAME AS NAME, TSEX AS SEX, TBIRTHDAY AS BIRTHDAY FROM TEACHER WHERE TSEX='';
    
    33.SELECT A.* FROM SCORE A WHERE DEGREE<(SELECT AVG(DEGREE) FROM SCORE B WHERE A.CNO=B.CNO);
    须注意********此题
    
    34。解法一:SELECT A.TNAME,A.DEPART FROM TEACHER A JOIN COURSE B ON A.TNO=B.TNO;
    解法二:select tname,depart from teacher a where exists
    (select * from course b where a.tno=b.tno);
    解法三:SELECT TNAME,DEPART FROM TEACHER WHERE TNO IN (SELECT TNO FROM COURSE);
    
    实际分析,第一种揭发貌似更好,至少扫描次数最少。
    
    35.解法一:SELECT TNAME,DEPART FROM TEACHER A LEFT JOIN COURSE B USING(TNO) WHERE ISNUL
    
    (B.tno);
    解法二:select tname,depart from teacher a where not exists
    (select * from course b where a.tno=b.tno);
    解法三:SELECT TNAME,DEPART FROM TEACHER WHERE TNO NOT IN (SELECT TNO FROM COURSE);
    NOT IN的方法效率最差,其余两种差不多
    
    36.SELECT CLASS FROM STUDENT A WHERE SSEX='' GROUP BY CLASS HAVING COUNT(SSEX)>1;
    
    37.SELECT * FROM STUDENT A WHERE SNAME not like '王%';
    
    38.SELECT SNAME,(YEAR(NOW())-YEAR(SBIRTHDAY)) AS AGE FROM STUDENT;
    
    39.select sname,sbirthday as THEMAX from student where sbirthday =(select min(SBIRTHDAY)
    
    from student)
    union
    select sname,sbirthday as THEMIN from student where sbirthday =(select max(SBIRTHDAY) from
    
    student);
    
    40.SELECT CLASS,(YEAR(NOW())-YEAR(SBIRTHDAY)) AS AGE FROM STUDENT ORDER BY CLASS DESC,AGE
    
    DESC;
    
    41.SELECT A.TNAME,B.CNAME FROM TEACHER A JOIN COURSE B USING(TNO) WHERE A.TSEX='';
    
    42.SELECT A.* FROM SCORE A WHERE DEGREE=(SELECT MAX(DEGREE) FROM SCORE B );
    
    43.SELECT SNAME FROM STUDENT A WHERE SSEX=(SELECT SSEX FROM STUDENT B WHERE B.SNAME='李军');
    
    44.SELECT SNAME FROM STUDENT A WHERE SSEX=(SELECT SSEX FROM STUDENT B WHERE B.SNAME='李军' )
    AND CLASS=(SELECT CLASS FROM STUDENT C WHERE c.SNAME='李军');
    
    45.解法一:SELECT A.* FROM SCORE A JOIN (STUDENT B,COURSE C) USING(sno,CNO) WHERE B.SSEX='
    
    ' AND C.CNAME='计算机导论';
    解法二:select * from score where sno in(select sno from student where
    ssex='') and cno=(select cno from course
    where cname='计算机导论');
    emp员工表 字段如下:
    empno    员工号
    ename    员工姓名
    job    职位
    mgr    上级编号
    hiredate入职日期
    sal    薪资
    comm    提成
    deptno    部门编号
    
    --1、选择部门30中的员工;
    select *from emp where deptno=30;
    
    --2、查询所有办事员(CLERK)的姓名、编号和部门;
    select ename,empno,deptno from emp where job ='CLERK';
    
    --3、找出提成高于工资的员工;
    select * from emp where comm>sal;
    
    --4、找出提成高于薪资60%的员工
    select * from emp where comm>sal*0.6;
    
    --5、找出部门10中所有经理和部门20中所有办事员的详细资料
    select 
    *
    from
     emp
    where 
     deptno=10 and job='MANAGER'
    or
     deptno=20 and job ='CLERK' ; 
    
    
    =============================
    
    --6、找出部门10中所有经理、部门20中所有办事员以及既不是经理又不是办事员但薪资大于或等于2000的所有雇员的详细资料
    select 
    *
    from emp
    where 
     deptno=10 and job='MANAGER'
    or
     deptno=20 and job ='CLERK' 
    or
    sal>=2000 and job not in('MANAGER','CLERK');
    
    第二种方法 (换 where后面第二个or)
    or
    (job !='MANAGER' and job!='CLERK'and sal>=1200);
    
    
    --7、找出收取提成的员工的不同职位;
    select distinct job
    from emp
    where comm is not null;
    
    
    --8、找出不收取提成 或收取提成低于100的员工;
    select *
    from emp
    where comm is null or comm<100;
    
    --9、显示雇员的详细资料,按姓名排序
    select * from emp where job!='MANAGER'and job!='CLERK' order by ename asc;
    
    --10、显示员工姓名,根据工作年限将最老的员工排在最前面
    select ename,hiredate from emp  order by hiredate asc;
    
    --11、显示所有员工的姓名、部门编号和薪资,部门编号降序排列,同部门员工以薪资升序排列
    select ename,deptno,sal,job from emp order by deptno desc , sal;
    
    --12、显示姓名字段的任何位置都包含A的所有员工姓名
          select ename from emp where ename like '%A%';
  • 相关阅读:
    使用C#实现WinForm窗体的动画效果
    c#制作飘动动画窗体
    c#制作简单启动画面
    C# windows media player详细用法(最全面)
    listbox的索引问题
    WindowsMediaPlayer播放完毕可以播放下一个
    Adobe Photoshop CC 2015安装激活
    C#中OpenFileDialog的使用
    点和多点
    五.几何对象和空间参考
  • 原文地址:https://www.cnblogs.com/lxy151/p/7767002.html
Copyright © 2020-2023  润新知