Вы находитесь на странице: 1из 62

INSTITUTUL DE FORMARE CONTINUĂ

FACULTATEA TEHNOLOGII INFORMAŢIONALE


Catedra Tehnologii Informaţionale

N.Carceva

BAZE DE DATE CORPORATIVE


(SGBD ORACLE)

Conspectul lecţiilor

Chişinău – 2013
1
СОДЕРЖАНИЕ

ВВЕДЕНИЕ……………………………………………………………………… 3
1. Создание, модификация и удаление таблиц……………………………. 6
2. Модификация данных в таблицах………………………………………. 9
3. Выбор данных из одной таблицы……………………………………….12
3.1. Оператор SELECT  ………………………………………………..12
3.2. Использование выражений (expressions) в операторе SELECT...13
4. Сортировка и группировка данных……………………………………...19
5. Выбор данных из нескольких таблиц……………………………………24
6. Создание и использование подзапросов………………………………...28
7. Создание представлений. Модификация данных в представлениях.
Использование представлений…………………………………………..34
8. Создание индексов и последовательностей……………………………..37
9. Разграничение доступа к данным. Пользователи, привилегии и роли..43
10.Команды среды SQL*PLUS……………………………………………...48
Практические задания…………………………………………………………...54
Список литературы………………………………………………………………62

2
ВВЕДЕНИЕ
 

СУБД Oracle - объектно-реляционная система управления базами


данных компании Oracle.
Надежность, безопасность, высокая производительность, удобство в
работе – главные характеристики СУБД Oracle . 
Основное преимущество СУБД Oracle — это идентичность кода для
всех вариантов сервера баз данных. Для всех компьютерных платформ и
архитектур существует единая СУБД Oracle, поставляемая в различных
версиях, которая ведет себя одинаково и предоставляет одинаковую
функциональность вне зависимости от платформы, на которой она
установлена.  Однa из отличительных особенностей сервера Oracle —
возможность хранения и обработки различных типов данных. Современная
СУБД Oracle это мощный программный комплекс, позволяющий создавать
приложения любой степени сложности. C высокой эффективностью работать
с этой информацией одновременно может любое количество пользователей.
С момента своего создания компания Oracle предлагала самые
передовые технологии защиты данных непосредственно в базе данных.
Компания Oracle предлагает обширный портфель решений по безопасности,
необходимых для обеспечения конфиденциальности данных и защиты от
внутрисистемных угроз.

Форма описания синтаксиса операторов SQL и команд среды


SQL*PLUS:
1. Обязательные элементы заключены в фигурные скобки {}.
Необходимо выбрать один из элементов, разделенных
вертикальной чертой.
2. Необязательные элементы заключены в квадратные скобки [].

3
В примерах рассматривается следующая схема данных:

Таблицы содержат данные:


1. о странах – таблица COUNTRY(cn_id – код страны, country – название
страны);
2. о клиентах фирмы – таблица CUSTOMER(c_id – код клиента, c_name –
фамилия клиента, cn_id – код страны, address – название города);
3. о производителях товара – таблица MANUFACT(m_id – код фирмы,
m_name – название фирмы, cn_id – код страны, address – название
города);
4. о товаре - таблица PRODUCT(p_id – код товара, p_desc –
наименование товара, m_id – код фирмы-производителя, cost –
закупочная стоимость, price – продажная цена);
5. о регионах, в которых работают сотрудники – таблица OFFICE(of_id –
код региона, office – название региона);
6. о сотрудниках – таблица SPERSON(sp_id – колд сотрудника, sp_name –
фамилия и имя сотрудника, man_id – код руководителя, of_id – код
региона, comm – процент комиссионных);
7. о продажах – таблица SALE(data – дата продажи, c_id – код клиента,
p_id – код товара, sp_id – код сотрудника, qty – количество проданного
товара).

4
COUNTRY OFFICE
cn_id country of_id office
1 Austria 10 Buenos-Aires
2 Chili 11 Bruxelles
3 Japan 12 Chicago
4 New-Zealand 13 Tokyo
5 Nigeria
6 Peru
7 USA

MANUFACT CUSTOMER
m_id m_name cn_id address c_id c_name cn_id address
210 Odejda “Kivi” 4 Aucland 100 Wotaib 3 Tokyo
253 Mednye izdelia 5 Lagos 101 Maltz 1 Zaltsburg
317 Lampy Lama 6 Lima 105 Djefferson 7 Chicago
110 Gomes 2 Santiago

PRODUCT
p_id p_desc m_id cost price
1035 Sweater 210 375.5 400
2241 Desc lamp 317 225.3 250.5
2249 Desc lamp 317 340.2 385.6
2518 Bronze sculpture 253 500 530.8

SPERSON
sp_id sp_name man_id of_id comm
10 Rodny Djons 27 12 10
14 Masai Matsu 44 13 11
23 Fransua Muar 35 11 9
37 Elena Ermana 12 10 13
39 Goro Atsuma 44 13 10
27 Terii Cardon 12 15
44 Albert Aidj 27 13 12
35 Bridjit Bovari 27 11 11
12 Baster Sances 27 10 10

SALE
data c_id p_id sp_id qty
28.02.11 100 2241 10 20
12.02.11 101 2518 23 30
15.02.11 101 1035 23 15
19.02.11 100 2518 39 20
02.02.11 101 1035 23 20
05.02.11 105 2241 10 10
22.02.11 110 2518 37 15
14.02.11 105 2249 10 5
01.02.11 101 2249 23 8
04.02.11 101 2241 23 25

5
1. Создание, модификация и удаление таблиц

Таблицы являются базовой структурой реляционной модели данных.


Именно в них хранятся данные. В СУБД Oracle таблицы являются объектами
СУБД и хранятся на сервере.
Таблицы состоят из нескольких столбцов (атрибутов). Полное имя
таблицы состоит из имени схемы и имени таблицы, разделенные точкой.
Если имя схемы не указано, то таблица создается в текущей схеме
данных.
Создание таблицы состоит из трех этапов:
1. таблице присваивается уникальное в рамках схемы данных имя;
2. определяется количество столбцов в таблице, их имена, типы
данных и ограничение на ввод пустых значений;
3. определяются ограничения на таблицу: ограничения первичного и
внешнего ключей, ограничение на уникальность значений в
указанном столбце, ограничение на допустимые значения в таблице.

Формат оператора SQL для создания таблицы:

CREATE TABLE [имя_схемы.]имя_таблицы(имя_поля1 тип данных [not


null], …, имя_поляn тип данных [not null] [,constraint ограничение1[,…,
constraint ограничениеn]]);

Имена полей не могут содержать пробелы и должны начинаться с


буквы.
Типы данных:
1. Числовой тип данных - number(n[,m]), где n – количество позиций,
выделенных под число, включая десятичную точку, m – количество
десятичных цифр. Например, number(3) – позволяет описать целое

6
число с максимальным значением 999; number(7,2) – позволяет
описать вещественное число с максимальным значением 9999.99.
2. Символьные данные постоянной длины – char(n), где n –
максимальная длина поля. Данные этого типа занимают всю длину
поля, недостающие символы заменяются пробелами; символьные
данные переменной длины varchar2(n), где n – максимальная длина
поля. Данные этого типа занимают такое количество байт, сколько
было введено символов.
3. Данные типа дата/время – date. Данные этого типа включают в себя
дату и время.
Ограничение not null означает, что указанный столбец не может
содержать пустых значений.
Существует 4 вида ограничений на таблицу:
1. ограничение первичного ключа – объявляет столбец(столбцы)
первичного ключа:
constraint имя_ограничения primary key(имя_поля1 [,
…,имя_поляn])
Имя ограничения не может содержать пробелы, первым символом
должна быть буква. Имя ограничения должно быть уникальным в рамках
схемы данных. Ограничение первичного ключа можно задать при описании
столбца, например, c_id number(4) not null primary key.
2. ограничение внешнего ключа – объявляет столбец(столбцы)
внешнего ключа. Служит для связи между главной и подчиненной
таблицами:
constraint имя_ограничения foreign key(имя_поля1 [,
…,имя_поляn])
references имя_главной таблицы(имя_поля1 [,…,имя_поляn]).
Ограничение внешнего ключа можно задать при описании столбца,
например, m_id number(4) not null references manufact(m_id).

7
3. Ограничение на уникальность значений – указывает, что значения
данного поля будут уникальными.
constraint имя_ограничения unique(имя_поля1 [,…,имя_поляn])
Данное ограничение нельзя использовать для первичного ключа, т.к.
ограничение первичного ключа уже включает в себя уникальность значений.
4. Ограничение на допустимые значения в таблице – задает условие
для ввода значений:
constraint имя_ограничения check(условие).
Примеры создания таблиц:
1. create table country(cn_id number(4) not null,
country varchar2(20) not null,
constraint pk_c primary key(cn_id));
или
create table country(cn_id number(4) not null primary key,
country varchar2(20) not null);
2. create table manufact (m_id number(4) not null,
m_name varchar2(30) not null,
cn_id number(4) not null,
address varchar2(40),
constraint pk_m primary key(m_id),
constraint fk_m foreign key(cn_id) references country(cn_id),
constraint u_m unique(m_name),
constraint ch_m check(m_id>0));
или
3. create table manufact (m_id number(4) not null primary key,
m_name varchar2(30) not null,
cn_id number(4) not null references country(cn_id),
address varchar2(40),
constraint u_m unique(m_name),
constraint ch_m check(m_id>0));

8
Для изменения(модификации) структуры таблицы используется
следующий оператор:

ALTER TABLE [имя_схемы.]имя_таблицы {


modify имя_поля новый_тип_данных [{not null|null}] |
add{имя_поля тип_данных [not null] | constraint ограничение} |
drop {имя_поля | имя_ограничения}};
где параметр modify позволяет изменить тип данных и ограничение на
пустые значения, add – добавить новое поле или новое ограничение в
таблицу и drop – удалить поле или ограничение из таблицы.
Примеры:
1. alter table country modify country char(10);
2. alter table product modify cost number(10,2) not null;
3. alter table customer add coment varchar2(50);
4. alter table manufact drop constraint u_m;
Для удаления таблицы используется оператор:

DROP TABLE [имя_схемы.]имя_таблицы [CASCADE];

Наличие параметра cascade удаляет указанную таблицу и все ее


подчиненные.
Например, drop table manufact;

2. Модификация данных в таблицах

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


формате:

INSERT INTO [имя_схемы.]имя_таблицы[(список_полей)]


VALUES (список_значений);

9
Правила создания оператора:
1. элементы списка отделяются друг от друга запятыми;
2. количество значений, их тип данных и порядок следования
должны совпадать с количеством, типом данных и порядком
следования полей;
3. если список полей не указан, то рассматриваются все поля
таблицы, а порядок следования полей соответствует структуре
таблицы, т.е. как они были указаны при создании таблицы;
4. если необходимо ввести пустое значение, то в списке значений
указывается ключевое слово null или открывающаяся и
закрывающаяся одинарные кавычки;
5. при вводе значений символьного и дата/время типа, они
заключаются в одинарные кавычки.
Примеры:
1. insert into country(cn_id, country) values(1, 'Austria');
2. insert into country(country, cn_id) values('Chili', 2);
3. insert into country values(3, 'Japan');
4. insert into sperson values(27, 'Terri Cardon', '', 12, 15);
5. insert into sperson values(27, 'Terri Cardon', null, 12, 15);

Для обновления данных (изменения существующих значений)


используется оператор update в следующем виде:

UPDATE [имя_схемы.имя_таблицы] SET имя_поля1=значение1


[,…имя_поляn=значениеn]
[WHERE условие];
Оператор update позволяет изменить значение в одном, нескольких
или всех столбцах указанной таблицы; в одной, в нескольких или во всех
строках. Фраза set указывает столбцы, в которых происходят изменения, а
фраза where определяет строки, в которых обновляются значения. Если

10
строка удовлетворяет условию, указанному во фразе where, в ней происходят
изменения, если нет, то изменения не происходят. При задании в условии
символьных значений имеет место отличия между заглавными и строчными
символами (регистр имеет значение). Если оператор update записан без
фразы where, то значения обновляются во всей таблице. Поэтому данный
оператор редко используется без фразы where.
Примеры:
1. update sperson set of_id=11, comm=13 where sp_name='rodny djons'; -
изменений не происходит, т.к. в таблице sperson не существует
строки со значением rodny djons;
2. update sperson set of_id=11, comm=13 where sp_name='Rodny Djons'; -
изменения произойдут в одной строке таблицы sperson в столбцах
of_id и comm вместо старых значений12 и 10 появятся новые
значения 11 и 13 соответственно;
3. update sperson comm=10; - изменения произойдут во всей таблице
sperson, в столбце comm все значения будут заменены на 10;
4. update sperson comm=12 where of_id=12; - во всех строчках, где в
столбце of_id значение равно 12 значение в столбце comm станет
равным 12.

Удаление данных из таблицы осуществляется с помощью оператора


delete:

DELETE FROM [имя_схемы.]имя_таблицы [WHERE условие];

При использовании данного оператора строка удаляется целиком.


Удалению подлежат те строки, которые удовлетворяют заданному условию.
Если фраза where не указана, то удаляются все строки указанной таблицы.
Поэтому данный оператор редко используется без фразы where.

11
Примеры:
11.delete from sale where data ='28.02.12'; - будут удалены данные о
продажах за 28.02.2012;
12.delete from sale; - будут удалены все строки из таблицы sale.

3. Выбор данных из одной таблицы

3.1. Оператор SELECT 


Для выбора данных из одной таблицы используется оператор select.
Оператор SELECT  - это выражение для получения результирующего набора
из таблиц БД. Мы формируем запрос при помощи оператора SELECT, а он,
в свою очередь, выполнив свою работу, возвращает результирующий набор
данных. Возвращаются эти данные в виде таблицы. При формировании
запроса SELECT пользователь описывает ожидаемый набор данных: его вид
(набор столбцов) и его содержимое (критерий попадания записи в набор,
группировка значений, порядок вывода записей и т. п.). Один и тот же набор
данных может быть получен при выполнении различных запросов.
Формат оператора select имеет следующий вид:

SELECT {*|[DISTINCT] список_полей}


FROM имя_таблицы
[WHERE условие]
[GROUP BY список_полей]
[HAVING условие]
[ORDER BY {имя_поля1|порядковый номер [{ASC|DESC}]
[,…,имя_поляn|порядковый номер [{ASC|DESC}]];

Код в скобках является не обязательным в операторе SELECT. Он


необходим для более точного определения запроса.

Основные ключевые слова, относящиеся к запросу SELECT:

12
SELECT – ключевое слово, которое сообщает базе данных о том, что
оператор является запросом. Все запросы начинаются с этого слова, за ним
следует пробел.
список_полей – список столбцов таблицы, которые выбираются
запросом. Столбцы, не указанные в операторе, не будут включены в
результат. Если необходимо вывести данные всех столбцов, можно
использовать сокращенную запись. Звездочка (*) означает полный список
столбцов. Часто бывает необходимым исключить повторяющиеся значения
из результатов запроса. Для этого используется ключевое слово DISTINCT. 
FROM – ключевое слово, которое должно присутствовать в каждом
запросе. После него через пробел указывается имя таблицы, являющейся
источником данных.
WHERE — используется для определения, какие строки должны быть
выбраны или включены в GROUP BY.
GROUP BY — используется для объединения строк с общими
значениями в элементы меньшего набора строк (группировка данных).
HAVING— используется для определения, какие строки после GROUP
BY должны быть выбраны.
ORDER BY— используется для определения, какие столбцы
используются для сортировки результирующего набора данных (сортировка
данных).

3.2. Использование выражений (expressions) в операторе SELECT


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

13
константы, которые могут дополнять или замещать столбцы в предложениях
SELECT.
Выражения SQL используются во фразах SELECT, WHERE и
HAVING и могут включать в себя константы, переменные, операторы и
функции. В качестве переменных используются имена столбцов, константы
символьного типа и типа дата/время заключаются в одинарные кавычки.
Операторы в выражениях SQL:
ЛОГИЧЕСКИЕ ОПЕРАТОРЫ
IS NULL используется для сравнения WHERE SALARY IS NULL; – зарплата не содержит
текущего значения со значением никакого значения.
WHERE SALARY=NULL – зарплата имеет значение,
NULL (пустым значением) содержащее символы N-U-L-L
BETWEEN используется для поиска WHERE SALARY BETWEEN '20000' AND '30000';
значения внутри некоторого
WHERE COST BETWEEN 5.95 AND 14.5;
интервала, определяемого своими
минимальным и максимальным
значениями. При этом максимальное и
минимальное значения включаются в
условия поиска.
IN используется для сравнения WHERE SALARY IN(20000, 30000, 40000);
некоторого значения со списком
SELECT *
заданных значений. Чтобы было FROM PRODUCT
возвращено TRUE, это значение WHERE P_ID IN(2241б 2249);
должно совпадать хотя бы с одним из
списка значений
LIKE применяется для сравнения WHERE SALARY LIKE '2000%' – значения любой
исходного значения с подобными ему длины, которые начинаются с 2000
WHERE SALARY LIKE '%200%' – все значения,
значениями при помощи шаблонов содержат 200 в любой позиции
% соответствует * (любое количество WHERE SALARY LIKE '_00%' - все значения, содержат
любых символов) 00 во 2 и 3 позиции
_ соответствует ? (один любой WHERE SALARY LIKE '2_%_%' - все значения
символ, в том числе и пробел) которые начинаются с 2
WHERE SALARY LIKE '_2%3' - все значения, содержат
2 во 2-й позиции и заканчиваются 3
WHERE SALARY LIKE '2__3' - все значения которые
начинаются с 2 и заканчиваются 3
EXIST используется, чтобы SELECT COST
определить, присутствует ли в FROM PRODUCT
WHERE EXIST(SELECT COST
указанной таблице строка, FROM PRODUCT
отвечающая определенному критерию WHERE COST < 100);
UNIQUE определяет отсутствие в WHERE UNIQUE (SELECT SALARY
таблице дублирующих записей FROM TMPLOEE_TBL
WHERE EMPLOYEE_ID = '3333333')
(проверяет эту таблицу на – проверяет поле SALARY на отсутствие дублирующих
уникальность записей.
ALL - используется для сравнения WHERE SALARY > ALL(SELECT SALARY FROM
исходного значения со всеми другими EMPLOYEE_TBL WHERE CITY='INDIANAPOLIS' –
проверяет, является ли данная зарплата (значение поля
значениями, входящими в некоторый SALARY) больше, чем зарплата любого из служащих,
набор данных проживающих в штате INDIANAPOLIS.

14
ANY используется для сравнения WHERE SALARY > ANY (SELECT SALARY FROM
исходного значения с каждым из EMPLOYEE_TBL WHERE CITY='INDIANAPOLIS') –
проверяет, является ли данная зарплата (значение поля
значений списка, полученного в SALARY) больше, чем зарплата хотя бы одного из
соответствии с некоторым условием служащих, проживающих в штате INDIANAPOLIS.
NOT BETWEEN выполняет действия, WHERE SALARY NOT BETWEEN 20000 AND 30000-
противоположные оператору значение зарплаты не может находиться между 2000 и
3000, включая эти значения.
BETWEEN
NOT IN – является отрицанием WHERE SALARY IN(20000, 30000, 40000) – Чтобы было
оператора IN. выполнено соответствующее действие, зарплата не может
совпадать ни с одним из данных значений.
NOT LIKE – является отрицанием WHERE SALARY NOT LIKE '2000%' – значения любой
оператора LIKE. Возвращаются только длины, которые не начинаются с 2000
WHERE SALARY NOT LIKE '_00%' - все значения, не
те значения, которые не совпадают с содержат 00 во 2 и 3 позиции
соответствующими шаблонами. SELECT P_DESC FROM PRODUCT
WHERE P_DESC NOT LIKE 'L%'; – в результирующий
набор не войдут наименования продукции, начинающиеся
с символа L
NOT EXIST-является отрицанием SELECT MAX(COST)
оператора EXIST FROM PRODUCT
WHERE NOT EXIST (SELECT COST
FROM PRODIUCT
WHERE COST>100);
NOT UNIQUE – является отрицанием WHERE NOT UNIQUE (SELECT SALARY
оператора UNIQUE FROM EMPLOYEE_TBL) –
проверяет поле SALARY на наличие дублирующих
записей.
АРИФМЕТИЧЕСКИЕ ОПЕРАТОРЫ
+ сложение SELECT SALARY + BONUS
- вычитание FROM EMPLOYEE_PAY_TABL;
*- умножение SELECT SALARY *10+1000
/- деление FROM EMPLOEE_PAY_TBL
WHERE SALARY+BONUS> 4000;

SELECT SALARY
FROM EMPLOEE_PAY_TBL
WHERE SALARY-BONUS> 40000;
СТРОКОВЫЕ ОПЕРАТОРЫ
Конкатенация строк представляет SELECTY CITY || ',' || STATE
собой процесс объединения двух FROM EMPLOYEE_TBL – Оператор Oracle объединяет в
единую строку названия города и штата и помещает между
отдельных сток в единую строку: ними запятую.
имя_столбца || [ ' ' || ] имя_столбца

Функции в выражениях SQL:


АГРЕГИРУЮЩИЕ ФУНКЦИИ
COUNT- используется для 1. SELECT COUNT (EMPLOYEE_ID ) FROM
определения количества записей в EMPLOYEE_PAY_ID – подсчитывает общее количество
идентификаторов служащих
таблице или подсчета ненулевых 2. SELECT COUNT ( DISTINCT SALARY ) FROM
значений в столбце и возвращает EMPLOYE_PAY_TBL – подсчитывает только
числовое значение. различающиеся строки для поля SALARY
COUNT (*) | ( [DISTINCT | ALL] 3. SELECT COUNT ( ALL SALARY) FROM
имя_столбца ) EMPLOYEE_PAY_TBL) подсчитывает все строки для
поля SALARY
DISTINCT- в подсчете участвуют
4. SELECT COUNT (*) FROM EMPLOYEE_TBL –
только различающиеся строки. подсчитывает все строки таблицы EMPLOYEE_TBL

15
ALL- подсчет ведется с учетом
дублирующих строк
* - ведется подсчет всех строк в
таблице, включающих дубликаты,
независимо от того, содержатся ли в
столбцах нулевые значения.
SUM возвращает для группы строк 1. SELECT SUM ( SALARY ) FROM
итоговую сумму содержащихся в EMPLOYEE_PAY_TBL – суммирует все зарплаты.
столбце значений. DISTINCT – 2. SELECT SUM (DISITCT SALARY ) FROM
суммируются только различающиеся EMPLOYEE_PAY_TBL суммирует различающиеся
строки (не имеет особого смысла) зарплаты
SUM ( [ DISTINCT ] имя_столбца)
Значение параметра функции
обязательно должно быть числовым.
AVG – находит среднее значение для 1. SELECT AVG (SALARY) FROM
группы строк. Параметром может EMPLOYEE_PAY_TBL - возвращает среднюю зарплату
быть только числовое значение. 2. SELECT AVG (DISTINCT SALARY) FROM
DISTINCT – возвращает среднее EMPLOYEE_PAY_TBL – возвращает среднее значение
только для различающихся сток для различающихся зарплат
AVG ( [ DISINCT] имя_столбца)
MAX возвращает для группы строк 1.SELECT MAX (SALARY) FROM
максимальное значение, EMPLOYEE_PAY_TBL– возвращает наибольшую
содержащееся в некотором столбце. зарплату
2. SELECT MAX(DISTINCT SALARY) FROM
Нулевые значения игнорируются. EMPLOYEE_PAY_TBL– возвращает наибольшую
Применение опции DISINCT не зарплату
оказывает никакого влияния на
результат
MAX ( [DISTINCT ] имя_столбца)
MIN возвращает для группы строк 1.SELECT MIN(SALARY) FROM
минимальное значение, содержащееся EMPLOYEE_PAY_TBL – возвращает наименьшую
в некотором столбце. Нулевые зарплату
2. SELECT MIN(DISTINCT SALARY) FROM
значения игнорируются. Применение EMPLOYEE_PAY_TBL– возвращает наименьшую
опции DISINCT не оказывает зарплату
никакого влияния на результат
MIN ( [DISTINCT ] имя_столбца)
СТРОКОВЫЕ ФУНКЦИИ
TRANSLATE используется для SELECT CITY, TRANSLATE (CITY, 'IND', 'ABC')
посимвольного транслирования исходной FROM EMPLOYEE_TBL
строки в другую Обычно функция CITY TRANSLAE(…)
TRANSLATE имеет три параметра: исходная GREENWOOD GREENWOOC
строка; список символов, подлежащих INDIANAPOLIS ABCAABAPOLAS
преобразованию; список символов. WHITELAND WHATELABC
Ищет в списке символов преобразования
очередной символ исходной строки и
запоминает его местоположение; после
этого она ищет в строке замены символ в
той же самой позиции и заменяет
соответствующие символы исходной
строки новым значением. Синтаксис:
TRANSLATE(набор_символов, значение1,
значение2)

16
REPLACE используется для замены каждого SELECT CITY, REPLACE (CITY, 'I', 'Z')
вхождения исходных символов указанными FROM EMPLOYEE_TBL
символами. Отличается от TRANSLATE тем,
что внутри целевой строки может быть
заменен как один конкретный символ, так и CITY REPLACE(…)
целая подстрока. GREENWOOD GREENWOOD
Синтаксис: INDIANAPOLIS ZNDZANAPOLZS
REPLACE (' значение', 'значение ', WHITELAND WZTELAND
[NUL]'значение')

UPPER используется для преобразования SELECT UPPER (с_name) FROM CUSTOMER; -


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

LOWER используется для преобразования SELECT LOWER (с_name) FROM CUSTOMER; -


прописных букв исходной строки в преобразует все символы столбца с_name в символы
нижнего регистра.
символы нижнего регистра и является
обратной функции UPPER. Синтаксис:
LOWER (символьная строка)

SUBSTR используется для выделения SELECT SUBSTR (c_name, 4,2)


подстроки исходного выражения. FROM CUSTOMER; – возвращает четвертый и
пятый символы поля с_name
Синтаксис:
SUBSTR( имя_столбца, начальная_позиция,
длина)
INSTR – с ее помощью можно найти SELECT INSTR(с_name, 'I',1, 1)
местоположение определенного набора FROM CUSTOMER; - возвращает позицию
первого вхождения буквы I для каждого значения
символов внутри символьной строки. поля с_name
Синтаксис:
INSTR (имя_столбца, ' набор символов',
[начальная позиция [, появление]]);
LTRIM - позволяет устранить указанные SELECT LTRIM(FIRST_NAME,'LES')
символы слева (в начале строки). FROM CUSTOMER_TBL
WHERE FIRST_NAME='LESLIE'; - устраняет LES
Синтаксис: из левой части всех имен LESLIE
LTRIM (символьная_строка [,'набор_символов'])
Если 'набор_символов не указан, то удаляются
пробелы.
RTRIM применяется для устранения SELECT RTRIM (FIRST_NAME,'ON')
символов, расположенных в правой части FROM EMPLOYEE_TBL
WHERE FIRST_NAME='BRANDON') –
строки (в конце строки). устраняет'ON' из правой части имени BRANDON и
Синтаксис: возвращает в качестве результата значение BRAND
RTRIM (символьная_строка [,'набор_символов'])
Если 'набор_символов не указан, то удаляются
пробелы.
DECODE – ищет в столбце некоторое SELECT CITY,
значение и, если поиск оказывается DECODE (CITY, 'INDIANAPOLIS', 'INDY',
'GREENWOOD', 'GREEN', 'OTHER')
успешным, отображает в выходных данных FROM EMPLOYEE_TBL;
замещающее значение. Синтаксис: CITY DECODE
DECODE (имя_столбца, 'значение_для_поиска1, GREENWOOD GREN
'отображаемое_значение1', INDIANAPOLIS INDY
[' 'значение_для_поиска2', WHITELAND OTHER
'отображаемое_значение2',
'значение_по_умолчанию'])
LENGTH используется для определения в SELECT LENGTH(c_name)

17
байтах размеров строк, числовых значений, FROM CUSTOMER; - возвращает длину фамилии
дат, а также различных выражений. каждого клиента.
Синтаксис:
LENGTH (символьная строка)
NVL используется для замены выражения, 1. SELECT NVL(SALARY, 00000)
имеющего нулевое значение, другим FROM EMPLOYEE_PAY_TBL; - каждое нулевое
значение зарплаты представляет в виде 00000
выражением и может быть применена для
большинства типов данных; единственным 2. SELECT PAGER, NVL(PAGER, 9999999999)
требованием является, чтобы исходное и FROM EMOLOYEE_TBL;
замещающее значения были одного и того
же типа. Синтаксис: PAGER NVL(PAGER)
NVL("значение","выражение для замены") 999999999
9999999999
3175709980 3175709980
LPAD – используется для дополнения к SELECT LPAD(P_DESC, 30, '.') product
строке слева символов или пробелов. FROM PRODUCT;
Синтаксис: PRODUCT_______________________
LPAD (имя_поля, набор_символов) …………………WITCHES COSTUME
……… .PLASTIC PUMPKIN 18 INCH
RPAD – используется для дополнения к SELECT RPAD(P_DESC, 30, '.') product
строке справа символов или пробелов. FROM PRODUCT;
Синтаксис:
RPAD (имя_поля, набор_символов) PRODUCT_______________________
WITCHES COSTUME………………….
PLASTIC PUMPKIN 18 INCH………….
SOUNDEX возвращает выражения, SELECT LAST_NAME
фонетически сходные с исходным FROM EMPLOYEE_TBL
WHERE
значением. Эта функция используется для SOUNDEX(LAST_NAME)=SOUNDEX('STEVENS')
поиска значений, в точном написании
которых вы не совсем уверены; она также LAST_NAME
может применяться с целью обнаружения STEPHENS
несогласованно введенных значений.
Синтаксис:
WHERE SOUNDEX (выражение) =SOUNDEX
(выражение)

ASCIIвозвращает ASCII-код самого левого ASCII('A') – возвращает 65


символа исходной строки. Синтаксис:
ASCII(набор символов)

МАТЕМАТИЧЕСКИЕ ФУНКЦИИ
ABS Вычисление абсолютного значения
ROUND Округление десятичного значения
SQRT Извлечение квадратного корня
SIGN Определение знака числа
POWER Возведение в степень
CELL,FLOOR Округление десятичного значения сверху и снизу
EXP Вычисление экспоненциальных значений
SIN, COS, TAN Вычисление синуса, косинуса, тангенса

Общепринятый синтаксис:
Имя_функции(выражение)
ФУНКЦИИ ПРЕОБРАЗОВАНИЯ
TO_NUMBER(выражение) – SELECT EMP_ID, TO_NUMBER(EMP_ID)
преобразование символьного типа в FROM EMPLOYEE_TBL;
числовой

18
TO_CHAR(выражение) – преобразование SELECT PAY_RATE, TO_CHAR(PAY_RATE)
числового типа в символьный FROM EMPLOYEE_PAY_TBL
WHERE PAY_RATE IS NOT NULL;
TO_DATE(выражение) – преобразование SELECT(SYSDATE, ’dd Month yyyy, hh24:mi’)
символьного типа в дату FROM DUAL;
TO_CHAR(выражение, ‘шаблон’) –
преобразование даты в символьный тип.
В шаблоне можно использовать различные
компоненты даты и времени:
yyyy – год цифрами
yy – последние две цифры года
Year – год прописью
mm – месяц цифрами
Month – месяц прописью
d – день недели цифрами (1 – понедельник)
dd - день
ddd – номер дня с начала года
day – день недели прописью
w – номер недели в текущем месяце
ww – номер недели с начала года
hh – часы в 12-часовом формате времени
hh24 – часы в 24-часовом формате времени
mi - минуты
ss - секунды
a.m. – вывод a.m. или p.m.

Совместное использование различных строковых функций


1. SELECT LAST_NAME || ',' || FIRST_NAME,
SUBSTR (EMP_ID, 1, 3) || '-' ||
SUBSTR (EMP_ID, 4, 2) || '-' ||
SUBSTR (EMP_ID, 6, 4) ID
FROM EMPLOYEE_TBL;
NAME ID
STEPHENS, TINA 311-54-9902
PLEW, LINDA 442-34-6889
GLASS, BRANDON 213-76-4555

2. SELECT SUM (LENGTH(LAST_NAME) + LENGTH (FIRSTNAME)) TOTAL


FROM EMPLOYEE_TBL;
TOTAL
71
LENGTH (LAST_NAME) + LENGTH (FIRSTNAME) – Общая длина имени и фамилии для каждой строки
SUM –определяет общую длину имени и фамилии для всего персонала компании
.

4. Сортировка и группировка данных

При помощи запросов нам удавалась получать те или иные результаты


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

19
должен стать исходным материалом некоего отчета, то вопрос сортировки в
нем данных становится чрезвычайно важным, поскольку человеку,
читающему неотсортированный должным образом отчет очень сложно
быстро найти в нем нужную именно ему часть информации. В качестве
решения этой задачи в SQL, есть ключевое слово ORDER BY указывающее
запросу как, и что сортировать.
Определение: Сортировка данных – это упорядоченный вывод
данных.
Для сортировки выходных данных результирующей таблицы в
операторе SELECT предназначена фраза ORDER BY в следующем виде:

ORDER BY {имя_поля1|порядковый номер [{ASC|DESC}]


[,…,имя_поляn|порядковый номер [{ASC|DESC}],
где ASC– возрастающий (алфавитный) порядок сортировки, DESC-
убывающий (обратный алфавитный) порядок сортировки. По умолчанию
используется порядок ASC.
Существует два вида сортировки данных:
1. Простой – по данным одного столбца;
2. Сложный – по данным нескольких столбцов.
Сложная сортировка данных выполняется слева направо следующим
образом: сначала сортируются данные первого поля в указанном порядке,
затем для одинаковых значений первого поля происходит сортировка
значений второго поля, после для одинаковых сцепленных значений первого
и второго полей происходит сортировка данных по третьему полю и так
далее. Для каждого поля, участвующего в сложной сортировке можно
указывать свой порядок.
Вместо имени поля или вычисляемого выражения во фразе ORDER BY
можно указывать порядковый номер этого столбца.
Примеры:
SELECT * FROM CUSTOMER ORDER BY c_name;

20
SELECT sp_name, office, comm. FROM SPERSON
ORDER BY 1, 2, 3 desc;
SELECT c_name, of_id, address FROM CUSTOMER ORDER BY 2;

Определение: Группировка данных – процесс объединения в


логическом порядке столбцов с повторяющимися значениями.
GROUP BY – используется совместно с оператором SELECT и
предназначен для организации идентичных данных в соответствующие
группы . Порядок его расположения в запросе:
SELECT столбец1, столбец2
FROM таблица1, таблица2
WHERE условия
GROUP BY столбец1, столбец2
ORDER BY столбец1, столбец2;

Правила группировки данных в операторе SELECT:


 Можно ссылаться на любые выбранные в операторе столбцы
SELECT. Если столбец не указан в операторе SELECT, то он не может быть
использован в предложении GROUP BY.
 За исключением столбцов агрегирующих функций все столбцы и
выражения, указанные в предложении SELECT, должны быть представлены
в предложении GROUP BY
 Имя столбца не может быть представлено целым числом, за
исключением случая, когда в запросе используется объединение(UNION) и
при этом имена соответствующих столбцов не совпадают.
 Можно применять агрегирующие функции для вычисления
отдельных значений для групп данных.
Предложение GROUP BY предназначено для группировки идентичных
данных, в то время как предложение ORDER BY служит всего лишь для
расположения данных в определенном порядке.

21
Примеры:
1. SELECT EMP_ID, CITY FROM EMPLOYEE_TBL GROUP BY CITY,
EMP_ID; - возвращенные данные группируются сначала по полю CITY, а
затем по полю EMP_ID
2. SELECT EMP_ID, SUM(SALARY)
FROM EMPLOYEE_PAY_TBL
GROUP BY SALARY, EMP_ID; - возвращает поле EMP_ID и общую сумму
зарплаты для каждой группы, группируя выходные данные в соответствии с
зарплатами и идентификаторами служащих.
3. SELECT SUM(SALARY)
FROM EMPLOYEE_PAY_TBL
GROUP BY SALARY; – возвращает итоговые суммы для различных
значений зарплат служащих (каждое из которых определяет новую группу)
4. SELECT CITY, COUNT(*)
FROM EMPLOYEE_TBL
GROUP BY CITY; - возвращает данные о названиях городов и количестве
записей, относящихся к каждому из них
CITY COUNT(*)
GREENWOOD 1
INDIANAPOLIS 4
WHITELAND 1
5. SELECT CITY, AVG(PAY_RATE), AVG (SALARY)
FROM EMP_PAY_TMP
WHERE CITY IN ('INDIANAPOLIS', 'WHITELAND')
GROUP BY CITY
ORDER BY 2,3; - возвращает сгруппированные данные по почасовой оплате
и среднюю заработную плату только для городов Индианаполис и Уайтлэнд,
упорядоченные по столбцам 2 и3. При сортировке все ненулевые значения
помещаются перед нулевыми.
CITY AVG(PAY_RATE) AVG(SALARY)

22
INDIANAPOLIS 13.5833333 20000
WHITELAND 40000
6. SELECT CITY, MAX(PAY_RATE), MIN (SALARY)
FROM EMP_PAY_TMP
GROUP BY CITY; - в результирующей таблице будут находиться
максимальная почасовая оплата и минимальная зарплата для каждого города.
HAVING используется в операторе SELECT совместно с
предложением GROUP BY и сообщает последнему какие группы данных
должны быть включены в результирующий набор. Играет по отношению к
GROUP BY ту же роль, что и предложение WHERE по отношению к
оператору SELECT. Порядок его расположения в запросе:

SELECT столбец1, столбец2


FROM таблица1, таблица2
WHERE условия
GROUP BY столбец1, столбец2
HAVUNG условия
ORDER BY столбец1, столбец2;

Примеры:

SELECT CITY, AVG(PAY_RATE), AVG(SALARY)


FROM EMP_PAY_TMP
WHERE CITY<> 'GREENWOOD'
GROUP BY CITY
HAVING AVG(SALARY) >20000
ORDER BY 3;
Возвращает среднюю ставку почасовой оплаты и среднюю зарплату для всех
городов за исключением Гринвуда. Выходные данные сгруппированы по
названиям городов (поле CITY), отображаются только те группы (города),

23
для которых средняя зарплата больше 20000. Для каждого названия города
результаты сортируются в соответствии со средней зарплатой.

5. Выбор данных из нескольких таблиц

До сих пор мы рассматривали выборку данных из одной таблицы. На


практике часто приходится писать запрос сразу к нескольким таблицам.
Затрагивая вопросы проектирования баз данных, мы выяснили, что
базы данных - это множество взаимосвязанных сущностей или отношений
(таблиц) в терминологии реляционных СУБД. При проектировании
стремятся создавать таблицы, в каждой из которых содержалась бы
информация об одном и только об одном типе сущностей. Это облегчает
модификацию базы данных и поддержание ее целостности. Но такой подход
тяжело усваивается начинающими проектантами, которые пытаются
привязать проект к будущим приложениям и так организовать таблицы,
чтобы в каждой из них хранилось все необходимое для реализации
возможных запросов. Типичен вопрос: как же получить сведения о том, кто
из клиентов и когда купил указанный товар, если нужные данные
"рассыпаны" по различным таблицам? Не лучше ли иметь одну большую
таблицу, содержащую все неогбходимые сведения?
Даже при отсутствии средств одновременного доступа ко многим
таблицам нежелателен проект, в котором информация о многих типах
сущностей перемешана в одной таблице. SQL же обладает великолепным
механизмом для одновременной или последовательной обработки данных из
нескольких взаимосвязанных таблиц. В нем реализованы возможности
"соединять" или "объединять" несколько таблиц
Одна из наиболее важных черт запросов SQL состоит в их способности
определять связи между множеством таблиц и отображать содержащуюся в
них информацию в терминах этих связей в рамках единственной команды.
Операция такого рода называется соединением (соединение таблиц).

24
Фактически, наличие операции соединения является едва ли не самым
главным, что отличает реляционные системы от систем других типов.
При операции соединения таблицы перечисляются в предложении запроса
FROM; имена таблиц разделяются запятыми. Предикат запроса может
ссылаться на любой столбец любой из соединяемых таблиц и, следовательно,
может использоваться для установления связей между ними. Обычно
предикат сравнивает значения в столбцах различных таблиц для того, чтобы
определить, удовлетворяется ли условие WHERE.
Существует 3 вида соединений таблиц:
1. Естественное соединение – используется для соединения связанных
таблиц (родительской и подчиненной);
2. Тета-соединение(самосоединение) – используется для связи
таблицы самой с собой.
3. Внешнее – гарантирующее, что каждая строка из связываемых
таблиц будет представлена в результирующей таблице.
Естественное соединение:
Объединение данных из двух таблиц происходит по общему столбцу,
являющемуся в одной из таблиц первичным ключом, а во второй – внешним
ключом.
Синтаксис:
SELECT таблица1.столбец1, таблица2.столбец2 ,…
FROM таблица1, таблица2 [, таблица3]
WHERE таблица1.имя_столбца1=таблица2.имя_столбца1
[AND таблица1.имя_столбца1=таблица3.имя_столбца1]

Если перед именем столбца помещается имя содержащей его таблицы,


то это называется квалификацией столбца (уточнение столбца именем
таблицы). Вместо имени таблицы в соединении можно использовать
короткий псевдоним (новое имя таблицы). Псевдоним для таблицы
указывается во фразе FROM через пробел после имени таблицы.

25
Для ускорения поиска данных названия таблиц во фразе FROM следует
указывать в алфавитном порядке.

Примеры:
1. Определить, кто из клиентов проживает в Чили.
SELECT c.c_name, cn.country, c.address
FROM COUNTRY cn, CUSTOMER c
WHERE cn.country='Chili'
AND c.cn_id=cn.cn_id
ORDER BY 1;
2. Определить, кто из сотрудников продавал настольные лампы.
SELECT sp.sp_name, p.p_desc, s.data, s.qty
FROM PRODUCT p, SALE s, SPERSON sp
WHERE p.p_desc='Desc Lamp'
AND p.p_id=s.p_id
AND sp.sp_id=s.sp_id;

Тета-соединение (самосоединение):
Используется для соединения таблицы с собой. При этом исходной
таблице с помощью псевдонимов временно присваивается два или более
имен. Соединение происходит на основе равенства значений в разных
столбцах. Соединяемые столбцы должны принадлежат к одинаковому типу
данных.
Синтаксис:
SELECT A.имя_столбца,
В.имя_столбца,
[, С.имя_столбца]
FROM таблица1 А, таблица1 В [,таблица1 С]
WHERE А.имя_столбца=В.имя_столбца
[AND А.имя_столбца = С.имя_столбца ];

26
Примеры:
1. Определить фамилии сотрудников, руководители которых получают
12% комиссионных.
Для решения этой задачи необходимо к строке с данными о сотруднике
прикрепить строку с данными о его руководителе. Таким образом, мы
должны соединить таблицу SPERSON с ней собой. Тогда размер
комиссионных руководителя будет стоять в той же строке, что и имя
сотрудника, и можно будет завершить запрос.
Для соединения таблицы с ней собой нельзя воспользоваться
естественным соединением, поскольку оно будет производиться на
основании равенства значений в общих столбцах копий (sp_id) и мы получим
таблицу SPERSON. Чтобы получить такую объединенную строку,
необходимо создать две копии s1 и s2 таблицы SPERSON и сравнить
значение столбца man_id из первой копии со значением столбца sp_id из
второй копии таблицы. Считаем, что из первой копии будем выбирать
данные о сотруднике, а из второй копии – данные о руководителе. Соединяем
только те строки, для которых man_id=sp_id, т.е. мы присоединяем к каждой
строке о сотруднике строку, содержащую информацию о его руководителе.
SELECT s1.sp_name, s2.sp_name, s2.comm
FROM SPERSON s1, SPERSON s2
WHERE s2.comm=12
AND s1.man_id=s2.sp_id;

Внешнее соединение:

Внешнее соединение расширяет естественное соединение, гарантируя,


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

27
включается в таблицу соединения, а все дополнительные столбцы
заменяются пустыми значениями. Возвращает все строки, содержащиеся в
одной из таблиц, даже если в соединяемой с ней таблице отсутствуют
совпадающие значения.
Внешние соединения обозначаются в запросах символом (+), который
помещается в предложениеWHERE после имени соответствующей таблицы,
в которой могут отсутствовать строки соответствия.
Синтаксис:
FROM таблица1, таблица2 [, таблица3]
WHERE таблица1.имя_столбца[(+)] =
таблица2.имя_столбца[(+)]
[AND таблица1.имя_столбца [(+)]=
таблица3.имя_столбца[(+)] ]
Символ соединения (+) можно использовать только с одной стороны
условия соединения, но при этом его можно использовать более чем для
одного столбца указанной таблицы. Символ соединения указывается справа
от внешнего ключа подчиненной таблицы.
Примеры:
1. Присоединить информацию о продажах к информации и
сотрудниках.
SELECT sp.*, s.*
FROM sale s, sperson sp
WHERE sp.sp_id=s.sp_id(+);

6. Создание и использование подзапросов. Сложные и составные


запросы.

Подзапрос – это запрос, помещенный внутри другого запроса (внутри


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

28
выполняется подзапрос, а затем в соответствии с его результатами
происходит выполнение основного запроса. При этом выходные данные
подзапроса используются при оценке выражений в предложении WHERE
(или HAVING) основного запроса Используются с операторами SELECT,
CREATE TABLE, INSERT, UPDATE и DELETE.
Сложный запрос – это запрос, который включает в себя несколько
подзапросов.
Формат сложного запроса:

SELECT список_полей FROM имя_табл1


WHERE список_полей ОПЕРАТОР (SELECT список_полей FROM имя_табл2
WHERE список_полей ОПЕРАТОР...(SELECT список_полей FROM имя_таблN
WHERE условие))
[GROUP BY список_полей] [HAVING условие]
[ORDER BY список_полей];
В одном сложном операторе SELECT может находиться не более 256
включенных подзапросов. В качестве оператора, связывающего подзапросы
можно использовать: =, in, <, >, <=, >=, !=, all, some(any), exists.
Сложные запросы могут использоваться в двух случаях:
1) для соединения таблиц.
Пример: Вывести названия товаров, которые произведены в
Нигерии.
SELECT P_DESC
FROM PRODUCT
WHERE m_id IN (SELECT m_id FROM MANUFACT
WHERE cn_id =(SELECT cn_id FROM COUNTRY
WHERE country='Nigeria'));

2) в случаях, когда критерий отбора заранее неизвестен.


Пример: вывести фамилии самых высокооплачиваемых
сотрудников фирмы.

29
SELECT sp_name
FROM SPERSON
WHERE comm=(SELECT MAX(comm) FROM SPERSON);
Правила создания сложного запроса:
 Подзапросы должны быть заключены в круглые скобки.
 Предложение SELECT подзапроса, как правило, содержит только
один столбец; исключением является случай, когда в сравнении участвуют
несколько столбцов основного запроса.
 Предложение ORDER BY может быть использовано только в
основном запросе – для выполнения всех действий, связанных с
упорядочением данных в подзапросе, следует применять предложение
GROUP BY.
 Подзапросы, возвращающие более одной строки данных, могут
использоваться только с многозначными операторами, такими как
оператор IN.
 Не допускается использование в основном запросе оператора
BETWEEN; этот оператор может быть использован только внутри
подзапроса.
Пример корректного применения оператора BETWEEN
SELECT имя_столбца
FROM таблица
WHERE имя_столбца оператор
(SELECT имя_столбца
FROM таблица
WHERE имя_столбца BETWEEN значение AND значение);
Пример некорректного применения оператора BETWEEN
SELECT имя_столбца
FROM таблица
WHERE имя_столбца BETWEEN значение AND
(SELECT имя_столбца
FROM таблица);

30
Применение подзапросов с оператором INSERT.
INSERT добавляет в таблицу данные, возвращаемые в результате
выполнения подзапроса. Выбранные в подзапросе данные могут быть
изменены с помощью любых строковых или числовых функций даты и
времени.
Синтаксис:
INSERT INTO имя_таблицы[* | (столбец1[,столбец2])]
SELECT [* | столбец1[,столбец2])
FROM таблица1 [, таблица2]
[WHERE условие];

Применение подзапросов с оператором UPDATE.


Применяя подзапросы с оператором UPDATE можно изменить
содержимое одного или сразу нескольких столбцов таблицы. Можно
использовать подзапросы как во фразе SET, так и во фразе WHERE
оператора UPDATE.
Синтаксис:
UPDATE таблица
SET имя_столбца =
(SELECT имя_столбца
FROM таблица
[WHERE условие]);

Применение подзапросов с оператором CREATE TABLE.


Использование подзапросов с оператором CREATE TABLE позволяет
внести в таблицу существующие в БД данные. Оператор создает новую
таблицу, в которые попадают строки, возвращаемые подзапросом.
Синтаксис:
CREATE TABLE имя_таблицы[(список_полей)] AS
SELECT список_полей

31
FROM имя_таблицы
WHERE условие;

Применение подзапросов с оператором DELETE.


Оператор DELETE с подзапросом удаляет из указанной таблицы
строки, удовлетворяющие условию в подзапросе.
Синтаксис:
DELETE FROM имя_таблицы
WHERE имя_столбца оператор (SELECT имя_столбца
FROM имя_таблицы
WHERE условие);
Примеры:
1. CREATE TABLE MAN_PROD AS
SELECT p.p_desc, m.m_name
FROM MANUFACT m, PRODUCT p
WHERE p.p_desc='Desc Lamp'
AND m.m_id=p.m_id;
2. INSERT INTO MAN_PROD
SELECT p.p_desc, m.m_name
FROM MANUFACT m, PRODUCT p
WHERE m.m_name='Mednye izdelia'
AND m.m_id=p.m_id;
3. UPDATE SPERSON
SET comm=(SELECT comm FROM SPERSON
WHERE sp_name='Rodny Djons')
WHERE of_id =(SELECT of_id FROM OFFICE WHERE office='Tokyo');
4. DELETE * FROM SALE
WHERE sp_id=(SELECT sp_id FROM SPERSON
WHERE sp_name='Rodny Djons');

32
Составные запросы – это запросы, в которых подзапросы связаны
одним из операторов объединения: UNION, UNION ALL, INTERSECT,
MINUS.
Формат составного оператора:
SELECT список_полей FROM имя_табл1
[GROUP BY список_полей]
оператор_объединения
SELECT список_полей FROM имя_табл1
[GROUP BY список_полей]
оператор_объединения
.........
SELECT список_полей FROM имя_табл1
[GROUP BY список_полей]
[ORDER BY список_полей];
Правила создания составных запросов:
1. Количество, порядок и тип данных полей в каждом из подзапросов
должны совпадать.
2. В результирующей таблице имена полей совпадают с именами полей
из первого подзапроса.
3. Фразу ORDER BY можно использовать только в конце всего запроса,
т.к. она относится к результирующей таблице.
4. Для сортировки данных, возвращаемых каждым из подзапросов
вместо ORDER BY используется GROUP BY.
Оператор UNION объединяет в одну результирующую таблицу все
записи, возвращаемые каждым из подзапросов. Причем каждая строка будет
представлена в единственном экземпляре.
Оператор UNION ALL работает аналогично оператору UNION, но не
исключает повторяющиеся записи из результирующей таблицы.
Оператор INTERSECT возвращает из первого запроса только те строки,
для которых есть совпадения во втором запросе.

33
Оператор MINUS возвращает из первого запроса те строки, для
которых во втором запросе отсутствуют совпадения.
Пример: Вывести в одну результирующую таблицу фамилии
сотрудников и клиентов.
SELECT sp_name spisok FROM SPERSON
UNION ALL
SELECT c_name FROM CUSTOMER;

7. Создание представлений. Модификация данных в представлениях.


Использование представлений.

Представление – это объект СУБД ORACLE, который содержит


структуру оператора SELECT.
На сервере хранится только структура запроса, при обращении к
представлению генерируются данные, находящиеся в источниках данных.
Представление может быть построено на основе одной или нескольких
таблиц и/или представлений. При удалении источника данных представление
становится недоступным.
Представления представляют собой виртуальные таблицы и являются
объектами базы данных, информация в которых не хранится постоянно, как в
базовых таблицах, а формируется динамически при обращении к ним.
Представление не может существовать само по себе, а определяется только в
терминах одной или нескольких таблиц. Применение представлений
позволяет разработчику базы данных обеспечить каждому пользователю или
группе пользователей подходящие способы работы с данными, что решает
проблему простоты их использования и безопасности. Содержимое
представлений выбирается из других таблиц с помощью выполнения запроса,
причем при изменении значений в таблицах данные в представлении
автоматически меняются. Представление - это тот же запрос, который

34
выполняется всякий раз при участии в какой-либо команде. Результат
выполнения этого запроса в каждый момент времени становится
содержанием представления. У пользователя создается впечатление, что он
работает с таблицей.
Для создания представления используется следующий оператор:

CREATE VIEW [имя_схемы.]имя_представления [(имена_полей)]


AS SELECT…;
Имена полей после имени представления необходимо указывать, если в
запросе присутствует вычисляемое выражение. В остальных случаях, если
имена полей не указаны, то они будут совпадать с именами полей,
возвращаемыми запросом.
После создания из представления можно выбирать данные с помощью
оператора SELECT:

SELECT список_полей FROM имя_представления


WHERE условие
[WITH CHECK OPTION];
По умолчанию имена столбцов в представлении соответствуют именам
столбцов в исходных таблицах. Явное указание имени столбца требуется для
вычисляемых столбцов или при объединении нескольких таблиц, имеющих
столбцы с одинаковыми именами. Имена столбцов перечисляются через
запятую, в соответствии с порядком их следования в представлении.
Параметр WITH CHECK OPTION предписывает серверу исполнять
проверку изменений, производимых через представление, на соответствие
критериям, определенным в операторе SELECT. Это означает, что не
допускается выполнение изменений, которые приведут к исчезновению
строки из представления. Такое случается, если для представления
установлен горизонтальный фильтр и изменение данных приводит к
несоответствию строки установленным фильтрам. Использование аргумента

35
WITH CHECK OPTION гарантирует, что сделанные изменения будут
отображены в представлении. Если пользователь пытается выполнить
изменения, приводящие к исключению строки из представления, при
заданном аргументе WITH CHECK OPTION сервер выдаст сообщение об
ошибке и все изменения будут отклонены.
Существует два типа представлений:
- модифицируемые, к которым напрямую можно применять операторы
DML(INSERT, UPDATE, DELETE);
- немодифицируемые, для модификации данных в которых необходимо
создать триггеры (специальные программы).
Представление считается модифицируемым, если
1. в нем находятся все поля, объявленные при создании как
обязательные для ввода;
2. при создании представления не использовался параметр DISTINCT;
3. представление не содержит вычисляемых полей.

Пример:
CREATE VIEW SOTR_TOKYO
AS SELECT * FROM SPERSON WHERE office=’Tokyo’;

Данное представление является модифицируемым, для него не надо


создавать триггер для применения операторов DML.

Пример:
CREATE VIEW PROD_FIRMA
AS SELECT p.p_desc, m.m_name, m.country, p.cost
FROM MANUFACT m, PRODUCT p
WHERE m.m_id=p.m_id;

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

36
При модификации данных через представление обновляются данные в
исходных таблицах.

Представления используются в следующих случаях:


1. Конечному пользователю доступ к данным предоставляется только
через представления для того, чтобы он не смог нарушить структуру базы
данных.
2. Возможность использования представлений позволяет скрыть
конфиденциальную информацию.
3. Использование представлений позволяет разграничить доступ к
данным разным категориям пользователей.

Представление удаляется оператором:

DROP VIEW имя_представления;

8. Создание индексов и последовательностей

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


Индекс – это системная структура, построенная по значениям
указанного столбца заданной таблицы.
В индексе размещается перечень уникальных значений указанного
столбца таблицы со ссылками на те строки, где встречаются эти значения
(структура, похожая на предметный указатель книги).
Решение о том, использовать или не использовать какой-либо индекс
при обработке некоторого конкретного запроса принимается не
пользователем, а оптимизатором СУБД, который учитывает множество
факторов – размер таблицы, тип используемых структур хранения данных,
статистическое распределение данных в таблицах и.д. Однако, чтобы
оптимизатор смог использовать индексы, их нужно построить.
Поиск какого-либо значения путем последовательного перебора
неупорядоченных данных будет во много раз медленнее, чем поиск с
37
использованием индекса. Несмотря на то, что индексы увеличивают объем
базы данных, их следует использовать как для отдельных столбцов таблицы,
так и для комбинации нескольких ее столбцов.
Для построения индекса используется следующий оператор:
CREATE [UNIQUE] INDEX имя_индекса ON имя_таблицы
(имя_столбца{[ASC]|DESC}[, имя_столбца {[ASC]|DESC}…);
где UNIQUE указывает, что никаким двум строкам в индексируемой
таблице не позволяется принимать одно и то же значение для
индексируемого столбца (или комбинации столбцов) в одно и то же время.
Индекс может содержать не более 16 столбцов.
Пустые значения не индексируются.
В больших (более 1000 строк) таблицах поиск индексированных
значений выполняется на порядок быстрее, чем поиск неиндексированных.
Однако при удалении или добавлении строк таблицы должны быть
перестроены все индексы, построенные для ее столбцов, а при изменении
значения индексированного столбца – индекс этого столбца. Когда
модифицируется много строк, после модификации каждой строки
перестраиваются все ее индексы. Время модификации может быть на
несколько порядков больше модификации строк с неиндексированными
столбцами. Поэтому перед модификацией множества строк таблицы
целесообразно уничтожить индексы ее столбцов. Индекс можно удалить с
помощью оператора:
DROP INDEX имя_индекса;
Так как индексы могут создаваться или уничтожаться в любое время,
то перед выполнением запросов целесообразно строить индексы лишь для
тех столбцов, которые используются в WHERE и ORDER BY фразах запроса,
а перед модификацией большого числа строк таблиц с индексированными
столбцами эти индексы следует уничтожить.

38
Последовательность – это объект базы данных, из которого
множественные пользователи могут генерировать уникальные целые числа.
Можно использовать последовательность для автоматической генерации
первичных ключей.

Синтаксис оператора:
CREATE SEQUENCE [имя_схемы.]имя_последовательности
[INCREMENT BY целое]
[START WITH целое]
[{[NOMAXVALUE]|MAXVALUE целое}]
[{[NOMINVALUE]|MINVALUE целое}]
[{[NOCYCLE]|CYCLE}]
[{NOCACHE|CACHE целое}]
[{[NOORDER]|ORDER}];

Параметры последовательности:
INCREMENT BY- указывает интервал между значениями (номерами)
последовательности. Это значение может быть любым положительным или
отрицательным целым числом, но не может быть нулевым. Если это значение
отрицательно, то последовательность убывает. Если это значение
положительно, то последовательность возрастает. Если эта фраза опущена,
по умолчанию принимается интервал 1.
MINVALUE – задает минимальное значение последовательности
NOMINVALUE – указывает, что минимальное значение равно 1, если
последовательность возрастает, или -10**26, если последовательность
убывает.
MAXVALUE – задает максимальный номер, который может быть
сгенерирован последовательностью.

39
NOMAXVALUE – указывает, что максимальное значение равно
10**27, если последовательность возрастает, или -1, если последовательность
убывает.
START WITH – указывает первый генерируемый номер
последовательности. Можно использовать эту опцию, чтобы начать
возрастающую последовательность с значения, превышающего ее минимум,
или начать убывающую последовательность с значения, которое меньше ее
максимума. По умолчанию возрастающая последовательность начинается со
своего минимума, а убывающая – со своего максимума.
CYCLE – указывает, что последовательность будет продолжать
генерировать значения после достижения своего максимума или минимума.
Возрастающая последовательность после достижения своего максимума
генерирует свой минимум. Убывающая последовательность после
достижения своего минимума генерирует свой максимум.
NOCYCLE – указывает, что последовательность не может продолжать
генерировать значения после достижения своего максимума или минимума.
CACHE – указывает сколько значений последовательности ORACLE
распределяет заранее и поддерживает в памяти для быстрого доступа.
Минимальное значение этого параметра равно 2. Для циклических
последовательностей это значение должно быть меньше, чем количество
значений в цикле.
NOCACHE – указывает, что значения последовательности не
распределяются в памяти.
Если опущены как параметр CACHE, так и NOCACHE, то ORACLE по
умолчанию кэширует 20 номеров последовательности.
ORDER – гарантирует, что номера последовательности генерируются в
порядке запросов. Можно указывать этот параметр, если номера
последовательности используются в качестве отметок времени (имеет смысл
использовать в параллельном режиме с опцией параллельного сервера).

40
Гарантирование порядка не существенно для тех последовательностей,
которые используются для генерации первичных ключей.
NOORDER – не гарантирует, что номера последовательности
генерируются в порядке запросов.
Когда генерируется значение последовательности, выполняется ее
приращение, независимо от подтверждения или отката транзакций. Если два
пользователя одновременно осуществляют приращение одной и той же
последовательности, то номера, которые видит каждый пользователь, могут
иметь пропуски, потому что номера генерируются и для другого
пользователя. Пользователь никогда не увидит номер последовательности,
сгенерированный для другого пользователя. После того, как значение
последовательности сгенерировано пользователем, этот пользователь может
обращаться к этому значению независимо от того, осуществляет ли
приращение последовательности другой пользователь.
Поскольку номера последовательностей генерируется независимо от
таблиц, одну и ту же последовательность можно использовать для одной или
для многих таблиц. Может оказаться, что отдельные номера
последовательности будут пропущены, потому что эти номера были
сгенерированы и использованы в транзакции, которая в конечном счете была
подвергнута откату.
После того как последовательность создана, можно обращаться к ее
значениям в предложениях SQL через следующие псевдостолбцы:
CURRVAL – возвращает текущее значение последовательности.
NEXTVAL – выполняет приращение последовательности и возвращает
новое значение.
Необходимо квалифицировать (уточнять) псевдостолбцы CURRVAL и
NEXTVAL именем последовательности: имя_последовательности.currval.
Можно использовать значения CURRVAL и NEXTVAL в следующих
местах:
1) в списке SELECT предложения SELECT;

41
2) во фразе VALUES предложения INSERT;
3) во фразе SET предложения UPDATE.
Нельзя использовать значения CURRVAL и NEXTVAL в следующих
местах:
1) в подзапросе;
2) в предложении SELECT с параметром DISTINCT;
3) в предложении SELECT с фразой GROUP BY или ORDER BY;
4) в предложении SELECT, объединенном с другим предложением
SELECT оператором множеств UNION, INTERSECT или MINUS;
5) во фразе WHERE предложения SELECT;
6) в умалчиваемом (DEFAULT) значении столбца в предложении
CREATE TABLE или ALTER TABLE;
7) в условии ограничения CHECK.
Прежде чем обращаться к CURRVAL в данной сессии, необходимо
хотя бы один раз выполнить обращение к NEXTVAL.
В одном предложении SQL приращение последовательности может
быть выполнено только один раз. Если предложение содержит несколько
обращений к NEXTVAL для одной и той же последовательности, то
ORACLE наращивает последовательность один раз, и возвращает одно и то
же значение для всех вхождений NEXTVAL. Если предложение содержит
обращения как к CURRVAL, так и к NEXTVAL, то ORACLE наращивает
последовательность и возвращает одно и то же значение как для CURRVAL,
так и для NEXTVAL, независимо от того, в каком порядке они встречаются в
предложении.
К одной и той же последовательности могут обращаться одновременно
несколько пользователей без какого-либо ожидания или блокировки.
Пример:
CREATE SEQUENCE a_seq; - создана возрастающая
последовательность a_seq с шагом приращения 1;
INSERT INTO CUSTOMER VALUES(a_seq.nextval, 'Ivanov',3, 'Tokyo');

42
INSERT INTO SALE VALUES('28.02.11',a_seq.currval,2241,10,10);
INSERT INTO SALE VALUES('28.02.11',a_seq.currval,2249,23,5);
С помощью значений последовательности были введены данные в
главную и подчиненную таблицы. Номера последовательности были
использованы для автоматической генерации значений первичного ключа и
ввода соответствующих значений внешнего ключа.

9. Разграничение доступа к данным.


Пользователи, привилегии и роли

Системы управления базами данных, в особенности реляционные СУБД,


стали доминирующим инструментом хранения больших массивов информации.
Развитые информационные приложения полагаются не на файловые структуры
операционных систем, а на многопользовательские СУБД, выполненные в
технологии клиент/сервер. В этой связи обеспечение информационной
безопасности СУБД, и в первую очередь их серверных компонентов,
приобретает решающее значение для безопасности организации в целом.
СУБД Oracle предлагает заказчикам самую стойкую систему
обеспечения безопасности из доступных на сегодняшний день в этой
отрасли.
Для создания пользователя или учетной единицы, через которую
можно будет подключаться к базе данных используется оператор:
CREATE USER имя_пользователя
IDENTIFIED {BY пароль|EXTENALLY}
[DEFAULT TABLESPACE имя_табличного_пространства]
[TEMPORARY TABLESPACE имя_табличного_пространства]
[QUOTA {целое{К|М}}|[UNLIMITED]} ON имя_табл_пространства]
[PROFILE имя_профиля];
Ключевые слова и параметры:

43
имя_пользователя – имя создаваемого пользователя. Это имя должно
состоять только из однобайтовых символов и начинаться с буквы;
IDENTIFIED – указывает как ORACLE разрешает доступ этому
пользователю:
BY пароль – пользователь должен указать пароль при подключении.
Этот пароль должен состоять только из однобайтовых символов и начинаться
с буквы;
EXTERNALLY – ORACLE проверяет доступ этого пользователя через
операционную систему. Доступ к такому пользователю может
осуществляться только через единственное учетное имя в операционной
системе. При подключении ORACLE сравнивает имя пользователя с
текущим именем операционной системы, уточненным значением параметра
инициализации операционной системы. Имя пользователя в ORACLE
должно совпадать с учетным именем операционной системы. Предположим,
что в системе UNIX пользователь установлен с учетной записью
пользователя UNIX под названием LANCE.DBA, создает в базе данных
учетную запись OPS$LANCE. После того как LANCE, ему для получения
доступа достаточно передать пустую строку в ответ на запрос базой данных
пароля;
DEFAULT TABLESPACE – идентифицирует умалчиваемое табличное
пространство для объектов, которые будет создавать этот пользователь. Если
эта фраза опущена, то по умолчанию принимается табличное пространство
SYSTEM;
TEMPORARY TABLESPACE – идентифицирует табличное
пространство для временных сегментов пользователя. Временное табличное
пространство функционирует как область памяти для команд SQL, которым
необходимо выполнять сортировку на диске, а не в оперативной памяти.
Примерами операций такого типа являются GROUP BY, ORDER BY, UNION
ALL. После завершения таких операций база данных освобождает сегменты,

44
полученные в этом табличном пространстве. Если эта фраза опущена, то по
умолчанию принимается табличное пространство SYSTEM;
QUOTA – позволяет пользователю распределять память в табличном
пространстве и устанавливает квоту в указанное число байт. Квота задает
максимальную память, которую данный пользователь может распределить в
табличном пространстве. Можно указать К или М, чтобы идентифицировать
квоту в кило- или мегабайтах. Предложение CREATE USER может
содержать несколько фраз QUOTA, каждую для своего табличного
пространства. Все остальные фразы могут появляться только один раз;
UNLIMITED – позволяет этому пользователю распределять память в
табличном пространстве без ограничений;
PROFILE – назначает пользователю профиль с указанным именем.
Профиль лимитирует объемы ресурсов базы данных, которые может
потреблять пользователь. Если эта фраза опущена, то ORACLE назначает
пользователю профиль DEFAULT.
Назначение пользователю привилегий.
Для того, чтобы пользователь мог выполнить любую операцию базы
данных, домен привилегий этого пользователя должен содержать
привилегию, которая авторизует эту операцию. Домен привилегий
пользователя содержит все привилегии, которые были назначены
пользователю, все привилегии из доменов привилегий ролей, которые были
назначены пользователю и включены. При создании пользователя командой
CREATE USER, его домен привилегий пуст.
Существует 2 вида привилегий:
системные привилегии – предназначенные для создания,
модификации, удаления объектов базы данных;
объектные привилегии – позволяют получить доступ к объектам
чужой схемы данных.
Чтобы подключиться к ORACLE, пользователь должен иметь
системную привилегию CREATE SESSION.

45
Для назначения системных привилегий используется следующий
оператор:
GRANT список_привилегий TO имя_пользователя
[WITH ADMIN OPTION];
Наличие параметра WITH ADMIN OPTION дает возможность
передавать привилегии другим пользователям.
Примеры системных привилегий:
create session, create table, alter table, create view, create any table, create
sequence, select any table, update any rows, grant any privilege, insert any table.
Для отзыва привилегий используется оператор:
REVOKE список_привилегий FROM имя_пользователя;
Группа системных привилегий включается в системную роль.
В ORACLE существует 3 системные роли:
CONNECT – позволяет пользователю вводить, обновлять и удалять
строки из таблиц, просматривать таблицы, а также создавать таблицы,
представления, последовательности, кластеры и синонимы.
RESOURCE – дает больший доступ к базе данных. Кроме привилегий,
установленных в роли CONNECT, пользователь получает привилегии на
создание процедур, функций, триггеров и индексов.
DBA – включает все привилегии.
Синтаксис оператора для назначения роли:
GRANT список_ролей TO имя_пользователя
[WITH ADMIN OPTION];
Если необходимо отозвать от пользователя опцию ADMIN OPTION по
некоторой системной привилегии или роли, то следует сначала полностью
отозвать эту системную привилегию или роль, а затем вновь назначить ее, но
уже без опции ADMIN OPTION. Грант с опцией ADMIN OPTION
перекрывает предыдущий идентичный грант без опции ADMIN OPTION.
Если назначить пользователю системную привилегию или роль без опции
ADMIN OPTION, а затем назначить ему эту же привилегию или роль с

46
опцией ADMIN OPTION, то пользователь будет иметь опцию ADMIN
OPTION по этой привилегии или роли.
Синтаксис оператора для отзыва роли:
REVOKE список_ролей FROM имя_пользователя;

Объектные привилегии.
Объектные привилегии авторизуют операции по таблицам чужой
схемы данных:
ALTER – позволяет изменять определение таблицы командой ALTER
TABLE;
DELETE – позволяет удалять строки из таблицы командой DELETE;
EXECUTE – позволяет осуществлять вызов процедуры командой
EXECUTE;
INDEX – позволяет создавать индекс по таблице командой CREATE
TABLE;
INSERT – позволяет вставлять новые строки в таблицу командой
INSERT;
REFERENCES – позволяет создавать ограничения, которые ссылаются
на таблицу. Эту привилегию нельзя назначать роли;
SELECT – позволяет опрашивать таблицу командой SELECT;
UPDATE – позволяет изменять данные в таблице командой UPDATE.
Для назначения объектных привилегий используется оператор:
GRANT{ALL|список_привилегий [(список_столбцов)]}
ON [имя_схемы.]имя_таблицы TO имя_пользователя
[WITH GRANT OPTION];
Опция WITH GRANT OPTION позволяет передавать указанные
привилегии другим пользователям.
Отозвать объектные привилегии можно с помощью оператора:
REVOKE {ALL|список_привилегий [(список_столбцов)]}
ON [имя_схемы.]имя_таблицы FROM имя_пользователя;

47
Примеры:
1. CREATE USER Jack IDENTIFIED BY Jack
DEFAULT TABLESPACE Users
TEMPORARY TABLESPACE Temp; - создан новый пользователь
2. CREATE USER Jill IDENTIFIED BY Jill
DEFAULT TABLESPACE Users
TEMPORARY TABLESPACE Temp; - создан новый пользователь
3. GRANT CONNECT TO Jack; - пользователю Jack назначена
системная роль CONNECT
4. GRANT RESOURCE TO Jill; - пользователю Jill назначена
системная роль RESOURCE
5. GRANT SELECT, UPDATE(qty) ON Sale TO Jill; - пользователю Jill
назначены объектные привилегии на просмотр и обновление
столбца qty для таблицы Sale.

10.Команды среды SQL*PLUS

Команды среды SQL*PLUS дают возможность редактировать


операторы SQL, изменить формат выходных данных и широко используются
для генерации отчетов. Каждая команда должна быть записана в одной
строке. Точку с запятой в конце команды указывать не обязательно.
L[IST] [n], где n – номер строки. – выводит из буфера отката (часть
оперативной памяти) указанную строку оператора. В буфере отката хранится
последний оператор SQL, отправленный на выполнение. Если номер строки
не указан, то будут выведены все строки оператора, хранящегося в буфере.
C[HANGE]/старое_значение/новое_значение – заменяет старое
значение на новое в текущей строке буфера обмена.
APPEND текст – добавляет указанный текст в конец текущей строки
буфера обмена.

48
DELn, где n номер строки – удаляет указанную строку в текущем
операторе буфера обмена. Если номер строки не указан, то удаляется
текущая строка.
/ - запускает на выполнение оператор из буфера обмена.
INPUT – добавляет новые строки после текущей строки оператора.
SAVE имя_файла – сохраняет текущий оператор в виде файла с
расширением .sql.
GET имя_файла – выводит на экран содержимое указанного файла
для просмотра.
EDIT имя_файла – позволяет редактировать указанный файл.
{STA[RT]|@} имя_файла – запускает на выполнение оператор,
находящийся в указанном файле.
RUN имя_файла – выводит на экран содержимое указанного файла и
результат выполнения оператора, находящегося в файле.
DESC[RIBE] имя_таблицы – выводит на экран структуру указанной
таблицы.
SHOW USER – выводит на экран имя пользователя.
SHOW LINESIZE – выводится длина строки (по умолчанию 80
символов).
SHOW PAGESIZE – выводится длина условной страницы (по
умолчанию 14 строк).
SHOW ALL – выводятся основные установки и настройки сеанса
ORACLE.
SHOW ERRORS – указывает ошибку при компиляции подпрограммы.
SPOOL имя_файла – создается текстовый файл с расширением .lst,
который включает в себя содержимое сессии работы. Файл заполняется
содержимым после выполнения команды SPOOL OFF.
SET FEEDBACK OFF – позволяет убрать результирующую строку
запроса, в которой указывается какое количество строк возвращает запрос.
SET FEEDBACK ON – включает строку (используется по умолчанию).

49
SET HEADING OFF – позволяет отключить при выводе
результирующей таблицы заголовки столбцов.
SET HEADING ON – включает заголовки столбцов (используется по
умолчанию).
SET LINESIZE n – увеличивает длину строки до n символов.
SET PAGESIZE n – увеличивает длину условной страницы до n строк.
SET TIME ON – включает текущее время в приглашение SQL.
SET TIME OFF – убирает текущее время из приглашения SQL
(используется по умолчанию).
TTITLE[{center|left|right}] 'текст'[&variable][skip n] – устанавливает
верхний заголовок над результирующей таблицей. Заголовок можно
разместить с левого, правого края или по центру условной страницы (left,
right, center). Параметр skip n определяет сколько строк пропустить после
заголовка.
ВTITLE[{center|left|right}] 'текст'[&variable][skip n] – устанавливает
нижний заголовок под результирующей таблицей. Заголовок можно
разместить с левого, правого края или по центру условной страницы (left,
right, center). Параметр skip n определяет сколько строк пропустить перед
заголовком.
TTITLE OFF, BTITLE OFF – выключить заголовки.
COL[UMN] имя_столбца HEA[DING] "новый__заголовок_столбца" FOR[MAT]{an|99.99} -
форматирует указанный столбец, при этом можно установить новый
заголовок для столбца и установить ширину поля для вывода: для
символьных данных используется формат an, n – ширина поля вывода, 99.99
– формат для вывода числовых данных.
BRE[AK] ON REPORT ON имя_столбца1 […ON имя_столбцаn][SKIP n|PAGE][DUP|NODUP]

– позволяет сгруппировать данные по указанны столбцам или по всему


отчету(ключевое слово REPORT). Параметр SKIP указывает какое
количество строк следует пропустить между группами. Параметр DUP
дублирует название группы. По умолчанию используется параметр NODUP.

50
COMP[UTE] функция OF имя_столбца ON {REPORT|имя_столбца} –
производит вычисление указанной функции для указанного столбца.
Функции, которые можно использовать в команде COMPUTE: AVG,
COUNT, SUM, MIN, MAX.
Примеры:
1. BREAK ON REPORT
COMPUTE AVG OF price ON REPORT
SELECT * FROM product;
2. COL price HEA 'Unit|Price' FOR $099.99
BREAK ON REPORT ON c_name SKIP 1
COMPUTE SUM OF price_q ON c_name
COMPUTE SUM OF price_q ON REPORT
TTITLE 'A List of Order'
SELECT c.c_name, p.p_desc, s.qty, p.price*s.qty price_q
FROM customer c, product p, sale s
WHERE c.c_id=s.c_id AND p.p_id=s.p_id
ORDER BY 1;

CL[EAR] SCR[EEN] – очистка экрана.


CL[EAR] COL[UMN] – очистка форматирования столбцов.
CL[EAR] BRE[AK] – очистка группировки.
CL[EAR] COMP[UTE] – очистка вычислений.

Использование переменных в командах SQL и SQL*PLUS


В командах SQL и SQL*PLUS используются переменные подстановки.
Для обозначения такого вида переменных применяется следующий
синтаксис:
&имя_переменной
Например:
SELECT * FROM &tbl_name

51
/
При выполнении такого оператора ORACLE запросит имя таблицы для
подстановки вместо переменной.
DEFINE tbl_name=sale
SELECT * FROM &tbl_name;
Команда DEFINE используется для подстановки имени таблицы вместо
переменной в SQL скриптах.
ACCEPT позволяет пользователю ввести значение для переменной.
Команду ACCEPT включают в блок INPUT. Перед созданием блока команд
необходимо очистить буфер.
Примеры:
1.
INPUT
ACCEPT newtitle PROMPT 'Enter Title for Report:'
TTITLE CENTER newtitle
SELECT *
FROM PRODUCT
SAVE p_file
START p_file
2.
INPUT
ACCEPT prod_id PROMPT 'Enter p_id:'
SELECT *
FROM PRODUCT
WHERE p_id=&prod_id
SAVE p_id_file
START p_id_file
Команда NEW_VALUE передает значение из указанного столбца в
переменную. Синтаксис команды:
COL[UMN] имя_столбца NEW_VALUE новое_имя

52
Пример:
INPUT
TTITLE LEFT 'Report for Product:' &p_title skip 2
COL p_desc NEW_VALUE p_title
SELECT p_desc, cost, price
FROM PRODUCT
WHERE p_desc='Desc lamp'
SAVE title_file
START title_file

53
Практические задания
Лабораторная работа № 1

1.Создать и связать таблицы АХ, ВХ, СХ; где Х – фамилия

AX BX
Id_num Name_c Birth_d Id_task Task Startdate Enddate
1 Ivanov 1960 10 Tech Survey 02.04.03 01.05.03
2 Petrov 1962 20 User MTGS 15.05.03 30.05.03
3 Sidorov 1958 30 Testing 03.09.03 17.01.03
4 Vasiliev 1970

CX
Id_num Id_task
1 10
2 10
1 20
3 20
2 30
4 30
2. Ввести данные в таблицы.
3. Изменить значение поля Startdate на 05.04.03 для значения поля Task=Tech
Survey.
4. Удалить из таблицы СХ все строчки.
5. Удалить таблицы АХ, ВХ, СХ.

Лабораторная работа № 2

1. Вывести фамилии сотрудников, фамилии которых начинаются на 'B'.


2. Вывести фамилии сотрудников, фамилии которых заканчиваются на 's'.
3. Вывести фамилии сотрудников, которые заканчиваются на 's' и вторая
буква в которых 'a'.
4. Вывести фамилии сотрудников, работающих в 'Chicago' и получающих
10% комиссионных.
5. Вывести фамилии сотрудников, получающих 10%, 9% и 15%
комиссионных.
6. Вывести фамилии сотрудников, получающих любой процент
комиссионных за исключением 10% и работающих в 'Chicago'.
7. Вывести фамилии клиентов, живущих во всех странах, за исключением
'USA', 'Chili', 'Japan'. В результирующую таблицу поместить два столбца:
фамилия клиента, страна.

54
8. Вывести наименования товаров, исключая товары, названия которых
начинаются на букву 'D' и заканчиваются на 'p'.
9. Посчитать количество записей в таблице SPERSON.
10. Посчитать количество значений в столбце manager_id таблицы SPERSON.
11. Посчитать количество НЕПОВТОРЯЮЩИХСЯ значений в столбце
manager_id таблицы SPERSON.
12. Посчитать количество проданного товара.
13. Посчитать количество проданных свитеров (Sweater).
14. Посчитать среднюю закупочную стоимость настольных ламп ('Desc
lamp').
15. Вывести максимальные и минимальные значения закупочной и
продажной стоимостей для настольных ламп ('Desc lamp').

Лаб.раб. № 3

Используя данные таблицы АВ:


A B
3.1415 4
-45 0.707
5 9
-57.667 42
15 55
-7.2 5.3
1. Вычислить: модуль всех значений столбца А, cosA, sinA, tgA, eA
2. Найти наибольшее и наименьшее целое для значений столбцов А и В.
3. Вычислить 2В, -2А.
4. Определить знак для всех значений А и В.
5. Вычислить квадратный корень для значений столбца В.
6. Из таблицы PRODUCT вывести названия товаров (prod_desc), цена
продажи (price) которых кратна 0.6.
7. Объединить в один столбец название фирмы-производителя (man_name) и
адрес фирмы-производителя (табл. MANUFACT):
name_country
Odejda"Kivi" – Aucland
Lampy Lama - Lima
8. Записать названия товаров (prod_desc) прописными и строчными буквами
(табл. PRODUCT).
9. Перед фамилией клиента (cust_name) поставить горизонтальную черту.
Общая длина поля должна составить 15 символов (табл. CUSTOMER).
10. После фамилии клиента (cust_name) поставить горизонтальную черту.
Общая длина поля должна составить 15 символов (табл. CUSTOMER).
11.Удалить в названиях стран(country) в таблице CUSTOMER первые 2
буквы 'US'.
55
12. Удалить в столбце sp_name все сочетания символов 'an' ( табл.SPERSON).
13. Заменить в столбце sp_name все сочетания символов 'an' на '_n'
(табл.SPERSON).
14. Для данных столбца prod_desc таблицы PRODUCT вывести в отдельный
столбец 3 символа, начиная с четвертого.
15. Для данных столбца prod_desc таблицы PRODUCT вывести в отдельный
столбец хвостовые символы, начиная с седьмого.
16. Вывести исходные данные для таблицы cod_ssn
ssn
300541117
301457111
459789998
в следующем виде:
ssn
300-54-1117
301-45-7111
459-78-9998
17. Определить номер позиции первой буквы 'o' в столбце sp_name (табл.
SPERSON) с начала строки.
18. Определить номер позиции второй буквы 'o' в столбце sp_name (табл.
SPERSON), начиная просмотр со второго символа.
19. Определить номер позиции второй буквы 'o' в столбце sp_name (табл.
SPERSON), начиная просмотр с третьего символа.
20. Определить количество символов для каждой строки столбца sp_name
таблицы SPERSON.

Лабораторная работа №4

Задана таблица PROJECT:


TASK STARTDATЕ ENDDATE
Kickoff MTG 01.04.00 01.04.00
Tech Survey 02.04.00 01.05.00
User MTGS 15.05.00 30.05.00
Design Widget 01.06.00 30.06.00
Code Widget 01.07.00 02.09.00
Testing 03.09.00 17.01.01

1.Прибавить к дате ENDDATE 4 месяца, отнять из даты ENDDATE 3 месяца.


2. Определить названия задач, продолжительность которых больше двух
месяцев.
3. Переместить сроки окончания задач, продолжительность которых меньше
месяца, на последний день месяца.
4. Переместить сроки окончания выполнения задач на десять дней вперед.
5. Вычислить продолжительность (в месяцах) каждой задачи проекта.

56
6. Вывести названия задач, которые начинаются до 19 мая 2000г.
7. Перевести начало выполнения каждой задачи на пятницу.
8. Преобразовать тип данных значений столбца prod_id таблицы PRODUCT в
символьный.

Задана таблица TEST:


CHARACTER NUMB
10 100
20 200

9. Вычислить сумму всех значений двух столбцов.


10. Определить имя пользователя.
11. Определить наименьшее значение из списка значений (3, 4,23,6,1,5,7).
12. Определить из списка значений (mama, mouse, skype, hi) слово, начальная
буква которого ближе всех остальных к концу алфавита.
13. Определить из списка значений (mama, mouse, skype, hi) слово, начальная
буква которого ближе всех остальных к началу алфавита.

Лабораторная работа № 5

1. Отсортировать записи в таблице SPERSON в обратном алфавитном


порядке названий офисов.
2. Отсортировать записи в таблице SPERSON следующим образом:
названия офисов установить в прямом алфавитном порядке; для одинаковых
названий офисов фамилии сотрудников вывести в обратном алфавитном
порядке.
3. Посчитать количество сотрудников, работающих в каждом городе.
4. Определить максимальный и минимальный процент комиссионных
сотрудников в каждом городе.
5. Определить максимальный и минимальный процент комиссионных
сотрудников, работающих в Токио, Брюсселе и в Чикаго (Tokyo, Brussel,
Chicago).
6. Определить средний процент комиссионных для всех городов за
исключением Токио (Tokyo). В результирующей таблице отобразить только
те города, для которых средний процент комиссионных >11%.
7. Определить среднюю, минимальную и максимальную закупочную
стоимость Настольных ламп (Desc lamp).
8. Посчитать количество сотрудников, работающих в каждом городе. В
результирующей таблице отобразить только те города, в которых работает
более двух сотрудников.
9.Определить фамилии сотрудников, продававших Настольные лампы (Desc
lamp).

57
10. Определить фамилии менеджеров, сотрудники которых продавали
Настольные лампы (Desc lamp).
11. Определить, кто из клиентов покупал настольные лампы (Desc lamp) 28
февраля 2003г.
12. Определить названия фирм, производящих Бронзовые скульптуры
(Bronze sculpture).
13. Определить кто из клиентов покупал товар производства фирмы Лампы
Лама (Lampy Lama).
14. Определить имена сотрудников, продававших товары, произведенные в
Перу (Peru).
15. Вывести фамилии клиентов, покупавших товар с id = 2241.

Лабораторная работа №6

1. Вывести идентификаторы тех клиентов, у которых есть один или


несколько заказов, используя данные двух таблиц CUSTOMER и SALE.
2. Вывести идентификаторы сотрудников, продававших товар, используя
данные двух таблиц SPERSON и SALE
3. Вывести идентификаторы сотрудников, не продававших товар , используя
данные двух таблиц SPERSON и SALE
4. Поместить в одну результирующую таблицу два столбца: название
таблицы и количество записей для таблиц: SALE, PRODUCT, SPERSON.
Выходные данные отсортировать в возрастающем порядке значений второго
столбца.
5. Создать новую таблицу и включить в нее следующие данные: имя
сотрудника, дата продажи, название товара, количество проданного товара и
процент комиссионных. В таблицу поместить данные только о тех
сотрудниках, которые оформляли заказ в период с 1 февраля 2003г. по 10
февраля 2003г.
6.Добавить в новую таблицу записи о тех сотрудниках, продававших товар,
процент комиссионных которых превышает процент комиссионных
сотрудника с идентификатором 14.
7. Напишите сложный запрос, возвращающий имена всех сотрудников,
продававших товар в количестве < 75 штук.
8. Напишите сложный запрос, который выводит наименования только тех
товаров, стоимость которых меньше средней стоимости всех видов
продукции.
9. Найти всех заказчиков, имеющих такие заказы, для которых количество
заказанной продукции, умноженное на ее цену, превышает стоимость всей
продукции.
10. Напишите сложный запрос (с подзапросами) для определения фамилий
менеджеров, сотрудники которых продавали Свитера (Sweater).
11. Напишите сложный запрос (с подзапросами) для определения
сотрудников, продававших товары, произведенные в Перу (Peru).
58
Лабораторная работа №7

1.Создать представление, содержащее данные о сотрудниках, офисы которых


находятся в Chicago.
2. Создать представление, содержащее имена клиентов и полный адрес
каждого клиента, объединив названия страны и города в один столбец.
3. Создать представление, содержащее данные о товарах(название товара,
название фирмы изготовителя, продажная стоимость), которые были
проданы в количестве от 150 до 250 штук включительно.
4. Создать представление, в котором содержится следующая информация:
название города, в котором находится офис сотрудников и количество
продаж, осуществленных сотрудниками каждого офиса.
5. Создать представление, в котором содержится следующая информация:
название фирмы-изготовителя, количество наименований поставляемых
товаров, общая стоимость всех наименований товаров, поставляемых данной
фирмой.
6. Создать представление, содержащее название фирмы, названия товаров,
поставляемых каждой фирмой, себестоимость товаров. Увеличить
первоначальную себестоимость всех поставляемых товаров на 10%.
7. Создать представление содержащее все данные о сотрудниках.
8. Увеличить всем сотрудникам вознаграждение на 2%, используя созданное
представление.
9. Удалить все созданные представления.

Лабораторная работа №8

1. Создать нового пользователя.


2. Назначить новому пользователю роли connect и resource и привилегии на
просмотр и обновление столбца cust_name таблицы customer.
3. Подключиться к серверу под новым пользователем.
4. Просмотреть все записи таблицы customer.
5. Заменить значение Wotaib на Zotaib в столбце cust_name таблицы customer.
6. Заменить значение USA на значение United States столбца country таблицы
customer.
7. Создать таблицу, содержащую 2 числовых столбца.
8. Ввести одну строку данных в созданную таблицу.
9. Завершить сеанс работы нового пользователя и подключиться к серверу
под пользователем ora.
10. Удалить нового пользователя.

Лабораторная работа №9

59
1.Создать спул-файл.
2. Установить и затем убрать строку результатов запроса.
3. Установить и затем убрать названия столбцов при выводе результатов
запроса.
4. Записать структуру запроса в файл.
5. Вывести структуру запроса на экран из файла.
6. Вывести результаты выполнения запроса из файла.
7. Вывести в приглашении SQL текущее время.
8. Установить длину страницы равную 20 строкам.
9. Создать запрос, выводящий следующие данные из таблицы SPERSON:
имя сотрудника, название офиса, процент комиссионных, имя менеджера.
Записать запрос в файл.
10. Для созданного запроса создайте заголовок "List of Staff" и расположите
его по центру. Создайте нижний заголовок "Product Distribution" и
расположите его слева.
11. Создать запрос, выводящий название товара и продажную цену товара.
Установите вывод цен в следующем виде: $значение цены.
13. Создать запрос, содержащий данные о продажах сотрудниками. В
результирующую таблицу включите следующие поля: имя сотрудника,
название товара, закупочная цена, продажная цена товара, количество
проданного товара, имя клиента. Сгруппируйте данные по каждому клиенту,
причем имя клиента следует указать только один раз.
14. Вычислить среднюю закупочную цену и среднюю продажную цену для
всех товаров.
Средние значение вывести отдельной строкой.
15. Составить отчет, в котором указать фамилии клиентов, стоимость
заказов, общую сумму стоимости заказов для каждого клиента и общую
сумму стоимости всех заказов для всех клиентов.

Лабораторная работа №10

1. Используя переменную подстановки для имени таблицы, вывести все


данные из таблиц SALE и PRODUCT.
2. Используя функцию define для определения переменной подстановки,
вывести все данные из таблицы SALE.
3.Используя команду accept вывести для таблицы SALE верхний заголовок:
"Sales".
4. Используя команду accept вывести данные о продажах для клиента с
cust_id=100.
5. Используя команду accept вывести следующие данные из таблицы
PRODUCT: название товара, себестоимость, продажную стоимость для
товара Sweater.
6. Используя new_value вывести следующую таблицу с данными о клиенте
Gomes
60
Report for customer : Gomes
CUST_NAME COUNTRY
--------------- -----------------------
Gomes Chili
7.Используя таблицу DUAL, посчитать (2+2)*4, 52, 23.
8. Вывести следующую таблицу:
DAY TODAY TOD YEAR TIME
----------- ------------ --- ------------------------------------------------- -----------
Четверг Мар 27, 2003 086 Two Thousand Three 01:38:24 AM
9. Используя функцию decode, создать таблицу:
PRODUCT NEW_DESC
------------------------------------- ------------
Sweater Sweater
Desc lamp D.lamp
Desc lamp D.lamp
Bronze sculpture B.sculpture
10. Используя функцию decode, увеличить комиссионные на 2%
сотрудникам, у которых процент вознаграждения равен 12%, на 3%
сотрудникам, у которых процент вознаграждения равен 13%.

Лабораторная работа № 11

1. Создайте индекс для поля m_name таблицы MANUFACT.


2. Создайте возрастающую последовательность с шагом приращения 10 и
с начальным номером 100. Выведите на экран текущее значение
последовательности.
3. Создайте убывающую последовательность с шагом приращения -5 и с
начальным номером 20000. Выведите на экран текущее значение
последовательности.
4. Определите доступные системные роли.
5. Определите объекты, созданные текущим пользователем.
6. Определите таблицы, созданные всеми пользователями

61
Список литературы
1. Дэн Хотка. Oracle 9i, Москва, С.-П., Киев, 2002.
2. Вильям Дж.Пэйдж (мл.) и др. Использование Oracle 8/8i. М, С.-П.,
Киев: Изд.дом Вильямс, 2000.

62

Оценить