1. 程式人生 > >SQL練習題完整(做完你就是高手)

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


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.4
3.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_GRADEASSELECTS#,COUNT(C)AVGGRADEFROMSC
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語句查詢結果是多個元組時,此時宿主語言程式無法使用, 一定要用遊標機制把多個元組一次一個地傳送給宿主語言處理。