Базовый синтаксис команды SELECT в ... образом: SELECT [DISTINCT] список_столбцов FROM источник WHERE фильтр ORDER BY

advertisement
Базовый
образом:
синтаксис
команды
SELECT
в
Oracle
выглядит
следующим
SELECT [DISTINCT] список_столбцов FROM источник WHERE фильтр ORDER BY
выражение_сортировки
Пример такого запроса:
SELECT
employee_id,
first_name,
last_name,
hire_date
hr.employees WHERE hire_date < '01.01.2000' ORDER BY last_name
FROM
или
SELECT * FROM hr.employees WHERE hire_date < '01.01.2000' ORDER BY
last_name
Выводимое имя столбца можно поменять при помощи псевдонима
(alias). Для этого достаточно просто написать имя пседвонима сразу
после названия столбца или использовать ключевое слово AS (оба
синтаксиса полностью равнозначны):
SELECT last_name Фамилия FROM hr.employees
SELECT last_name AS Фамилия FROM hr.employees
Особенно
удобно
использовать
псевдонимы
для
столбцов, для которых изначально имя не предусмотрено:
вычисляемых
SELECT last_name AS Фамилия, salary*12 AS "Зарплата за год" FROM
hr.employees
В список столбцов в Oracle можно включать литералы (literals).
Литералы — это любое строковое значение, дата или число, которое
помещается в список столбцов и при этом не является ни названием
столбца, ни псевдонимом. Литералы будут повторяться для каждого
возвращаемого
столбца.
Обычно
они
используются
для
создания
пояснений в возвращаемом наборе результатов:
SELECT last_name AS Фамилия, 'Зарплата за год: ', salary*12 FROM
hr.employees
В этом примере 'Зарплата за год: ' — это литерал, который будет
выводиться для каждой записи.
Строковые литералы и литералы с датой должны заключаться в
одинарные кавычки. Литералы в виде числовых значений в кавычки не
помещаются.
При работе с литералами иногда возникает проблема, связанная с
тем, что литерал сам по себе может содержать зарезервированный
символ, например, одинарные кавычки. Oracle, в отличие, например, от
SQL Server, позволяет пользователю самостоятельно определять символ,
который будет использоваться в качестве кавычек. Выглядеть такое
переопределение может, например, так:
select department_name,
manager_id from departments
q'[It's
assigned
manager
ID:
]',
Попытка применить обычные одинарные кавычки для литерала
приведет к ошибке, поскольку кавычка встречается внутри самого
символьного значения литерала. Поэтому в этом примере в качестве
кавычек выступают квадратные скобки.
Отметим некоторые особенности применения оператора q':

можно использовать как строчную букву q, так и заглавную (Q);
 после q должна идти обычная одинарная кавычка.
Следующая
одинарная кавычка определяет завершение области действия оператора
q;

сразу после одинарной кавычкой должен идти символ, выбранный
пользователем для применения в качестве кавычек. Этот символ может
быть любым, за исключением пробела, перевода строки или табуляции (в
том числе и одинарная кавычка). Если пользователь выбрал символ (,
{, [ или <, то закрываться кавычки должны соответствующим символом
), }, ] и >. В других случаях закрытие кавычек производится при
помощи того же символа, который использовался для их открытия.
По умолчанию запрос возвращает из базы данных все значения,
соответствующие
параметрам
запроса,
даже
если
некоторые
из
возвращаемых значений будут полностью одинаковыми. Например, запрос
SELECT salary FROM hr.employees
вернет 107 строк, несмотря
значений будет повторяться.
на
то,
что
значительная
часть
Чтобы вернуть только уникальные значения (или наборы значений,
если возвращается несколько столбцов), в запросе можно использовать
ключевое слово DISTINCT:
SELECT DISTINCT salary FROM hr.employees
Такой запрос вернет уже 57 значений, при этом все значения будут
уникальными.
Отличительной особенностью Oracle является то, что вместо
DISTINCT можно использовать ключевое слово UNIQUE. SQL Server такого
не позволяет.
Операторы конкатенации (слияния строковых значений) в запросах
Oracle SQL, слияние строковых данных разных типов
В реальной работе очень часто приходится производить слияние
строковых значений. Такая операция называется конкатенацией.
В Oracle SQL предусмотрен несколько необычный (по крайней мере,
с точки зрения специалистов, работавших с SQL Server) оператор
конкатенации — две вертикальные черты (||). Отметим, что в некоторых
версиях сервера Oracle, например, предназначенных для работы на
мэйнфреймах IBM, используется другой оператор конкатенации. Поэтому
на всякий случай в Oracle SQL предусмотрена еще и встроенная функция
CONCAT, которая также производит конкатенацию и работает на любых
платформах.
Пример применения оператора конкатенации может выглядеть так:
SELECT first_name || ' ' || last_name
FROM hr.employees;
В этом примере у нас сливается три значения: имя, пробел (в виде
литерала) и фамилия.
Оператор конкатенации можно применять как для строковых значений
и значений CLOB (больших строковых значений), так и для чисел и дат
(эти значения будут автоматически конвертированы в строковые). При
слиянии строкового значения со значением типа NULL Oracle вернет
строковое значение (в отличие от поведения по умолчанию SQL Server),
однако Oracle предупреждает, что такое поведение в будущих версиях
Oracle не гарантируется. Поэтому в таких ситуациях рекомендуется
использовать функцию NVL, которая преобразует значения типа NULL в
строки нулевой длины.
При
выполнении
конкатенации
рекомендуется
подумать
над
ограничениями типов данных, которые используются для конкатенации.
Oracle использует для результата конкатенации больший тип данных из
тех значений, которые используются для конкатенации. Например, при
слиянии двух значений с типом данных CHAR (максимальный размер —
2000 символов) вернется CHAR, при слиянии CHAR и VARCHAR2
(максимальный размер — 4000 символов) вернется VARCHAR2, а при
слиянии любого типа данных с CLOB вернется CLOB.
Пробелы при конкатенации всегда сохраняются.
Выражение
WHERE
в
запросах
Oracle
SQL
для
фильтрации
возвращаемых значений, условия сравнения (conditions) в Oracle
Если мы обратимся к базовому синтаксису команды SELECT (см.
раздел 2.1), то увидим, что после списка столбцов должно идти
ключевое слово FROM с указанием источника для извлечения информации
(таким источником может быть таблица, представление, подзапрос.
функция и т.п.). Сразу после выражения FROM должно следовать
ключевое слово WHERE с выражением, которое определяет фильтр для
извлечения записей из источника. Возвращаются только те записи, для
которых выражение WHERE возвращает true.
Пример запроса с выражением WHERE может выглядеть так:
SELECT * FROM hr.employees WHERE hire_date < '01.01.2000'
Конечно же, для того, чтобы возвращаемые значения можно было
сравнить с условием, используются специальные операторы сравнения. В
Oracle SQL почему-то термин "операторы сравнения" (comparison
operators) не употребляется. Вместо этого для них предусмотрен
специальный термин "условия" (conditions).
Операторов (условий) сравнения в Oracle SQL предусмотрено
множество, и далеко не все из них имеют аналоги в других системах
управления базами данных, например, в Microsoft SQL Server.
Групповые условия (операторы сравнения) в запросах Oracle SQL,
ключевые слова ALL, ANY, SOME
Для групповых условий сравнения в Oracle SQL используются три
ключевых слова: ALL, SOME и ANY. Все эти ключевые слова применяются
для сравнения указанного значения с набором значений, который
возвращает подзапрос (или явно указанный набор значений):
 ALL — сравнение будет производиться со всеми записями, которые
возвращает подзапрос (или просто со всеми значениями в наборе). True
вернется только в том случае, если все записи, которые возвращает
подзапрос, будут удовлетворять указанному условию. Кроме того, в
Oracle значение True вернется в ситуации, когда подзапрос не вернет
ни одной записи.
В качестве примера приведем такой запрос:
select * from hr.employees where salary <= ALL(SELECT salary
FROM hr.employees WHERE job_id = 'SH_CLERK')
Он вернет записи для всех сотрудников, для которых зарплата
меньше или равна самой маленькой зарплате у сотрудников с должностью
SH_CLERK.

ANY — сравнение вернет True, если условию будет удовлетворять
любая запись из набора (или подзапроса). Например, такой запрос
вернет всех пользователей, зарплата которых совпадает с зарплатой
клерка:
select * from hr.employees where salary = ANY(SELECT salary FROM
hr.employees WHERE job_id = 'SH_CLERK')
 SOME — сравнение вернет True, если условию будут удовлетворять
некоторые записи из набора (или подзапроса).
Такие
же
возможности
предусмотрены
и
в
других
управления базами данных, например, Microsoft SQL Server.
системах
Логические условия в фильтрах WHERE в запросах Oracle SQL, ключевые
слова AND, OR, NOT
Логические условия в Oracle SQL позволяют определить требуемую
комбинацию из нескольких обычных условий. Таких условий в Oracle SQL
предусмотрено три:

AND — логическое И. Чтобы выражение вернуло True, нужно, чтобы
истинными были оба условия:
SELECT * FROM hr.employees WHERE department_id = 50 AND JOB_ID =
'SH_CLERK'

OR — логическое ИЛИ. Чтобы выражение вернуло True, достаточно,
чтобы истинным было только одно условие:
SELECT * FROM hr.employees WHERE department_id = 50 OR JOB_ID =
'SH_CLERK'

NOT — "обращает"
возвращать True,
наоборот:
условие. При добавлении NOT выражение будет
когда без него оно возвращало бы False, и
SELECT * FROM hr.employees WHERE NOT department_id = 50
Пустые значения в запросах Oracle SQL, специальное значение NULL,
выражения IS NULL и IS NOT NULL
Если в какой-то ячейке в таблице базы данных нет значения, то
считается, что в этой ячейке находится специальное значение NULL.
NULL — это не 0 и не пустая строка. NULL считается специальным
значением, для которого существуют специальные приемы работы.
Применить специальные операторы сравнения для значений типа NULL не
получится: NULL никогда не равен другому значению NULL. Поэтому для
работы с ним предусмотрены два специальных условия:

IS NULL — это
равно NULL;

IS NOT NULL — это условие вернет NULL, если проверяемое значение
не равно NULL.
условие
вернет
True,
если
проверяемое
значение
Например, вернуть все записи из таблицы Locations, для которых не
указан почтовый индекс, можно так:
SELECT * FROM hr.locations WHERE postal_code IS NULL;
А вернуть все остальные записи — так:
SELECT * FROM hr.locations WHERE postal_code IS NOT NULL;
Такие же возможности для работы с пустыми значениями предусмотрены в
Microsoft SQL Server.
Операторы LIKE и REGEXP_LIKE в запросах Oracle SQL, символы % и
_, регулярные выражения в запросах
Очень часто в практической работе возникает необходимость
провести поиск по набору символов в любом месте столбца — например,
для поиска всех записей с названиями товаров, содержащими какое-либо
слово, или для поиска какого-либо слова как в единственном, так и во
множественном числе. Для этой цели в Oracle SQL можно использовать
оператор LIKE (его можно использовать и в SQL Server) и оператор
REGEXP_LIKE (этого оператора в SQL Server не предусмотрено).
Сразу скажем, что LIKE и REGEXP_LIKE используются только в
относительно простых ситуациях. Если вам нужно производить поиск с
учетом грамматики, фильтрации шумовых слов и т.п., то следует
подумать о применении полнотекстового поиска.
Оператор LIKE используется для поиска символьных значений по
шаблону со специальными подстановочными символами (метасимволами).
Отметим, что в Oracle предусмотрено четыре разновидности этого
оператора:

"обычный" LIKE — применяется для запроса к строковым столбцам
с традиционными кодировками;

LIKEC — применяется для столбцов с кодировкой
терминологии Oracle — Unicode complete);

LIKE2 — для кодировки UCS2;

LIKE4 — для кодировки UCS4.
Unicode
(в
Пример применения этого оператора может выглядеть так:
select last_name from hr.employees where last_name like 'R%';
В этом примере last_name после ключевого слова where — это столбец,
из которого берутся строковые значения для проверки, а 'R%' — это
условие для проверки. Отличительной особенностью оператора LIKE
является то, что он может включать в условие специальные
подстановочные
символы
(метасимволы).
Для
этого
оператора
предусмотрено только два подстановочных символа:

% — представляет любую последовательность из нуля или более
символов. При этом значение '%' никогда не будет равно NULL
(для проверки таких значений используется IS NULL);

_ — представляет любой одиночный символ.
В нашем примере мы использовали подстановочный символ %, поэтому
запрос вернет всех сотрудников, чья фамилия начинается на R.
Если мы хотим, чтобы символ процента (%) и подчеркивания (_)
воспринимались Oracle как обычные символы, по которым можно
производить поиск (а не как служебные подстановочные символы), в
нашем распоряжении — параметр ESCAPE. При помощи этого параметра
можно определить специальный символ, после которого подстановочный
символ будет считаться обычным:
select last_name
ESCAPE '\';
from
hr.employees
where
last_name
like
'R\%'
Условие
LIKE
использовать
совсем
несложно,
но
и
набор
возможностей у него очень ограничен. Намного большие функциональные
возможности предоставляет условие REGEXP_LIKE, которое позволяет
определять условие поиска при помощи стандартных POSIX-совместимых
регулярных выражений. Регулярные выражения — очень большая тема,
которая выходит за рамки этого учебного курса. Здесь же мы приведем
только простой пример:
SELECT first_name FROM employees
WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$');
В этом примере мы возвращаем информацию о всех сотрудниках, у
которых имя начинается на Ste, заканчивается на en, а между ними
находится либо v, либо ph. Результат может быть таким:
Steven
Steven
Stephen
Оператор BETWEEN для сравнения диапазонов в запросах ORACLE SQL
Иногда необходимо вернуть все значения, которые попадают в
какой-либо диапазон. Для этой цели очень удобно использовать
специальный оператор для сравнения диапазонов BETWEEN. Например,
чтобы вернуть информацию о всех сотрудниках, которые получают
зарплату в диапазоне от 3000 до 4000, можно использовать запрос
такого вида:
SELECT * FROM hr.employees WHERE salary BETWEEN 3000 AND 4000;
Обратите внимание, что при использовании ключевого слова BETWEEN
граничные значения также попадают в диапазон, поэтому запрос вернет
в том числе сотрудников с зарплатой в 3000 и 4000.
Конечно же, мы всегда можем заменить запрос с ключевым словом
BETWEEN на запрос с обычными операторами сравнения:
SELECT * FROM hr.employees WHERE salary >= 3000 AND salary <=
4000;
Однако применение BETWEEN тоже вполне допустимо.
Такие же возможности работы с оператором BETWEEN предусмотрены и
в Microsoft SQL Server.
Работа со списками значения в запросах Oracle SQL, условие IN
Если условие BETWEEN предназначено для работы с диапазонами, то
условие IN используется для проверки значения на соответствие списку
значений. Например, вернуть все записи для сотрудников с должностями
Sales Manager, Sales Representative и Shipping Clerk можно так:
SELECT * FROM hr.employees WHERE job_id IN ('SA_MAN', 'SA_REP',
'SH_CLERK');
Чтобы вернуть все значения, которые не попадают в указанный
список, можно использовать ключевое слово NOT. Например, чтобы
вернуть информацию о всех сотрудниках с другими должностями, можно
использовать запрос
SELECT * FROM hr.employees
'SA_REP', 'SH_CLERK');
WHERE
job_id
NOT
IN
('SA_MAN',
Конечно же, как и в случае с BETWEEN, синтаксические конструкции
с IN можно заменить на обычные операторы сравнения с OR. Однако при
сравнении с большим списком значений синтаксис с IN явно удобнее.
Такие же возможности для работы с условием IN предусмотрены и в
Microsoft SQL Server.
Условие EXISTS и проверка существования набора значений в ORACLE
SQL
Условие EXISTS используется только в одной ситуации — когда вы
используете в запросе и подзапрос и хотите проверить, возвращает ли
подзапрос записи. Если подзапрос возвращает хотя бы одну запись, то
условие EXISTS вернет True, если нет — то false. Пример применения
этого условия может выглядеть так:
SELECT * FROM departments d WHERE EXISTS
(SELECT
*
FROM
e.department_id);
employees
e
WHERE
d.department_id
=
В этом примере мы возвращаем информацию о всех департаментах,
для которых в таблице employees есть хотя бы один сотрудник.
Как обычно, это условие можно обращать при помощи NOT:
SELECT * FROM departments d WHERE NOT EXISTS
(SELECT
*
FROM
e.department_id);
employees
e
WHERE
d.department_id
Те же возможности предусмотрены и для Microsoft
SQL Server.
=
Лабораторная работа 2.1 Применение операторов в простых запросах
Операторы в простых запросах Oracle SQL
Задание:
Напишите запрос с использованием столбцов таблицы employees в
схеме hr, который бы возвращал результаты в следующем виде (см.
рис. 2.1-1)
Рис. 2.1-1.
При этом сумму подоходного налога нужно считать равной 13%.
Лабораторная работа 2.2. Применение простых условий
Простые условия в запросах Oracle SQL
Задание:
Напишите запрос, возвращающий фамилию и имя тех сотрудников из
таблицы hr.employees, для которых размер оклада (столбец salary)
больше или равен 10000. Результат запроса должен быть таким, как
представлено на рис. 2.2-1.
Рис. 2.2-1
Лабораторная работа 2.3 Применение групповых условий в Oracle
Групповые условия в запросах Oracle SQL
Задание:
Создайте
запрос,
который
вернет
из
таблицы
hr.employees
информацию об имени, фамилии, окладе и дате приема на работу для
сотрудников, которые были приняты на работу раньше, чем любой из
сотрудников департамента номер 70. Результат запроса должен быть
таким, как представлено на рис. 2.3-1.
Рис. 2.3-1
Лабораторная работа 2.4 Логические условия в Oracle
Логические условия в запросах Oracle SQL
Задание:
Напишите запрос, который бы возвращал информацию об имени,
фамилии,
окладе
и
ставке
комиссии
сотрудников
из
таблицы
hr.employees. При этом должна возвращаться информация только для
сотрудников, для которых сумма оклада больше или равна 10000 и для
которых установлена ставка комиссии. Результат выполнения запроса
должен выглядеть так, как представлено на рис. 2.4-1.
Рис. 2.4-1
Лабораторная работа 2.5 Поиск по шаблонам
Поиск по шаблонам и применение регулярных выражений в запросах
Oracle SQL
Задание 1:
Напишите запрос, который бы возвращал информацию об имени,
фамилии и должности (столбец JOB_ID) для каждого сотрудника на
основе информации из таблицы employees в в схеме hr. При этом должна
возвращаться информация только для тех сотрудников, которые работают
в сфере продаж (наименование должности начинается на SA) или которые
выполняют роль менеджера (в должности присутствует сочетание MGR).
Результат запроса должен выглядеть так, как представлено на рис.
2.5-1.
Рис. 2.5-1
Задание 2:
Напишите запрос, который возвращал бы информацию о имени,
фамилии, телефонном номере для каждого сотрудника в таблице
hr.employees. При этом должна выводиться информация только для тех
сотрудников, телефонный номер которых не соответствует маске
XXX.XXX.XXXX, где X-любое число от 0 до 9. Результат выполнения
запроса должен выглядеть так, как представлено на рис. 2.5-2.
Рис. 2.5-2
Лабораторная работа 2.6 Работа с диапазонами и ограничение
количества выводимых записей
Работа с диапазонами и ограничение количества выводимых записей в
Oracle SQL
Задание:
Напишите запрос, который возвращал бы информацию об имени,
фамилии, должности (столбец JOB_ID) и времени приема на работу
(столбец HIRE_DATE) для сотрудников из таблицы hr.employees. При
этом должна возвращаться только информация для тех сотрудников,
которые были приняты на работу с 1995 по 1999 годы включительно,
плюс тех, чьи должности выглядят как AD_PRES, AD_VP и AD_ASST.
Ограничьте число выводимых записей пятью. Используйте для этого
запроса выражения BETWEEN и IN. Результат такого запроса должен
выглядеть так, как представлено на рис. 2.6-1.
Рис. 2.6-1
Лабораторная работа 2.7 Применение сортировки
Сортировка по возрастанию и убыванию в запросах Oracle SQL
Задание:
Напишите запрос, который бы выводил информацию об именах,
фамилиях, зарплате и времени приема на работу для сотрудников на
основе таблицы hr.employees. При этом выводимая информация должна
быть отсортирована вначале по зарплатам (самые большие зарплаты —
вверху), а затем — по дате приема на работу (вверху — тот, кто
устроился на работу раньше). Результат выполнения запроса должен
выглядеть так, как представлено на рис. 2.7-1.
Рис. 2.7-1.
Лабораторная работа 3.1 Работа со строковыми функциями
Строковые функции в запросах Oracle SQL, функции UPPER(),
CONCAT(), SUBSTR()
Задание:
Вам потребовалось создать для каждого сотрудника идентификатор,
который должен выглядеть как 3 первые символа имени плюс два первых
символа фамилии. Все символы этого идентификатора должны быть
представлены в верхнем регистре.
Напишите запрос, который возвращал бы из таблицы hr.employees
информацию об имени и фамилии сотрудника, а также идентификатор
сотрудника в соответствии с поставленными условиями. Результат
выполнения запроса должен быть таким, как представлено на рис. 3.11.
Рис.3.1-1.
Лабораторная работа 3.2 Применение функций для работы с
датой/временем и арифметических функций
Функции для работы с датой/временем
MONTHS_BETWEEN(), SYSDATE()
в
Oracle
SQL,
функции
Задание:
Напишите запрос, который бы возвращал информацию об именах и
фамилиях сотрудников из таблицы hr.employees, а также об дате приема
каждого сотрудника на работу и количестве полных месяцев, которое
каждый сотрудник отработал по настоящее время (настоящее время
определяется по часам вашего компьютера).
Результат запроса должен выглядеть так, как представлено на рис.
3.2-1.
Рис. 3.2-1.
Примечание:
Значение в столбце "Проработано месяцев" у вас может быть другим,
поскольку другим будет время на часах компьютера.
Лабораторная работа 3.3 Изменение выводимого формата даты
Изменение выводимого формата даты в Oracle SQL, функция TO_CHAR()
Задание:
Необходимо представить информацию из таблицы сервера Oracle в
соответствии с принятым на предприятии стандартом вывода данных,
который выглядит как год/месяц/число, например, 2008/02/20. Напишите
запрос, который бы выводил из таблицы hr.employees информацию об
имени. фамилии и дате приема на работу сотрудников в соответствии с
описанным форматом. Вначале должны выводиться те, кто был принят
работу позже. Результат выполнения запроса должен выглядеть так, как
представлено на рис. 3.3-1.
Рис. 3.3-1
Лабораторная работа 3.4 Изменение формата выводимых чисел
Изменения формата числовых значений в Oracle SQL, функция TO_CHAR
для работы с числовыми значениями
Задание:
Напишите запрос, который бы выводил информацию о имени, фамилии
и
зарплате
сотрудников
из
таблицы
hr.employees
в
формате,
представленном на рис. 3.4-1:
Рис. 3.4-1.
При этом данные должны быть отсортированы таким образом, чтобы
первыми выводились строки для сотрудников с наибольшей зарплатой.
Примечание.
Некоторые значения зарплаты на рис. 3.4-1 были изменены, поэтому
они могут не совпадать с вашими значениями.
Лабораторная работа 3.5 Применение функции NVL
Функция NVL для работы с неопределенными значениями в Oracle SQL
Задание:
Напишите запрос, который выводит информацию об имени и фамилии
сотрудников из таблицы hr.employees. а также ставку комиссии
(столбец
COMMISSION_PCT
для
сотрудника.
При
этом
для
тех
сотрудников, для которых комиссия не определена, нужно вывести
значение 0. Результат выполнения запроса должен быть таким, как
представлено на рис. 3.5-1.
Рис. 3.5-1 (показаны значения начиная со строки 51).
Лабораторная работа 3.6 Применение функции DECODE
Функция DECODE для проверки условий в запросах Oracle SQL
Задание:
Напишите запрос, который возвращает информацию об имени, фамилии и
должности
сотрудников
(столбец
JOB_ID)
на
основе
таблицы
hr.employees. При этом:

если в столбце JOB_ID для сотрудников находится
то должно выводиться "Торговый представитель";

если в столбце JOB_ID для сотрудников находится значение SA_MAN,
то должно выводиться "Менеджер по продажам";

если в этом столбце находится любое другое значение, то должно
выводиться "Другое".
значение SA_REP,
Результат запроса должен быть таким, как представлено на рис. 3.6-1
Рис. 3.6-1
Лабораторная работа 4.1 Создание простого соединения
Простые соединения (джойны) в Oracle SQL
Задание:
Создайте запрос, который бы возвращал информацию из таблиц
employees и jobs схемы hr. При этом должна возвращаться информация:
 об имени сотрудника (таблица employees);
 о фамилии сотрудника (таблица employees);
 о разнице между максимальной заработной платы для данной
должности (из таблицы jobs) и реальной заработной платой (из
таблицы employees).
При этом сотрудники, для
должны выводиться первыми.
которых
Результат
выполнения
запроса
представлено на рис. 4.1-1.
Рис. 4.1-1
такая
должен
разница
выглядеть
максимальна,
так,
как
Лабораторная работа 4.2 Соединение более чем двух таблиц
Соединения (джойны) более чем двух таблиц в Oracle SQL
Задание:
Напишите запрос, который возвращал бы информацию из таблиц
employees и countries схемы hr. При этом для каждого сотрудника
должна возвращаться информация:

об имени сотрудника (таблица employees);

о фамилии сотрудника (таблица employees);

о стране, в которой он находится (таблица countries).
Убедитесь, что в результате выполнения вашего запроса не
получается декартово произведение (должно вернуться всего 106
записей). Для написания этого запроса необходимо самостоятельно
проанализировать связи между таблицами в схеме hr, используя,
например, средства Oracle SQL Developer. Результат выполнения
запроса должен выглядеть так, как представлено на рис. 4.2-1.
Рис. 4.2-1
Лабораторная работа 4.3 Не экви-соединения
Не эквивалентные (джойны) соединения в запросах Oracle SQL
Задание:
Напишите запрос на основе информации из таблиц employees и jobs
схемы hr. При этом должна возвращаться информация:

об имени сотрудника (таблица employees);

о фамилии сотрудника (таблица employees);

о
его
заработной
employees);

о минимальной заработной плате для его должности (столбец
min_salary в таблице jobs).
плате
(столбец
salary
в
таблице
При
этом
информация
должна
возвращаться
только
для
тех
сотрудников, чья заработная плата отличается от минимальной для
данной должности не более чем на 20 процентов (для проверки: должно
вернуться 38 записей). Результат выполнения запроса должен выглядеть
так, как представлено на рис. 4.3-1.
Рис. 4.3.1
Лабораторная работа 4.4 Внешние объединения
Внешние объединения (внешние джойны, outer joins) в запросах
Oracle SQL
Задание:
Напишите запрос на основе информации из таблиц employees
departments схемы hr. Запрос должен возвращать информацию:
 о
названии
departments);
отдела

об имени сотрудника;

о фамилии сотрудника.
(столбец
deparment_name
в
и
таблице
При этом должна выводиться также информация о тех отделах, для
которых сотрудников в таблице employees нет. Информация должна быть
упорядочена по названиям отделов.
Результат
выполнения
запроса
представлено на рис. 4.4-1.
должен
выглядеть
так,
как
Рис. 4.4-1.
Лабораторная работа 5.1 Применение агрегатных функций
Агрегатные функции в запросах Oracle SQL, функции MIN(), MAX(),
AVG()
Задание:
Напишите запрос, который бы вернул информацию о максимальной,
минимальной и средней заработной плате из таблицы employees в схеме
hr (информация о заработной плате находится в столбце salary).
Результаты выполнения запроса должны выглядеть так, как представлено
на рис. 5.1-1.
Рис. 5.1-1
Лабораторная работа 5.2 Применение выражения Group By
Выражение GROUP BY в запросах Oracle SQL, группировка записей в
результатах запросов
Задание:
Напишите запрос, который бы возвращал информацию о максимальной,
минимальной и средней заработной плате для каждой должности в
таблице employees в схеме hr. Информация о заработной плате
находится в столбце salary, а информация о должности — в таблице
job_id. Результат выполнения запроса должен выглядеть так, как
представлено на рис. 5.2-1
Рис. 5.2-1
Лабораторная работа 5.3 Дополнительные возможности GROUP BY
Фильтрация групп и сортировка по группам в запросах Oracle SQL
Задание:
Напишите запрос, в котором должна выводиться информация о
максимальной, минимальной и средней заработной плате на основе
информации из столбца salary таблицы hr.employees. При этом данная
информация:

вначале должна быть сгруппирована по должностям (столбец
job_id таблицы employees);

затем должна быть сгруппирована по
department_name таблицы departments);

должны выводиться только те группы для должностей, средняя
заработная плата для которых выше или равна 7000;

информация должна быть отсортирована вначале по отделам, а
затем по должностям.
Результаты
выполнения
представлено на рис. 5.3-1.
запроса
должны
отделам
выглядеть
(столбец
так,
как
Рис. 5.3-1
Лабораторная работа 6.1 Работа с однострочными подзапросами
Однострочные подзапросы в Oracle SQL
Задание:
Напишите запрос, который возвращал бы информацию о имени,
фамилии, заработной плате всех сотрудников из таблицы hr.employees,
зарплата которых превышает среднюю для отдела продаж (значение Sales
в столбце department_name таблицы departments). Решите эту задачу
при помощи подзапроса. Результат выполнения запроса должен выглядеть
так, как представлено на рис. 6.1-1.
Рис. 6.1-1
Лабораторная работа 6.2 Применение многострочных подзапросов
Многострочные подзапросы в Oracle SQL
Задание:
Напишите запрос, который возвращает имена и фамилии сотрудников
на основе информации из таблицы hr.employees. Должны вернуться
записи только для тех сотрудников, которые выполняют менеджерские
функции (для которых их номер employee_id встречается в столбце
manager_id
той
же
таблицы).
Решите
эту
задачу
при
помощи
многострочного подзапроса. Результат выполнения запроса должен
выглядеть так, как представлено на рис. Лаб. 6.2-1.
Рис. 6.2-1
Лабораторная работа 7.2 Применение многостолбцовых подзапросов
Многостолбцовые подзапросы в Oracle SQL
Задание:
Напишите запрос, возвращающий информацию об именах, фамилиях,
должностях (столбец job_id) и заработной плате сотрудников из
таблицы hr.employees. При этом должна возвращаться информация только
для сотрудников, для которых установлена минимальная заработная
плата для их должности. Информацию о минимальной заработной плате
можно получить из таблицы hr.jobs (столбец min_salary). Используйте
для решения многострочный подзапрос. Результат выполнения запроса
должен выглядеть так, как представлено на рис. 7.2.-1.
Рис. 7.2-1
Лабораторная работа 8.1 Интерактивный запрос значений переменных
в командах Oracle SQL
Интерактивный запрос значений переменных в Oracle SQL*Plus и
Oracle SQL Developer
Задание:
Напишите запрос, который вы выводил информацию об имени, фамилии
и заработой плате сотрудников из таблицы hr.employees. При этом
запрос:
 должен запрашивать у пользователя информацию о номере отдела
(см. рис. 8.1-1) и выводить информацию только о пользователях
соответствующего отдела;
 должен показывать пользователю не только результаты запроса, но
и текст запроса со значением, введенным пользователем;
Результат
выполнения
запроса
представлено на рис. 8.1-2.
должен
выглядеть
так,
как
Примечание:
При использовании Oracle SQL Developer, для вывода результатов
запроса в текстовом виде нужно использовать клавишу F5.
Рис. 8.1-1
Рис. 8.1-2
Download