oracle9i學習筆記之十三 SQL練習

 1.圖書借閱系統包含以下表:
    會員表(member)
    圖書表(title)
    庫存圖書備份表(title_copy)
    圖書借閱表(borrow)
    預定表(reservation)

2.表信息
1)會員表包含以下字段:
  會員ID(序列號)、會員名、地址、城市、電話、加入時間(默認爲系統時間)、會員ID是主鍵

2)圖書表包含以下字段:
  圖書編號(序列號)、書名、書的描述信息、出版時間、作者、圖書的類別(只能是'java'、'c'、'c++'、'db'、'web')圖書編號爲主鍵

3.庫存備份表包含以下信息:
  圖書編號、庫存數量(最低數量爲0)、缺少數量(默認爲0),圖書編號爲主鍵

4.圖書借閱表包含以下字段(每個會員可以借閱多本書):
  序列號、圖書編號、會員ID、借閱日期(默認爲系統當前日期)、還書日期、到期日期(默認爲系統單籤日期後的一個月),序列號爲主鍵

5.預定表包含以下字段(每個會員可以預定多本書):
  會員ID、圖書編號、預定日期,會員ID、圖書編號、預定日期爲聯合主鍵


3.操作步驟
1)創建用戶neu,分配用戶create session、unlimited tablespace、create table、createsequence、create view權限

  SQL>CREATE USER neusoft IDENTIFIED BY neu;

  SQL> GRANT create session,unlimited tablespace,create table,
             create sequence,create view
       TO    neu;

2)創建各個表,選擇適當的數據類型並添加完整性約束

   CREATE TABLE member
    (member_id  NUMBER(10) CONSTRAINT member_id_pk PRIMARY KEY,
     m_name  VARCHAR2(25) NOT NULL,
     address  VARCHAR2(100),
     city  VARCHAR2(30),
     phone  VARCHAR2(15),
     join_date  DATE DEFAULT SYSDATE NOT NULL);

  CREATE TABLE title
  (title_id    NUMBER(10) CONSTRAINT title_id_pk PRIMARY KEY,
   title       VARCHAR2(60) NOT NULL,
   description VARCHAR2(400) NOT NULL,
   pub_date    DATE,
   author      VARCHAR2(40),
   label       VARCHAR2(20) CONSTRAINT label_ck
                            CHECK(label IN('java','c','c++','db','web')));

  CREATE TABLE title_copy
    (title_id  NUMBER(10) CONSTRAINT title_bak_pk PRIMARY KEY,
     bak_num   NUMBER(10) CONSTRAINT bak_num_c CHECK(bak_num>=0),
     lack_num  NUMBER(10) DEFAULT 0,
     CONSTRAINT title_id_bak_fk FOREIGN KEY(title_id) REFERENCES title(title_id));

   CREATE TABLE  reservation
    (member_id   NUMBER(10) CONSTRAINT r_member_id_fk REFERENCES member(member_id),
     title_id   NUMBER(10) CONSTRAINT r_title_id_fk REFERENCES title(title_id), 
     res_date   DATE,
     CONSTRAINT res_s_pk PRIMARY KEY(member_id,title_id, res_date));

   CREATE TABLE borrow
   (borrow_seq  NUMBER(10) CONSTRAINT borrow_seq_pk PRIMARY KEY,
    title_id    NUMBER(10) CONSTRAINT b_title_id_fk REFERENCES title(title_id),
    borrow_date DATE DEFAULT SYSDATE,
    return_date DATE,
    exp_date    DATE DEFAULT ADD_MONTHS(SYSDATE,1));
  
3)檢查數據字典,驗證表和約束已被完全創建

   SELECT * FROM user_tables;
   SELECT * FROM user_constraints;

   或:
   SELECT table_name
   FROM   user_tables
   WHERE  table_name IN ('MEMBER', 'TITLE', 'TITLE_COPY', 'BORROW', 'RESERVATION');

   SELECT constraint_name, constraint_type, table_name
   FROM user_constraints
   WHERE table_name IN ('MEMBER', 'TITLE', 'TITLE_COPY', 'BORROW', 'RESERVATION');

4)創建序列來唯一地標識在會員表、圖書表、圖書借閱表中的每一行

   CREATE SEQUENCE member_seq
          INCREMENT BY 1
          START WITH 1
          NOCACHE;

   CREATE SEQUENCE title_seq
          INCREMENT BY 1
          START WITH 1
          NOCACHE;

   CREATE SEQUENCE borrow_seq
          INCREMENT BY 1
          START WITH 1
          NOCACHE;
5)驗證在數據字典中已經存在的序列

   SELECT * FROM user_sequences;

   或:
   SELECT sequence_name, increment_by, last_number
   FROM   user_sequences
   WHERE  sequence_name IN ('MEMBER_SEQ','TITLE_ID_SEQ','BORROW_SEQ'); 

6)添加數據到表中,注意:數據的添加要使用序列

 
   INSERT INTO title
   VALUES (title_seq.NEXTVAL, '世界是平的','介紹世界爲什麼是平的','14-8月-07','xiyou','java');
 
   INSERT INTO member
   VALUES (member_seq.NEXTVAL, 'yang','陝西韓城','韓城',83660002,sysdate);

   INSERT INTO title_copy
   VALUES (title_seq.CURRVAL,10,0);

   INSERT INTO borrow(borrow_seq, title_id , member_id , borrow_date, exp_date )
   VALUES (borrow_seq.NEXTVAL, title_seq.CURRVAL,member_seq.currval, sysdate, ADD_MONTHS(SYSDATE,1));

   INSERT INTO reservation
   VALUES (member_seq.currval,title_seq.CURRVAL, sysdate);

7)創建一個名爲title_avail的視圖,顯示書的編號、書名、出版時間和書的庫存數量,從視圖中查詢所有出版日期大於2007-01-01的數據,用書的編號排序

   CREATE OR REPLACE VIEW title_avail
   AS
 SELECT t.title_id ,t.title, c.bak_num , t.pub_date
 FROM title t, title_copy c
 WHERE t.title_id = c.title_id;

   SELECT *
   FROM   title_avail
   WHERE  pub_date>TO_DATE('2007-01-01','yyyy-mm-dd')
   ORDER BY title_id;

8)在圖書借閱表上以會員ID創建非惟一索引
  
   CREATE INDEX bow_mem_idx
   ON borrow(member_id );

9)更新庫存圖書備份表,將其中一本書名爲XXX的庫存量在原有基礎上增加10本

   UPDATE title_copy
   SET    bak_num=bak_num+10
   WHERE  title_id=
                (SELECT title_id
                 FROM   title
                 WHERE  title='世界是平的')

10)修改表結構,添加一個price列到title表,記錄書的購買價格。該列應該有8位數字長度和2位小數,驗證你的修改。

   ALTER TABLE title
     ADD (price NUMBER(8,2));

   DESC title

11)爲每本書添加價格

    UPDATE title SET price=50 WHERE title_id=1;

12)更改title表中價格字段爲非空,驗證該約束

   ALTER TABLE title MODIFY (price NOT NULL);
  
   SELECT * FROM user_constraints;
   或:
   SELECT constraint_name, constraint_type, search_condition
     FROM user_constraints
    WHERE table_name = 'TITLE';
  
13)查詢客戶租書信息,包含客戶編號、客戶名、書名、書的價格、借閱日期、還書日期、到期日期
   SELECT m.member_id,m.m_name,t.title,t.price,b.borrow_date,b.return_date,b.exp_date
     FROM member m,title t,borrow b
    WHERE m.member_id=b.member_id
      AND t.title_id=b.title_id;
14)刪除各個表中的數據

   DELETE FROM borrow;
   DELETE FROM reservation;
   DELETE FROM title_copy;
   DELETE FROM title;
   DELETE FROM member;

15)刪除member表上的主鍵約束,並且任何與其相依賴的約束也被一起刪除

   ALTER TABLE member
          DROP PRIMARY KEY CASCADE;
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章