周浩

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            28 隨筆 :: 0 文章 :: 16 評論 :: 0 Trackbacks

          3.1 名詞解釋

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

          3.2 對于教學(xué)數(shù)據(jù)庫的三個基本表
               學(xué)生 S(S#,SNAME,AGE,SEX)
               學(xué)習(xí) SC(S#,C#,GRADE)
               課程 C(C#,CNAME,TEACHER)
              試用SQL的查詢語句表達(dá)下列查詢:


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

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

          (3)檢索至少選修LIU老師所授課程中一門課程的女學(xué)生姓名。
              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:有多種寫法,比如聯(lián)接查詢寫法:
              SELECT SNAME
              FROM S,SC,C
              WHERE SEX=‘F’ AND SC.S#=S.S#
              AND SC.C#=C.C#
              AND TEACHER='LIU'
          但上一種寫法更好一些。


          (4)檢索WANG同學(xué)不學(xué)的課程的課程號。
              SELECT C#
              FROM C
              WHERE C# NOT IN
               (SELECT C#
               FROM SC
               WHERE S# IN
                (SELECT S#
                FROM S
                WHERE SNAME='WANG'))

          (5)檢索至少選修兩門課程的學(xué)生學(xué)號。
              SELECT DISTINCT X.SNO
              FROM SC X,SC Y
              WHERE X.SNO=Y.SNO AND X.CNO<>Y.CNO
          Notice:對表SC進(jìn)行自連接,X,Y是SC的兩個別名。

          (6)檢索全部學(xué)生都選修的課程的課程號與課程名。
              SELECT C#,CNAME
              FROM C
              WHERE NOT EXISTS
               (SELECT *
               FROM S
               WHERE S# NOT IN
                (SELECT *
                FROM SC
                WHERE? SC.C#=C.C#))

          要從語義上分解:(1)選擇課程的課程號與課程名,不存在不選這門課的同學(xué)。
          ?? 其中,“不選這門課的同學(xué)”可以表示為:

          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老師所授課的學(xué)生學(xué)號。    
               SELECT DISTINCT S#
               FROM SC
               WHERE C# IN
                (SELECT C#
                FROM C
                WHERE TEACHER='LIU'))   

          3.3 設(shè)有兩個基本表R(A,B,C)和S(D,E,F(xiàn)),試用SQL查詢語句表達(dá)下列關(guān)系代數(shù)表達(dá)式:
            (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 設(shè)有兩個基本表R(A,B,C)和S(A,B,C)試用SQL查詢語句表達(dá)下列關(guān)系代數(shù)表達(dá)式:
            (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語言的關(guān)系代數(shù)特點(diǎn)和元組演算特點(diǎn)。
          (P61-62)

          3.6 試用SQL查詢語句表達(dá)下列對教學(xué)數(shù)據(jù)庫中三個基本表S、SC、C的查詢:

          (1)統(tǒng)計有學(xué)生選修的課程門數(shù)。
              SELECT COUNT(DISTINCT C#) FROM SC

          (2)求選修C4課程的學(xué)生的平均年齡。
              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老師所授課程的每門課程的學(xué)生平均成績。
             SELECT CNAME,AVG(GRADE)
             FROM SC ,C
             WHERE SC.C#=C.C# AND TEACHER='LIU'
             GROUP BY C#   

          (4)統(tǒng)計每門課程的學(xué)生選修人數(shù)(超過10人的課程才統(tǒng)計)。要求輸出課程號和選修人數(shù), 查詢結(jié)果按人數(shù)降序排列,若人數(shù)相同,按課程號升序排列。
              SELECT DISTINCT C#,COUNT(S#)
              FROM SC
              GROUP BY C#
              HAVING COUNT(S#)>10
              ORDER BY 2 DESC, C# ASC

          (5)檢索學(xué)號比WANG同學(xué)大,而年齡比他小的學(xué)生姓名。
              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打頭的所有學(xué)生的姓名和年齡。
              SELECT SNAME,AGE
              FROM S
              WHERE SNAME LIKE 'WANG%'

          (7)在SC中檢索成績?yōu)榭罩档膶W(xué)生學(xué)號和課程號。
              SELECT S#,C#
              FROM SC
              WHERE GRADE IS NULL

          (8)求年齡大于女同學(xué)平均年齡的男學(xué)生姓名和年齡。
              SELECT SNAME,AGE
              FROM S AS X
              WHERE X.SEX='男' AND X.AGE>(SELECT AVG(AGE) FROM S AS Y WHERE Y.SEX='女')

          (9)求年齡大于所有女同學(xué)年齡的男學(xué)生姓名和年齡。
              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更新語句表達(dá)對教學(xué)數(shù)據(jù)庫中三個基本表S、SC、C的各個更新操作:
          (1)往基本表S中插入一個學(xué)生元組(‘S9’,‘WU’,18)。
              INSERT INTO S(S#,SNAME,AGE) VALUES('59','WU',18)
          (2)在基本表S中檢索每一門課程成績都大于等于80分的學(xué)生學(xué)號、姓名和性別, 并把檢索到的值送往另一個已存在的基本表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同學(xué)的學(xué)習(xí)選課和成績?nèi)縿h去。
              DELETE FROM SC
               WHERE S# IN
                (SELECT S#
                FROM S
                WHERE SNAME='WANG')

          (5)把選修MATHS課不及格的成績?nèi)臑榭罩怠?/font>
              UPDATE SC
              SET GRADE=NULL
              WHERE GRADE<60 AND C# IN
                (SELECT C#
                FROM C
                WHERE CNAME='MATHS')

          (6)把低于總平均成績的女同學(xué)成績提高5%。
              UPDATE SC
              SET GRADE=GRADE*1.05
              WHERE GRADE<(SELECT AVG(GRADE) FROM SC) AND S# IN (SELECT S# FROM S WHERE SEX='F')

          (7)在基本表SC中修改C4課程的成績,若成績小于等于75分時提高5%, 若成績大于75分時提高4%(用兩個UPDATE語句實現(xiàn))。
              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中提到“倉庫管理”關(guān)系模型有五個關(guān)系模式:
               零件 PART(P#,PNAME,COLOR,WEIGHT)
               項目 PROJECT(J#,JNAME,DATE)
               供應(yīng)商 SUPPLIER(S#,SNAME,SADDR)
               供應(yīng) P_P(J#,P#,TOTOAL)
               采購 P_S(P#,S#,QUANTITY)


          (1)試用SQL DDL語句定義上述五個基本表,并說明主鍵和外鍵。
              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三個基本表的自然聯(lián)接定義為一個視圖VIEW1,PART、P_S、SUPPLIER 三個基本表的自然聯(lián)接定義為一個視圖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)試在上述兩個視圖的基礎(chǔ)上進(jìn)行數(shù)據(jù)查詢:

              1)檢索上海的供應(yīng)商所供應(yīng)的零件的編號和名字。
              SELECT P#,PNAME FROM VIEW2 WHERE SADDR='SHANGHAI'

              2)檢索項目J4所用零件的供應(yīng)商編號和名字。
              SELECT S#,SNAME FROM VIEW2 WHERE P# IN(SELECT P# FROM VIEW1 WHERE J#='J4')

          3.9 對于教學(xué)數(shù)據(jù)庫中基本表SC,已建立下列視圖:
               CREATE VIEW S_GRADE(S#,C_NUM,AVG_GRADE)
                AS SELECT S#,COUNT(C#),AVG(GRADE)
                 FROM SC
                 GROUP BY S#
             試判斷下列查詢和更新是否允許執(zhí)行。若允許,寫出轉(zhuǎn)換到基本表SC上的相應(yīng)操作。

            (1) SELECT *
                FROM S_GRADE

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

            (2) SELECT S#,C_NUM
                 FROM S_GRADE
                  WHERE AVG_GRADE>80

              允許
             SELECT S#,COUNT(C#) FROM SC WHERE AVG(GRADE)>80

            (3) SELECT S#,AVG_GRADE
                  FROM S_GRADE
                  WHERE C_NUM>(SELECT C_NUM
                          FROM S_GRADE
                          WHERE S#=‘S4’)

              允許
             SELECT S#,AVG(GRADE)
             FROM SC AS X
             WHERE COUNT(X.C#)>(SELECT COUNT(Y.C#) FROM SC AS Y WHERE Y.S#='S4')
             GROUP BY S#

            (4) UPDATE S_GRADE
                  SET C_NUM=C_NUM+1
                  WHERE S#=‘S4’

              不允許

            (5) DELETE FROM S_GRADE
                  WHERE C_NUM>4

              不允許

          3.10 預(yù)處理方式對于嵌入式SQL的實現(xiàn)有什么重要意義?
          ??? 預(yù)處理方式是先用預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,識別出SQL語句,并處理成宿主語言的函數(shù)調(diào)用形式; 然后再用宿主語言的編譯程序把源程序編譯成目標(biāo)程序。這樣,不用擴(kuò)充宿主語言的編譯程序, 就能處理SQL語句。

          3.11 在宿主語言的程序中使用SQL語句有哪些規(guī)定?
          在宿主語言的程序中使用SLQ語句有以下規(guī)定:
          (1)在程序中要區(qū)分SQL語句與宿主語言語句
          (2)允許嵌入的SQL語句引用宿主語言的程序變量(稱為共享變量),但有兩條規(guī)定:
             1)引用時,這些變量前必須加“:”作為前綴標(biāo)識,以示與數(shù)據(jù)庫中變量有區(qū)別。
             2)這些變量由宿主語言的程序定義,并用SQL的DECLARE語句說明。
          (3)SQL的集合處理方式與宿主語言單記錄處理方式之間要協(xié)調(diào)。 需要采用游標(biāo)機(jī)制,把集合操作轉(zhuǎn)換成單記錄處理方式。

          3.12 SQL的集合處理方式與宿主語言單記錄處理方式之間如何協(xié)調(diào)?
          ??? 由于SQL語句處理的是記錄集合,而宿主語言語句一次只能處理一個記錄, 因此需要用游標(biāo)(cousor)機(jī)制,把集合操作轉(zhuǎn)換成單記錄處理方式。

          2.13 嵌入式SQL語句何時不必涉及到游標(biāo)?何時必須涉及到游標(biāo)?
          ??? (1)INSERT、DELETE、UPDATE語句,查詢結(jié)果肯定是單元組時的SELECT語句, 都可直接嵌入在主程序中使用,不必涉及到游標(biāo)。
          ??? (2)當(dāng)SELECT語句查詢結(jié)果是多個元組時,此時宿主語言程序無法使用, 一定要用游標(biāo)機(jī)制把多個元組一次一個地傳送給宿主語言處理。

          posted on 2006-11-17 20:18 Derek 閱讀(6384) 評論(5)  編輯  收藏

          評論

          # re: 數(shù)據(jù)庫原理之關(guān)系數(shù)據(jù)庫SQL語言課后習(xí)題及答案 2007-06-17 18:18 但是
          頂下 基礎(chǔ)知識蠻全面的 學(xué)習(xí)了  回復(fù)  更多評論
            

          # re: 數(shù)據(jù)庫原理之關(guān)系數(shù)據(jù)庫SQL語言課后習(xí)題及答案[未登錄] 2007-10-30 11:06 haohao
          為什么我要查看答案時進(jìn)不了那頁面啊,是不是有問題啊,能不能看看啊,  回復(fù)  更多評論
            

          # re: 數(shù)據(jù)庫原理之關(guān)系數(shù)據(jù)庫SQL語言課后習(xí)題及答案 2009-01-21 13:56 afag
          按進(jìn)貨時間由早到晚顯示各種服裝的信息,當(dāng)進(jìn)貨時間相同時先顯示女裝信息,再依次顯示男裝信息和兒童裝信息?  回復(fù)  更多評論
            

          # re: 數(shù)據(jù)庫原理之關(guān)系數(shù)據(jù)庫SQL語言課后習(xí)題及答案[未登錄] 2009-03-16 21:59 feng
          在表“學(xué)生”中增加數(shù)值類型的“德育分”、“專業(yè)分”與“總積分”屬性,總積分=德育分+專業(yè)分。
            回復(fù)  更多評論
            

          # re: 數(shù)據(jù)庫原理之關(guān)系數(shù)據(jù)庫SQL語言課后習(xí)題及答案 2009-12-12 09:02 wslovenide
          謝了,對我有很大的幫助  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          Google
          主站蜘蛛池模板: 黄山市| 高雄市| 文成县| 湘西| 进贤县| 洪洞县| 灵台县| 黑龙江省| 青海省| 大渡口区| 卢龙县| 新密市| 大洼县| 贡觉县| 武功县| 青阳县| 新昌县| 莫力| 邵武市| SHOW| 华容县| 镶黄旗| 始兴县| 礼泉县| 宁远县| 兰考县| 辉南县| 广安市| 辽宁省| 安阳市| 城固县| 陕西省| 陵川县| 海盐县| 利川市| 张家界市| 中方县| 沾化县| 垦利县| 古丈县| 肥西县|