中国石油大学(华东)数据库原理实验(MySQL版)

2024-06-04 2347阅读

目录

实验一 SQL练习1

一、实验目的

二、实验学时

三、实验内容

四、实验报告

实验二 SQL练习2

一、实验目的

二、实验学时

三、实验内容

四、实验报告

实验三 SQL练习3

一、实验目的

二、实验学时

三、实验内容

四、实验报告

实验四 其它数据库对象的管理

一、实验目的

二、实验学时

三、实验内容

四、实验报告

实验五 安全机制

一、实验目的

二、实验学时

三、实验内容 

四、实验报告


本实验结果相关的图表略。

  1. 实验一 SQL练习1

一、实验目的

    1.掌握基本表的定义;

    2.掌握插入数据、修改数据和删除数据语句的常用形式。

二、实验学时

2学时

三、实验内容

1.新建一个数据库,数据库名字以自己的姓名命名,并有以下要求:

⑴ 该数据库记录某采油厂对油/水井实施作业时所消耗的成本。(作业:为保证油水井正常生产所实施的工程项目)

⑵ 成本的消耗(成本表)分为预算、结算、入账三个状态。

预算:采油队向管理部门提出作业申请,并经管理部门批准后,由管理部门负责录入。

结算:某次作业施工结束后,由管理部门与施工单位共同核算各种成本,由管理部门负责录入。

入账:结算后,财务部门将成本计入采油厂账目,由财务部门录入。

⑶ 预算状态时需要录入的数据:(★:字符型   ◆数字型   ▲日期型)

★单据号:某一作业项目的编号

★预算单位:指需要对油水井实施作业的采油队代码

★井号:需要实施作业的油水井

◆预算金额   ★预算人   ▲预算日期

⑷ 结算状态时需要录入的数据:(★:字符型   ◆数字型   ▲日期型)

调出某条预算记录,录入以下数据:

▲开工日期   ▲完工日期   ★施工单位   ★施工内容

◆材料费(要求另外用表单独记录材料消耗的明细)

材料消耗表(★单据号  ★物码   ◆消耗数量)

◆人工费   ◆设备费   ◆其它费用

◆结算金额(材料费+人工费+设备费+其它费用)

★结算人   ▲结算日期

⑸ 入账状态时需要录入的数据:(★:字符型   ◆数字型   ▲日期型)

调出某条结算记录,录入以下数据:

◆入账金额   ★入账人   ▲入账日期

⑹ 为了避免出现数据的不一致和方便数据录入,要求定义以下基础表:(★:字符型)

单位表:★单位代码   ★单位名称

油水井表:★井号   ★井别:油井/水井   ★单位代码  (表示某口井由哪个单位负责管理)

材料表:★物码   ★名称   ★计量单位   ◆单价

2.根据以上要求,用建表语句定义所需的数据表(暂时不定义完整性规则)。

3.用数据插入语句录入以下数据:

单位表:

1122       采油厂

112201     采油一矿       112202     采油二矿

112201001  采油一矿一队   112201002  采油一矿二队

112201003  采油一矿三队

112202001  采油二矿一队   112202002  采油二矿二队

油水井表:

(y001   油井   112201001)  (y002   油井   112201001)

(y003   油井   112201002)  (s001   水井   112201002)

(y004   油井   112201003)  (s002   水井   112202001)

(s003   水井   112202001)  (y005   油井   112202002)

材料表:

wm001 材料一 吨  10    wm002 材料二 米  10

wm003 材料三 桶  10    wm004 材料四 袋  10

4.录入以下数据:

某作业项目单据号  zy2023001

预算单位:112201001   井号:y001   预算金额:10000.00

预算人:张三   预算日期:2023-5-1   开工日期:2023-5-4

完工日期:2023-5-25   施工单位:作业公司作业一队

施工内容:堵漏    材料费:7000.00(其中材料一:2000.00

材料二:2000.00    材料三:2000.00   材料四:1000.00)

人工费:2500.00    设备费:1000.00   其它费用:1400.00

结算金额:11900.00  结算人:李四   结算日期:2023-5-26

入账金额:11900.00  入账人:王五   入账日期:2023-5-28

某作业项目单据号  zy2023002

预算单位:112201002   井号:y003   预算金额:11000.00

预算人:张三   预算日期:2023-5-1    开工日期:2023-5-4

完工日期:2023-5-23   施工单位:作业公司作业二队

施工内容:检泵     材料费:6000.00(其中材料一:2000.00

材料二:2000.00     材料三:2000.00)

人工费:1500.00     设备费:1000.00   其它费用:2400.00

结算金额:10900.00   结算人:李四   结算日期:2023-5-26

入账金额:10900.00   入账人:王五   入账日期:2023-5-28

某作业项目单据号  zy2023003

预算单位:112201002   井号:s001   预算金额:10500.00

预算人:张三   预算日期:2023-5-1   开工日期:2023-5-6

完工日期:2023-5-23   施工单位:作业公司作业二队

施工内容:调剖    材料费:6500.00(其中材料一:2000.00

材料二:2000.00    材料三:2500.00)

人工费:2000.00    设备费:500.00   其它费用:1400.00

结算金额:10400.00  结算人:李四   结算日期:2023-5-26

入账金额:10400.00  入账人:王五   入账日期:2023-5-28

某作业项目单据号  zy2023004

预算单位:112202001   井号:s002   预算金额:12000.00

预算人:张三   预算日期:2023-5-1   开工日期:2023-5-4

完工日期:2023-5-24   施工单位:作业公司作业三队

施工内容:解堵    材料费:6000.00(其中材料一:2000.00

材料二:2000.00    材料四:2000.00)

人工费:2000.00    设备费:1000.00   其它费用:1600.00

结算金额:10600.00  结算人:李四   结算日期:2023-5-26

入账金额:10600.00  入账人:赵六   入账日期:2023-5-28

某作业项目单据号  zy2023005

预算单位:112202002   井号:y005   预算金额:12000.00

预算人:张三   预算日期:2023-5-1   开工日期:2023-5-4

完工日期:2023-5-28   施工单位:作业公司作业三队

施工内容:防砂    材料费:7000.00(其中材料一:2000.00

材料二:2000.00    材料四:3000.00)

人工费:1000.00    设备费:2000.00   其它费用:1300.00

结算金额:11300.00   结算人:李四   结算日期:2023-6-1

5.完成以下操作

⑴ 将编号为zy2023005的项目的人工费和结算金额增加200元。

⑵ 删除已经结算但未入账的项目。

⑶ 撤消上述两个操作。

四、实验报告

提交实验内容中用SQL语句完成的题目的SQL语句文档及相应的执行结果。

# 1新建一个数据库,数据库名字以自己的姓名命名
CREATE DATABASE `金小矿` CHARACTER SET 'utf8mb4';
# 2根据以上要求,用建表语句定义所需的数据表
create table 成本消耗表
(
  单据号 varchar(20),
  预算单位 varchar(20),
  井号 varchar(20),
  预算金额 decimal(10, 2),
  预算人 varchar(20),
  预算日期 date,
  开工日期 date,
  完工日期 date,
  施工单位 varchar(20),
  施工内容 varchar(20),
  材料费 decimal(10,2),
  材料一费用 decimal(10,2),
  材料二费用 decimal(10,2),
  材料三费用 decimal(10,2),
  材料四费用 decimal(10,2),
  人工费 decimal(10,2),
  设备费 decimal(10,2),
  其他费用 decimal(10,2),
  结算金额 decimal(10,2),
  结算人 varchar(20),
  结算日期 date,
  入账金额 decimal(10,2),
  入账人 varchar(20),
  入账日期 date
 );
create table 单位表
(
    单位代码 char(9),
    单位名称 char(12)
);
create table 油水井表
(
    井号 char(4),
    井别 char(2),
    单位代码 char(9)
);
create table 材料表
(
    物码 char(20),
    名称 char(20),
    计量单位 char(20),
    单价 decimal(10,2)
);
create table 材料消耗表
(
    单据号 char(20),
    物码 char(20),
    消耗数量 int
);
# 3向表中插入数据
insert into 单位表
values('1122','采油厂'),
      ('112201', '采油一矿'),
      ('112202', '采油二矿'),
      ('112201001', '采油一矿一队'),
      ('112201002', '采油一矿二队'),
      ('112201003', '采油一矿三队'),
      ('112202001', '采油二矿一队'),
      ('112202002', '采油二矿二队');     
select * from 单位表;
insert into 油水井表
values('y001','油井','112201001'),
      ('y002','油井','112201001'),
      ('y003','油井','112201002'),
      ('s001','水井','112201002'),
      ('y004','油井','112201003'),
      ('s002','水井','112202001'),
      ('s003','水井','112202001'),
      ('y005','油井','112202002');
select * from 油水井表;
insert into 材料表
values('wm001','材料一','吨',10),
      ('wm002','材料二','米',10),
      ('wm003','材料三','桶',10),
      ('wm004','材料四','袋',10);
select * from 材料表;
insert into 材料消耗表
values
('zy2023001','wm001',200),
('zy2023001','wm002',200),
('zy2023001','wm003',200),
('zy2023001','wm004',100),
('zy2023002','wm001',200),
('zy2023002','wm002',200),
('zy2023002','wm003',200),
('zy2023003','wm001',200),
('zy2023003','wm002',200),
('zy2023003','wm003',250),
('zy2023004','wm001',200),
('zy2023004','wm002',200),
('zy2023004','wm004',200),
('zy2023005','wm001',200),
('zy2023005','wm002',200),
('zy2023005','wm004',300);
select * from 材料消耗表;
insert into 成本消耗表
values ('zy2023001', '112201001', 'y001', '10000.00', '张三',
        '2023-05-01', '2023-05-04', '2023-05-25', '作业公司作业一队', '堵漏',
        '7000.00', '2000.00', '2000.00', '2000.00', '1000.00',
        '2500.00', '1000.00', '1400.00',
        '11900.00', '李四', '2023-05-26', '11900.00', '王五', '2023-05-28'),
       ('zy2023002', '112201002', 'y003','11000.00', '张三',
        '2023-05-01', '2023-05-04', '2023-05-23', '作业公司作业二队', '检泵',
        '6000.00', '2000.00', '2000.00', '2000.00', NULL,
        '1500.00', '1000.00', '2400.00',
        '10900.00', '李四', '2023-05-26', '10900.00', '王五', '2023-05-28'),
       ('zy2023003', '112201002', 's001','10500.00', '张三',
        '2023-05-01', '2023-05-04', '2023-05-23',
        '作业公司作业二队', '调剖', '6500.00', '2000.00', '2000.00', '2500.00', NULL,
        '2000.00', '500.00', '1400.00',
        '10400.00', '李四', '2023-05-26', '10400.00', '王五', '2023-05-28'),
       ('zy2023004', '112201001', 's002',
        '12000.00', '张三', '2023-05-01', '2023-05-04', '2023-05-24',
        '作业公司作业三队', '解堵', '6000.00', '2000.00', '2000.00', NULL, '2000.00',
        '2000.00', '1000.00', '1600.00',
        '10600.00', '李四', '2023-05-26', '10600.00', '赵六', '2023-05-28'),
       ('zy2023005', '112201002', 'y005',
        '12000.00', '张三',
        '2023-05-01', '2023-05-04', '2023-05-28',
        '作业公司作业三队', '防沙',
        '7000.00', '2000.00', '2000.00', NULL, '3000.00',
        '1000.00', '2000.00', '1300.00',
        '11300.00', '李四', '2023-06-01', NULL, NULL, NULL);
select * from 成本消耗表;
#查看开关状态
show variables like 'SQL_SAFE_UPDATES';
#修改数据库模式
SET SQL_SAFE_UPDATES = 0;
#开始事务create table 成本消耗表
(
  单据号 varchar(20),
  预算单位 varchar(20),
  井号 varchar(20),
  预算金额 decimal(10, 2),
  预算人 varchar(20),
  预算日期 date,
  开工日期 date,
  完工日期 date,
  施工单位 varchar(20),
  施工内容 varchar(20),
  材料费 decimal(10,2),
  材料一费用 decimal(10,2),
  材料二费用 decimal(10,2),
  材料三费用 decimal(10,2),
  材料四费用 decimal(10,2),
  人工费 decimal(10,2),
  设备费 decimal(10,2),
  其他费用 decimal(10,2),
  结算金额 decimal(10,2),
  结算人 varchar(20),
  结算日期 date,
  入账金额 decimal(10,2),
  入账人 varchar(20),
  入账日期 date
 );
create table 单位表
(
    单位代码 char(9),
    单位名称 char(12)
);
create table 油水井表
(
    井号 char(4),
    井别 char(2),
    单位代码 char(9)
);
create table 材料表
(
    物码 char(20),
    名称 char(20),
    计量单位 char(20),
    单价 decimal(10,2)
);
create table 材料消耗表
(
    单据号 char(20),
    物码 char(20),
    消耗数量 int
);
# 3向表中插入数据
insert into 单位表
values('1122','采油厂'),
      ('112201', '采油一矿'),
      ('112202', '采油二矿'),
      ('112201001', '采油一矿一队'),
      ('112201002', '采油一矿二队'),
      ('112201003', '采油一矿三队'),
      ('112202001', '采油二矿一队'),
      ('112202002', '采油二矿二队');     
select * from 单位表;
insert into 油水井表
values('y001','油井','112201001'),
      ('y002','油井','112201001'),
      ('y003','油井','112201002'),
      ('s001','水井','112201002'),
      ('y004','油井','112201003'),
      ('s002','水井','112202001'),
      ('s003','水井','112202001'),
      ('y005','油井','112202002');
select * from 油水井表;
insert into 材料表
values('wm001','材料一','吨',10),
      ('wm002','材料二','米',10),
      ('wm003','材料三','桶',10),
      ('wm004','材料四','袋',10);
select * from 材料表;
insert into 材料消耗表
values
('zy2023001','wm001',200),
('zy2023001','wm002',200),
('zy2023001','wm003',200),
('zy2023001','wm004',100),
('zy2023002','wm001',200),
('zy2023002','wm002',200),
('zy2023002','wm003',200),
('zy2023003','wm001',200),
('zy2023003','wm002',200),
('zy2023003','wm003',250),
('zy2023004','wm001',200),
('zy2023004','wm002',200),
('zy2023004','wm004',200),
('zy2023005','wm001',200),
('zy2023005','wm002',200),
('zy2023005','wm004',300);
select * from 材料消耗表;
insert into 成本消耗表
values ('zy2023001', '112201001', 'y001', '10000.00', '张三',
        '2023-05-01', '2023-05-04', '2023-05-25', '作业公司作业一队', '堵漏',
        '7000.00', '2000.00', '2000.00', '2000.00', '1000.00',
        '2500.00', '1000.00', '1400.00',
        '11900.00', '李四', '2023-05-26', '11900.00', '王五', '2023-05-28'),
       ('zy2023002', '112201002', 'y003','11000.00', '张三',
        '2023-05-01', '2023-05-04', '2023-05-23', '作业公司作业二队', '检泵',
        '6000.00', '2000.00', '2000.00', '2000.00', NULL,
        '1500.00', '1000.00', '2400.00',
        '10900.00', '李四', '2023-05-26', '10900.00', '王五', '2023-05-28'),
       ('zy2023003', '112201002', 's001','10500.00', '张三',
        '2023-05-01', '2023-05-04', '2023-05-23',
        '作业公司作业二队', '调剖', '6500.00', '2000.00', '2000.00', '2500.00', NULL,
        '2000.00', '500.00', '1400.00',
        '10400.00', '李四', '2023-05-26', '10400.00', '王五', '2023-05-28'),
       ('zy2023004', '112201001', 's002',
        '12000.00', '张三', '2023-05-01', '2023-05-04', '2023-05-24',
        '作业公司作业三队', '解堵', '6000.00', '2000.00', '2000.00', NULL, '2000.00',
        '2000.00', '1000.00', '1600.00',
        '10600.00', '李四', '2023-05-26', '10600.00', '赵六', '2023-05-28'),
       ('zy2023005', '112201002', 'y005',
        '12000.00', '张三',
        '2023-05-01', '2023-05-04', '2023-05-28',
        '作业公司作业三队', '防沙',
        '7000.00', '2000.00', '2000.00', NULL, '3000.00',
        '1000.00', '2000.00', '1300.00',
        '11300.00', '李四', '2023-06-01', NULL, NULL, NULL);
select * from 成本消耗表;
#查看开关状态
show variables like 'SQL_SAFE_UPDATES';
#修改数据库模式
SET SQL_SAFE_UPDATES = 0;
#开始事务
begin; #另一种 start transaction
# 5.1将编号为zy2023005的项目的人工费和结算金额增加200元
update 成本消耗表
set 人工费 = 人工费 + 200,
	结算金额 = 结算金额 + 200
where 单据号 = 'zy2023005';   
select * from 成本消耗表;
# 5.2删除已经结算但未入账的项目
delete from 成本消耗表
where 入账金额 is NULL;
select * from 成本消耗表;
# 5.3撤消上述两个操作
rollback;
select * from 成本消耗表;
begin; #另一种 start transaction
# 5.1将编号为zy2023005的项目的人工费和结算金额增加200元
update 成本消耗表
set 人工费 = 人工费 + 200,
	结算金额 = 结算金额 + 200
where 单据号 = 'zy2023005';   
select * from 成本消耗表;
# 5.2删除已经结算但未入账的项目
delete from 成本消耗表
where 入账金额 is NULL;
select * from 成本消耗表;
# 5.3撤消上述两个操作
rollback;
select * from 成本消耗表;

实验二 SQL练习2

一、实验目的

    1.掌握索引的建立、删除及使用

    2.掌握单表查询、连接查询、嵌套查询和集合查询;

    3.掌握插入数据、修改数据和删除数据语句的非常用形式。

二、实验学时

2学时

三、实验内容

1.完成以下操作:

⑴ 在预算日期、结算日期和入账日期上分别建立索引,并在查询操作中体会索引的作用。

⑵ 在完成第2题的查询操作后,删除预算日期、结算日期和入账日期上的索引。

2.完成以下操作:

⑴ 采油一矿二队2023-5-1到2023-5-28有哪些项目完成了预算,列出相应明细。

⑵ 采油一矿二队2023-5-1到2023-5-28有哪些项目完成了结算,列出相应明细。

⑶ 采油一矿二队2023-5-1到2023-5-28有哪些项目完成了结算,列出相应的材料费消耗明细。

⑷ 采油一矿二队2023-5-1到2023-5-28有哪些项目完成了入账,列出相应明细。

⑸ 列出采油一矿二队2023-5-1到2023-5-28总的预算金额。

⑹ 列出采油一矿二队2023-5-1到2023-5-28总的结算金额。

⑺ 列出采油一矿二队2023-5-1到2023-5-28总的入账金额。

⑻ 列出采油一矿2023-5-1到2023-5-28总的入账金额。

⑼ 有哪些人员参与了入账操作。

⑽ 列出2023-5-1到2023-5-28进行了结算但未入账的项目。

⑾ 列出采油一矿二队的所有项目,按入账金额从高到低排列。

⑿ 列出有哪些施工单位实施了项目,并计算各单位所有项目结算金额总和。

⒀ 找出消耗了材料三且消耗超过了2000元的项目,列出相应消耗明细(利用子查询)。

⒁ 作业公司作业二队参与了哪些项目。

⒂ 作业公司作业一队和作业二队参与了哪些项目(利用union)。

⒃ 采油一矿的油井是哪些作业队参与施工的。

3.完成以下操作:

⑴ 建立汇总表(包含3个属性列:★施工单位、★年月、◆结算金额)保存各个施工单位每月的结算金额总和。

⑵ 用子查询将各个施工单位每月的结算金额总和插入到所建立的数据表中。

⑶ 用带子查询的修改语句将采油一矿油井作业项目的结算人改为“李兵”。

⑷ 用带子查询的删除语句删除采油一矿油井作业项目。

⑸ 撤消上述两个操作。

四、实验报告

提交实验内容中用SQL语句完成的题目的SQL语句文档及相应的执行结果。

# 1.1在预算日期、结算日期和入账日期上分别建立索引,并在查询操作中体会索引的作用
create index budget_date on 成本消耗表(预算日期)
create index settlement_date on 成本消耗表(结算日期)
create index entry_date on 成本消耗表(入账日期)
# 2.1采油一矿二队2023-5-1到2023-5-28有哪些项目完成了预算,列出相应明细
select * from 成本消耗表
where 预算日期 >='2023-5-1' AND 预算日期 ='2023-5-1' AND 结算日期 ='2023-5-1' AND 结算日期 ='2023-5-1' AND 入账日期 ='2023-5-1' AND 预算日期 ='2023-5-1' AND 结算日期 ='2023-5-1' AND 入账日期 ='2023-5-1' AND 入账日期 ='2023-5-1' AND 结算日期 =2000);
# 2.14作业公司作业二队参与了哪些项目
select * from 成本消耗表
where 施工单位 = '作业公司作业二队'
# 2.15作业公司作业一队和作业二队参与了哪些项目(利用union)
select * from 成本消耗表
where 施工单位 = '作业公司作业一队'
union
select * from 成本消耗表
where 施工单位 = '作业公司作业二队'
# 2.16采油一矿的油井是哪些作业队参与施工的
select distinct 施工单位 from 成本消耗表,油水井表,单位表
where 成本消耗表.井号=油水井表.井号 and 油水井表.单位代码=单位表.单位代码 and 单位表.单位名称 like '采油一矿%'
# 1.2 在完成第2题的查询操作后,删除预算日期、结算日期和入账日期上的索引
DROP INDEX budget_date ON 成本消耗表;
DROP INDEX settlement_date ON 成本消耗表;
DROP INDEX entry_date ON 成本消耗表;
# 3.1建立汇总表(包含3个属性列:★施工单位、★年月、◆结算金额)保存各个施工单位每月的结算金额总和:
create table 汇总表
(施工单位 varchar(20),
年月 varchar(20),
结算金额 decimal(10,2));
select * from 汇总表;
# 3.2用子查询将各个施工单位每月的结算金额总和插入到所建立的数据表中:
insert into 汇总表(施工单位,年月,结算金额)
select 施工单位,date_format(结算日期, '%Y%m'),sum(结算金额) from 成本消耗表
group by `施工单位`,date_format(结算日期, '%Y%m');
select * from 汇总表;
# 3.3用带子查询的修改语句将采油一矿油井作业项目的结算人改为“李兵”:
begin;
update 成本消耗表 set 结算人='李兵'
where 预算单位 in 
(select 单位代码 from 单位表 where 单位名称 in (select 单位代码 from 单位表 where 单位名称 like '采油一矿%'));
select * from 成本消耗表;
# 3.4用带子查询的删除语句删除采油一矿油井作业项目:
delete from 成本消耗表 
where 预算单位 in (select 单位代码  from 单位表 where 单位名称 like '采油一矿%');
select * from 成本消耗表;
# 3.5撤消上述两个操作:
rollback;
select * from 成本消耗表;

实验三 SQL练习3

一、实验目的

    1.掌握基本表的删除与修改;

    2.掌握实体完整性、参照完整性和用户定义的完整性的定义、检查和违约处理;

    3.掌握视图的定义、查询和更新,了解视图的作用。

二、实验学时

2学时

三、实验内容

1.完成以下操作:

⑴ 向在实验二中所定义的数据表增加“备注”列,其数据类型为字符型,并查看新增列的值。

⑵ 对上述数据表增加主码约束条件,并观察在数据表中存在数据的情况下主码约束是否创建成功,然后再次执行实验二中实验内容3-⑵的操作,并观察记录执行结果。

⑶ 删除上述数据表中的数据,然后再删除该数据表,对这两个操作进行比较。

2.完成以下任务:

⑴ 对实验一中所定义的5个数据表增加主码约束条件,并观察在数据表中存在数据的情况下主码约束是否创建成功,然后执行以下2个操作,观察并记录实体完整性的检查和违约处理。

① insert  into  材料消耗表  values('zy2023001','wm004',100)

② insert  into  材料消耗表  values('zy2023002',NULL,200)

⑵ 对实验一中所定义的5个数据表增加相应的参照完整性约束,并观察在数据表中存在数据的情况下参照完整性约束是否创建成功,然后执行以下操作,观察并记录参照完整性的检查和违约处理。

① 将(y007   油井   112203002)插入到油水井表。

② insert  into  材料消耗表  values('zy2023007','wm006',100)

③ 将单位表中的(112202002  采油二矿二队)删除,查看油水井表和成本表中的数据有何变化。

④ 将材料表中的(wm004 材料四 袋 10)修改为(wm04 材料四 袋 10)。

⑤ 撤销上述成功的更新操作。

⑶ 对实验一中所定义的5个数据表按以下要求增加相应的完整性约束条件,并观察在数据表中存在数据的情况下完整性约束是否创建成功。

① 单位表的单位名称不能取空值、且取值唯一。

② 油水井表的井别只允许取“油井”或“水井”,单位代码不能取空值。

③ 材料表的名称不能取空值、且取值唯一,计量单位不能取空值。

④ 材料消耗表的消耗数量不能取空值。

⑤ 对成本表根据实际应用的要求定义适当的用户定义的完整性约束条件。

3.完成以下操作:

⑴ 定义视图V1,用于保存成本表和材料消耗表的全部列。

⑵ 查询上面定义的视图V1,可任意组合查询条件,构造出2个查询。

⑶ 定义一个反映成本表预算状态的视图V2,并向该视图插入('zy2023008','112202002','y005',10000,'张三', '2023-07-02'),查看成本表的数据有何变化。

⑷ 撤销上述成功的更新操作。

四、实验报告

提交实验内容中用SQL语句完成的题目的SQL语句文档及相应的执行结果。

# 1.1向在实验二中所定义的数据表增加“备注”列,其数据类型为字符型,并查看新增列的值。
alter table 汇总表 add 备注 varchar(20);
select * from 汇总表
# 1.2对上述数据表增加主码约束条件,并观察在数据表中存在数据的情况下主码约束是否创建成功,然后再次执行实验二中实验内容3-2的操作,并观察记录执行结果。
alter table 汇总表
add primary key(施工单位,年月);
# 子查询将各个施工单位每月的结算金额总和插入到所建立的数据表中:
insert into 汇总表(施工单位,年月,结算金额)
select 施工单位,date_format(结算日期, '%Y%m'),sum(结算金额) from 成本消耗表
group by `施工单位`,date_format(结算日期, '%Y%m');
select * from 汇总表;
# 1.3-1删除上述数据表中的数据,然后再删除该数据表,对这两个操作进行比较。
delete from 汇总表
select * from 汇总表;
# 1.3-2删除上述数据表中的数据,然后再删除该数据表,对这两个操作进行比较。
drop table 汇总表
select * from 汇总表;
# 2.1对实验一中所定义的5个数据表增加主码约束条件,并观察在数据表中存在数据的情况下主码约束是否创建成功
# 然后执行以下2个操作,观察并记录实体完整性的检查和违约处理。
alter table 材料表 alter column 物码 varchar(20) not null;
alter table 材料表 add constraint 主码 primary key (物码);
alter table 材料消耗表 alter column 物码 varchar(20) not null;
alter table 材料消耗表 alter column 单据号 varchar(20) not null;
alter table 材料消耗表 add constraint 主码_材料消耗表 primary key (单据号,物码);
alter table 单位表 alter column 单位代码 varchar(20) not null;
alter table 单位表 add constraint 主码_单位表 primary key (单位代码);
alter table 油水井表 alter column 井号 varchar(20) not null;
alter table 油水井表 add constraint 主码_油水井表 primary key(井号);
alter table 成本消耗表 alter column 单据号 varchar(20) not null;
alter table 成本消耗表 add constraint 主码_成本消耗表 primary key(单据号);
# 2.1.1insert  into  材料消耗表  values('zy2023001','wm004',100)
insert  into  材料消耗表  values('zy2023001','wm004',100)
# 2.1.2insert  into  材料消耗表  values('zy2023002',NULL,200)
insert  into  材料消耗表  values('zy2023002',NULL,200)
# 2.2.0对实验一中所定义的5个数据表增加相应的参照完整性约束,并观察在数据表中存在数据的情况下参照完整性约束是否创建成功,然后执行以下操作,观察并记录参照完整性的检查和违约处理。
alter table 材料消耗表 add foreign key(单据号) references 成本消耗表(单据号);
alter table 材料消耗表 add foreign key(物码) references 材料表(物码);
alter table 油水井表 add foreign key(单位代码) references 单位表(单位代码);
alter table 成本消耗表 add foreign key(预算单位) references 单位表(单位代码);
alter table 成本消耗表 add foreign key(井号) references 油水井表(井号);
# 2.2.1将(y007  油井  112203002)插入到油水井表。
begin
insert into 油水井表 values('y007','油井','112203002');
# 2.2.2insert  into  材料消耗表  values('zy2023007','wm006',100)
insert  into  材料消耗表  values('zy2023007','wm006',100);
# 2.2.3将单位表中的(112202002  采油二矿二队)删除,查看油水井表和成本表中的数据有何变化。
delete from 单位表 where 单位代码 ='112202002' and
单位名称 = '采油二矿二队'
# 2.2.4将材料表中的(wm004 材料四 袋 10)修改为(wm04 材料四 袋 10)。
update 材料表 set 物码 = 'wm04' where '物码' = 'wm004';
# 2.2.5撤销上述成功的更新操作。
rollback;
# 2.3.0对实验一中所定义的5个数据表按以下要求增加相应的完整性约束条件,并观察在数据表中存在数据的情况下完整性约束是否创建成功。
# 2.3.1单位表的单位名称不能取空值、且取值唯一。
alter table 单位表 alter column 单位名称 varchar(12) not null;
alter table 单位表 add unique(单位名称);
# 2.3.2油水井表的井别只允许取“油井”或“水井”,单位代码不能取空值。
alter table 油水井表 add check(井别 = '油井' or 井别 = '水井');
alter table 油水井表 alter column 单位代码 varchar(20) not null;
# 2.3.3材料表的名称不能取空值、且取值唯一,计量单位不能取空值。
alter table 材料表 alter column 名称 varchar(20) not null; 
alter table 材料表 add unique(名称);
alter table 材料表 alter column 计量单位 varchar(20) not null;
# 2.3.4材料消耗表的消耗数量不能取空值。
alter table 材料消耗表 alter column 消耗数量 int not null;
# 2.3.5对成本表根据实际应用的要求定义适当的用户定义的完整性约束条件。
# 假设用户规定成本消耗标的预算金额不能为空
alter table 成本消耗表 alter column 预算金额 varchar(20) not null; 
# 3.1定义视图V1,用于保存成本表和材料消耗表的全部列。
create view V1 as select 成本消耗表.*,材料消耗表.消耗数量,材料消耗表.物码 
from 成本消耗表,材料消耗表 
where 成本消耗表.单据号 = 材料消耗表.单据号;
# 3.2查询上面定义的视图V1,可任意组合查询条件,构造出2个查询。
# 查询1——查询视图V1中井号为y001的全部列
select * from V1 where 井号 = 'y001';
# 查询2——查询视图V1中施工单位为作业公司作业二队的项目的单据号和预算单位
select 单据号,预算单位 from V1 where 施工单位 = '作业公司作业二队';
# 3.3定义一个反映成本表预算状态的视图V2,并向该视图插入('zy2023008','112202002','y005',10000,'张三', '2023-07-02'),查看成本表的数据有何变化。
create view V2 as select 单据号,预算单位,井号,预算金额,预算人,预算日期
from 成本消耗表;
begin;
insert into V2 values('zy2023008','112202002','y005',10000,'张三', '2023-07-02');
select * from V2;
# 3.4撤销上述成功的更新操作。
rollback;
select * from V2;

实验四 其它数据库对象的管理

一、实验目的

    1.掌握事务的概念、性质、定义及使用;

    2.掌握游标的概念、组成、创建及使用;

    3.掌握存储过程的概念、类型、特点、创建、执行及管理。

    4.掌握触发器的概念、创建、管理及使用。

二、实验学时

4学时

三、实验内容

    1.进行如下事务处理练习(把下列五条语句作为一个事务处理,只有五条语句全部成功执行才做提交,并给出成功的提示信息;否则就做回退处理,并给出具体的错误提示信息):

insert into 成本表 values('zy2023006','112202002','y005',

10000,'张三', '07-01-2023' ,'07-04-2023','07-25-2023',

'作业公司作业一队','堵漏',7000,2500,1000,1400,11900,

'李四','07-26-2023',11900,'王五','07-28-2023')

insert into材料消耗表values('zy2023006','wm001',200)

insert into材料消耗表values('zy2023006','wm002',200)

insert into材料消耗表values('zy2023006','wm003',200)

insert into材料消耗表values('zy2023006','wm004',100)

2.进行如下游标练习:

定义一个游标,用于存放成本表的全部行数据,并打印以下表头和各行数据。

表头:单据号 预算单位 井号 预算金额 预算人 预算日期 开工日期 完工日期 施工单位 施工内容 材料费 人工费 设备费 其它费用 结算金额 结算人 结算日期 入账金额 入账人 入账日期

执行以上所定义的游标,查看是否能正确输出结果。

3.定义一个存储过程,要求完成以下功能:

生成某单位(单位可以是采油厂或采油矿或采油队)某段时间内的成本运行情况(输入参数:单位代码 起始日期 结束日期)。

输出格式    ***单位**时间---**时间成本运行情况

预算金额  结算金额  入账金额  未结算金额  未入账金额

 ****.**   ****.**    ****.**    ****.**     ****.**

其中:未结算金额=预算金额-结算金额

      未入账金额=结算金额-入账金额

分三种情况(单位分别为:采油厂、采油矿、采油队)执行以上定义的存储过程,查看执行输出结果。

4.针对成本表定义三个触发器,分别完成以下功能:

⑴ 对成本表插入一行数据时,自动计算并插入结算金额字段(结算金额=材料费+人工费+设备费+其它费用)。

⑵ 当修改成本表的某行数据时自动修改结算金额字段。

⑶ 当删除成本表中一行数据时,自动删除材料消耗表中相应明细数据。

⑷ 对上述3个触发器用适当的更新语句进行验证,并查看结果是否达到预期结果。

四、实验报告

提交实验内容中用SQL语句完成的题目的SQL语句文档及相应的执行结果。

#1.进行如下事务处理练习(把下列五条语句作为一个事务处理,只有五条语句全部成功执行才做提交,
# 并给出成功的提示信息;否则就做回退处理,并给出具体的错误提示信息):
-- 开始事务
DROP PROCEDURE IF EXISTS process_transaction;
DELIMITER //
CREATE PROCEDURE process_transaction()
BEGIN
    START TRANSACTION;
    BEGIN
		insert into 成本消耗表 values
		('zy2023006','112202002','y005',10000,'张三', '2023-07-01' ,'2023-07-04','2023-07-25','作业公司作业一队','堵漏',7000,null,null,null,null,2500,1000,1400,11900,'李四','2023-07-26',11900,'王五','2023-07-28');
        insert into 材料消耗表 values ('zy2023006', 'wm001', 200);
        insert into 材料消耗表 values ('zy2023006', 'wm002', 200);
        insert into 材料消耗表 values ('zy2023006', 'wm003', 200);
        insert into 材料消耗表 values ('zy2023006', 'wm004', 100);
    END;
    IF (SELECT COUNT(*) FROM 成本消耗表 WHERE 单据号 = 'zy2023006') > 0 THEN
        -- 提交事务
        COMMIT;
        SELECT '事务执行成功' AS result;
    ELSE
        -- 回滚事务
        ROLLBACK;
        SELECT '事务执行失败' AS result;
    END IF;
END //
DELIMITER ;
CALL process_transaction();
# 2.进行如下游标练习:
# 定义一个游标,用于存放成本表的全部行数据,并打印以下表头和各行数据。
# -- 定义存储过程
-- 删除之前定义的存储过程
DROP PROCEDURE IF EXISTS print_cost_table;
-- 创建存储过程
-- 定义存储过程
DELIMITER //
CREATE PROCEDURE print_cost_table()
BEGIN
    -- 声明变量
    DECLARE done INT DEFAULT FALSE;
    DECLARE cur_id varchar(20);
    DECLARE cur_budget_unit varchar(20);
    DECLARE cur_well varchar(20);
    DECLARE cur_budget_amount decimal(10,2);
    DECLARE cur_budget_person varchar(20);
    DECLARE cur_budget_date date;
    DECLARE cur_start_date date;
    DECLARE cur_end_date date;
    DECLARE cur_construction_unit varchar(20);
    DECLARE cur_construction_content varchar(20);
    DECLARE cur_material_cost decimal(10,2);
    DECLARE cur_labor_cost decimal(10,2);
    DECLARE cur_equipment_cost decimal(10,2);
    DECLARE cur_other_cost decimal(10,2);
    DECLARE cur_settlement_amount decimal(10,2);
    DECLARE cur_settlement_person varchar(20);
    DECLARE cur_settlement_date date;
    DECLARE cur_accounting_amount decimal(10,2);
    DECLARE cur_accounting_person varchar(20);
    DECLARE cur_accounting_date date;
    -- 声明游标
    DECLARE cur_cost_table CURSOR FOR
        SELECT
            单据号, 预算单位, 井号, 预算金额, 预算人, 预算日期,
            开工日期, 完工日期, 施工单位, 施工内容, 材料费,
            人工费, 设备费, 其他费用, 结算金额, 结算人,
            结算日期, 入账金额, 入账人, 入账日期
        FROM 成本消耗表;
    -- 声明异常处理
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    -- 打印表头
    SELECT
        '单据号', '预算单位', '井号', '预算金额', '预算人', '预算日期',
        '开工日期', '完工日期', '施工单位', '施工内容', '材料费',
        '人工费', '设备费', '其他费用', '结算金额', '结算人',
        '结算日期', '入账金额', '入账人', '入账日期';
	  -- 进入游标
    OPEN cur_cost_table;
    read_loop: LOOP
        FETCH cur_cost_table INTO
            cur_id, cur_budget_unit, cur_well, cur_budget_amount, cur_budget_person,
            cur_budget_date, cur_start_date, cur_end_date, cur_construction_unit,
            cur_construction_content, cur_material_cost, cur_labor_cost,
            cur_equipment_cost, cur_other_cost, cur_settlement_amount,
            cur_settlement_person, cur_settlement_date, cur_accounting_amount,
            cur_accounting_person, cur_accounting_date;
        -- 判断是否取到数据
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- 打印数据
        SELECT
            cur_id, cur_budget_unit, cur_well, cur_budget_amount, cur_budget_person,
            cur_budget_date, cur_start_date, cur_end_date, cur_construction_unit,
            cur_construction_content, cur_material_cost, cur_labor_cost,
            cur_equipment_cost, cur_other_cost, cur_settlement_amount,
            cur_settlement_person, cur_settlement_date, cur_accounting_amount,
            cur_accounting_person, cur_accounting_date;
    END LOOP;
    -- 关闭游标
    CLOSE cur_cost_table;
END //
DELIMITER ;
-- 调用存储过程
CALL print_cost_table();
# 3.定义一个存储过程,要求完成以下功能:生成某单位(单位可以是采油厂或采油矿或采油队)某段时间内的成本运行情况(输入参数:单位代码 起始日期 结束日期)。
DELIMITER //
CREATE PROCEDURE generate_cost_report(IN unit_code CHAR(9), IN start_date DATE, IN end_date DATE)
BEGIN
    -- 声明变量
    DECLARE done INT DEFAULT FALSE;
    DECLARE cur_budget_amount DECIMAL(10,2);
    DECLARE cur_settlement_amount DECIMAL(10,2);
    DECLARE cur_accounting_amount DECIMAL(10,2);
    DECLARE cur_unsettled_amount DECIMAL(10,2);
    DECLARE cur_unaccounted_amount DECIMAL(10,2);
    -- 声明游标
    DECLARE cur_cost_table CURSOR FOR
        SELECT
            预算金额, 结算金额, 入账金额
        FROM 成本消耗表
        WHERE 预算单位 IN (SELECT 单位代码 FROM 单位表 WHERE 单位代码 = unit_code OR 单位代码 LIKE CONCAT(unit_code, '%'))
        AND 预算日期 >= start_date AND 预算日期 

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]