1. 程式人生 > 實用技巧 >面試官沒想到,一個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 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®(2)σB='17’®(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®π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__種情況。

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

  2. 在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.基本表屬於全域性模式中的表,它是____實表____,而檢視則屬於區域性模式中的表,它是____虛表 ____。

  1. 在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

        )

收藏點贊~~養成好習慣~

微信搜一搜**【程式設計師一凡】**關注這個文縐縐的程式設計師,關注後回覆【面試】有我準備的一線大廠面試資料和簡歷模板,希望大家都能找到心儀的工作,學習是一條時而鬱鬱寡歡,時而開懷大笑的路,加油。如果你通過努力成功進入到了心儀的公司,一定不要懈怠放鬆,職場成長和新技術學習一樣,不進則退。如果有幸我們江湖再見!

如果對軟體測試、介面、自動化、效能測試、測試開發、面試經驗交流。感興趣可以1079636098,群內會有不定期的發放免費的資料連結,這些資料都是從各個技術網站蒐集、整理出來的,如果你有好的學習資料可以私聊發我,我會註明出處之後分享給大家。