[Oracle]实验六 表、视图、 索引和完整性等 创建一个视图 customers_info, 描述客户的信息, 包括客户名称、 订购图书名称、 图书总价。根据图书销售系统关系模式设计, 创建下列各

实验六  表、视图、 索引和完整性等

一、 实验目的

1、 了解视图的基本概念、 种类及各自的特点与作用。

2、 理解索引的基本概念及其优缺点。

3、 理解修改数据时索引的开销。

4、 理解数据完整性的概念及分类。

5、 理解同义词和序列的基本概念。

6、 掌握在 OEM 中创建视图、 索引、 实体完整性、 域完整性和参照完整性以及同义词、 序列的方法。

二、实验要求

(1)为图书销售系统创建表。

(2)在图书销售系统适当表的适当列上创建适当类型的索引。

(3)为图书销售系统创建视图

(4)为图书销售系统创建序列。

三、 实验内容

(1)打开 SQL Plus, 以 system 用户登录 ORCL 数据库。

(2)按下列方式创建一个用户 bs, 并给该用户授权。

SQL>CREATE USER bs IDENTIFIED BY bs DEFAULT TABLESPACE USERS ;

SQL>GRANT RESOURCE,CONNECT,CREATE VIEW TO bs;

(3)使用 bs 用户登录数据库, 并进行下面的相关操作。

(4)根据图书销售系统关系模式设计, 创建下列各表。

①customers表

create table customers(customer_id number(4) primary key,
name char(20) not null,phone varchar2(50) not null,
email varchar2(50),address varchar2(200),code varchar2(10));

②publishers表

create table publishers(publisher_id number(2) primary key,
name varchar2(50),contact char(10),phone varchar2(50));

③books表

create table books(isbn varchar2(50) primary key,
title varchar2(50),author varchar2(50),pubdate date,
publisher_id number(2),cost number(6,2),
retail number(6,2),category varchar2(5),
foreign key(publisher_id) references publishers(publisher_id));

④orders表

create table orders(order_id number(4) primary key,
customer_id number(4),orderdate date not null,
shipdate date,shipaddress varchar2(200),
shipcode varchar2(10),
foreign key(customer_id) references customers(customer_id));

⑤orderitem表

create table orderitem(order_id number(4),item_id number(4),
isbn varchar2(50) not null,quantity number(4),
primary key(order_id,item_id),
foreign key(order_id) references orders(order_id));

⑥promotion表

create table promotion(gift_id number(2),
name char(20) primary key,minretail number(5,2),
maxretail number(5,2));

(5)在 CUSTOMERS 表的 name 列上创建一个 B-树索引(即传统默认的索引),索引名称为indx_cname, 要求索引值为大写字母。

create index indx_cname on customers(upper(name));

(6)在 BOOKS 表的 title 列上创建一个非唯一性索引indx_btitle。

 

create index indx_btitle on books(title);

(7)在 ORDERitem 表的 ISBN 列上创建一个唯一性索引indx_oisbn。

create unique index indx_oisbn on orderitem(isbn);

(8)创建一个视图 customers_book, 描述客户与订单的详细信息, 包括客户编号、 客户名单、 订购图书的 ISBN、 图书名称、 图书数量、 订货日期、 发货日期等。

 

create view customers_book as 
select c.customer_id,name,quantity,orderdate,shipdate 
from customers c,orderitem oi,orders o where 
c.customer_id=o.customer_id and o.order_id=oi.order_id;

(9)创建一个视图 customers_info, 描述客户的信息, 包括客户名称、 订购图书名称、 图书总价。

 

create view customer_info as 
select c.name,title,
case when sum(quantity)>10 
then sum(cost*quantity) 
else sum(retail*quantity) 
end as book_total_price 
from customers c,books b,orderitem oi,orders o 
where c.customer_id=o.customer_id and 
o.order_id =oi.order_id and 
oi.isbn=b.isbn group by c.name,title;

(10)为表customers的列“客户编号”定义序列seq_customers,序列起始值为1,步长为1,不缓存,不循环。(此步选做)

 

create sequence seq_customers 
start with 1 
increment by 1 
nocache 
nocycle;

insert into customers 
values(seq_customers.nextval,'王牧','83823422','Wangmu@sina.com','北京','110010');

select * from customers;

(11)为表ORDERS的order_id订单编号列创建序列seq_orders,序列起始值为1000,步长为1,不缓存,不循环。

create sequence seq_orders 
start with 1000 
increment by 1 
nocache 
nocycle;
insert into orders 
values (seq_orders.nextval,1,to_date('2013-2-1', 'yyyy-mm-dd'),to_date('2013-2-5','yyyy-mm-dd'), '大连','116023');

select * from orders;

(12)为表promotion的礼品编号列定义序列seq_promotion,序列起始值为1,步长为1,不缓存,不循环。

create sequence seq_promotion 
start with 1 
increment by 1 
nocache 
nocycle;
insert into promotion 
values(seq_promotion.nextval,'签字笔',100,150);

select * from promotion;

四、问题解答及实验结果

五、实验体会与收获

语法:

1.在Oracle数据库中,序列(Sequence)是一种特殊的数据库对象,用于生成一个序列的唯一值。这些唯一值通常用于主键列。

START WITH 是创建序列时的一个可选参数。它定义了序列的起始值。也就是说,当你首次从该序列中获取一个值时,它将从这个 START WITH 指定的数值开始。

例如,如果你创建一个序列,并指定 START WITH 为 100,那么第一次从这个序列获取值时,你将得到100。下一次获取值时,你将得到101,以此类推。

下面是一个创建序列时使用 START WITH 的例子:

CREATE SEQUENCE seq_name  
  START WITH     100  
  INCREMENT BY   1  
  NOMAXVALUE;

在这个例子中,序列名为 seq_name,起始值为100,每次递增1,没有设置最大值,所以它会一直递增下去。

2.在Oracle序列中,INCREMENT BY 是一个可选参数,用于指定序列中每个值之间的间隔或增量

当您从序列中获取值时,每个后续的值将增加 INCREMENT BY 中指定的数值。例如,如果 INCREMENT BY 设置为1,那么序列将生成连续递增的整数值。如果 INCREMENT BY 设置为5,则序列将生成按照5递增的整数值。

下面是一个示例,演示如何在创建Oracle序列时设置 INCREMENT BY 参数:

CREATE SEQUENCE my_sequence  
  START WITH     100  
  INCREMENT BY   10  
  NOMAXVALUE;

在上述示例中,序列名为 my_sequence,起始值为100,增量为10。因此,序列将生成以下值:100、110、120、130,以此类推。

通过使用 INCREMENT BY 参数,你可以根据需求自定义序列的增量步长,以满足特定场景下的要求。

单词:

primary adj.主要的

foreign adj.外国的

sequence n.序列

increment n.增量

cache n.高速缓冲存储器

cycle n.周期

ship n.船 v.把...推向市场

retail n.零售

promotion n.推广

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值