Sei sulla pagina 1di 8

Answer to Tutorial 9.

1
(Week 9)

Advanced Database Management


School of Information Technology
James Cook University
Semester 1, 2002
_________________________________________________________________

1. Consider the AIRLINE relational database schema shown in Figure


7.19 (see your textbook), which describes a database for airline ight
information. Each FLIGHT is identi ed by a ight NUMBER, and
consists of one or more FLIGHT LEGs with LEG NUMBERs 1, 2,
3, etc. Each leg has scheduled arrival and departure times and air-
ports, and has many LEG INSTANCEs{one for each DATE on which
the ight travels. FARES are kept for each ight. For each leg in-
stance, SEAT RESERVATIONs are kept, as is the AIRPLANE used
in the leg, and the actual arrival and departure times and airports.
An AIRPLANE is identi ed by an AIRPLANE ID, and is of a partic-
ular AIRPLANE TYPE. CAN LAND relates AIRPLANE TYPEs to
the AIRPORTs in which they can land. An AIRPORT is identi ed by
an AIRPORT CODE.
Considering the following referential integrity constraints:

1
FLIGHT_LEG.(FLIGHT_NUMBER) --> FLIGHT.(NNUMBER)
FLIGHT_LEG.(DEPARTURE_AIRPORT_CODE) --> AIRPORT.(AIRPORT_CODE)
FLIGHT_LEG.(ARRIVAL_AIRPORT_CODE) --> AIRPORT.(AIRPORT_CODE)
LEG_INSTANCE.(FLIGHT_NUMBER, LEG_NUMBER) -->
FLIGHT_LEG.(FLIGHT_NUMBER, LEG_NUMBER)
LEG_INSTANCE.(AIRPLANE_ID) --> AIRPLANE.(AIRPLANE_ID)
LEG_INSTANCE.(DEPARTURE_AIRPORT_CODE) --> AIRPORT.(AIRPORT_CODE)
LEG_INSTANCE.(ARRIVAL_AIRPORT_CODE) --> AIRPORT.(AIRPORT_CODE)
FARES.(FLIGHT_NUMBER) --> FLIGHT.(NNUMBER)
CAN_LAND.(AIRPLANE_TYPE_NAME) --> AIRPLANE_TYPE.(TYPE_NAME)
CAN_LAND.(AIRPORT_CODE) --> AIRPORT.(AIRPORT_CODE)
AIRPLANE.(AIRPLANE_TYPE) --> AIRPLANE_TYPE.(TYPE_NAME)
SEAT_RESERVATION.(FLIGHT_NUMBER, LEG_NUMBER, DATE) -->
LEG_INSTANCE.(FLIGHT_NUMBER, LEG_NUMBER, DATE)

Write appropriate SQL DDL statements to de ne the database.


Answer:
One possible set of CREATE TABLE statements to de ne the database
is given below.
CREATE TABLE AIRPORT
(AIRPORT_CODE CHAR(3) NOT NULL,
NAME VARCHAR(30) NOT NULL,
CITY VARCHAR(30) NOT NULL,
STATE VARCHAR(30),
PRIMARY KEY (AIRPORT_CODE) );

CREATE TABLE FLIGHT


(NNUMBER VARCHAR(6) NOT NULL,
AIRLINE VARCHAR(20) NOT NULL,
WEEKDAYS VARCHAR(10) NOT NULL,
PRIMARY KEY (NNUMBER) );

CREATE TABLE FLIGHT_LEG


(FLIGHT_NUMBER VARCHAR(6) NOT NULL,
LEG_NUMBER INTEGER NOT NULL,
DEPARTURE_AIRPORT_CODE CHAR(3) NOT NULL,

2
SCHEDULED_DEPARTURE_TIME CHAR(8) NOT NULL,
ARRIVAL_AIRPORT_CODE CHAR(3) NOT NULL,
SCHEDULED_ARRIVAL_TIME CHAR(8) NOT NULL,
PRIMARY KEY (FLIGHT_NUMBER, LEG_NUMBER),
FOREIGN KEY (FLIGHT_NUMBER) REFERENCES FLIGHT (NNUMBER),
FOREIGN KEY (DEPARTURE_AIRPORT_CODE) REFERENCES
AIRPORT (AIRPORT_CODE),
FOREIGN KEY (ARRIVAL_AIRPORT_CODE) REFERENCES
AIRPORT (AIRPORT_CODE) );

CREATE TABLE LEG_INSTANCE


(FLIGHT_NUMBER VARCHAR(6) NOT NULL,
LEG_NUMBER INTEGER NOT NULL,
LEG_DATE DATE NOT NULL,
NO_OF_AVAILABLE_SEATS INTEGER,
AIRPLANE_ID INTEGER,
DEPARTURE_AIRPORT_CODE CHAR(3),
DEPARTURE_TIME CHAR(8) NOT NULL,
ARRIVAL_AIRPORT_CODE CHAR(3),
ARRIVAL_TIME CHAR(8) NOT NULL,
PRIMARY KEY (FLIGHT_NUMBER, LEG_NUMBER, LEG_DATE),
FOREIGN KEY (FLIGHT_NUMBER, LEG_NUMBER) REFERENCES
FLIGHT_LEG (FLIGHT_NUMBER, LEG_NUMBER),
FOREIGN KEY (AIRPLANE_ID) REFERENCES AIRPLANE (AIRPLANE_ID),
FOREIGN KEY (DEPARTURE_AIRPORT_CODE) REFERENCES
AIRPORT (AIRPORT_CODE),
FOREIGN KEY (ARRIVAL_AIRPORT_CODE) REFERENCES
AIRPORT (AIRPORT_CODE) );

CREATE TABLE FARES


(FLIGHT_NUMBER VARCHAR(6) NOT NULL,
FARE_CODE VARCHAR(10) NOT NULL,
AMOUNT DECIMAL(8,2) NOT NULL,
RESTRICTIONS VARCHAR(200),
PRIMARY KEY (FLIGHT_NUMBER, FARE_CODE),
FOREIGN KEY (FLIGHT_NUMBER) REFERENCES FLIGHT (NNUMBER) );

CREATE TABLE AIRPLANE_TYPE

3
(TYPE_NAME VARCHAR(20) NOT NULL,
MAX_SEATS INTEGER NOT NULL,
COMPANY VARCHAR(15) NOT NULL,
PRIMARY KEY (TYPE_NAME) );

CREATE TABLE CAN_LAND


(AIRPLANE_TYPE_NAME VARCHAR(20) NOT NULL,
AIRPORT_CODE CHAR(3) NOT NULL,
PRIMARY KEY (AIRPLANE_TYPE_NAME, AIRPORT_CODE),
FOREIGN KEY (AIRPLANE_TYPE_NAME) REFERENCES
AIRPLANE_TYPE (TYPE_NAME),
FOREIGN KEY (AIRPORT_CODE) REFERENCES AIRPORT (AIRPORT_CODE));

CREATE TABLE AIRPLANE


(AIRPLANE_ID INTEGER NOT NULL,
TOTAL_NUMBER_OF_SEATS INTEGER NOT NULL,
AIRPLANE_TYPE VARCHAR(20) NOT NULL,
PRIMARY KEY (AIRPLANE_ID),
FOREIGN KEY (AIRPLANE_TYPE) REFERENCES
AIRPLANE_TYPE (TYPE_NAME) );

CREATE TABLE SEAT_RESERVATION


(FLIGHT_NUMBER VARCHAR(6) NOT NULL,
LEG_NUMBER INTEGER NOT NULL,
LEG_DATE DATE NOT NULL,
SEAT_NUMBER VARCHAR(4),
CUSTOMER_NAME VARCHAR(30) NOT NULL,
CUSTOMER_PHONE CHAR(12),
PRIMARY KEY (FLIGHT_NUMBER, LEG_NUMBER, LEG_DATE, SEAT_NUMBER),
FOREIGN KEY (FLIGHT_NUMBER, LEG_NUMBER, LEG_DATE) REFERENCES
LEG_INSTANCE (FLIGHT_NUMBER, LEG_NUMBER, LEG_DATE) );

_________________________________________________________________

2. Specify the following queries on the database of tutorial 7 (COMPANY


database) in SQL.

4
(a) For each department whose average employee salary is more than
$30000, retrieve the department name and the number of employ-
ees working for that department.
(b) Suppose we want the number of male employees in each depart-
ment rather than all employees as in case (a). Can we specify this
query in SQL?
Answer:
(a) SELECT DNAME, COUNT (*)
FROM DEPARTMENT, EMPLOYEE
WHERE DNUMBER=DNO
GROUP BY DNAME
HAVING AVG (SALARY) > 30000;
(b) The query can be speci ed in SQL by using a nested query as
follows (not all implementations may support this type of query):
SELECT DNAME, COUNT (*)
FROM DEPARTMENT, EMPLOYEE
WHERE DNUMBER=DNO AND SEX='M' AND DNO IN (
SELECT DNO
FROM EMPLOYEE
GROUP BY DNO
HAVING AVG (SALARY) > 30000 )
GROUP BY DNAME;

_________________________________________________________________

3. Specify the following views in SQL on the COMPANY database schema


(see tutorial 7 or Figure 7.5 of your textbook):
(a) A view that has the department name, manager name, and man-
ager salary for every department.
(b) A view that has the employee name, supervisor name, employee
salary for each employee who works in the 'Research' department.
(c) A view that has project name, controlling department name, num-
ber of employees, and total hours worked per week on the project
for each project.
5
(d) A view that has project name, controlling department name, num-
ber of employees, and total hours worked per week on the project
for each project with more than one employee working on it.
Answer:
(a) CREATE VIEW DEPT_INFO
(DEPT_NAME, MGR_LAST_NAME, MGR_FIRST_NAME, MGR_SALARY) AS
SELECT DNAME, LNAME, FNAME, SALARY FROM DEPARTMENT, EMPLOYEE
WHERE MGRSSN=SSN;
(b) CREATE VIEW RESEARCH_EMP_INFO
(LNAME, FNAME, SUPERVISOR_NAME, SALARY) AS
SELECT E.LNAME, E.FNAME, S.LNAME, E.SALARY
FROM EMPLOYEE E, EMPLOYEE S, DEPARTMENT
WHERE DNAME='Research' AND DNUMBER=E.DNO AND E.SUPERSSN=S.SSN;
(c) CREATE VIEW PROJ_INFO
(PROJ_NAME, DNAME, NUMBER_OF_EMPS, TOTAL_HRS_PER_WEEK) AS
SELECT PNAME, DNAME, COUNT(*), SUM(HOURS)
FROM PROJECT, DEPARTMENT, WORKS_ON
WHERE PNUMBER=PNO AND DNUM=DNUMBER
GROUP BY PNAME, DNAME;
(d) CREATE VIEW PROJ_INFO
(PROJ_NAME, DNAME, NUMBER_OF_EMPS, TOTAL_HRS_PER_WEEK) AS
SELECT PNAME, DNAME, COUNT(*), SUM(HOURS)
FROM PROJECT, DEPARTMENT, WORKS_ON
WHERE PNUMBER=PNO AND DNUM=DNUMBER
GROUP BY PNAME, DNAME
HAVING COUNT(*) > 1;

_________________________________________________________________

4. Consider the following view DEPT SUMMARY, de ned on the COM-


PANY database of Figure 7.6 (see your textbook, or consider tutorial
7):
CREATE VIEW DEPT_SUMMARY (D, C, TOTAL_S, AVERAGE_S) AS
SELECT DNO, COUNT (*), SUM (SALARY), AVG (SALARY)

6
FROM EMPLOYEE
GROUP BY DNO;
State which of the following queries and updates would be allowed on
the view. If a query or update is allowed, show what the corresponding
query or update on the base relations would look like, and give its result
when applied to the database of Figure 7.6.
(a) SELECT *
FROM DEPT_SUMMARY;
(b) SELECT D, C
FROM DEPT_SUMMARY
WHERE TOTAL_S > 100000;
(c) SELECT D, AVERAGE_S
FROM DEPT_SUMMARY
WHERE C > (SELECT C
FROM DEPT_SUMMARY
WHERE D=4);
(d) UPDATE DEPT_SUMMARY
SET D=3
WHERE D=4;
(e) DELETE FROM DEPT_SUMMARY
WHERE C > 4;
Answer:
(a) This query is allowed, and the resulting query on the base relation
would be the same query as in the view de nition, which is:
SELECT DNO, COUNT (*), SUM (SALARY), AVG (SALARY)
FROM EMPLOYEE
GROUP BY DNO;
(b) This query is allowed, and the resulting query on the base relation
could be:
SELECT DNO, COUNT (*)
FROM EMPLOYEE
GROUP BY DNO
HAVING SUM(SALARY) > 100000;

7
(c) This query is allowed, and the resulting query on the base relation
could be:
SELECT DNO, AVG (SALARY)
FROM EMPLOYEE
GROUP BY DNO
HAVING COUNT(*) > (SELECT COUNT(*)
FROM EMPLOYEE
WHERE DNO=4);
(d) This update may be interpreted to mean that all EMPLOYEEs
who work for department 4 should be reassigned to department 3,
or it may be interpreted to mean that the department number is
being changed; hence, it is ambiguous.
(e) This deletion may be interpreted to mean that every department
with more than 4 employees should be deleted, or that all em-
ployees who work for a department with more than 4 employees
should be deleted; hence, it is also ambiguous.
_________________________________________________________________

Potrebbero piacerti anche