SQL練習題完整(做完你就是高手)

SQL 練習題答案

 

一、補充作業一、
 
設有三個關係:
               S(SNO, SNAME, AGE, SEX,Sdept)
               SC(SNO, CNO, GRADE)
               C(CNO, CNAME, TEACHER)
試用關係代數表達式表示下列查詢:
 
1、查詢學號爲S3學生所學課程的課程名與任課教師名。
  
2、查詢至少選修LIU老師所教課程中一門課的女生姓名。

3、查詢WANG同學不學的課程的課程號。

4、查詢至少選修兩門課程的學生學號。

5、查詢選修課程中包含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 90

 

 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

10、查詢所有考試成績的平均分相同的學生學號分組

二、

 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

 

 

 

        實驗指導中“八 SQL查詢語句” 的答案

 

 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 設有兩個基本表RABC)和SDEF),試用SQL查詢語句表達下列關係代數表達式:
  (1πA(R)(2)σB='17'(R)(3)R×S(4))πA,FC=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 設有兩個基本表RABC)和SABC)試用SQL查詢語句表達下列關係代數表達式:
  (1RS  (2RS  (3RS  (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語言的關係代數特點和元組演算特點。
(P61-62)

3.6 試用SQL查詢語句表達下列對教學數據庫中三個基本表SSCC的查詢:

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更新語句表達對教學數據庫中三個基本表SSCC的各個更新操作:
1)往基本表S中插入一個學生元組(‘S9’‘WU’18)。
    INSERT INTO S(S#,SNAME,AGE) VALUES('59','WU',18)
2)在基本表S中檢索每一門課程成績都大於等於80分的學生學號、姓名和性別,並把檢索到的值送往另一個已存在的基本表STUDENTS#,SANMESEX)。
    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 在第1章例1.4中提到倉庫管理關係模型有五個關係模式:
  零件 PARTP#,PNAMECOLORWEIGHT
  項目 PROJECTJ#,JNAMEDATE
  供應商 SUPPLIERS#,SNAMESADDR
  供應 P_PJ#,P#,TOTOAL
  採購 P_SP#,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)試將PROGECTP_PPART三個基本表的自然聯接定義爲一個視圖VIEW1PARTP_SSUPPLIER 三個基本表的自然聯接定義爲一個視圖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_GRADES#,C_NUMAVG_GRADE
ASSELECTS#,COUNT(C)AVGGRADE
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_GRADE80
    允許
   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_NUMC_NUM1
WHERES#=‘S4’
    不允許

  (5 DELETEFROMS_GRADE
WHEREC_NUM4
    不允許

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             C.16           D.32

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

       A.250        B.252         C.254            D255

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

       A.4           B         C.3           D.6

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

       A.         B.         C        D.

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

       A.1              B.2              C3                D.4

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

       A.9              B10             C.7                D.8

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

       A.OpenForm       BOpenReport       C.OpenTable       D.OpenQuery

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

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

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

       A.2            B3              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

        )

 

 

 

 

 

1.   Student(S#,Sname,Sage,Ssex) 學生表 

2.   Course(C#,Cname,T#) 課程表 

3.   SC(S#,C#,score) 成績表 

4.   Teacher(T#,Tname) 教師表 

5.    

6.   問題: 

7.   1、查詢“001”課程比“002”課程成績高的所有學生的學號; 

8.     select a.S# from (select s#,score from SC where C#='001') a,(select s#,score 

9.     from SC where C#='002') b 

10.    where a.score>b.score and a.s#=b.s#; 

11.  2、查詢平均成績大於60分的同學的學號和平均成績; 

12.      select S#,avg(score) 

13.      from sc 

14.      group by S# having avg(score) >60; 

15.  3、查詢所有同學的學號、姓名、選課數、總成績; 

16.    select Student.S#,Student.Sname,count(SC.C#),sum(score) 

17.    from Student left Outer join SC on Student.S#=SC.S# 

18.    group by Student.S#,Sname 

19.  4、查詢姓“李”的老師的個數; 

20.    select count(distinct(Tname)) 

21.    from Teacher 

22.    where Tname like '%'

23.  5、查詢沒學過“葉平”老師課的同學的學號、姓名; 

24.      select Student.S#,Student.Sname 

25.      from Student  

26.      where S# not in (select distinct( SC.S#) from SC,Course,Teacher where  SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平'); 

27.  6、查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名; 

28.    select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002'); 

29.  7、查詢學過“葉平”老師所教的所有課的同學的學號、姓名; 

30.    select S#,Sname 

31.    from Student 

32.    where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher  where Teacher.T#=Course.T# and Tname='葉平')); 

33.  8、查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名; 

34.    Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2 

35.    from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score; 

36.  9、查詢所有課程成績小於60分的同學的學號、姓名; 

37.    select S#,Sname 

38.    from Student 

39.    where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60); 

40.  10、查詢沒有學全所有課的同學的學號、姓名; 

41.      select Student.S#,Student.Sname 

42.      from Student,SC 

43.      where Student.S#=SC.S# group by  Student.S#,Student.Sname having count(C#) <(select count(C#) from Course); 

44.  11、查詢至少有一門課與學號爲“1001”的同學所學相同的同學的學號和姓名; 

45.      select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001'

46.  12、查詢至少學過學號爲“001”同學所有一門課的其他同學學號和姓名; 

47.      select distinct SC.S#,Sname 

48.      from Student,SC 

49.      where Student.S#=SC.S# and C# in (select C# from SC where S#='001'); 

50.  13、把“SC”表中“葉平”老師教的課的成績都更改爲此課程的平均成績; 

51.      update SC set score=(select avg(SC_2.score) 

52.      from SC SC_2 

53.      where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='葉平'); 

54.  14、查詢和“1002”號的同學學習的課程完全相同的其他同學學號和姓名; 

55.      select S# from SC where C# in (select C# from SC where S#='1002'

56.      group by S# having count(*)=(select count(*) from SC where S#='1002'); 

57.  15、刪除學習“葉平”老師課的SC表記錄; 

58.      Delect SC 

59.      from course ,Teacher  

60.      where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平'

61.  16、向SC表中插入一些記錄,這些記錄要求符合以下條件:沒有上過編號“003”課程的同學學號、2、 

62.      號課的平均成績; 

63.      Insert SC select S#,'002',(Select avg(score) 

64.      from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002'); 

65.  17、按平均成績從高到低顯示所有學生的“數據庫”、“企業管理”、“英語”三門的課程成績,按如下形式顯示: 學生ID,,數據庫,企業管理,英語,有效課程數,有效平均分 

66.      SELECT S# as 學生ID 

67.          ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 數據庫 

68.          ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企業管理 

69.          ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英語 

70.          ,COUNT(*) AS 有效課程數, AVG(t.score) AS 平均成績 

71.      FROM SC AS t 

72.      GROUP BY S# 

73.      ORDER BY avg(t.score)  

74.  18、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分 

75.      SELECT L.C# As 課程ID,L.score AS 最高分,R.score AS 最低分 

76.      FROM SC L ,SC AS R 

77.      WHERE L.C# = R.C# and 

78.          L.score = (SELECT MAX(IL.score) 

79.                        FROM SC AS IL,Student AS IM 

80.                        WHERE L.C# = IL.C# and IM.S#=IL.S# 

81.                        GROUP BY IL.C#) 

82.          AND 

83.          R.Score = (SELECT MIN(IR.score) 

84.                        FROM SC AS IR 

85.                        WHERE R.C# = IR.C# 

86.                    GROUP BY IR.C# 

87.                      ); 

88.  19、按各科平均成績從低到高和及格率的百分數從高到低順序 

89.      SELECT t.C# AS 課程號,max(course.Cname)AS 課程名,isnull(AVG(score),0) AS 平均成績 

90.          ,100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分數 

91.      FROM SC T,Course 

92.      where t.C#=course.C# 

93.      GROUP BY t.C# 

94.      ORDER BY 100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC 

95.  20、查詢如下課程平均成績和及格率的百分數(用"1"顯示): 企業管理(001),馬克思(002),OO&UML (003),數據庫(004) 

96.      SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企業管理平均分 

97.          ,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企業管理及格百分數 

98.          ,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 馬克思平均分 

99.          ,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 馬克思及格百分數 

100.                ,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分 

101.                ,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分數 

102.                ,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 數據庫平均分 

103.                ,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 數據庫及格百分數 

104.          FROM SC 

105.        21、查詢不同老師所教不同課程平均分從高到低顯示 

106.          SELECT max(Z.T#) AS 教師ID,MAX(Z.Tname) AS 教師姓名,C.C# AS 課程ID,MAX(C.Cname) AS 課程名稱,AVG(Score) AS 平均成績 

107.            FROM SC AS T,Course AS C ,Teacher AS Z 

108.            where T.C#=C.C# and C.T#=Z.T# 

109.          GROUP BY C.C# 

110.          ORDER BY AVG(Score) DESC 

111.        22、查詢如下課程成績第 3 名到第 6 名的學生成績單:企業管理(001),馬克思(002),UML (003),數據庫(004) 

112.            [學生ID],[學生姓名],企業管理,馬克思,UML,數據庫,平均成績 

113.            SELECT  DISTINCT top 3 

114.              SC.S# As 學生學號, 

115.                Student.Sname AS 學生姓名 , 

116.              T1.score AS 企業管理, 

117.              T2.score AS 馬克思, 

118.              T3.score AS UML, 

119.              T4.score AS 數據庫, 

120.              ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 總分 

121.              FROM Student,SC  LEFT JOIN SC AS T1 

122.                              ON SC.S# = T1.S# AND T1.C# = '001' 

123.                    LEFT JOIN SC AS T2 

124.                              ON SC.S# = T2.S# AND T2.C# = '002' 

125.                    LEFT JOIN SC AS T3 

126.                              ON SC.S# = T3.S# AND T3.C# = '003' 

127.                    LEFT JOIN SC AS T4 

128.                              ON SC.S# = T4.S# AND T4.C# = '004' 

129.              WHERE student.S#=SC.S# and 

130.              ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) 

131.              NOT IN 

132.              (SELECT 

133.                    DISTINCT 

134.                    TOP 15 WITH TIES 

135.                    ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) 

136.              FROM sc 

137.                    LEFT JOIN sc AS T1 

138.                              ON sc.S# = T1.S# AND T1.C# = 'k1' 

139.                    LEFT JOIN sc AS T2 

140.                              ON sc.S# = T2.S# AND T2.C# = 'k2' 

141.                    LEFT JOIN sc AS T3 

142.                              ON sc.S# = T3.S# AND T3.C# = 'k3' 

143.                    LEFT JOIN sc AS T4 

144.                              ON sc.S# = T4.S# AND T4.C# = 'k4' 

145.              ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC); 

146.         

147.        23、統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60] 

148.            SELECT SC.C# as 課程ID, Cname as 課程名稱 

149.                ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85] 

150.                ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70] 

151.                ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60] 

152.                ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -] 

153.            FROM SC,Course 

154.            where SC.C#=Course.C# 

155.            GROUP BY SC.C#,Cname; 

156.         

157.        24、查詢學生平均成績及其名次 

158.              SELECT 1+(SELECT COUNT( distinct 平均成績) 

159.                      FROM (SELECT S#,AVG(score) AS 平均成績 

160.                              FROM SC 

161.                          GROUP BY S# 

162.                          ) AS T1 

163.                    WHERE 平均成績 > T2.平均成績) as 名次, 

164.              S# as 學生學號,平均成績 

165.            FROM (SELECT S#,AVG(score) 平均成績 

166.                    FROM SC 

167.                GROUP BY S# 

168.                ) AS T2 

169.            ORDER BY 平均成績 desc; 

170.          

171.        25、查詢各科成績前三名的記錄:(不考慮成績並列情況) 

172.              SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數 

173.              FROM SC t1 

174.              WHERE score IN (SELECT TOP 3 score 

175.                      FROM SC 

176.                      WHERE t1.C#= C# 

177.                    ORDER BY score DESC 

178.                      ) 

179.              ORDER BY t1.C#; 

180.        26、查詢每門課程被選修的學生數 

181.          select c#,count(S#) from sc group by C#; 

182.        27、查詢出只選修了一門課程的全部學生的學號和姓名 

183.          select SC.S#,Student.Sname,count(C#) AS 選課數 

184.          from SC ,Student 

185.          where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1; 

186.        28、查詢男生、女生人數 

187.            Select count(Ssex) as 男生人數 from Student group by Ssex having Ssex=''

188.            Select count(Ssex) as 女生人數 from Student group by Ssex having Ssex=''; 

189.        29、查詢姓“張”的學生名單 

190.            SELECT Sname FROM Student WHERE Sname like '%'

191.        30、查詢同名同性學生名單,並統計同名人數 

192.          select Sname,count(*) from Student group by Sname having  count(*)>1;; 

193.        31、1981年出生的學生名單(注:Student表中Sage列的類型是datetime) 

194.            select Sname,  CONVERT(char (11),DATEPART(year,Sage)) as age 

195.            from student 

196.            where  CONVERT(char(11),DATEPART(year,Sage))='1981'

197.        32、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列 

198.            Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ; 

199.        33、查詢平均成績大於85的所有學生的學號、姓名和平均成績 

200.            select Sname,SC.S# ,avg(score) 

201.            from Student,SC 

202.            where Student.S#=SC.S# group by SC.S#,Sname having    avg(score)>85; 

203.        34、查詢課程名稱爲“數據庫”,且分數低於60的學生姓名和分數 

204.            Select Sname,isnull(score,0) 

205.            from Student,SC,Course 

206.            where SC.S#=Student.S# and SC.C#=Course.C# and  Course.Cname='數據庫'and score <60; 

207.        35、查詢所有學生的選課情況; 

208.            SELECT SC.S#,SC.C#,Sname,Cname 

209.            FROM SC,Student,Course 

210.            where SC.S#=Student.S# and SC.C#=Course.C# ; 

211.        36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數; 

212.            SELECT  distinct student.S#,student.Sname,SC.C#,SC.score 

213.            FROM student,Sc 

214.            WHERE SC.score>=70 AND SC.S#=student.S#; 

215.        37、查詢不及格的課程,並按課程號從大到小排列 

216.            select c# from sc where scor e <60 order by C# ; 

217.        38、查詢課程編號爲003且課程成績在80分以上的學生的學號和姓名; 

218.            select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003'

219.        39、求選了課程的學生人數 

220.            select count(*) from sc; 

221.        40、查詢選修“葉平”老師所授課程的學生中,成績最高的學生姓名及其成績 

222.            select Student.Sname,score 

223.            from Student,SC,Course C,Teacher 

224.            where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='葉平' and SC.score=(select max(score)from SC where C#=C.C# ); 

225.        41、查詢各個課程及相應的選修人數 

226.            select count(*) from sc group by C#; 

227.        42、查詢不同課程成績相同的學生的學號、課程號、學生成績 

228.          select distinct  A.S#,B.score from SC A  ,SC B where A.Score=B.Score and A.C# <>B.C# ; 

229.     43、查詢每門功課成績最好的前兩名 

230.            SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數 

231.              FROM SC t1 

232.              WHERE score IN (SELECT TOP 2 score 

233.                      FROM SC 

234.                      WHERE t1.C#= C# 

235.                    ORDER BY score DESC 

236.                      ) 

237.              ORDER BY t1.C#; 

238.        44、統計每門課程的學生選修人數(超過10人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,查詢結果按人數降序排列,若人數相同,按課程號升序排列  

239.            select  C# as 課程號,count(*) as 人數 

240.            from  sc  

241.            group  by  C# 

242.            order  by  count(*) desc,c#  

243.        45、檢索至少選修兩門課程的學生學號 

244.            select  S#  

245.            from  sc  

246.            group  by  s# 

247.            having  count(*)  >  =  2 

248.        46、查詢全部學生都選修的課程的課程號和課程名 

249.            select  C#,Cname  

250.            from  Course  

251.            where  C#  in  (select  c#  from  sc group  by  c#)  

252.        47、查詢沒學過“葉平”老師講授的任一門課程的學生姓名 

253.            select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='葉平'); 

254.        48、查詢兩門以上不及格課程的同學的學號及其平均成績 

255.            select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#; 

256.        49、檢索“004”課程分數小於60,按分數降序排列的同學學號 

257.            select S# from SC where C#='004'and score <60 order by score desc; 

258.        50、刪除“002”同學的“001”課程的成績 

259.        delete from Sc where S#='001'and C#='001'

260.         

 

 

 

 

 

 

 

 

 

 

模擬考覈試題參考答案

 

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

   1. D  2. B  3. D 4. B  5. C  6. C 7. B 8. B 9. D  10. B

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

 

   1. 依賴於                 2. 記錄、數據項

   3. 多、多                 4. 元組、屬性

   5. 數據庫管理員、數據庫設計員、應用程序員、終端用戶(次序無先後)

   6. 系統、用戶             7. 班級號、外碼

   8. a1+b1、a2´b2           9. Õ學生號(X)、S  (次序無先後)

    10. X→(Y,Z)

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

 

   1. 第二                            2.6、4

   3. 表、建立                        4. 分組統計、排序

   5. 局部ER圖、整體ER圖            6. 設計要求、功能完善、操作方便

   7. 標題欄、菜單欄、工作區(次序無先後)

   8. 字段名稱、數據類型、說明(次序無先後)

   9. 頁眉、主體(次序無先後)

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

 

   1. (A,D)、僞傳遞                      2. 第一、2

   3. 命令交互、程序執行、窗口界面(次序無先後)

   4. primary key、foreign key

   5. 實表、虛表                         6. 連接、選擇

   7. 數據、處理(次序無先後)           8. 主碼、外碼(次序無先後)

   9. 旅客登記表、消費卡表(次序無先後) 10. 大小寫

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

 

   1. 標題欄、菜單欄、工作區   (次序無先後)

   2. 字段名稱、數據類型       (次序無先後)

   3. 頁眉、主體、頁腳         (次序無先後)

4. 類模塊、標準模塊         (次序無先後)

 

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

   1. 從商品庫中查詢出所有商品的不同產地。

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

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

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

        from 商品表1

        group by 分類名

   5. select distinct 學生.*

        from 學生,選課

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

          from 學生,選課

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

        )

 

3.1 名詞解釋

(1)SQL模式:SQL模式是表和授權的靜態定義。一個SQL模式定義爲基本表的集合。 一個由模式名和模式擁有者的用戶名或賬號來確定,幷包含模式中每一個元素(基本表、視圖、索引等)的定義。
(2)SQL數據庫:SQL(Structured Query Language),即‘結構式查詢語言’,採用英語單詞表示和結構式的語法規則。 一個SQL數據庫是表的彙集,它用一個或多個SQL模式定義。
(3)基本表:在SQL中,把傳統的關係模型中的關係模式稱爲基本表(Base Table)。 基本表是實際存儲在數據庫中的表,對應一個關係。
(4)存儲文件:在SQL中,把傳統的關係模型中的存儲模式稱爲存儲文件(Stored File)。 每個存儲文件與外部存儲器上一個物理文件對應。
(5)視圖:在SQL中,把傳統的關係模型中的子模式稱爲視圖(View),視圖是從若干基本表和(或)其他視圖構造出來的表。
(6):在SQL中,把傳統的關係模型中的元組稱爲行(row)。
(7)列:在SQL中,把傳統的關係模型中的屬性稱爲列(coloumn)。
(8)實表:基本表被稱爲“實表”,它是實際存放在數據庫中的表。
(9)虛表:視圖被稱爲“虛表”,創建一個視圖時,只把視圖的定義存儲在數據詞典中,而不存儲視圖所對應的數據。
(10)相關子查詢:在嵌套查詢中出現的符合以下特徵的子查詢:子查詢中查詢條件依賴於外層查詢中的某個值, 所以子查詢的處理不只一次,要反覆求值,以供外層查詢使用。
(11)聯接查詢:查詢時先對錶進行笛卡爾積操作,然後再做等值聯接、選擇、投影等操作。 聯接查詢的效率比嵌套查詢低。
(12)交互式SQL:在終端交互方式下使用的SQL語言稱爲交互式SQL。
(13)嵌入式SQL:嵌入在高級語言的程序中使用的SQL語言稱爲嵌入式SQL。
(14)共享變量:SQL和宿主語言的接口。共享變量有宿主語言程序定義,再用SQL的DECLARE語句說明, SQL語句就可引用這些變量傳遞數據庫信息。
(15)遊標:遊標是與某一查詢結果相聯繫的符號名,用於把集合操作轉換成單記錄處理方式。
(16)卷遊標:爲了克服遊標在推進時不能返回的不便,SQL2提供了卷遊標技術。 卷遊標在推進時不但能沿查詢結果中元組順序從頭到尾一行行推進,也能一行行返回。

3.2 對於教學數據庫的三個基本表
  學生S(S#,SNAME,AGE,SEX)
  學習 SC(S#,C#,GRADE)
  課程C(C#,CNAME,TEACHER)
 試用SQL的查詢語句表達下列查詢:

1)檢索LIU老師所授課程的課程號和課程名。
    SELECT C#,CNAME
    FROM C
    WHERE TEACHER=‘LIU’

2)檢索年齡大於23歲的男學生的學號和姓名。
    SELECT S#,SNAME
    FROM S
    WHERE (AGE>23) AND (SEX=‘M’)

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 設有兩個基本表RABC)和SDEF),試用SQL查詢語句表達下列關係代數表達式:
  (1πA(R)(2)σB='17'(R)(3)R×S(4))πA,FC=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 設有兩個基本表RABC)和SABC)試用SQL查詢語句表達下列關係代數表達式:
  (1RS  (2RS  (3RS  (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語言的關係代數特點和元組演算特點。
(P61-62)

3.6 試用SQL查詢語句表達下列對教學數據庫中三個基本表SSCC的查詢:

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更新語句表達對教學數據庫中三個基本表SSCC的各個更新操作:
1)往基本表S中插入一個學生元組(‘S9’‘WU’18)。
    INSERT INTO S(S#,SNAME,AGE) VALUES('59','WU',18)
2)在基本表S中檢索每一門課程成績都大於等於80分的學生學號、姓名和性別,並把檢索到的值送往另一個已存在的基本表STUDENTS#,SANMESEX)。
    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 在第1章例1.4中提到倉庫管理關係模型有五個關係模式:
  零件 PARTP#,PNAMECOLORWEIGHT
  項目 PROJECTJ#,JNAMEDATE
  供應商 SUPPLIERS#,SNAMESADDR
  供應 P_PJ#,P#,TOTOAL
  採購 P_SP#,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)試將PROGECTP_PPART三個基本表的自然聯接定義爲一個視圖VIEW1PARTP_SSUPPLIER 三個基本表的自然聯接定義爲一個視圖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_GRADES#,C_NUMAVG_GRADE
ASSELECTS#,COUNT(C)AVGGRADE
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_GRADE80
    允許
   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_NUMC_NUM1
WHERES#=‘S4’
    不允許

  (5 DELETEFROMS_GRADE
WHEREC_NUM4
    不允許

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語句查詢結果是多個元組時,此時宿主語言程序無法使用, 一定要用遊標機制把多個元組一次一個地傳送給宿主語言處理。

 

發佈了60 篇原創文章 · 獲贊 51 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章