最新SOL练习题(下)

2022-01-13 13:43发布

补充六

1、查询年龄在19至21岁之间的女生的学号,姓名,年龄,按年龄从大到小排列。

 

    Selectsno,sname,sage from student

    where sagebetween 19 and 21 and ssex='女'

    order by sagedesc

 

2、查询姓名中有“明”字的学生人数。

 

    Select count(*)from student

    where snamelike "%明%"

 

3、查询1001课程没有成绩的学生的学号。

 

    Select sno fromsc where cno='1001' and grade is null

 

4、查询JSJ、SX、WL系的学生学号,姓名,结果按系及学号排列。

 

    Selectsno,sname,sdept from student

    where sdept in( 'JSJ', 'SX', 'WL' )

    order bysdept,sno

 

5、计算每一门课的总分、平均分,最高分、最低分。

 

    Selectcno,sum(grade),avg(grade),max(grade),min(grade)

    from sc

    group by cno

 

6、查询平均分大于90分的男学生学号及平均分。

连接:

 

    selectsc.sno,avg(grade) from student,sc

    wherestudent.sno=sc.sno and ssex=’男’

    group by sc.sno

    havingavg(grade)>90

嵌套:

    selectsno,avg(grade) from sc

    where sno in (select sno from student where ssex='男')

    group by sno

    havingavg(grade)>90

 

7、查询选修课程超过2门的学生姓名。

    select snamefrom student,sc

    where student.sno=sc.sno

    group bysc.sno,sname

    havingcount(*)>2

本题也可以用嵌套做

 

8、查询 JSJ 系的学生选修的课程号。

 

    Select distinctcno from student,sc

    where  student.sno=sc.sno and sdept='JSJ'

本题也可以用嵌套做

 

9、查询选修1002课程的学生的学生姓名(用连接和嵌套2种方法)

  连接:Select sname from student,sc

          wherestudent.sno=sc.sno and cno='1002'

    嵌套:Select sname from student where sno in

              (select sno from sc where cno='1002' )

10、查询学生姓名以及他选修课程的课程号及成绩。

 

    Selectsname,cno,grade from student,sc

    wherestudent.sno=sc.sno

 

思考本题也可以用嵌套做吗?

 

 

3.6 使用SQL查询语句表达下列对教学数据库中三个基本表S、SC、C的查询:

1)统计有学生选修的课程门数。

SELECT COUNT(DISTINCT C#) FROM SC

2)求选修C4课程的学生的平均年龄。

    SELECT AVG(AGE)
    FROM S
    WHERE S# IN
     (SELECT S#
     FROM SC
     WHERE C#='C4')

或者

    SELECT AVG(AGE)
    FROM S,SC
    WHERE S.S#=SC.S# AND C#='004'

3)求LIU老师所授课程的每门课程的学生平均成绩。

   SELECT CNAME,AVG(GRADE)
   FROM SC ,C
   WHERE SC.C#=C.C# ANDTEACHER='LIU'
   GROUP BY C#   

4)统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。

    SELECT DISTINCT C#,COUNT(S#)
    FROM SC
    GROUP BY C#
    HAVING COUNT(S#)>10
    ORDER BY 2 DESC, C# ASC

5)检索学号比WANG同学大,而年龄比他小的学生姓名。

    SELECT X.SNAME
    FROM S AS X, S AS Y
    WHERE Y.SNAME='WANG' AND X.S#>Y.S# AND X.AGE<Y.AGE

6)检索姓名以WANG打头的所有学生的姓名和年龄。

    SELECT SNAME,AGE
    FROM S
    WHERE SNAME LIKE 'WANG%'

7)在SC中检索成绩为空值的学生学号和课程号。

    SELECT S#,C#
    FROM SC
    WHERE GRADE IS NULL

8)求年龄大于女同学平均年龄的男学生姓名和年龄。

    SELECT SNAME,AGE
    FROM S AS X
    WHERE X.SEX='男' AND X.AGE>(SELECT AVG(AGE)FROM S AS Y WHERE Y.SEX='女')

9)求年龄大于所有女同学年龄的男学生姓名和年龄。

    SELECT SNAME,AGE
    FROM S AS X
    WHERE X.SEX='男' AND X.AGE>ALL (SELECT AGE FROM S AS Y WHERE Y.SEX='女')

除法运算

3.7 使用SQL更新语句表达对教学数据库中三个基本表S、SC、C的各个更新操作:

1)往基本表S中插入一个学生元组(‘S9’,‘WU’,18)。

    INSERT INTO S(S#,SNAME,AGE) VALUES('59','WU',18)

2)在基本表S中检索每一门课程成绩都大于等于80分的学生学号、姓名和性别,并把检索到的值送往另一个已存在的基本表STUDENT(S#,SANME,SEX)。

    INSERT INTO STUDENT(S#,SNAME,SEX)
     SELECT S#,SNAME,SEX
     FROM S WHERE  NOT EXISTS
      (SELECT * FROM SC WHERE
       GRADE<80 AND S.S#=SC.S#)

3)在基本表SC中删除尚无成绩的选课元组。

    DELETE FROM SC
     WHERE GRADE IS NULL

4)把WANG同学的学习选课和成绩全部删去。

    DELETE FROM SC
     WHERE S# IN
      (SELECT S#
      FROM S
      WHERE SNAME='WANG')

5)把选修MATHS课不及格的成绩全改为空值。

    UPDATE SC
    SET GRADE=NULL
    WHERE GRADE<60 AND C# IN
      (SELECT C#
      FROM C
      WHERE CNAME='MATHS')

6)把低于总平均成绩的女同学成绩提高5%。

    UPDATE SC
    SET GRADE=GRADE*1.05
    WHERE GRADE<(SELECT AVG(GRADE) FROM SC) AND S# IN (SELECT S# FROM SWHERE SEX='F')

7)在基本表SC中修改C4课程的成绩,若成绩小于等于75分时提高5%,若成绩大于75分时提高4%(用两个UPDATE语句实现)。

    UPDATE SC
     SET GRADE=GRADE*1.05
     WHERE C#='C4' AND GRADE<=75
    UPDATE SC
     SET GRADE=GRADE*1.04
     WHERE C#='C4' AND GRADE>75

3.8 “仓库管理”关系模型有五个关系模式:

  零件 PART(P#,PNAME,COLOR,WEIGHT)

  项目 PROJECT(J#,JNAME,DATE)

  供应商 SUPPLIER(S#,SNAME,SADDR)

  供应 P_P(J#,P#,TOTOAL)

  采购 P_S(P#,S#,QUANTITY)

 

1)使用SQLDDL语句定义上述五个基本表,并说明主键和外键。

    CREATE TABLE PART
    (P# CHAR(4) NOT NULL,PNAME CHAR(12) NOT NULL,
    COLOR CHAR(10),WEIGHT REAL,
    PRIMARY KEY(P#))
    CREATE TABLE PROJECT
    (J# CHAR(4) NOT NULL,JNAME CHAR(12) NOT NULL,
    DATE DATE,
    PRIMARY KEY(J#))
    CREATE TABLE SUPLIER
    (S# CHAR(4) NOT NULL,SNAME CHAR(12),SADDR VARCHAR(20),
    PRIMARY KEY(S#))
    CREATE TABLE P_P
    (J# CHAR(4),P# CHAR(4),TOTAL INTEGER,
    PRIMARY KEY(J#,P#),
    FOREIGN KEY(J#) REFERENCE PROJECT(J#),
    FOREIGN KEY(P#) REFERENCE PART(P#))
    CREATE TABLE P_S
    (P# CHAR(4),S# CHAR(4),QUANTITY INTEGER,
    PRIMARY KEY(P#,S#),
    FOREIGN KEY(P#) REFERENCE PART(P#),
    FOREIGN KEY(S#) REFERENCE SUPLIER(S#))

 

2)试将PROGECT、P_P、PART三个基本表的自然联接定义为一个视图VIEW1,PART、P_S、SUPPLIER 三个基本表的自然联接定义为一个视图VIEW2。

    CREATE VIEW VIEW1(J#,JNAME,DATE,P#,PNAME,COLOR,WEIGHT,TOTAL)
          AS SELECT PROJECT.J#,JNAME,DATE,PART.P#,PNAME,COLOR,WEIGHT,TOTAL
          FROM PROJECT,PART,P_P
          WHERE PART.P#=P_P.P# AND P_P.J#=PROJECT.J# 
     
    CREATE VIEW VIEW2(P#,PNAME,COLOR,WEIGHT,S#,SNAME,SADDR,QUANTITY)
          AS SELECT PART.P#,PNAME,COLOR,WEIGHT,SUPPLIER