注:mysql表中所输出的元祖均为设计来满足要求的数据


7.12创建另一个和表Booking具有相同结构的表,用于保存归档记录,用INSERT语句将表Booking中2013年1月1日之前登记的记录复制到归档记录表中,从表Booking中将2013年1月1日之前的所有登记删除

由于是归档表,所以不需要像booking那样要设置主键和外键,创建booking2作为新表

CREATE TABLE  booking2(
hotelNo INT NOT NULL,
guestNo INT NOT NULL,
dateFrom DATE NOT NULL,
dateTo DATE,
roomNo INT NOT NULL
);

现在booking有以下记录

插入需要复制的元祖

     INSERT INTO Booking2 (SELECT * FROM booking WHERE dateFrom<'2013-01-01');


然后再删除booking中对应的表

     DELETE from booking2 WHERE dateFrom<'2013-01-01';

此时booking中的记录已经被删除

7.13创建一个视图,包括酒店名字和居住在酒店中的客人名字

创建视图的语法和表差不多,就是用AS就可以了

    CREATE VIEW name AS SELECT hotelname,guestname 
    FROM hotel h,booking b,guest g
    WHERE h.hotelNo=b.hotelNo AND b.guestNo=g.guestNo 
    AND dateFrom<=CURRENT_DATE AND dateTo>=CURRENT_DATE;

效果如下

7.14创建一个视图,包括格罗夫纳酒店每个客人的账户

和上一题一样的思路,这里注意账户里面应该有钱,而这个钱应该是指住在酒店房间的客人应付的钱,所以需要连接表Room

CREATE VIEW accout AS 
SELECT guestNo,guestname,guestAddress,price*(b.dateTo-b.dateFrom) 
FROM hotel h,room r,booking b,guest g WHERE h.hotelname="Grosvenor" 
AND h.hotelNo=r.hotelNo AND h.hotelNo=b.hotelNo AND r.roomNo=b.roomNo 
AND b.guestNo=g.guestNo;

7.25创建一个视图,有Employee和Department构成,但是不包括address,DOB和sex属性

为了检验,先把四张表创建好

CREATE TABLE Employee(
empNo INT NOT NULL,
fname VARCHAR(10) NOT NULL,
IName VARCHAR(10) NOT NULL,
address VARCHAR(10) NOT NULL,
DOB VARCHAR(10) NOT NULL,
sex VARCHAR(10) NOT NULL,
position VARCHAR(10) NOT NULL,
deptNo INT NOT NULL,
PRIMARY KEY(empNo),
FOREIGN KEY(deptNo) REFERENCES Department(deptNo)
);

CREATE TABLE Department(
deptNo INT NOT NULL,
deptName VARCHAR(10) NOT NULL,
mgrEmpNo VARCHAR(10) NOT NULL,
PRIMARY KEY(deptNo)
);

CREATE TABLE Project(
projNo INT NOT NULL,
projName  VARCHAR(10) NOT NULL,
deptNo  INT NOT NULL,
PRIMARY KEY(projNo),
FOREIGN KEY(deptNo) REFERENCES Department(deptNo)
);

CREATE TABLE WorksOn(
empNo INT NOT NULL,
projNo INT NOT NULL,
dateWorked VARCHAR(10) NOT NULL,
hoursWorked VARCHAR(10) ,
PRIMARY KEY(empNo,projNo,dateWorked),
FOREIGN KEY(empNo) REFERENCES Employee(empNo),
FOREIGN KEY(projNo) REFERENCES Project(projNo)
);

语句如下,两表的链接之处在于deptNo

CREATE VIEW ed AS SELECT empNo,fname,Iname,position,d.* FROM Employee e,
Department d  WHERE e.deptNo=d.deptNo;

由于没有数据,用DESC描述

7.26创建一个由属性,empNo,fName,IName,projName和hoursWorked构成的视图

CREATE VIEW efl AS SELECT e.empNo,e.fname,e.IName,p.projName,w.hoursWorked FROM 
Employee e,Project p,WorksOn w WHERE e.empNo=w.empNo AND p.projNo=w.projNo;


存储过程

解析:存储过程就类似于编程语言中的函数,预先查出数据,需要的时候调用
其语法为
CREATE PROCEDURE func()
BEGIN
END;

1. 求某个酒店,当前在住,但dateTo还未指定的旅客姓名,房间号,DateFrom

因为是在mysql中,所以需要用DELIMITER先把分割符由;变成//,否则在输入完IS NULL之后的;将会直接结束语句,输入不了END
SELECT语句比较简单,就不多讲了,注意这里是一个有参数的存储过程,我取的参数为酒店名,容易记,参数前用IN表示这是用来输入的

DELIMITER //
CREATE PROCEDURE product(
IN hname VARCHAR(20)
)
BEGIN
SELECT h.hotelNo,hotelname,guestname,roomNo,dateFrom From hotel h,guest g,booking b 
WHERE h.hotelName=hname AND h.hotelNo=b.hotelNo AND b.guestNo=g.guestNo 
AND dateFrom <=CURRENT_DATE AND dateTo IS NULL;
END//
DELIMITER ;

2. 求某年某月,某个酒店的月收入

以当今酒店的尿性,我认为应该是在住房的第一天就一次性结清了所有的钱,所以月收入我以dateFram作为标准

DELIMITER //
CREATE PROCEDURE dingfang(
IN hname VARCHAR(10),
IN ym DATE,
)
BEGIN 
SELECT SUM((dateTo-dateFrom)*price) FROM hotel h,booking b,room r 
WHERE h.hotelname=hname AND h.hotelNo=b.hotelNo AND b.hotelNo=r.hotelNo 
AND  r.roomNo=b.roomNo AND  dateFrom LIKE "ym"
END //
DELIMITER ;

3. 求从某个日期,至某个日期,某个酒店的可订房间

这道题感觉有点奇怪,比较常见的情况,这目标参数日期内如果有房定了又退了,那么到底算不算可订呢?
从“可订”这个意思理解,应该只要有一天能顶,都算可订,
但是,从用户体验上理解,用户搜索从A时期到B时期,那么他应该是想在这段时期都住下去,所以房间必须在搜索时期内没有被订
所以我选择用户体验嘻嘻 ^ _ ^

DELIMITER //
CREATE PROCEDURE dingfang(
IN hname VARCHAR(10),
IN df DATE,
IN dt DATE
)
BEGIN 
SELECT r.roomNo FROM booking b, hotel h,room r WHERE h.hotelName=hname 
AND h.hotelNo=b.hotelNo AND r.hotelNo=h.hotelNo AND r.roomNo=b.roomNo AND
dateFrom>df AND dateTo<dt;
END //
DELIMITER ;

输出了结果