Скачиваний:
19
Добавлен:
01.04.2014
Размер:
82.43 Кб
Скачать

1. Create table Customers

(cnum integer,

cname char(10),

city char(10),

rating integer,

snum integer);

2. CREATE INDEX Datesearch ON Orders(odate);

( Все индексные имена используемые в этих ответах - произвольные. )

3. CREATE UNIQUE INDEX Onumkey ON Orders(onum);

4. CREATE INDEX Mydate ON Orders(snum, odate);

5. CREATE UNIQUE INDEX Combination ON

Customers(snum, rating);

Глава 18

1. CREATE TABLE Orders

(onum integer NOT NULL PRIMARY KEY,

amt decimal,

odate date NOT NULL,

cnum integer NOT NULL,

snum integer NOT NULL,

UNIOUE (snum, cnum));

или

CREATE TABLE Orders

(onum integer NOT NULL UNIQUE,

amt decimal,

odate date NOT NULL,

cnum integer NOT NULL,

snum integer NOT NULL,

UNIQUE (snum, cnum));

Первое решение предпочтительнее.

2. CREATE TABLE Salespeople

(snum integer NOT NULL PRIMARY KEY,

sname char(15) CHECK (sname BETWEEN 'AA' AND 'MZ'),

city char(15),

comm decimal NOT NULL DEFAULT = .10);

372 ПОНИМАНИЕ SQL

___________________________________________________________________

ПРИЛОЖЕНИЕ. A

3. CREATE TABLE Orders

(onum integer NOT NULL,

amt decimal,

odate date,

cnum integer NOT NULL,

snum integer NOT NULL,

CHECK ((cnum > snum) AND (onum > cnum)));

Глава 19

1. CREATE TABLE Cityorders

(onum integer NOT NULL PRIMARY KEY,

amt decimal,

cnum integer,

snum integer,

city char (15),

FOREIGN KEY (onum, amt, snum)

REFERENCES Orders (onum, amt, snum),

FOREIGN KEY (cnum, city)

REFERENCES Customers (cnum, city) );

2. CREATE TABLE Orders

(onum integer NOT NULL,

amt decimal,

odate date,

cnum integer NOT NULL,

snum integer,

prev integer,

UNIQUE (cnum, onum),

FOREIGN KEY (cnum, prev) REFERENCES Orders (cnum,onum) );9

Глава 20

1. CREATE VIEW Highratings

AS SELECT *

FROM Customers

WHERE rating =

(SELECT MAX (rating)

FROM Customers);

ОТВЕТЫ НА УПРАЖНЕНИЯ 373

___________________________________________________________________

2. CREATE VIEW Citynumber

AS SELECT city, COUNT (DISTINCT snum)

FROM Salespeople

GROUP BY city;

3. CREATE VIEW Nameorders

AS SELECT sname, AVG (amt), SUM (amt)

FROM Salespeople, Orders

WHERE Salespeople.snum = Orders.snum

GROUP BY sname;

4 CREATE VIEW Multcustomers

AS SELECT *

FROM Salespeople a

WHERE 1 <

(SELECT COUNT (*)

FROM Customers b

WHERE a.snum = b.snum);

Глава 21

1. #1 - не модифицируемый, потому что он использует DISTINCT.

#2 - не модифицируемый, потому что он использует обьединение,

агрегатную функцию, и GROUP BY.

#3 - не модифицируемый, потому что он основывается на #1, который

сам по себе не модифицируемый.

2. CREATE VIEW Commissions

AS SELECT snum, comm

FROM Salespeople

WHERE comm BETWEEN .10 AND .20

WITH CHECK OPTION;

3 CREATE TABLE Orders

(onum integer NOT NULL PRIMARY KEY,

amt decimal,

odate date DEFAULT VALUE = CURDATE,

snum integer,

cnum integer);

CREATE VIEW Entryorders

AS SELECT onum, amt, snum, cnum

FROM Orders;

374 ПОНИМАНИЕ SQL

___________________________________________________________________

ПРИЛОЖЕНИЕ. A

Глава 22

1. GRANT UPDATE (rating) ON Customers TO Janet;

2. GRANT SELECT ON Orders TO Stephen WITH GRANT OPTION;

3. REVOKE INSERT ON Salespeople FROM Claire;

4. Шаг 1: CREATE VIEW Jerrysview

AS SELECT *

FROM Customers

WHERE rating BETWEEN 100 AND 500

WITH CHECK OPTION;

Шаг 2: GRANT INSERT, UPDATE ON Jerrysview TO Jerry;

5. Шаг 1: CREATE VIEW Janetsview

AS SELECT *

FROM Customers

WHERE rating =

(SELECT MIN (rating)

FROM Customers);

Шаг 2: GRANT SELECT ON Janetsview TO Janet;

Глава 23

1. CREATE DBSPACE Myspace

(pctindex 15,

pctfree 40);

2. CREATE SYNONYM Orders FOR Diane.Orders;

3. Они должны быть откатаны обратно назад.

4. Блокировка взаимоисключающего доступа.

5. Толко чтение

ОТВЕТЫ НА УПРАЖНЕНИЯ 375

___________________________________________________________________

1. SELECT a.tname, a.owner, b.cname, b.datatype

FROM SYSTEMCATOLOG a, SYSTEMCOLUMNS b

WHERE a.tname = b.tname

AND a.owner = b.owner

AND a.numcolumns > 4;

Обратите Внимание: из-за того что большинство имен столбца объ-

единяемых таблиц - различны, не все из используемых псевдонимов

a и b в вышеупомянутой команде - строго обязательны. Они предс-

тавлены просто для понимания.

2. SELECT tname, synowner, COUNT (ALL synonym)

FROM SYTEMSYNONS

GROUP BY tname, synowner;

3 SELECT COUNT (*)

FROM SYSTEMCATALOG a

WHERE numcolumns/2 <

(SELECT COUNT (DISTINCT cnumber)

FROM SYSTEMINDEXES b

WHERE a.owner = b.tabowner

AND a.tname = b.tname);

Глава 25

1. EXEC SQL BEGIN DECLARE SECTION;

SQLCODE:integer;

{требуемый всегда}

cnum integer;

snum integer;

custnum: integer;

salesnum: integer;

EXEC SQL END DECLARE SECTION;

EXEC SQL DECLARE Wrong_Orders AS CURSOR FOR

SELECT cnum, snum

FROM Orders a

WHERE snum < >

(SELECT snum

FROM Customers b

WHERE a.cnum = b.cnum);

376 ПОНИМАНИЕ SQL

___________________________________________________________________

ПРИЛОЖЕНИЕ A

{ Мы пока еще используем здесь SQL для выполнения основной работы.

Запрос выше размещает строки таблицы Порядков которые не согласуются

с таблицей Заказчиков. }

EXEC SQL DECLARE Cust_assigns AS CURSOR FOR

SELECT cnum, snum

FROM Customers;

{Этот курсор используется для получения правильных значений snum}

begin { основная программа }

EXEC SQL OPEN CURSOR Wrong_Orders;

while SQLCODE = O do

{Цикл до тех пор пока Wrong_Orders не опустеет}

begin

EXEC SQL FETCH Wrong_Orders INTO

(:cnum, :snum);

if SQLCODE = O then

begin

{Когда Wrong_Orders опустеет, мы не хотели бы продолжать выполнение

этого цикла до бесконечности}

EXEC SQL OPEN CURSOR Cust_Assigns;

repeat

EXEC SQL FETCH Cust_Assigns

Соседние файлы в папке ПОНИМАНИЕ SQL