Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
54
Добавлен:
16.04.2013
Размер:
137.73 Кб
Скачать

Лабораторная работа №4 по курсу субд oracle Введение

Данная лабораторная работа ориентированна на изучение следующих конструкций и команд языка PL/SQL:

  1. CREATE INDEX – создание индексов по полям (столбцам) таблицы

  • простые индексы (по одному полю (столбцу))

  • составные индексы (по нескольким полям (столбцам))

  1. DROP INDEX – удаление индексов

  2. ALTER TABLE – изменение схемы таблицы

  • переименование таблицы

  • изменение параметров столбцов

  • определение первичного ключа таблицы

  • добавление и удаление ограничений на значение поля (полей)

  • разрешение и запрещение существующих ограничений

  • определение внешних ключей таблицы

  1. SELECT – выборка данных

  • выборка данных из нескольких таблиц

  • использование псевдонимов таблиц в запросе

  • связь таблиц по значениям полей (соединение таблиц)

Задание

Используя схему таблицы и данные приведенные в примере (см. файл lab4_schema.sql), выполнить следующее:

  1. Определить первичные ключи для всех таблиц по полям оканчивающимся на _id (у таблицы purchase определить составной ключ)

  2. Определить индексы (в соответствующих таблицах):

  • обеспечивающий уникальность комбинации first_name и last_name

  • обеспечивающий уникальность поля product_name

  • по полю quantity

  1. Разработать команды UPDATE, подтверждающие наличие ограничений первичных ключей и индексов

  2. Запретить NULL значения для полей purchase_date и quantity в таблице purchase

  3. Разрешить NULL значения для поля hire_date в таблице salesperson

  4. Определить внешние ключи для таблицы purchase (ссылки на соответствующие поля в salesperson и product)

  5. Используя SELECT для выборки данных из нескольких таблиц получить следующие данные:

  • Все данные о покупках продукта ‘Sok’

  • Все данные о покупках в которых участвовал Ivan Ivanov

  • Все данные о покупках продуктов, чья цена выше средней цены продуктов

  • Все продукты, проданные продавцом Ivanov в июне 2004 года

  • Все продукты, проданные продавцами Pertov и Fedorov c ценой продукта более 50

Пример

SQL> -- СОЗДАНИЕ И ЗАПОЛНЕНИЕ ТАБЛИЦЫ salesperson

SQL> --

SQL> DROP TABLE salesperson;

Table dropped.

SQL> CREATE TABLE salesperson (

2 salesperson_id INT,

3 first_name VARCHAR2(15) NOT NULL,

4 last_name VARCHAR2(20) NOT NULL,

5 hire_date DATE NOT NULL );

Table created.

SQL>

SQL> INSERT INTO salesperson VALUES (10, 'Ivan', 'Ivanov', '2003-02-01');

1 row created.

SQL> INSERT INTO salesperson VALUES (11, 'Peter', 'Petrov', '2003-10-21');

1 Row created.

SQL> INSERT INTO salesperson VALUES (12, 'Fedor', 'Fedorov', '2003-06-17');

1 Row created.

SQL> INSERT INTO salesperson VALUES (13, 'John', 'Johnson', '2004-09-01');

1 Row created.

SQL>

SQL> --

SQL> -- СОЗДАНИЕ И ЗАПОЛНЕНИЕ ТАБЛИЦЫ product

SQL> --

SQL> DROP TABLE product;

Table dropped.

SQL> CREATE TABLE product (

2 product_id INT,

3 product_name VARCHAR2(25) NOT NULL,

4 product_price NUMBER(4,2) NOT NULL,

5 quantity_on_hand NUMBER(5,0) NOT NULL,

6 last_stock_date DATE );

Table created.

SQL>

SQL> INSERT INTO product VALUES (5, 'Moloko', 30.00, 10, '2004-09-15');

1 row created.

SQL> INSERT INTO product VALUES (6, 'Kefir', 41.00, 5, '2004-08-15');

1 row created.

SQL> INSERT INTO product VALUES (7, 'Tvorog', 31.50, 2, '2004-08-01');

1 row created.

SQL> INSERT INTO product VALUES (8, 'Sok', 52.10, 18, TO_DATE('15.10.2004','DD.MM.YYYY'));

1 row created.

SQL> INSERT INTO product VALUES (9, 'Slivki', 32.20, 4, '2004-09-15');

1 row created.

SQL>

SQL> --

SQL> -- СОЗДАНИЕ И ЗАПОЛНЕНИЕ ТАБЛИЦЫ purchase

SQL> --

SQL> DROP TABLE purchase;

Table dropped.

SQL> CREATE TABLE purchase (

2 salesperson_id INT,

3 product_id INT,

4 purchase_date DATE,

5 quantity NUMBER(4,2) );

Table created.

SQL>

SQL> INSERT INTO purchase VALUES (1, 5, '2004-06-15', 9);

1 row created.

SQL> INSERT INTO purchase VALUES (10, 1, '2004-06-15', 9);

1 row created.

SQL> INSERT INTO purchase VALUES (10, 5, '2004-06-15', 1);

1 row created.

SQL> INSERT INTO purchase VALUES (10, 6, '2004-06-16', 2);

1 row created.

SQL> INSERT INTO purchase VALUES (11, 8, '2004-07-14', 3);

1 row created.

SQL> INSERT INTO purchase VALUES (12, 7, '2004-04-07', 5);

1 row created.

SQL> INSERT INTO purchase VALUES (10, 8, '2004-09-25', 1);

1 row created.

SQL> INSERT INTO purchase VALUES (13, 5, '2004-07-08', 7);

1 row created.

SQL> INSERT INTO purchase VALUES (13, 6, '2004-07-08', 1);

1 row created.

SQL> --

SQL> -- ИНДЕКСЫ

SQL> --

SQL>

SQL> -- создать индекс с именем 'salesperson_lastname_idx'

SQL> -- по полю last_name таблицы salesperson

SQL> CREATE INDEX salesperson_lastname_idx

2 ON salesperson (last_name);

Index created.

SQL>

SQL> -- удалить ранее созданный индекс

SQL> DROP INDEX salesperson_lastname_idx;

Index dropped.

SQL>

SQL> -- создать индекс допускающий только уникальные значения

SQL> CREATE UNIQUE INDEX salesperson_lastname_idx

2 ON salesperson (last_name);

Index created.

SQL>

SQL> DROP INDEX salesperson_lastname_idx;

Index dropped.

SQL>

SQL> -- создать индекс который ссылается на значения

SQL> -- в порядке возрастания

SQL> CREATE UNIQUE INDEX salesperson_lastname_idx

2 ON salesperson (last_name ASC);

Index created.

SQL>

SQL> DROP INDEX salesperson_lastname_idx;

Index dropped.

SQL>

SQL> -- создать индекс который ссылается на значения

SQL> -- в порядке убывания

SQL> CREATE UNIQUE INDEX salesperson_lastname_idx

2 ON salesperson (last_name DESC);

Index created.

SQL>

SQL> DROP INDEX salesperson_lastname_idx;

Index dropped.

SQL>

SQL> -- создать составной индекс

SQL> CREATE INDEX salesperson_name_idx

2 ON salesperson (first_name, last_name);

Index created.

SQL>

SQL> DROP INDEX salesperson_name_idx;

Index dropped.

SQL>

SQL>

SQL> --

SQL> -- ИЗМЕНЕНИЕ СХЕМЫ ТАБЛИЦЫ

SQL> --

SQL>

SQL> -- переименование таблицы

SQL> ALTER TABLE salesperson RENAME TO salesperson_new;

Table altered.

SQL> SELECT * FROM salesperson;

SELECT * FROM salesperson

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL>

SQL> ALTER TABLE salesperson_new RENAME TO salesperson;

Table altered.

SQL>

SQL> -- разрешим NULL значения для поля first_name

SQL> ALTER TABLE salesperson MODIFY (first_name NULL);

Table altered.

SQL>

SQL> -- запретим NULL значения для поля first_name

SQL> ALTER TABLE salesperson MODIFY (first_name NOT NULL);

Table altered.

SQL>

SQL> -- добавим поле salary в таблицу salesperson,

SQL> -- со значением по умолчанию = 100 и запретом на NULL

SQL> ALTER TABLE salesperson ADD (salary NUMBER(6,2) DEFAULT 100 NOT NULL);

Table altered.

SQL> SELECT * FROM salesperson;

SALESPERSON_ID FIRST_NAME LAST_NAME HIRE_DATE SALARY

-------------- --------------- -------------------- ---------- ----------

10 Ivan Ivanov 2003-02-01 100

11 Peter Petrov 2003-10-21 100

12 Fedor Fedorov 2003-06-17 100

13 John Johnson 2004-09-01 100

SQL>

SQL> -- удалим добавленное поле

SQL> ALTER TABLE salesperson DROP COLUMN salary;

Table altered.

SQL> SELECT * FROM salesperson;

SALESPERSON_ID FIRST_NAME LAST_NAME HIRE_DATE

-------------- --------------- -------------------- ----------

10 Ivan Ivanov 2003-02-01

11 Peter Petrov 2003-10-21

12 Fedor Fedorov 2003-06-17

13 John Johnson 2004-09-01

SQL>

SQL> -- определение первичного ключа таблицы по полю salesperson_id

SQL> ALTER TABLE salesperson ADD PRIMARY KEY (salesperson_id);

Table altered.

SQL>

SQL> -- удалиение определения первичного ключа

SQL> ALTER TABLE salesperson DROP PRIMARY KEY;

Table altered.

SQL>

SQL> --

SQL> -- добавление и удаление ограничений на значение поля (полей)

SQL> --

SQL>

SQL> -- потребуем уникальности поля hire_date

SQL> ALTER TABLE salesperson

2 ADD CONSTRAINT salesperson_unique_hire_date UNIQUE (hire_date);

Table altered.

SQL>

SQL> ALTER TABLE salesperson DROP CONSTRAINT salesperson_unique_hire_date;

Table altered.

SQL>

SQL> -- потребуем чтобы значение поля hire_date было более

SQL> -- определенной величины

SQL> ALTER TABLE salesperson

2 ADD CONSTRAINT salesperson_unique_hire_date CHECK (hire_date > TO_DATE('31/12/2002', 'DD/MM/YYYY'));

Table altered.

SQL>

SQL> -- попробуем вставить ошибочные данные

SQL> INSERT INTO salesperson VALUES(100, 'A', 'Smith', TO_DATE('10/01/1999', 'DD/MM/YYYY'));

INSERT INTO salesperson VALUES(100, 'A', 'Smith', TO_DATE('10/01/1999', 'DD/MM/YYYY'))

*

ERROR at line 1:

ORA-02290: check constraint (SYSTEM.SALESPERSON_UNIQUE_HIRE_DATE) violated

SQL>

SQL> -- запрещение существующих ограничений

SQL> ALTER TABLE salesperson DISABLE CONSTRAINT salesperson_unique_hire_date;

Table altered.

SQL>

SQL> -- попробуем вставить ошибочные данные

SQL> INSERT INTO salesperson VALUES(100, 'A', 'Smith', TO_DATE('10/01/1999', 'DD/MM/YYYY'));

Соседние файлы в папке lab4
  • #
    16.04.2013137.73 Кб54lab4.doc
  • #
    16.04.201330.7 Кб53lab4_sample.lst
  • #
    16.04.20135.19 Кб53lab4_sample.sql
  • #
    16.04.20131.82 Кб54lab4_schema.sql