暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于OpenGauss 的sql操作实验

原创 Carton 2022-12-03
699

基于openGauss的sql实验

该文档为一个大致解析,实验报告及结果在这里

实验数据库
a3c9a70e6db37077bf863c995635887f229a1f841580025464fbda50fb631b11.png

e848e0d24187b5e1923f6d8eff0d62da550c4dcdb5f7d3a580822b460e05c7c4.png

一、实验项目名称

基于openGauss的sql实验

二、实验学时

4个学时

三、实验内容

在给定数据集中,利用openGauss对数据集进行数据库简单数据管理和高级数据管理的应用,包括对函数,存储过程,触发器,索引的使用等

四、实验环境

openGauss(2.0.0)

五、实验数据及结果分析

1.查询所有房型的具体信息,包括room_id, Room_name, hotel_id。

select * from room_type ;

图 15

2.查询所有酒店名称中包含“希尔顿”的酒店,返回酒店名称和酒店id。

select * from hotel where hotel_name like '%希尔顿%';

图 2

3.查询订单总价在10000元及以上的所有订单详情,包括订单编号、
酒店编号、房型编号及居住时长。

select order_id, hotel_id, room_id, leave_date - start_date as living_time from hotel_order natural join room_type where payment >= 10000;

图 3

4.查询所有房型的订单情况,包括房型编号,房型名称,订单编号、
价格。

select distinct room_id, room_name, order_id, price from hotel_order natural join room_type natural join room_info order by room_id asc;

图 4

5.创建启悦酒店的订单视图。

create view qiyu_order1 as select order_id, room_id, start_date, leave_date, amount, payment, create_date, customer_id from hotel natural join room_type natural join hotel_order where hotel_name = '启悦酒店'; select * from qiyu_order1;

图 5

6.在订单表的总价字段上 创建降序的普通索引。索引名为orderpayment. 用\di 命令查看创建的索引。

create index orderpayment on hotel_order (payment desc); \di

图 6

7.创建函数:查询给定日期,给定酒店所有房型的平均价格。执行函数,输入参数为2020-11-14,希尔顿大酒店

create or replace function avg_price(date1 date, name varchar) returns decimalas $$ declare res decimal(10, 2); begin select distinct avg(price) into res from (select price from hotel natural join room_type natural join room_info where hotel_name = name and date = date1); return res; end; $$ language plpgsql;

图 7

8.创建存储过程:从订单表中统计指定酒店、指定日期的各种房型的预订情况,返回酒店名,房型,预定数量。
执行存储过程:统计希尔顿大酒店2020-11-14当天各个房型预定情况

利用存储过程创建一个新表,将结果插入到新表中

create or replace procedure order_status(date1 date, name varchar) as declare hname varchar(20); rname varchar(20); rsum integer; cursor c1 is select hotel_name, room_name, sum(amount) from hotel natural join room_type natural join hotel_order where hotel_name=name and start_date<=date1 and leave_date>=date1 group by hotel_id, room_id; begin create table order_status_table(hotel_name varchar(20), room_name varchar(20), sum integer); open c1; loop fetch c1 into hname, rname, rsum; exit when c1%notfound; insert into order_status_table values (hname, rname, rsum); end loop; close c1; end; / call order_status('2020-11-14', '希尔顿大酒店'); select * from order_status_table;

图 8

9.查找同时评价了2次及以上的用户信息。

select distinct r1.uid, uname from rating r1, rating r2, customer where r1.uid = r2.uid and r1.uid = customer.uid and r1.rid < r2.rid;

图 9

10.查询评价过所有总统套房的顾客姓名。

select distinct uname from customer natural join rating natural join hotel_order natural join room_type where room_name = '总统套房';

图 10

11.若要预定11.14-16日每天房间数量4间。查询满足条件(时
间区间,将预定房间数)的房型及其平均价格,并按平均价格从
低到高进行排序。查询结果应包含酒店,房型及平均价格信息。

SELECT hotel_name,room_name,AVG(price) FROM hotel NATURAL JOIN room_type NATURAL JOIN room_info WHERE date <= '2020-11-16 00:00:00' AND date >= '2020-11-14 00:00:00' GROUP BY hotel_name,room_name HAVING MIN(remain) >= 4 ORDER BY AVG(price);

图 11

12.编写触发器:完成预订房间,包括创建订单和更新房型信息。
该订单为预订11月14号-15号4号房型4间。

--触发器函数 CREATE OR REPLACE FUNCTION update_roominfo() RETURNS TRIGGER AS $$ declare begin update room_info set remain = remain - new.amount when date >= new.start_date and date <= new.leave_date and room_id = new.room_id; return new; end $$ language plpgsql; --触发器 create or replace trigger insert_hotelorder after insert on hotel_order for each row execute procedure update_roominfo(); --执行函数 insert into hotel_order values(28, 4, '2020-11-14', '2020-11-15', 4, 8000, '2020-11-12', 201904);

插入后,room_info中对应日期的remain也发生了相应的变化

六、实验结论

  • 通过课堂上的限时测试与课下的思考,对openGauss中的触发器,函数,索引,存储过程都有了更深的理解,了解了用sql语句处理更复杂的业务流程
  • 不同数据库间sql语句有一定的区别,高级数据的管理结构也有较大差异,需要根据不同的数据库做不同的操作
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论