
- •Простая выборка
- •Исключение дубликатов
- •Выборка вычисляемых значений.
- •Выборка с использованием фразы where и упорядочением.
- •Агрегирование данных.
- •Агрегирование данных с использованием фразы having
- •Естественное соединение таблиц
- •Соединение таблицы со своей копией
- •Вложенные подзапросы
- •Объединение запросов
- •Представления Создание таблиц и заполнение их данными
Простая выборка
Выдать содержимое всех столбцов таблицы Н_ЦИКЛЫ_ДИСЦИПЛИН.
select *
from Н_ЦИКЛЫ_ДИСЦИПЛИН;
Выдать содержимое столбцов АББРЕВИАТУРА и НАИМЕНОВАНИЕ той же таблицы.
select АББРЕВИАТУРА, НАИМЕНОВАНИЕ
from Н_ЦИКЛЫ_ДИСЦИПЛИН;
Получить перечень квалификаций, присваиваемых выпускникам нашего университета.
select НАИМЕНОВАНИЕ
from Н_КВАЛИФИКАЦИИ;
Из таблицы Н_Оценки получить содержимое столбца ПРИМЕЧАНИЕ
select ПРИМЕЧАНИЕ
from Н_ОЦЕНКИ;
Выдать специальности и их коды, предлагаемые нашим университетом
select КОД_НАПРСПЕЦ, НАИМЕНОВАНИЕ
from Н_НАПР_СПЕЦ;
Исключение дубликатов
Выдать неповторяющиеся имена людей из таблицы Н_ЛЮДИ.
select distinct ИМЯ
from Н_ЛЮДИ;
Какие состояния студентов (признаки) используются в таблице Н_УЧЕНИКИ.
select distinct ПРИЗНАК
from Н_УЧЕНИКИ;
Из таблицы НТ_ОЦЕНКИ_СТУДЕНТА получить неповторяющиеся значения столбца КОНТР
select distinct КОНТР
from НТ_ОЦЕНКИ_СТУДЕНТА;
Выдать неповторяющиеся фамилии из таблицы Н_ЛЮДИ
select distinct ФАМИЛИЯ
from Н_ЛЮДИ;
Выборка вычисляемых значений.
Из таблицы Н_УЧЕБНЫЕ_ГОДА получить названия и продолжительность каждого учебного года (напомним, что единица измерения дат - одни сутки).
select УЧЕБНЫЙ_ГОД, (КОНЕЦ - НАЧАЛО)ПРОД
from Н_УЧЕБНЫЕ_ГОДА;
Используя сведения из таблицы Н_ИЗМ_ЛЮДИ, определить:
а) целое число дней, прошедших с момента изменения фамилии до текущей даты (SYSDATE);
select ФАМИЛИЯ, ROUND((SYSDATE - КОГДА_ИЗМЕНИЛ))ПРОД
from Н_ИЗМ_ЛЮДИ;
б) целое число месяцев, прошедших с момента изменения фамилии до текущей даты.
select ФАМИЛИЯ, ROUND(MONTHS_BETWEEN(SYSDATE, КОГДА_ИЗМЕНИЛ))ПРОД_МЕСЯЦ
from Н_ИЗМ_ЛЮДИ;
Для округления используется функция ROUND(expr [,m]), возвращающая expr, округленное до m-го десятичного знака; если m опущено, то оно принимается равным 0, а если m < 0, то округляются цифры левее десятичной точки.
Для получения количества месяцев между датами d1 и d2 используется функция MONTHS_BETWEEN (d1,d2). Если d1 > d2, то результат положителен, иначе отрицателен.
В таблице Н_ВЕДОМОСТИ для каждого человека вывести ИД и кол-во суток между датой создания и последнего изменения
select ИД, ROUND((КОГДА_ИЗМЕНИЛ - КОГДА_СОЗДАЛ))ПРОД_СУТ
from Н_ВЕДОМОСТИ;
Для таблицы Н_ЛЮДИ вывести Фамилии людей и количество полных лет
select ФАМИЛИЯ, ROUND((SYSDATE - ДАТА_РОЖДЕНИЯ)/365)ЛЕТ
from Н_ЛЮДИ;
Выборка с использованием фразы where и упорядочением.
8. Выдать фамилию и инициалы людей (запрос оформить в виде выражения, чтобы получить в результате один столбец, например, "Сидоров С.С.", а не три: "Сидоров","С." и "С.").
Для выделения из строки "str" "len" символов, начиная с "pos", используется функция SUBSTR(str,pos[,len]). Если "len" отсутствует, то выдются символы от "pos" до конца "str". При "pos" < 0 первый выделяемый символ определяется не от начала, а от конца "str".
Для соединения текстовых значений используется оператор ||, а значения текстовых констант должны быть заключены в апострофы (например, точка и пробел: '.' и ' ').
Для ограничения числа строк используйте псевдостолбец ROWNUM (WHERE ROWNUM < … или WHERE <= …) и ограничьте результат 50-ю строками.
SELECTФАМИЛИЯ||' '||SUBSTR(ИМЯ, 1, 1)||'.'||SUBSTR(ОТЧЕСТВО, 1, 1)||'.'
FROM Н_ЛЮДИ
WHERE ROWNUM <= 50;
9. Выдать номер, фамилию и инициалы людей (запрос оформить в виде выражения, чтобы получить, в результате один столбец, например, "104567 Сидоров С.С.").
Для преобразования числового значения или даты (expr) в текстовое значение по формату, заданному в fmt (с необязательным указанием национального языка nlsparam), используется функция TO_CHAR (expr [, fmt [, 'nlsparam']] ). Если fmt опущено, то expr преобразуется в строку такой длины, которая вмещает только значащие цифры. С форматами можно познакомиться в Кратком справочнике по Oracle( http://www.cs.ifmo.ru , http://www.cis.ifmo.ru).
Для ограничения числа строк используйте псевдостолбец ROWNUM (WHERE ROWNUM < … или WHERE <= …) и ограничьте результат 50-ю строками.
SELECTTO_CHAR(ИД) ФАМИЛИЯ||' '||SUBSTR(ИМЯ, 1, 1)||'.'||SUBSTR(ОТЧЕСТВО, 1, 1)||'.'
FROM Н_ЛЮДИ
WHERE ROWNUM <= 50;
10. Выдать номер (ИД) Короткое_имя и название (имя_в_имин_падеже) всех отделов факультета Компьютерных технологий и управления.
SELECT ИД, КОРОТКОЕ_ИМЯ, ИМЯ_В_ИМИН_ПАДЕЖЕ
FROM Н_ОТДЕЛЫ
WHERE ОТД_ИД =
(SELECT ИД
FROM Н_ОТДЕЛЫ
WHERE КОРОТКОЕ_ИМЯ = 'КТиУ');
11. Выдать "Фамилия, Имя, Отчество" всех людей, фамилии которых начинаются на "Яков".
SELECT ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО
FROM Н_ЛЮДИ
WHERE ФАМИЛИЯ LIKE 'Яков%';
12. Выдать "Фамилия, Имя, Отчество" всех людей из запроса номер 11, отсортировав строки по:
1) имени
SELECT ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО
FROM Н_ЛЮДИ
WHERE ФАМИЛИЯ LIKE 'Яков%'
ORDER BY ИМЯ;
2) имени и отчеству
SELECT ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО
FROM Н_ЛЮДИ
WHERE ФАМИЛИЯ LIKE 'Яков%'
ORDER BY ИМЯ, ОТЧЕСТВО;
3) фамилии, имени и отчеству.
SELECT ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО
FROM Н_ЛЮДИ
WHERE ФАМИЛИЯ LIKE 'Яков%'
ORDER BY ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО;
13. Повторить предыдущие запросы задавая сортировку позициями, а не именами столбцов.
1) имени
SELECT ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО
FROM Н_ЛЮДИ
WHERE ФАМИЛИЯ LIKE 'Яков%'
ORDER BY 2 ASC;
2) имени и отчеству
SELECT ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО
FROM Н_ЛЮДИ
WHERE ФАМИЛИЯ LIKE 'Яков%'
ORDER BY 2 ASC, 3 ASC;
3) фамилии, имени и отчеству.
SELECT ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО
FROM Н_ЛЮДИ
WHERE ФАМИЛИЯ LIKE 'Яков%'
ORDER BY 1 ASC, 2 ASC, 3 ASC;
14. Выдать " фамилия, имя, отчество" всех людей с фамилиями, начинающимися на "Э", "Ю" и "Я", с упорядочением по фамилии (составить не менее двух вариантов запроса).
1) SELECT ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО
FROM Н_ЛЮДИ
WHERE ФАМИЛИЯ LIKE 'Э%'OR ФАМИЛИЯ LIKE 'Ю%'OR ФАМИЛИЯ LIKE'Я%'
ORDER BY ФАМИЛИЯ;
2)SELECT ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО
FROM Н_ЛЮДИ
WHERE SUBSTR(ФАМИЛИЯ, 1, 1) IN ('Э','Ю','Я')
ORDER BY 1 ASC;
15. Выдать номера, короткие имена и названия отделов с номерами 102, 111 и 212.
SELECT ИД, КОРОТКОЕ_ИМЯ, ИМЯ_В_ИМИН_ПАДЕЖЕ
FROM Н_ОТДЕЛЫ
WHERE ИД IN ('102', '111', '212');
16. Получить из таблицы н_напр_спец код и наименование специализаций специальности 230101 (напомним, что номера специализаций отличаются от номера специальности двумя последними цифрами).
SELECT КОД_НАПРСПЕЦ, НАИМЕНОВАНИЕ
FROM Н_НАПР_СПЕЦ
WHERE КОД_НАПРСПЕЦ LIKE '230101__';
17. По таблице Н_УЧЕНИКИ познакомиться с особенностями процесса обучения студентов с номерами 114052,114746,115264,116483,117127,118705.
Для получения ФИО этих студентов можно воспользоваться функцией
Человек(члвк_ид, padej , priz IN NUMBER DEFAULT 0, nach DATE DEFAULT SYSDATE)
выводящей фамилию имя и отчество (priz=0) или фамилию и инициалы (priz=1) человека с
номером члвк_ид в заданном падеже ('И','Р','Д','В','Т','П') и на заданную дату
(по умолчанию устанавливается priz=0 и текущая (системная) дата – SYSDATE.
Для соединения текстовых значений используется оператор ||, а значения текстовых констант должны быть заключены в апострофы (например, точка и пробел: '.' и ' ').
SELECT члвк_ид, признак, состояние, начало, конец, группа, человек(члвк_ид,'И')
FROM н_ученики
WHERE члвк_ид IN (118843,119299,119457,119490,120224)
ORDER BY члвк_ид, начало ASC;
18. Вывести из таблицы Н_ВЕДОМОСТЬ ваши оценки. Список должен содержать оценку, её преобразованное значение (5 → отлично, 4 → хорошо, 3 → удовлетворительно, 2 → неудовлетворительно, зачет → зачет, незач → незачет, осв → освобождение, неявка → неявка, 99 → диплом с отличием, . → выдача экзаменационного листа, - → отсутствие данных), которому необходимо дать псевдоним – Эквивалент, дату получения оценки и ссылку (сэс_ид) на идентификатор таблицы Н_СОДЕРЖИМОЕ_ЭЛЕМЕНТОВ_СТРОК. Зная сэс_ид можно получить имя дисциплины, по которой получена оценка. Список упорядочить по сэс_ид и дате.
Преобразование оценок можно осуществить с помощью функции DECODE:
DECODE (expr, search1, result1 [, search2, result2] ... [default]),
где значение выражения expr сравнивается с каждым из значений search.
Если expr совпадает с каким-либо search, возвращается соответствующее значение result.
Если ни одного совпадения не найдено, возвращается значение default (или NULL, если значение default опущено).
Expr может иметь любой тип данных, но значения search должны иметь тот же тип, как у expr.
Возвращаемое значение принудительно приводится к тому типу данных, как у result.
SELECT оценка,
(DECODE(оценка, '5','отлично',
'4','хорошо',
'3','удовлетворительно',
'2','неудовлетворительно',
'зачет','зачет',
'незач','незачет',
'осв','освобождение',
'неявка','неявка',
'99','диплом с отличием',
'.','выдача экзаменационного листа',
'-','отсутствие данных')) эквивалент,
дата, сэс_ид
FROM н_ведомости
WHERE UPPER(человек(члвк_ид, 'И'))=UPPER('Голубцов Евгений Сергеевич')
ORDER BY сэс_ид, дата;
19. Вывести список тех ваших оценок, которые заданы цифрами 5, 4, 3, 2. Список должен содержать оценку, её удвоенный цифровой эквивалент (псевдоним - Оценка*2), дату получения оценки и ссылку (сэс_ид) на идентификатор таблицы Н_СОДЕРЖИМОЕ_ЭЛЕМЕНТОВ_СТРОК. Зная сэс_ид можно получить имя дисциплины, по которой получена оценка. Список упорядочить по сэс_ид и дате.
Следует иметь в виду, что любое имя Oracle может в чистом виде содержать лишь буквы, цифры и три символа: $, #, _. Имена, содержащие другие символы (включая пробелы) необходимо заключать в кавычки, например, "Оценка*2".
Для преобразования текстового значения (char) в число по формату в fmt (с необязательным указанием нацязыка nlsparam), используется функция TO_NUMBER (char [, fmt [, 'nlsparam']]). С форматами можно познакомиться в Кратком справочнике по Oracle ( http://www.cs.ifmo.ru , http://www.cis.ifmo.ru).
SELECT оценка, TO_NUMBER(оценка*2) "Оценка*2", дата, сэс_ид
FROM н_ведомости
WHERE UPPER(человек(члвк_ид, 'И'))=UPPER('Голубцов Евгений Сергеевич')
AND оценка IN ('2','3','4','5')
ORDER BY сэс_ид, дата;
20. Выполнить запрос 4, удалив из результата пробелы и точки (отсутствие имени у некоторых студентов), а также однобуквенные имена, получившиеся при вводе инициалов: ' ', '.', 'А', 'А.', 'Б', 'Б.', 'В', 'В.', 'Г', 'Г.', 'Д', 'Д.', 'Е', 'Е.', 'Ж', 'Ж.', 'З', 'З.', 'И', 'И.', 'К', 'К.', 'Л', 'Л.', 'М', 'М.', 'Н.', 'Н.', 'О', 'О.', 'П', 'П.', 'Р', 'Р.', 'С', 'С.', 'Т', 'Т.', 'У', 'У.', 'Ф', 'Ф.', 'Х', 'Х.', 'Ц', 'Ц.', 'Ш', 'Ш.', 'Э', 'Э.', 'Ю', 'Ю.'
select distinct ИМЯ
from Н_ЛЮДИ
where ИМЯ not like '_'
and ИМЯ not like '_.';
Выдать все имена и фамилии студентов начинающиеся на букву В и заканчивающиеся на д или в , отсортировать их по фамилиям.
SELECT фамилия, имя
FROM н_люди
WHERE имя LIKE 'В%д' OR имя LIKE 'В%в'
ORDER BY фамилия;
Выдать ИД всех студентов, отчисленных или в академическом отпуске и отсортировать по ИД.
SELECT ИД
FROM н_ученики
WHERE ПРИЗНАК in ('отчисл', 'академ')
ORDER BY ИД;