Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технология проектирования и администрирования баз данных и систем данных-Конспект3

.pdf
Скачиваний:
33
Добавлен:
20.03.2016
Размер:
1.05 Mб
Скачать

- 31 -

добавлять или модифицировать строки достаточно просто при помощи следующих трех команд:

*команда UPDATE изменяет значения, хранимые в полях

*команда INSERT добавляет строки в таблицу

*команда DELETE удаляет строки из таблицы

1.12.1.Команда UPDATE

Используя имеющийся пример базы данных, для повышения окладов всех клерков на 100 долларов потребуется обновить или изменить значения некоторых данных (поля SAL) в некоторых строках (тех, в которых значение для JOB = CLERK) в таблице EMP. Команда UPDATE состоит из клаузы UPDATE вместе с клаузой SET и опционной (необязательной) клаузой

WHERE:

UPDATE EMP

SET SAL = SAL + 100 WHERE JOB = 'CLERK’;

Клауза UPDATE определяет таблицу, которую нужно модифицировать (EMP). Клауза SET задает поле, которое нужно модифицировать в некоторое другое значение (SAL=SAL+100). В клаузе WHERE задается условие выбора строк для обновления (условие JOB='CLERK'). Вывод на дисплей подтверждает, что обновление действительно имело место:

SELECT ENAME,JOB,SAL

FROM EMP

WHERE JOB ='CLERK';

 

ENAME

 

JOB

 

SAL

 

 

 

 

SMITH

 

CLERK

900.00

 

ADAMS

 

CLERK

1,200.00

 

JAMES

 

CLERK

1,050.00

 

MILLER

 

CLERK

1,400.00

1.12.2.Команда INSERT

Ранее демонстрировалось использование команды INSERT для добавления строк в таблицу, однако это самое примитивное использование инструкции INSERT. Возможно использовать эту команду и для добавления набора строк в таблицу и для копирования строк из одной таблицы в другую. Это делается, используя запрос для определения набора строк, вводимых в

таблицу.

- 32 -

Предположим, что в ранее описанном примере базы данных имеется третья таблицу по имени PROMOTION. Эта таблица содержит многие колонки такие же как в EMP - ENAME, JOB, SAL, СОММ. Задача введения в эту таблицу данных для всех продавцов, имеющих комиссионные больше 25% от оклада путем копирования информации из таблицы ЕМР решается с помощью следующей SQL-инструкции:

INSERT INTO PROMOTION (ENAME,JOB,SAL,COMM) SELECT ENAME,JOB,SAL,COMM --- подзапрос FROM EMP

WHERE COMM > 0.25 * SAL;

2 records created. --- возможное сообщение системы

Команда INSERT в данном примере использует подзапрос вместо списка значений данных. Исполняющая система вводит в таблицу PROMOTION строки и колонки, выбранные из ЕМР в подзапросе.

1.12.3.Команда DELETE

Поскольку в отделе 40 нет работников, удалим его из таблицы DEPT при помощи команды DELETE:

DELETE FROM DEPT

WHERE DEPTNO = 40;

Используем запрос SELECT * , чтобы убедиться, что удаление реально имело место:

SELECT *

FROM DEPT;

 

DEPTNO

 

 

DNAME

 

 

LOC

 

 

 

 

 

 

 

10

 

 

ACCOUNTIG

 

NEW YORK

20

 

 

RESEARCH

 

DALLAS

30

 

 

SALES

 

CHICAGO

Клауза DELETE FROM определяет таблицу, из которой необходимо удалить строку или набор строк (в данном случае таблицу DEPT). Клауза WHERE должна иметь опции (клауза DELETE FROM без нее будет означать, что пользователь желает удалить все строки из таблицы); она задает условия, при соблюдении которых нужно удалять строки. В этом примере использовалась клауза WHERE, чтобы сообщить исполняющей системе

- 33 -

следующее ‘УДАЛИТЬ строки таблицы DEPT, у которых значение в колонке

DEPTNO равно 40’.

Клаузы WHERE во всех командах демонстрируют, как SQL использует одинаковый синтаксис для обработки данных и для запросов. В командах

SELECT, UPDATE, INSERT, DELETE функционирование клаузы WHERE

идентично: она всегда опционна и используется для задания условий, при которых нужно уничтожать, модифицировать или обновлять данные. Долее будет ясно, как SQL использует одинаковый синтаксис запросов для определения данных.

Контрольные вопросы

1.Каков формат SQL-предписаний UPDATE, INSERT и DELETE ?

2.Каким образом команда INSERT используется для переноса (по заданному условию) данных из одной таблицы в другую ?

1.13.Динамические изменения структуры базы данных

Поддерживаются команды SQL, необходимые для динамического изменения структуры базы данных. В данном разделе будут приведены необходимые для этого инструкции SQL:

*

ALTER TABLE

ADD - добавления новой колонки

в

существующую

таблицу

 

*ALTER TABLE MODIFY - изменение размера существующей колонки

Для примера расширим вышеописанную базу данных так, что в дальнейшем сможем назначить работников для проектов так же, как назначали их для отделов. Это изменение структуры базы данных требует нескольких шагов. Сначала при помощи команды CREATE TABLE создадим таблицу проектов:

CREATE TABLE DEPT (PROGNO

NUMBER (3) NOT NULL,

PNAME

CHAR (5),

BUDGET

NUMBER(7,2));

Далее используем команду INSERT для помещения некоторых данных в таблицу PROJ:

INSERT INTO PROJ VALUES (101, 'ALPHA', 96000)

INSERT INTO PROJ VALUES (101, 'BETA', 82000)

INSERT INTO PROJ VALUES (101, ‘GAMMA', 96000)

- 34 -

Проверим корректность создания таблицы PROJ:

SELECT *

FROM PROJ;

PROJNO

PNAME

BUDJET

101

ALPHA

96,000.00

102

BETA

82,000.00

103

GAMMA

15,000.00

И в третьих, добавим колонку номеров проектов в таблицу ЕМР, так что две таблицы разделят общую колонку. Используем команду ALTER TABLE для добавления новой колонки в существующую таблицу :

ALTER TABLE ЕМР ADD (PROJNO NUMBER(3));

В данной команде названа таблица, которую нужно изменить (в данном случае ЕМР), описана функция добавления (ADD), колонка, которую нужно добавить в нее (PROJNO), новый тип данных колонки и максимальная длина новой колонки - NUMBER(3).

Просмотрим таблицу ЕМР и заметим, что добавлено в каждую строку новое поле PROJNO с пустым начальным значением:

SELECT *

FROM ЕМР;

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTN

PROJNO

 

 

 

 

 

 

 

O

 

7369

SMITH

CLERK

7902

17-DEC-80

8,00.00

 

20

7499

ALLEN

SALESMAN

7698

20-FEB-81

1,600.00

300.00

30

7521

WARD

SALESMAN

7698

22-FEB-81

1,250.00

500.00

30

7566

JONES

MANAGER

7839

02-APR-81

2,975.00

 

20

7654

MARTIN

SALESMAN

7698

28-SEP-81

1,250.00

1,400.00

30

7698

BLAKE

MANAGER

7839

01-MAY-81

2,850.00

 

30

7782

CLARK

MANAGER

7839

09-JUN-81

2,450.00

 

10

7788

SCOTT

ANALYST

7566

09-NOV-81

3,000.00

 

20

7839

KING

PRESIDENT

 

17-NOV-81

5,000.00

 

10

7844

TURNER

SALESMAN

7698

08-SEP-81

1,500.00

 

30

7876

ADAMS

CLERK

7788

23-SEP-81

1,100.00

 

20

7900

JAMES

CLERK

7698

03-DEC-81

950.00

 

30

7902

FORD

ANALYST

7566

03-DEC-81

3,000.00

 

20

7934

MILLER

CLERK

7782

23-JAN-82

1,300.00

 

10

После введения новой колонки в таблицу ЕМР применим команду

- 35 -

UPDATE для соотнесения работников с проектами. Соотнесем всех работников отдела 20 и всех продавцов проекту 101:

UPDATE ЕМР SET PROJNO = 101

WHERE DEPTNO = 20

OR JOB = 'SALESMAN';

Выведем на экран полученную таблицу ЕМР для уверенности во введенных изменениях:

SELECT *

FROM ЕМР;

 

EMPNO

 

 

ENAME

 

 

JOB

 

 

MGR

 

 

HIREDATE

 

 

 

SAL

 

 

COMM

 

 

 

DEPTNO

 

 

PROJNO

 

7369

 

 

SMITH

 

CLERK

7902

 

 

17-DEC-80

8,00.00

 

 

 

 

20

 

101

 

7499

 

 

ALLEN

 

SALESMAN

7698

 

 

20-FEB-81

1,600.00

 

300.00

 

30

 

101

 

7521

 

 

WARD

 

SALESMAN

7698

 

 

22-FEB-81

1,250.00

 

500.00

 

30

 

101

 

7566

 

 

JONES

 

MANAGER

7839

 

 

02-APR-81

2,975.00

 

 

 

 

20

 

101

 

7654

 

 

MARTIN

 

SALESMAN

7698

 

 

28-SEP-81

1,250.00

 

1,400.00

 

30

 

101

 

7698

 

 

BLAKE

 

MANAGER

7839

 

 

01-MAY-81

2,850.00

 

 

 

 

30

 

 

 

 

7782

 

 

CLARK

 

MANAGER

7839

 

 

09-JUN-81

2,450.00

 

 

 

 

10

 

 

 

 

7788

 

 

SCOTT

 

ANALYST

7566

 

 

09-NOV-81

3,000.00

 

 

 

 

20

 

 

 

 

7839

 

 

KING

 

PRESIDENT

 

 

 

 

17-NOV-81

5,000.00

 

 

 

 

10

 

 

 

 

7844

 

 

TURNER

 

SALESMAN

7698

 

 

08-SEP-81

1,500.00

 

 

 

 

30

 

101

 

7876

 

 

ADAMS

 

CLERK

7788

 

 

23-SEP-81

1,100.00

 

 

 

 

20

 

101

 

7900

 

 

JAMES

 

CLERK

7698

 

 

03-DEC-81

950.00

 

 

 

 

30

 

 

 

 

7902

 

 

FORD

 

ANALYST

7566

 

 

03-DEC-81

3,000.00

 

 

 

 

20

 

101

 

7934

 

 

MILLER

 

CLERK

7782

 

 

23-JAN-82

1,300.00

 

 

 

 

10

 

 

 

 

Теперь поместим всех, кто не отнесен ни к какому проекту (то есть

WHERE PROJNO IS NULL), в проект 102:

UPDATE EMP SET PROJNO = 102

WHERE PROJNO IS NULL;

Другой запрос в таблицу EMP показывает, что все работники теперь имеют значения в поле PROJNO:

SELECT *

FROM EMP;

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

PROJNO

7369

SMITH

CLERK

7902

17-DEC-80

8,00.00

 

20

101

7499

ALLEN

SALESMAN

7698

20-FEB-81

1,600.00

300.00

30

101

7521

WARD

SALESMAN

7698

22-FEB-81

1,250.00

500.00

30

101

7566

JONES

MANAGER

7839

02-APR-81

2,975.00

 

20

101

7654

MARTIN

SALESMAN

7698

28-SEP-81

1,250.00

1,400.00

30

101

7698

BLAKE

MANAGER

7839

01-MAY-81

2,850.00

 

30

102

- 36 -

7782

CLARK

MANAGER

7839

09-JUN-81

2,450.00

 

10

102

7788

SCOTT

ANALYST

7566

09-NOV-81

3,000.00

 

20

102

7839

KING

PRESIDENT

 

17-NOV-81

5,000.00

 

10

102

7844

TURNER

SALESMAN

7698

08-SEP-81

1,500.00

 

30

101

7876

ADAMS

CLERK

7788

23-SEP-81

1,100.00

 

20

101

7900

JAMES

CLERK

7698

03-DEC-81

950.00

 

30

102

7902

FORD

ANALYST

7566

03-DEC-81

3,000.00

 

20

101

7934

MILLER

CLERK

7782

23-JAN-82

1,300.00

 

10

102

Обновление строк работников с номерами проектов завершает модификацию базы данных и позволяет соотносить работников с проектами так же как с отделами.

Присоединение таблицы EMP к таблице PROJ:

SELECT ENAME,JOB,DEPTNO,PNAME

FROM EMP,PROJ

WHERE EMP.PROJNO = PROJ.PROJNO;

 

ENAME

 

 

JOB

 

 

DEPTNO

 

 

PNAME

 

 

 

 

 

 

 

 

 

SMITH

 

CLERK

20

 

 

ALPHA

ALLEN

 

SALESMAN

30

 

 

ALPHA

WARD

 

SALESMAN

30

 

 

ALPHA

JONES

 

MANAGER

20

 

 

ALPHA

MARTIN

 

SALESMAN

30

 

 

ALPHA

SCOTT

 

ANALYST

20

 

 

ALPHA

TURNER

 

SALESMAN

30

 

 

ALPHA

ADAMS

 

CLERK

20

 

 

ALPHA

FORD

 

ANALYST

20

 

 

ALPHA

BLAKE

 

MANAGER

20

 

 

BETA

CLARK

 

MANAGER

10

 

 

BETA

KING

 

PRESIDENT

10

 

 

BETA

JAMES

 

CLERK

30

 

 

BETA

MILLER

 

CLERK

10

 

 

BETA

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

Сначала была создана новая таблица. Затем в нее добавили новую колонку. После этого поместили данные в эту колонку. И, наконец, слили новую и старую таблицу. Все четыре операции были выполнены с помощью простых команд SQL без вмешательства системы для загрузки и перезагрузки данных или явной реорганизации какой-то части базы данных.

Команда ALTER TABLE

В дополнение к возможности добавлять новые колонки существующие

- 37 -

таблицы, можно изменить размер существующих колонок.

Например, что было введено значение 15000 для бюджета в проекте 103. Предположим, что произошла ошибка и правильное значение в действительности должно быть равно 105000. Необходимо обновить строку проект 103 с правильным значением бюджета:

UPDATE PROJ

SET BUDGET = 105000

WHERE PROJNO = 103;

ERROR: для колонки задано значение больше допустимого

Получено сообщение об ошибке, поскольку сумма нового бюджета, которую попытались ввести, была слишком велика, чтобы поместиться в колонку BUDGET, определенную в команде CREATE TABLE как NUMBER(7,2). Это определение значит, что допускаются числа не больше чем 99,999.99 (7 цифр, из которых две справа от десятичной точки). Проблему можно решить, используя команду ALTER TABLE для увеличения колонки:

ALTER TABLE PROJ

MODIFY BUDGET NUMBER(8,2);

Также как в команде ALTER TABLE ADD, указывается таблица PROG, которую надо изменить. В данном примере необходимо модифицировать определение колонки BUDGET (определить ее размер как NUMBER(8,2) вместо текущей.

Теперь можно попытаться обновить таблицу снова:

UPDATE PROJ

SET BUDGET = 105000

WHERE PROJNO = 103;

Используем запрос SELECT для уверенности, что обновление действительно имело место:

SELECT *

FROM PROJ;

PROJNO

PNAME

BUDJET

101

ALPHA

96,000.00

102

BETA

82,000.00

103

GAMMA

105,000.00

- 38 -

Контрольные вопросы

1.В каких случаях необходимо динамически изменять структуру таблицы ?

2.Каков формат SQL-предписаний, осуществляющих динамическое изменение структуры данных ?

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

4.Насколько, по Вашему мнению, динамическое изменение структуры таблиц с помощью SQL эффективнее традиционного подхода (создание новой

таблицы c заданной структурой имеющейся таблицы добавление ‘старой’ таблицы) ?

1.14.Альтернативные виды данных

копирования в нее необходимых данных

содержимого

уничтожение

Поддерживающие язык SQL системы позволяют создавать и обрабатывать альтернативный вид данных - вид (VIEW, иное русскоязычное название - представление). Виды можно представить виртуальными таблицами; они подобны окнам, через которые можно просматривать данные, хранимые в реальных таблицах. Виды (именуемые также

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

Также любое изменение данных в таблицах сразу же вызывает соответственное изменение связанного с данными таблицами вида; образно говоря, изменения в 'окружающем пространстве' (таблицах) тут же проявляются в ’окне’ (виде).

Виды (представления) используются аналогично любой таблицы - к видам можно обращаться с запросами, обновлять, вставлять или удалять данные или соединять его с другими таблицами или видами. Имена столбцов вида могут не совпадать с именами соответственных столбцов породивших вид таблицах.

Обычно изменения в виде сразу же сказывается на содержании породивших его таблиц (в этом случае говорят, что ‘вид обновляем’), однако существуют случаи, когда вид существует ‘только для чтения’. Вопрос определения критериев ‘обновляемости’ видов до сих пор дискуссируется в теории баз данных (некоторые практические примеры можно найти в [1]).

Виды служат трем основным целям

*упрощают доступ к данным

*обеспечивают независимость данных

*обеспечивают защиту данных

- 39 -

Рассмотрим, как создаются виды и как их можно использовать для упрощения доступа к данным.

Создадим вид таблицы ЕМР, который будет поднабором всей таблицы и будет включать только номера, фамилии и работу работников, занятых в отделе 10:

CREATE VIEW EMPN0 AS

SELECT EMPNO,ENAME,JOB

FROM ЕМР

WHERE DEPTNO = 10;

Поскольку результат запроса - таблица, то запрос используется для определения виртуальной таблицы или вида. В команде CREATE VIEW называется вид, а затем описывается в форме оператора запроса SQL, что вид должен содержать. С некоторыми ограничениями можно запрашивать и модифицировать виды так же, как если бы они были реальными таблицами.

Просмотрим созданный вид:

SELECT *

FROM EMPNO;

EMPNO

ENAME

JOB

7782

CLARK

MANAGER

7839

KING

PRESIDENT

7934

MILLER

CLERK

Для некоторых пользователей проще работать с одной таблицей, чем с несколькими. Поддерживающие SQL системы позволяют создавать единственный вид из двух или более таблиц. Таким образом, возможно определить вид как выборку из нескольких таблиц, вместо которых можно запрашивать индивидуально сделанное соединение (это и есть вид).

Несложно создать единственный вид таблицы по имени PERSONNEL с колонками ENAME, JOB, PNAME из таблиц ЕМР и PROJ и затем проанализировать его содержимое.

Создание соединенного вида:

CREATE VIEW PERSONNEL AS

SELECT ENAME,JOB,PNAME

FROM EMP,PROJ

WHERE EMP.PROJNO = PROJ.PROJNO;

Просмотр созданного вида:

 

 

- 40 -

SELECT *

 

 

FROM PERSONNEL;

 

 

 

 

PROJNO

JOB

PNAME

SMITH

CLERK

ALPHA

ALLEN

SALESMAN

ALPHA

WARD

SALESMAN

ALPHA

JONES

MANAGER

ALPHA

MARTIN

SALESMAN

ALPHA

SCOTT

ANALYST

ALPHA

TURNER

SALESMAN

ALPHA

ADAMS

CLERK

ALPHA

FORD

ANALYST

ALPHA

BLAKE

MANAGER

BETA

CLARK

MANAGER

BETA

KING

PRESIDENT

BETA

JAMES

CLERK

BETA

MILLER

CLERC

BETA

После создания вида пользователь никак не сможет узнать, что данные, которые он просматривает, хранятся в двух таблицах. Более того, можно считать, что данные хранятся в одной таблице (данном виде).

Таким образом можно использовать виды для упрощения доступа к данным, уменьшения длины строк и сокращения количества ошибок.

Используя вид PERSONNEL, перечислим имена менеджеров и проекты, над которыми они работают:

SELECT ENAME,PNAME

FROM PERSONNEL

WHERE JOB = 'MANAGER';

ENAME

PNAME

JONES

ALPHA

BLAKE

BETA

CLARK

BETA

Отметим, насколько прост этот запрос вида PERSONNEL по сравнению с запросом типа JOIN, требуемым для выполнения аналогичных действий - генерации этого списка из двух таблиц ЕМР и PROJ.

Контрольные вопросы

1. Что такое представления (виды) и чем они функционально отличаются от