Технология проектирования и администрирования баз данных и систем данных-Конспект3
.pdf
- 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. Что такое представления (виды) и чем они функционально отличаются от
