最全的SQL練習題(做完你就是高手)


最全的SQL練習題(做完你就是高手)

原文:https://zhuanlan.zhihu.com/p/257977231

補充作業一

設有三個關系:

S(SNO, SNAME, AGE, SEX,Sdept)

SC(SNO, CNO, GRADE)

C(CNO, CNAME, TEACHER)

試用關系代數表達式表示下列查詢:

-- 1、查詢學號為S3學生所學課程的課程名與任課教師名。
SELECT c.`name`, c.teacher FROM student_class sc LEFT JOIN `class` c ON sc.cno = c.NO WHERE sc.sno = 's3';


-- 2、查詢至少選修LIU老師所教課程中一門課的女生姓名。
select s.sname from student as s where s.sno in 
(select DISTINCT sc.sno from student_class as sc left join class as c on sc.cno=c.cno where c.teacher='LIU')
and s.sex=2;

-- 3、查詢WANG同學不學的課程的課程號。
select c.cno from class as c where c.cno not in 
(select DISTINCT sc.cno from student as s inner join student_class as sc on s.sno=sc.sno where s.sname='WANG');

-- 4、查詢至少選修兩門課程的學生學號。
select sno, count(*) as cou from student_class group by sno having cou>=2;

-- 5、查詢選修課程中包含LIU老師所教全部課程的學生學號。
select sc.sno from student_class as sc INNER JOIN class as c on sc.cno=c.cno where c.teacher='LIU';

補充作業二

三個關系同上,試用SQL語言表示下列查詢:

1、 查詢門門課程都及格的學生的學號

方法1:

提示:根據學號分組,就得到每個學生所有的課程成績,在某個學生這一組成績里,如果他所有的課程成績都大於60分則輸出該組學生的學號

Select sno frome sc group by sno having min(grade)>=60;

2、查詢既有課程大於90分又有課程不及格的學生的學號

自身連接:

Select sno from sc where grade >90 and sno in (select sno from sc where grade<60)

3、查詢平均分不及格的課程號和平均成績

Select cno , avg(GRADE) from sc group by cno having avg(grade)<60

查詢平均分及格的課程號和課程名

Select C.cno , Cname from SC,C where C.cno=SC.cno group by C.cno having avg(grade)>=60

4、找出至少選修了2號學生選修過的全部課程的學生

提示:不存在這樣的課程y,學生2選修了y,而學生x沒有選。

SELECT DISTINCT Sno

   FROM SC as SCX

   WHERE NOT EXISTS

      (SELECT *

       FROM SC as SCY

       WHERE SCY.Sno =‘2’AND NOT EXISTS

                               (SELECT *

                                  FROM SC SCZ

                          WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno))

5、求各門課程去掉一個最高分和最低分后的平均分

第一步,求所有成績的平均分(去掉一個最高分和最低分)

select   avg(GRADE)   from   SC     
  where   GRADE   not   in (select   top   1   GRADE   from   SC order   by   GRADE)   
  and     GRADE   not   in (select   top   1   GRADE   from   SC order   by   GRADE   desc)  

第二步,將所有成績按各門課程的課程號CNO分組

SELECT CNO avg(GRADE)   from   SC     
  where   GRADE   not   in (select   top  1  GRADE   from   SC order   by   GRADE)   
  and     GRADE   not   in (select   top  1  GRADE   from   SC order   by   GRADE   desc) group by CNO

1、查詢7號課程沒有考試成績的學生學號。

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

2、查詢7號課程成績在90分以上或60分以下的學生學號。

Select sno from sc where cno='7' and grade not between 60and 9

3、查詢課程名以“數據”兩個字開頭的所有課程的課程號和課程名。

Select cno,cname from c where cname like '數據%'

4、查詢每個學生所有課程的平均成績,輸出學生學號和平均成績。

  Select sno,avg(grade)from sc group by sno

5、查詢每門課程的選修人數,輸出課程號和選修人數。

    Selectcno,count(*) from sc group by cno

6、查詢選修7號課程的學生的學號、姓名、性別。

    Selects.sno,sname,ssex from s,sc where s.sno=sc.sno and cno='7'

或:

 Select sno,sname,ssex from s where sno in

              ( Select sno from sc where cno='7' )

7、查詢選修7號課程的學生的平均年齡。

    Selectavg(sage) from s,sc where s.sno=sc.sno and cno='7'

或:

 Select avg(sage) from s where sno in

              (Select sno from sc where cno='7' )

8、查詢有30名以上學生選修的課程號。

    Select cno fromsc group by cno having count(*)>30

9、查詢至今沒有考試不及格的學生學號。

    Select distinctsno from sc where sno not in

         ( Select sno from sc where grade<60 )

或:

Select sno from sc group by sno havingmin(grade)>=60

補充三

1、找出選修課程號為C2的學生學號與成績。

Select sno,grade from sc where cno='C2'

2、找出選修課程號為C4的學生學號與姓名。

    Selects.sno,sname from s,sc where s.sno=sc.sno and cno='C4'

注意本題也可以用嵌套做

思考本題改為“找出選修課程號為C4的學生學號、姓名與成績”后還能用嵌套做嗎?

3、找出選修課程名為 Maths 的學生學號與姓名。

    Selects.sno,sname from s,sc,c
    where  s.sno=sc.sno and c.cno=sc.cno andcname='Maths'

注意本題也可以用嵌套做

4、找出選修課程號為C2或C4的學生學號。

    Select distinctsno from sc where cno in ('C2','C4')

或:

Select distinct sno from sc where cno='C2' or cno='C4'

5、找出選修課程號為C2和C4的學生學號。

    Select sno fromsc where cno='C2' and sno in

         ( Select sno from sc where cno='C4' )

注意本題也可以用連接做

思考:

Select distinct sno from sc where cno='C2' andcno='C4'正確嗎?

6、找出不學C2課程的學生姓名和年齡。

    Selectsname,sage from s where sno not in

         ( Selectsno from sc where cno='C2' 

或:

 Select sname,sage from s where not exists

              (Select * from sc where sno=s.sno and cno='C2' ) 

7、找出選修了數據庫課程的所有學生姓名。(同3)

    Select snamefrom s,sc,c

where  s.sno=sc.snoand c.cno=sc.cno and cname='數據庫'

8、找出數據庫課程不及格的女生姓名。

    連接:Select sname from s,sc,c
         where  s.sno=sc.sno andc.cno=sc.cno and cname='數據庫'

                and grade<60 and ssex='女'

    嵌套:Select sname from s where ssex='女' and  sno in

               (Select sno from sc where grade<60 and cno in

                     ( Select cno from c where cname='數據庫' )

               )

9、找出各門課程的平均成績,輸出課程名和平均成績。

    Selectcname,avg(grade) from sc,c

    wherec.cno=sc.cno  group by c.cno,cname

思考本題也可以用嵌套做嗎?

10、找出各個學生的平均成績,輸出學生姓名和平均成績。

    Selectsname,avg(grade) from s,sc

    wheres.sno=sc.sno group by s.sno,sname

思考本題也可以用嵌套做嗎?

11、找出至少有30個學生選修的課程名。

    Select cnamefrom c where cno in

         ( Selectcno from sc group by cno having count(*)>=30 )

注意本題也可以用連接做

12、找出選修了不少於3門課程的學生姓名。

    Select snamefrom s where sno in

         ( Selectsno from sc group by sno having count(*)>=3 )

注意本題也可以用連接做

13、找出各門課程的成績均不低於90分的學生姓名。

   Select snamefrom s,sc where s.sno=sc.sno

         group bys.sno,sname having min(grade)>=90

方法二:

Select sname from s where sno not in

         ( Selectsno from sc where grade<90 )

只要有一門不小於90分就會輸出該學生學號

14、找出數據庫課程成績不低於該門課程平均分的學生姓名。

    Select snamefrom s,sc,c

    where  s.sno=sc.sno and sc.cno=c.cno and cname='數據庫' and grade>

         ( Selectavg(grade) from sc,c

           where sc.cno=c.cnoand cname='數據庫'

         )

15、找出各個系科男女學生的平均年齡和人數。

    Selectsdept,ssex,avg(sage),count(*) from s group by sdept,ssex

16、找出計算機系(JSJ)課程平均分最高的學生學號和姓名。

    Selects.sno,sname from s,sc where s.sno=sc.sno and sdept='JSJ'

    group bys.sno,sname

    havingavg(grade) >=ALL

         ( Selectavg(grade) from s,sc

           wheres.sno=sc.sno and sdept='JSJ'

           group bys.sno

         )

17、(補充)查詢每門課程的及格率。

本題可以分三步做:

第1步:得到每門課的選修人數

     createview  v_all(cno,cnt)

         as selectcno, count(*) from sc group by cno

第2步:得到每門課及格人數

     createview  v_pass(cno,cnt_pass)

         as selectcno, count(*) from sc where grade>=60 group by cno

第3步:每門課的及格人數/每門課選修人數

     selectv_all.cno, cnt_pass*100/cnt  from  v_all, v_pass

     where v_all.cno = v_pass.cno

18、查詢平均分不及格的學生的學號,姓名,平均分。

    Selectsc.sno,sname,avg(grade) from student,sc

    wherestudent.sno=sc.sno

    group bysc.sno,sname

    havingavg(grade)<60

思考本題也可以用嵌套做嗎?

19、查詢平均分不及格的學生人數。

    Select count(*)from student

    where sno in

         ( selectsno from sc group by sno having avg(grade)<60 )

下面是一個典型的錯誤

Select count(*) from sc group by sno havingavg(grade)<60

這是每個學生有幾門不及格的數目

補充四

1、查詢工資在1000到3000元之間的男性業務員的姓名和辦公室編號。

    SelectYname,Ono from YWY

    where Salarybetween 1000 and 3000 and Ysex='男'

2、查詢各個辦公室的業務員人數,輸出辦公室編號和對應的人數。

    SelectOno,count(*) from YWY group by Ono

3、查詢每個客戶在2002年5月購買的總金額,輸出客戶號和相應的總金額。

    SelectKno,sum(Fmoney) from FP

    where Fdatebetween '2002.5.1' and '2002.5.31'

    group by Kno

4、查詢2002年5月購買次數超過5次的所有客戶號,且按客戶號升序排序。

    Select Kno fromFP

    where Fdatebetween '2002.5.1' and '2002.5.31'

    group by Kno

    havingcount(*)>5

    order by KnoASC

5、查詢各辦公室男性和女性業務員的平均工資。

    SelectOno,Ysex,avg(Salary) from YWY group by Ono,Ysex

6、查詢2002年5月曾經在王海亮業務員手中購買過商品的客戶號、 客戶姓名和聯系電話。

    SelectKno,Kname,Phone from KH where Kno in

         ( SelectKno from FP

           whereFdate between '2002.5.1' and '2002.5.31' and Yno in

                      ( Select Yno from YWY where Yname='王海亮' )

         )

注意本題也可以用連接做

7、查詢所有工資比1538號業務員高的業務員的編號、姓名和工資。

    SelectYno,Yname,Salary from YWY where Salary >

         ( SelectSalary from YWY where Yno='1538' )

8、查詢所有與1538號業務員在同一個辦公室的其他業務員的編號和姓名。

    SelectYno,Yname from YWY where Yno!='1538' and Ono in

         ( SelectOno from YWY where Yno='1538' )

9、查詢銷售總金額最高的業務員的編號。

    Select Yno fromFP group by Yno having sum(Fmoney) >=ALL

         ( Selectsum(Fmoney) from FP group by Yno )

10、查詢所有業務員的編號、姓名、工資以及工資比他高的其他業務員的平均工資。

利用自連接

    SelectY1.Yno,Y1.Yname,Y1.Salary,avg(Y2.Salary)

    from   YWY Y1, YWY Y2

    where  Y1.Salary < Y2.Salary

    group by  Y1.Yno 

補充五

1、找出每個班級的班級代碼、學生人數、平均成績。

    SelectBJDM,count(*),avg(CJ) from SC group by BJDM

2、找出每個學生的班級代碼、學生姓名、考試科目數、總成績。

    SelectBJDM,XSXM,count(*),sum(CJ) from SC

    group byBJDM,BNXH,XSXM

3、輸出一張表格,每位學生對應一條記錄,包括字段:班級代碼、學生姓名、語文成績、數學成績、外語成績。

    SelectSC1.BJDM,SC1.XSXM,SC1.CJ,SC2.CJ,SC3.CJ

    from  SC SC1, SC SC2, SC SC3

    whereSC1.BJDM=SC2.BJDM and SC1.BNXH=SC2.BNXH and

         SC2.BJDM=SC3.BJDM and SC2.BNXH=SC3.BNXH and

          SC1.KM='語文' and SC2.KM='數學' and SC3.KM='外語'

4、輸出一張表格,有成績低於60分的每位學生對應一條記錄,包括字段:班級代碼、學生姓名、最低成績。

    SelectBJDM,XSXM,min(CJ) from SC

    where  CJ<60 group by BJDM,BNXH,XSXM

    或:  SelectBJDM,XSXM,min(CJ) from SC

          group byBJDM,BNXH,XSXM

          havingmin(CJ)<60

5、輸出一張表格,有成績低於60分的每位學生對應一條記錄,包括字段: 班級代碼、學生姓名、最高成績、平均成績。

    SelectBJDM,XSXM,max(CJ) from SC

    group byBJDM,BNXH,XSXM

    havingmin(CJ)<60

請思考下列做法是否正確:

          SelectBJDM,XSXM,max(CJ),avg(CJ) from SC

         where  CJ<60 group byBJDM,BNXH,XSXM

6、輸出一張表格,所有成績都不低於60分的每位學生對應一條記錄,包括字段:班級代碼、學生姓名、平均成績。

    SelectBJDM,XSXM,avg(CJ) from SC

    group by BJDM,BNXH,XSXM

    havingmin(CJ)>=60

7、輸出一張表格,每一位學生對應一條記錄,包括字段:班級代碼、學生姓名、去掉一個最低分后的平均成績。

    SelectBJDM,XSXM,(sum(CJ)-min(CJ))/(count(*)-1) from SC

    group byBJDM,BNXH,XSXM

8、輸出一張表格,每門科目對應一條記錄,包括字段: 科目、去掉一個最低分后的平均成績。

    Select KM,(sum(CJ)-min(CJ))/(count(*)-1)from SC

    group by KM

補充六

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

思考本題也可以用嵌套做嗎?

11、查詢選修“數據庫原理”課且成績 80 以上的學生姓名(用連接和嵌套2種方法)

    連接:Select sname from student,sc,course

          wherestudent.sno=sc.sno and sc.cno=course.cno and

               cname='數據庫原理' and grade>80

    嵌套:Select sname from student where sno in 

               (select sno from sc where grade>80 and cno in 

                    ( select cno from course where cname='數據庫原理' )

               )

14、查詢沒有選修1002課程的學生的學生姓名。

    Select snamefrom student

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

    或: select sname from student

         where notexists

              (select * from sc where cno='1002' and sno=student.sno)

思考本題也可以用一般的連接做嗎?

15、查詢平均分最高的學生學號及平均分。

    Selectsno,avg(grade)

    from sc

    group by sno

    havingavg(grade) >=ALL ( Select avg(grade)

                              from sc

                              group by sno

                            )

16、查詢每門課程成績都高於該門課程平均分的學生學號。

可以先計算每門課程平均分

    create viewc_avg(cno,avg_grade)

         as selectcno,avg(grade) from sc group by cno

    再查詢

    Select distinctsno from sc

    where sno notin ( Select sno from sc,c_avg

                      where sc.cno=c_avg.cno and grade<avg_grade

                    )

   ===========================================

    SELECT DISTINCT Sno

    FROM SC SC1

    WHERE SC1.SnoNOT IN

          ( SELECT SC2.Sno

            FROM SC SC2

            WHERE SC2.Grade <=

                 ( SELECT AVG(SC3.Grade)

                   FROM SC SC3

                   WHERE SC3.Cno=SC2.Cno

                 )

          )

或:

    SELECT DISTINCTSno

    FROM SC SC1

    WHERE NOTEXISTS

          (SELECT *

            FROM SC SC2

            WHERE SC2.Sno=SC1.Sno AND SC2.Grade <=

                       (SELECT AVG(SC3.Grade)

                         FROM SC SC3

                         WHERE SC3.Cno=SC2.Cno

                       )

          )

(3)檢索至少選修LIU老師所授課程中一門課程的女學生姓名。

 SELECT SNAME
    FROM S
    WHERE SEX=‘F’ AND S# IN
     (SELECT S#
     FROM SC
     WHERE C# IN
      (SELECT C#
      FROM C
      WHERE TEACHER=‘LIU’)

NOTICE:有多種寫法,比如聯接查詢寫法:

    SELECT SNAME
    FROM S,SC,C
    WHERE SEX=‘F’ AND SC.S#=S.S#
    AND SC.C#=C.C#
    AND TEACHER='LIU'

但上一種寫法更好一些。

(4)檢索WANG同學不學的課程的課程號。

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

(5)檢索至少選修兩門課程的學生學號。

    SELECT DISTINCT X.SNO
    FROM SC X,SC Y
    WHERE X.SNO=Y.SNO AND X.CNO<>Y.CNO

Notice:對表SC進行自連接,X,Y是SC的兩個別名。

(6)檢索全部學生都選修的課程的課程號與課程名。

    SELECT C#,CNAME
    FROM C
    WHERE NOT EXISTS
     (SELECT *
     FROM S
     WHERE S# NOT IN
      (SELECT *
      FROM SC
      WHERE  SC.C#=C.C#))

要從語義上分解:(1)選擇課程的課程號與課程名,不存在不選這門課的同學。

其中,“不選這門課的同學”可以表示為:

SELECT *

 FROM  S

 WHERE  S# NOT IN

  (SELECT  *

      FROM SC  

      WHERE  SC.C#=C.C#)

或者

SELECT *

 FROM  S

 WHERE   NOT EXISTS

  (SELECT  *

      FROM SC  

      WHERE S.S#=C.S# AND 

SC.C#=C.C# )

(7)檢索選修課程包含LIU老師所授課的學生學號。    

     SELECT DISTINCT S#
     FROM SC
     WHERE C# IN
      (SELECT C#
      FROM C
      WHERE TEACHER='LIU'))   

3.3 設有兩個基本表R(A,B,C)和S(D,E,F),試用SQL查詢語句表達下列關系代數表達式:

(1)πA(R)(2)σB='17'(R)(3)R×S(4))πA,F(σC=D(R×S))

(1)SELECT A FROM R

(2)SELECT * FROM R WHERE B='17'

(3)SELECT A,B,C,D,E,F FROM R,S

(4)SELECT A,F FROM R,S WHERE R.C=S.D

3.43.4 設有兩個基本表R(A,B,C)和S(A,B,C)試用SQL查詢語句表達下列關系代數表達式:

  (1)R∪S  (2)R∩S  (3)R-S  (4)πA,B(R)πB,C(S)

    (1)

SELECT A,B,C
      FROM R
      UNION
      SELECT A,B,C
      FROM S

 (2)

   SELECT A,B,C
      FROM R
      INTERSECT
      SELECT A,B,C
      FROM S

 (3)

SELECT A,B,C
      FROM R
      WHERE NOT EXISTS
       (SELECT A,B,C
       FROM S
       WHERE R.A=S.A AND R.B=S.B AND R.C=S.C)

 (4)

SELECT R.A,R.B,S.C
      FROM R,S
      WHERE R.B=S.B

3.5 試敘述SQL語言的關系代數特點和元組演算特點。

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.S#,SNAME,SADDR,QUANTITY
          FROM PART,P_S,SUPPLIER
          WHERE PART.P#=P_S.P# AND P_S.S#=SUPPLIER.S#

(3)試在上述兩個視圖的基礎上進行數據查詢:

    1)檢索上海的供應商所供應的零件的編號和名字。

    SELECT P#,PNAME FROM VIEW2 WHERE SADDR='SHANGHAI'

    2)檢索項目J4所用零件的供應商編號和名字。

    SELECT S#,SNAME FROM VIEW2 WHERE P# IN(SELECT P# FROM VIEW1 WHERE J#='J4')

3.9 對於教學數據庫中基本表SC,已建立下列視圖:

CREATEVIEWS_GRADE(S#,C_NUM,AVG_GRADE)
ASSELECTS#,COUNT(C#),AVG(GRADE)
FROMSC
GROUPBYS#

試判斷下列查詢和更新是否允許執行。若允許,寫出轉換到基本表SC上的相應操作。

  (1)

SELECT*
FROMS_GRADE
      允許
   SELECT S#,COUNT(C#),AVG(GRADE)FROM SC GROUP BY S#

  (2)

SELECTS#,C_NUM
FROMS_GRADE
WHEREAVG_GRADE>80
    允許
   SELECT S#,COUNT(C#) FROM SC WHEREAVG(GRADE)>80

  (3)

SELECTS#,AVG_GRADE
FROMS_GRADE
WHEREC_NUM>(SELECTC_NUM
FROMS_GRADE
WHERES#=‘S4’)
    允許
   SELECT S#,AVG(GRADE)
   FROM SC AS X
   WHERE COUNT(X.C#)>(SELECTCOUNT(Y.C#) FROM SC AS Y WHERE Y.S#='S4')
   GROUP BY S#

  (4)

UPDATES_GRADE
SETC_NUM=C_NUM+1
WHERES#=‘S4’
    不允許

  (5)

 DELETEFROMS_GRADE
WHEREC_NUM>4
    不允許

3.10 預處理方式對於嵌入式SQL的實現有什么重要意義?

預處理方式是先用預處理程序對源程序進行掃描,識別出SQL語句,並處理成宿主語言的函數調用形式; 然后再用宿主語言的編譯程序把源程序編譯成目標程序。這樣,不用擴充宿主語言的編譯程序, 就能處理SQL語句。

3.11 在宿主語言的程序中使用SQL語句有哪些規定?

在宿主語言的程序中使用SLQ語句有以下規定:

(1)在程序中要區分SQL語句與宿主語言語句

(2)允許嵌入的SQL語句引用宿主語言的程序變量(稱為共享變量),但有兩條規定:

   1)引用時,這些變量前必須加“:”作為前綴標識,以示與數據庫中變量有區別。

   2)這些變量由宿主語言的程序定義,並用SQL的DECLARE語句說明。

(3)SQL的集合處理方式與宿主語言單記錄處理方式之間要協調。 需要采用游標機制,把集合操作轉換成單記錄處理方式。

3.12SQL的集合處理方式與宿主語言單記錄處理方式之間如何協調?

由於SQL語句處理的是記錄集合,而宿主語言語句一次只能處理一個記錄, 因此需要用游標(cousor)機制,把集合操作轉換成單記錄處理方式。

2.13 嵌入式SQL語句何時不必涉及到游標?何時必須涉及到游標?

(1)INSERT、DELETE、UPDATE語句,查詢結果肯定是單元組時的SELECT語句, 都可直接嵌入在主程序中使用,不必涉及到游標。

(2)當SELECT語句查詢結果是多個元組時,此時宿主語言程序無法使用, 一定要用游標機制把多個元組一次一個地傳送給宿主語言處理。

(電商)數據庫原理及應用_模擬考核試題及參考答案

一、單選 (每空1分,共10分)

1.在Access數據庫中,數據保存在( )對象中。

A.窗體 B.查詢 C.報表 D.表

2.如果某一字段數據型為文本型,字段大小為8,該字段中最多可輸入( )個漢字。

A.8 B.4 C.16 D.32

3.文本型字段最多可以存放( )個字符。

A.250 B.252 C.254 D.255

4.Access用戶操作界面由( )部分組成。

A.4 B.5 C.3 D.6

5.下列( )圖標是Access中表對象的標志。

A. B. C. D.

6.在設計Access數據表時,“索引”屬性有( )取值。

A.1 B.2 C.3 D.4

7.Access中包含有( )種數據類型。

A.9 B.10 C.7 D.8

8.在一個宏中要打開一個報表,應該使用的操作是( )。

A.OpenForm B.OpenReport C.OpenTable D.OpenQuery

9.可以通過Internet進行數據發布的對象是( )。

A.窗體 B.報表 C.查詢 D.數據訪問頁

10.模塊窗口由( )個部分組成。

A.2 B.3 C.4 D.5

二、填空 (每空1分,共20分)

1.在人工管理和文件管理階段,程序設計__依賴於 ___數據表示。

2.在文件系統中,存取數據的基本單位為___記錄____,在數據庫系統中,存取數據的基本單位為___數據項_____。

3.若實體A和B是多對多的聯系,實體B和C是1對1的聯系,則實體A和C是___多_____對___多_____的聯系。

4.在一個關系中不允許出現重復的____元組____,也不允許出現具有相同名字的___屬性_____。

5.數據庫系統中的四類用戶分別為____數據庫管理員、數據庫設計員、應用程序員、終端用戶_____。

6.在存取數據庫的數據的過程中,使用了兩個數據緩沖區,分別為___系統_____緩沖區和____用戶 ____緩沖區。

7.學生關系中的班級號屬性與班級關系中的班級號主碼屬性相對應,則____班級號____為學生關系中的___外碼___。

8.設一個關系A具有a1個屬性和a2個元組,關系B具有b1個屬性和b2個元組,則關系A´B具有___a1+b1____個屬性和____ a2´b2 ____個元組。

9.設一個學生關系為S(學生號,姓名),課程關系為C(課程號,課程名),選課關系為X(學生號,課程號,成績),求出所有選課的學生信息的運算表達式為_____Õ學生號(X)______與____S ____的自然連接。

10.在一個關系R中,若存在X→Y和X→Z,則存在_____ X→(Y,Z)_______,稱此為函數依賴的合並性規則。

三、填空 (每空1分,共20分)

1.若一個關系的任何非主屬性都不部分依賴依賴於任何候選碼,則稱該關系達到____第二____范式。

2.在SQL中,列級完整性約束分為__6__種情況,表級完整性約束分為__4__種情況。

\3. 在SQL中,每個視圖中的列可以來自不同的___表___,它是在原有表的基礎上____建立____的邏輯意義上的新關系。

\4. 在SQL的查詢語句中,group by選項實現____分組統計______功能,order by選項實現對結果表的____排序_____功能。

5.對於較復雜的系統,概念設計階段的主要任務是:首先根據系統的各個局部應用畫出各自對應的____局部ER圖______,然后再進行綜合和整體設計,畫出_____整體ER圖_____。

6.機器實現階段的目標是在計算機系統中得到一個滿足______設計要求、功能完善、操作方便___的數據庫應用系統。

7.Access的用戶操作界面由 標題欄、菜單欄、工作區 、工具欄、狀態欄等五個部分組成。

8.Access“表”結構設計窗口中上半部分的“表設計器”是由 字段名稱、數據類型、說明 等三列組成。

9.Access中的窗體由 頁眉、主體 和頁腳等三個部分組成。

四、填空 (每空1分,共20分)

\1. 設一個關系為R(A,B,C,D,E),它的最小函數依賴集為FD={A→B,A→C,(C,D)→E},則該關系的候選碼為_____(A,D)___,候選碼函數決定E是___偽傳遞___性。

2.設一個關系為R(A,B,C,D,E),它的最小函數依賴集為FD={A→B,A→C,(A,D)→E},該關系只滿足___第一_____范式,若要規范化為高一級的范式,則將得到____2____個關系。

3.在實際的數據庫管理系統中,對數據庫的操作方式有_____命令交互、程序執行、窗口界面______等三種。

4.在SQL中,主碼約束的關鍵字為____ primary key________,外碼約束的關鍵字為______foreignkey ______。

5.基本表屬於全局模式中的表,它是____實表____,而視圖則屬於局部模式中的表,它是____虛表 ____。

\6. 在SQL新版的查詢語句中,select選項實現投影運算,from選項實現____連接____運算,where選項實現____選擇___運算。

7.數據字典是對系統工作流程中____數據____和____處理____的描述。

8.關系數據庫系統中的全局模式由若干個基本表所組成,表與表之間的聯系是通過定義的____主碼____和____外碼____實現的。

9.在旅店管理中,涉及到的基本表有四個,它們分別為客房表、住宿表、_旅客登記表、消費卡表

10.在設置或撤消數據庫密碼的過程中,密碼對於字母 大小寫 是敏感的。

五、填空 (每空1分,共10分)

1.Access的用戶操作界面由 標題欄、菜單欄、工作區 、工具欄、狀態欄等五個部分組成。

2.Access“表”結構設計窗口中上半部分的“表設計器”是由 字段名稱、數據類型 和說明等三列組成。

3.Access中的窗體由 頁眉、主體、頁腳 等三個部分組成。

4.在Access中模塊分為 類模塊 和 標准模塊 兩種類型。

六、根據主教材第四章所給的商品庫和教學庫,或者按照下列所給的每條SQL查詢語句寫出相應的功能,或者按照下列所給的每種功能寫出相應的SQL查詢語句。(每小題4分,共20分)

在名稱為商品庫的數據庫中包含有商品表1和商品表2,它們的定義分別為:

商品表1(商品代號 char(8),分類名 char(8),單價 float,數量 int)

商品表2(商品代號 char(8),產地 char(6),品牌 char(6),)

在名稱為教學庫的數據庫中包含有學生、課程和選課三個表,它們的定義分別為:

學生(學生號 char(7),姓名 char(6),性別 char(2),出生日期 datetime,

專業 char(10),年級 int)

課程(課程號 char(4),課程名 char(10),課程學分 int

選課(學生號 char(7),課程號 char(4),成績 int)

    1.select distinct 產地

        from 商品表2

       功能:從商品庫中查詢出所有商品的不同產地。
 2.select *

        from 學生

        where 學生號 in (select 學生號

          from 選課

          group by 學生號 having count(*)=1

        )

    功能:從教學庫中查詢出只選修了一門課程的全部學生。

    3.select *

         from 學生

         where 學生號 in (select 學生號

           from 選課

           group by 學生號 having count(*)<=2   

         ) or not exists (select *

              from 選課

              where 學生.學生號=選課.學生號

         )

    功能: 從教學庫中查詢出最多選修了2門課程(含未選任何課程)的全部學生。

4.從商品庫中查詢出每類(即分類名相同)商品的最高單價。

 select 分類名,max(單價) as 最高單價

        from 商品表1

        group by 分類名

5.從教學庫中查詢出至少選修了姓名為@m1學生所選課程中一門課的全部學生。

select distinct 學生.*

        from 學生,選課

        where 學生.學生號=選課.學生號 and 課程號=any(select 課程號

          from 學生,選課

          where 學生.學生號=選課.學生號 and 姓名=@m1

        )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM