SQL、RESTRICT/CASCADE、基本表、視圖、相關題目 | 數據庫系統概論第三章

目錄

第3章 關係數據庫標準語言SQL(重點)

知識點

SQL的特點

在DROP TABLE時,RESTRICT和CASCADE的區別

有兩個關係S(A,B,C,D)和T(C,D,E,F),寫出與下列查詢等價的SQL表達式

用SQL語句建立第2章習題6中的4個表,針對建立的4個表用SQL語言完成第2章習題6中的查詢

針對習題3中的4個表,用SQL語言完成以下各項操作

基本表、視圖,兩者的區別和聯繫

視圖的優點

所有的視圖是否都可以更新?爲什麼?

哪類視圖是可以更新的,哪類視圖是不可更新的? 各舉一例說明

綜合題

綜合題



第3章 關係數據庫標準語言SQL(重點)

瞭解

  • SQL語言發展過程
  • 關係數據庫技術和關係數據庫管理系統RDBMS產品的發展過程

掌握

  • SQL語言的特點和優點
  • 面向過程的語言和SQL語言的區別
  • 關係數據庫系統爲數據庫應用系統的開發提供良好環境,減輕了用戶負擔,提高用戶生產率的原因
  • 用SQL語言完成對數據庫的增刪改查,特別是各種查詢

知識點

  • SQL的特點

    • 綜合統一。SQL語言集數據定義語言DDL、數據操縱語言DML、數據控制語言DCL的功能於一體
    • 高度非過程化。用 SQL 語言進行數據操作, 只要提出 “做什麼”,而無需指明 “怎麼做”,因此無需瞭解存取路徑,存取路徑的選擇以及 SQL 語句的操作過程由系統自動完成。
    • 面向集合的操作方式。 SQL 語言採用集合操作方式,不僅操作對象、查找結果可以是元組的集合,而且一次插入、刪除、更新操作的對象也可以是元組的集合。
    • 以同一種語法結構提供兩種使用方式。 sQL 語言既是自含式語言,又是嵌入式語言。作爲自含式語言, 它能夠獨立地用於聯機交互的使用方式; 作爲嵌入式語言, 它能夠嵌入到高級語言程序中,供程序員設計程序時使用。
    • 語言簡捷,易學易用。

    在DROP TABLE時,RESTRICT和CASCADE的區別

    • RESTRICT表示表的刪除是有限制條件的。要刪除的基本表不能被其他表的約束所引用,不能有視圖,不能有觸發器,不能有存儲過程或函數等。如果存在這些依賴該表的對象,則表不能被刪除
    • CASCADE表示表的刪除沒有限制條件,在刪除基本表的同時,相關的依賴對象(如視圖)都將被刪除

    有兩個關係S(A,B,C,D)和T(C,D,E,F),寫出與下列查詢等價的SQL表達式

    • (1)SELECT * FROM S WHERE A=10
    • (2)SELECT DISTINCT A,B FROM S
    • (3)SELECT A,B,S.C,S.D,E,F FROM S,T WHERE S.C=T.C AND S.D=T.D
    • (4)SELECT A,B,S.C,S.D,T.C,T.D,E,F FROM S,T WHERE S.C=T.C
    • (5)SLEECT A,B,S.C,S.D,T.C,T.D,E,F FROM S,T WHERE A<E
    • (6)SELECT S1.C,S1.D,T.C,T.D,E,F FROM T,(SELECT DISTINCT C,D FROM S) AS S1

    用SQL語句建立第2章習題6中的4個表,針對建立的4個表用SQL語言完成第2章習題6中的查詢

    • 建S表 S(SNO,SNAME,STATUS,CITY);
      ​CREATE TABLE S(SNO CHAR(3).​ SNAME CHAR(10), STATUS CHAR(2), CITY CHAR(10)​​​)​;
    • 建P表 P(PNO,PNAME,COLOR,WEIGHT);
      CREATE TABLE P(PNO CHAR(3), PNAME CHAR(10), COLOR CHAR(4), WEIGHT INT​​​);​
    • 建J表 J(JNO,JNAME,CITY);
      CREATE TABLE J(JNO CHAR(3), JNAME CHAR(10),CITY CHAR(10)​​);​
    • 建SPJ表 SPJ(SNO,PNO,JNO,QTY);
      CREATE TABLE SPJ(SNO CHAR(3), PNO CHAR(3),JNO CHAR(3), QTY INT​​​);​
    • 求供應工程J1零件的供應商號碼SNO
      SELECT SNO​FROM SPJWHERE JNO='J1';​
    • 求供應工程J1零件P1的供應商號碼SNO
      SELECT SNOFROM SPJWHERE JNO='J1' AND PNO='P1';​​
    • 求供應工程J1零件爲紅色的供應商號碼SNO
      SELECT SNOFROM SPJWHERE JNO='J1' AND PNO IN (SELECT PNO FROM P WHERE COLCO=‘紅’​​);或SELECT SNOFROM SPJ,PWHERE JNO='J1' AND SPJ.PNO=P.PNO AND COLOR='紅';​​​​​​​​​
    • 求沒有使用天津供應商生產的紅色零件的工程號JNO
      SELECT JNOFROM JWHERE NOT EXISTS (SELECT * ​FROM SPJ WHERE SPJ.JNO=J.JNO AND SNO IN (SELECT SNO FROM S WHERE CITY='天津'​​) AND​ PNO IN (SELECT PNO FROM P WHERE COLOR='紅'​​)​​​​);​​​或SELECT JNOFROM JWHERE NOT EXISTS (SELECT * FROM SPJ,S,P WHERE SPJ.JNO=J.JNO AND SPJ.SNO=S.SNO AND SPJ.PNO=P.PNO AND S.CITY='天津' AND P.COLOR='紅'​​​);​​​​​
    • 求至少用了供應商S1所供應的全部零件的工程號JNO
      SELECT DISTINCT JNOFROM SPJ SPJZWHERE NOT EXISTS (SELECT * ​FROM SPJ SPJX WHERE SNO='S1'​ AND NOT EXISTS​ (SELECT * FROM SPJ SPJY WHERE SPJY.PNO=SPJX.PNO AND SPJY.JNO=SPJZ.JNO​​​)​);​​​

    針對習題3中的4個表,用SQL語言完成以下各項操作

    • 找出所有供應商的姓名和所在城市。
      SELECT SNAME,CITY ​FROM S;
    • 找出所有零件的名稱、顏色、重量。
      SELECT PNAME,COLOR,WEIGHT ​FROM P;
    • 找出使用供應商 S1 所供應零件的工程號碼。
      SELECT DIST JNO ​FROM SPJ ​WHERE SNO='S1';
    • 找出工程項目 J2 使用的各種零件的名稱及其數量。
      SELECT P.PNAME,SPJ.QTY ​FROM P,SPJWHERE P.PNO=SPJ.PNO ​AND SPJ.JNO='J2';​
    • 找出上海廠商供應的所有零件號碼。
      SELECT DISTINCT PNO ​FROM SPJ​WHERE SNO IN (SELECT SNO FROM S WHERE CITY='上海'​​);​
    • 找出使用上海產的零件的工程名稱。
      SELECT JNAME ​FROM SPJ,S,JWHERE S.SNO=SPJ.SNO AND S.CITY=' 上海 ' AND J.JNO=SPJ.JNO或​SELECT JNAME    FROM J    WHERE JNO IN    (SELECT JNO    FROM SPJ, S    WHERE SPJ. SNO=S.SNO    AND S.CITY='上海'); 
    • 找出沒有使用天津產的零件的工程號碼。
      SELECT JNO FROM J WHERE NOT EXISTS    (SELECT *    FROM SPJ    WHERE SPJ.JNO=J.JNO AND SNO IN    (SELECT SNO    FROM S    WHERE CITY=‘天津’)); 或 SELECT JNO FROM J WHERE NOT EXISTS    (SELECT *1    FROM SPJ, S    WHERE SPJ.JNO=J.JNO AND SPJ.SNO=S.SNO AND ​S.CITY=‘天津’);​
    • 把全部紅色零件的顏色改成藍色。
      UPDATE P SET COLOR='藍' WHERE COLOR='紅' ; ​
    • 由S5供給J4的零件P6改爲由S3供應,請作必要的修改。
      UPDATE SPJ SET SNO='S3' WHERE SNO='S5' AND JNO='J4' AND PNO='P6'; ​
    • 從供應商關係中刪除S2的記錄,並從供應情況關係中刪除相應的記錄。
      DELETE FROM SPJ WHERE SNO='S2'; 或 DELETE FROM S WHERE SNO='S2'; ​注意刪除順序,應該先從SPJ表中刪除供應商S2所供應零件的記錄,然後從從S表中刪除S2。
    • 請將 (S2,J6,P4,200) 插入供應情況關係。
      INSERT INTOSPJ(SNO, JNO, PNO, QTY) VALUES (S2,J6,P4,200); 或 INSERT INTO SPJ VALUES (S2,P4,J6,200); 

    基本表、視圖,兩者的區別和聯繫

    • 基本表是本身獨立存在的表,在SQL中一個關係就對應一個表。
    • 視圖是從一個或幾個基本表導出的表。視圖本身不獨立存儲在數據庫中,是一個虛表。即數據庫中只存放視圖的定義而不存放視圖對應的數據,這些數據仍存放在導出視圖的基本表中。視圖在概念上與基本表等同,用戶可以如同基本表那樣使用視圖,可以在視圖上再定義視圖。

    視圖的優點

    • 視圖能夠簡化用戶的操作。
    • 視圖使用戶能以多種角度看待同一數據。
    • 視圖對重構數據庫提供了一定程度的邏輯獨立性。
    • 視圖能夠對機密數據提供安全保護。

    所有的視圖是否都可以更新?爲什麼?

    • 不是。視圖是不實際存儲數據的虛表,因此對視圖的更新,最終要轉換爲對基本表的更新。因爲有些視圖的更新不能唯一地有意義地轉換成對相應基本表的更新,所以,並不是所有的視圖都是可更新的。如《概論》3.5.1中的視圖S_G(學生的學號及他的平均成績)
      CREAT VIEW S_G(Sno,Gavg)AS SELECT Sno,AVG(Grade)FROM SCGROUP BY Sno;
    • 要修改平均成績,必須修改各科成績,而我們無法知道哪些課程成績的變化導致了平均成績的變化。

    哪類視圖是可以更新的,哪類視圖是不可更新的? 各舉一例說明

    • 基本表的行列子集視圖一般是可更新的。如《概論》3.5.3中的例1。
    • 若視圖的屬性來自集函數、表達式,則該視圖肯定是不可以更新的。如《概論》3.5.3中的S_G視圖。

    綜合題

    • 建視圖
      CREATE VIEW V_SPJ ASSELECT SNO, PNO, QTYFROM SPJWHERE JNO=(SELECT JNOFROM JWHERE JNAME='三建');
    • 對該視圖查詢
      (1) 找出三建工程項目使用的各種零件代碼及其數量。SELECT PNO, QTYFROM V_SPJ;(2) 找出供應商S1的供應情況。SELECT PNO, QTY FROM V_SPJWHERE SNO='S1';
  • 請爲三建工程項目建立一個供應情況的視圖,包括供應商代碼(SNO)、零件代碼(PNO)、供應數量(QTY)。針對該視圖完成下列查詢:(1)找出三建工程項目使用的各種零件代碼及其數量。(2)找出供應商S1的供應情況。

補充

    • SQL是【非過程化】的語言,用戶無須指定存取路徑
    • 對錶中數據進行刪除的操作是【DELECT】
    • 數據庫中建立索引的目的是爲了【加快存取速度】
    • 視圖是數據庫系統三級模式中的【外模式】
    • 基本表和視圖一樣,都是關係
    • 可以使用SQL對基本表和視圖進行操作
    • 可以從基本表或視圖上定義視圖,視圖不僅可以從單個基本表導出,還可以從多個基本表導出
    • 視圖不存儲數據
    • SELECT子句中的目標列可以是表中的屬性列,也可以是表達式
    • 使用ANY或ALL謂詞時必須與比較運算符同時使用
    • SQL語言具有【數據定義】【數據查詢】【數據操縱】【數據控制】的功能
    • SQL語句中用來消除重複的關鍵詞是【DISTINCT】
    • 若一個視圖是從單個基本表導出的,並且只是去掉了基本表的某些行和列,但保留了主碼,這類視圖稱爲【行列子集視圖】
    • SQL語言的數據定義功能包括【模式定義】【表定義】【視圖定義】【索引定義】
    • 在視圖上不能完成的操作是【在視圖上定義新的表】
    • CREATE、DROP、ALTER實現【數據定義】功能
    • 刪除一個視圖的命令是【DROP】
    • 刪除表S的命令是【DROP TABLE S】
    • 在基本表S中增加一列CN(課程名),可用【ALTER TABLE S ADD (CN CHAR(8))】
    • 在基本表S中刪除一個屬性“年齡”,可用【ALTER TABLE S DROP Age】
    • 有關係S(S#,SNAME,SAGE),C(C#,CNAME),SC(S#,C#,GRADE)。其中S#是學生號,SNAME是學生姓名,SAGE是學生年齡, C#是課程號,CNAME是課程名稱。要查詢選修“ACCESS”課的年齡不小於20的全體學生姓名的SQL語句是SELECT SNAME FROM S,C,SC WHERE子句。這裏的WHERE子句的內容是【S.S# = SC.S# and C.C# = SC.C# and SAGE>=20 and CNAME=‘ACCESS’】
    • 設關係數據庫中一個表S的結構爲S(SN,CN,grade),其中SN爲學生名,CN爲課程名,二者均爲字符型;grade爲成績,數值型,取值範圍0-100。若要把“張二的化學成績80分”插入S中,則可用【INSERT INTO S VALUES(’張二’,’化學’,80)】
    • 設關係數據庫中一個表S的結構爲:S(SN,CN,grade),其中SN爲學生名,CN爲課程名,二者均爲字符型;grade爲成績,數值型,取值範圍0-100。若要更正王二的化學成績爲85分,則可用【UPDATE S SET grade=85 WHERE SN=’王二’ AND CN=’化學’】
    • 在SQL語言中,子查詢是【嵌入到另一個查詢語句之中的查詢語句】
    • SQL是一種【關係數據庫】語言
    • 有關係S(S#,SNAME,SEX),C(C#,CNAME),SC(S#,C#,GRADE)。其中S#是學生號,SNAME是學生姓名,SEX是性別, C#是課程號,CNAME是課程名稱。要查詢選修“數據庫”課的全體男生姓名的SQL語句是SELECT SNAME FROM S,C,SC WHERE子句。這裏的WHERE子句的內容是【A.S.S# = SC.S# and C.C# = SC.C# and SEX=’男’ and CNAME=’數據庫’】
    • CREATE TABLE SC (S# CHAR(6) NOT NULL,C# CHAR(3) NOT NULL,SCORE INTEGER,NOTE CHAR(20));向SC表插入如下行時,【(’200823’,’101’,NULL,NULL)】行可以被插入
    • 假設學生關係S(S#,SNAME,SEX),課程關係C(C#,CNAME),學生選課關係SC(S#,C#,GRADE)。要查詢選修“Computer”課的男生姓名,將涉及到關係【S,C,SC】
    • 【GRANT】不是數據定義語句
    • 相關子查詢和不相關子查詢
      • 在嵌套查詢中,如果子查詢的查詢條件不依賴於父查詢,稱爲不相關子查詢
      • 如果子查詢的查詢條件依賴於父查詢,稱爲相關子查詢
    • ANY和ALL謂詞與聚集函數或IN謂詞可能存在的等價轉換關係

    • 綜合題

      • 關係R包含A、B、C三個屬性,包含的數據如下

      • 寫出對查詢語句SELECT * FROM R WHERE X;當X爲下列條件時的查詢結果
        • A IS NULL
          空的結果集
        • A>8 AND B<20
          空的結果集
        • A>10 OR B<20

        • C+10>25

        • EXISTS(SELECT B FROM R WHERE A=10)

        • C IN (SELECT B FROM R)
          空的結果集
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章