Академический Документы
Профессиональный Документы
Культура Документы
N.Carceva
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
ВВЕДЕНИЕ
3
В примерах рассматривается следующая схема данных:
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. Создание, модификация и удаление таблиц
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
Для изменения(модификации) структуры таблицы используется
следующий оператор:
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);
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.
11
Примеры:
11.delete from sale where data ='28.02.12'; - будут удалены данные о
продажах за 28.02.2012;
12.delete from sale; - будут удалены все строки из таблицы sale.
12
SELECT – ключевое слово, которое сообщает базе данных о том, что
оператор является запросом. Все запросы начинаются с этого слова, за ним
следует пробел.
список_полей – список столбцов таблицы, которые выбираются
запросом. Столбцы, не указанные в операторе, не будут включены в
результат. Если необходимо вывести данные всех столбцов, можно
использовать сокращенную запись. Звездочка (*) означает полный список
столбцов. Часто бывает необходимым исключить повторяющиеся значения
из результатов запроса. Для этого используется ключевое слово DISTINCT.
FROM – ключевое слово, которое должно присутствовать в каждом
запросе. После него через пробел указывается имя таблицы, являющейся
источником данных.
WHERE — используется для определения, какие строки должны быть
выбраны или включены в GROUP BY.
GROUP BY — используется для объединения строк с общими
значениями в элементы меньшего набора строк (группировка данных).
HAVING— используется для определения, какие строки после GROUP
BY должны быть выбраны.
ORDER BY— используется для определения, какие столбцы
используются для сортировки результирующего набора данных (сортировка
данных).
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 объединяет в
единую строку названия города и штата и помещает между
отдельных сток в единую строку: ними запятую.
имя_столбца || [ ' ' || ] имя_столбца
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]'значение')
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
(выражение)
МАТЕМАТИЧЕСКИЕ ФУНКЦИИ
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.
19
должен стать исходным материалом некоего отчета, то вопрос сортировки в
нем данных становится чрезвычайно важным, поскольку человеку,
читающему неотсортированный должным образом отчет очень сложно
быстро найти в нем нужную именно ему часть информации. В качестве
решения этой задачи в SQL, есть ключевое слово ORDER BY указывающее
запросу как, и что сортировать.
Определение: Сортировка данных – это упорядоченный вывод
данных.
Для сортировки выходных данных результирующей таблицы в
операторе SELECT предназначена фраза ORDER BY в следующем виде:
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;
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. Порядок его расположения в запросе:
Примеры:
23
для которых средняя зарплата больше 20000. Для каждого названия города
результаты сортируются в соответствии со средней зарплатой.
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]
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;
Внешнее соединение:
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(+);
28
выполняется подзапрос, а затем в соответствии с его результатами
происходит выполнение основного запроса. При этом выходные данные
подзапроса используются при оценке выражений в предложении WHERE
(или HAVING) основного запроса Используются с операторами SELECT,
CREATE TABLE, INSERT, UPDATE и DELETE.
Сложный запрос – это запрос, который включает в себя несколько
подзапросов.
Формат сложного запроса:
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 условие];
31
FROM имя_таблицы
WHERE условие;
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;
34
выполняется всякий раз при участии в какой-либо команде. Результат
выполнения этого запроса в каждый момент времени становится
содержанием представления. У пользователя создается впечатление, что он
работает с таблицей.
Для создания представления используется следующий оператор:
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’;
Пример:
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
При модификации данных через представление обновляются данные в
исходных таблицах.
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);
С помощью значений последовательности были введены данные в
главную и подчиненную таблицы. Номера последовательности были
использованы для автоматической генерации значений первичного ключа и
ввода соответствующих значений внешнего ключа.
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.
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]
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;
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
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
54
8. Вывести наименования товаров, исключая товары, названия которых
начинаются на букву 'D' и заканчиваются на 'p'.
9. Посчитать количество записей в таблице SPERSON.
10. Посчитать количество значений в столбце manager_id таблицы SPERSON.
11. Посчитать количество НЕПОВТОРЯЮЩИХСЯ значений в столбце
manager_id таблицы SPERSON.
12. Посчитать количество проданного товара.
13. Посчитать количество проданных свитеров (Sweater).
14. Посчитать среднюю закупочную стоимость настольных ламп ('Desc
lamp').
15. Вывести максимальные и минимальные значения закупочной и
продажной стоимостей для настольных ламп ('Desc lamp').
Лаб.раб. № 3
Лабораторная работа №4
56
6. Вывести названия задач, которые начинаются до 19 мая 2000г.
7. Перевести начало выполнения каждой задачи на пятницу.
8. Преобразовать тип данных значений столбца prod_id таблицы PRODUCT в
символьный.
Лабораторная работа № 5
57
10. Определить фамилии менеджеров, сотрудники которых продавали
Настольные лампы (Desc lamp).
11. Определить, кто из клиентов покупал настольные лампы (Desc lamp) 28
февраля 2003г.
12. Определить названия фирм, производящих Бронзовые скульптуры
(Bronze sculpture).
13. Определить кто из клиентов покупал товар производства фирмы Лампы
Лама (Lampy Lama).
14. Определить имена сотрудников, продававших товары, произведенные в
Перу (Peru).
15. Вывести фамилии клиентов, покупавших товар с id = 2241.
Лабораторная работа №6
Лабораторная работа №8
Лабораторная работа №9
59
1.Создать спул-файл.
2. Установить и затем убрать строку результатов запроса.
3. Установить и затем убрать названия столбцов при выводе результатов
запроса.
4. Записать структуру запроса в файл.
5. Вывести структуру запроса на экран из файла.
6. Вывести результаты выполнения запроса из файла.
7. Вывести в приглашении SQL текущее время.
8. Установить длину страницы равную 20 строкам.
9. Создать запрос, выводящий следующие данные из таблицы SPERSON:
имя сотрудника, название офиса, процент комиссионных, имя менеджера.
Записать запрос в файл.
10. Для созданного запроса создайте заголовок "List of Staff" и расположите
его по центру. Создайте нижний заголовок "Product Distribution" и
расположите его слева.
11. Создать запрос, выводящий название товара и продажную цену товара.
Установите вывод цен в следующем виде: $значение цены.
13. Создать запрос, содержащий данные о продажах сотрудниками. В
результирующую таблицу включите следующие поля: имя сотрудника,
название товара, закупочная цена, продажная цена товара, количество
проданного товара, имя клиента. Сгруппируйте данные по каждому клиенту,
причем имя клиента следует указать только один раз.
14. Вычислить среднюю закупочную цену и среднюю продажную цену для
всех товаров.
Средние значение вывести отдельной строкой.
15. Составить отчет, в котором указать фамилии клиентов, стоимость
заказов, общую сумму стоимости заказов для каждого клиента и общую
сумму стоимости всех заказов для всех клиентов.
Лабораторная работа № 11
61
Список литературы
1. Дэн Хотка. Oracle 9i, Москва, С.-П., Киев, 2002.
2. Вильям Дж.Пэйдж (мл.) и др. Использование Oracle 8/8i. М, С.-П.,
Киев: Изд.дом Вильямс, 2000.
62