Формирование выводов запросов

Автор: Пользователь скрыл имя, 16 Декабря 2011 в 07:17, реферат

Описание работы

Большинство основанных на SQL баз данных предоставляют специальные средства, позволяющие совершенствовать вывод ваших запросов. Конечно, они претерпевают значительные изменения от программы к программе, и их обсуждения здесь не будет, однако имеются пять особенностей, созданных в стандарте SQL, которые позволяют вам делать нечто большее, чем просто вывод значений полей и агрегатных данных.

Работа содержит 1 файл

ФОРМИРОВАНИЕ ВЫВОДА ЗАПРОСОВ.doc

— 205.50 Кб (Скачать)

       (SELECT COUNT (-)

           FROM Orders b

           WHERE a.cnum = b.cnum) 

           UNION 

   SELECT snum, sname

      FROM Salespeople a

      WHERE 1 <

        (SELECT COUNT (*)

            FROM Orders b

            WHERE a.snum = b.snum) 

      ORDER BY 2; 

3. SELECT snum

      FROM Salespeople

      WHERE city = 'San Jose' 

      UNION 

  (SELECT cnum

      FROM Customers

      WHERE city = 'San Jose' 

      UNION ALL 

  SELECT onum

     FROM Orders

    WHERE odate = 10/03/1990);

Глава 15

1. INSERT INTO Salespeople (city, cname, comm, cnum)

VALUES ('San Jose', 'Blanco', NULL, 1100);

2. DELETE FROM Orders WHERE cnum = 2006;

3. UPDATE Customers

SET rating = rating + 100

WHERE city = 'Rome';

4. UPDATE Customers

SET snum = 1004

WHERE snum = 1002;

Глава 16

1. INSERT INTO Multicust

SELECT *

FROM Salespeople

WHERE 1 <

   (SELECT COUNT (*)

       FROM Customers

       WHERE Customers.snum = Salespeople.snum);

2. DELETE FROM Customers

WHERE NOT EXISTS

(SELECT *

    FROM Orders

    WHERE cnum = Customers.cnum);

3. UPDATE Salespeople

SET comm = comm + (comm * .2)

WHERE 3000 <

(SELECT SUM (amt)

    FROM Orders

    WHERE snum = Salespeople.snum);

В более сложный  вариант этой команды  можно было бы вставить проверку, чтобы убедиться, что значения комиссионных не превышают 1.0 (100 %):

UPDATE Salespeople

SET comm = comm + (comm * .2)

WHERE 3000 <

(SELECT SUM (amt)

   FROM Orders

   WHERE snum = Salespeople.snum)

   AND comm + (comm * .2) < 1.0;

Эти вопросы могут  иметь и другие, такие же хорошие решения.

Глава 17

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);

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);

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;

Глава 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. Только чтение.

Глава 24

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);

Мы  пока ещё используем здесь 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

            INTO (:custnum, :salesnum);

     until :custnum = :cnum;

{Повторять FETCH до тех пор, пока ... команда будет просматривать Cust_Assigns курсор до строки, которая соответствует текущему значению cnum, найденного в Wrong_Orders}

     EXEC SQL CLOSE CURSOR Cust_assigns;

{Поэтому  мы будем начинать  новый вывод в  следующий раз через цикл. Значение, которое мы получим из этого курсора, сохраняется в переменной salesnum.}

     EXEC SQL UPDATE Orders

        SET snum = :salesnum

        WHERE CURRENT OF Wrong_Orders;

     end; {Если SQLCODE = 0}.

  end;

{Пока SQLCODE . . . выполнить}

EXEC SQL CLOSE CURSOR Wrong_Orders;

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

2.

Для данной программы  решение будет  состоять в том, чтобы  просто включить поле onum первичным ключом таблицы Заказов  в курсор Wrong_Orders. В команде UPDATE вы будете затем использовать предикат WHERE onum =:ordernum (считая целую переменную odernum объявленной), вместо WHERE CURRENT Of Wrong_Orders. Результатом будет программа наподобие этой (большинство комментариев из предыдущей программы здесь исключены):

Информация о работе Формирование выводов запросов