Скачиваний:
73
Добавлен:
08.05.2014
Размер:
105.47 Кб
Скачать

Простая выборка

  1. Выдать содержимое всех столбцов таблицы Н_ЦИКЛЫ_ДИСЦИПЛИН.

select *

from Н_ЦИКЛЫ_ДИСЦИПЛИН;

  1. Выдать содержимое столбцов АББРЕВИАТУРА и НАИМЕНОВАНИЕ той же таблицы.

select АББРЕВИАТУРА, НАИМЕНОВАНИЕ

from Н_ЦИКЛЫ_ДИСЦИПЛИН;

  1. Получить перечень квалификаций, присваиваемых выпускникам нашего университета.

select НАИМЕНОВАНИЕ

from Н_КВАЛИФИКАЦИИ;

  • Из таблицы Н_Оценки получить содержимое столбца ПРИМЕЧАНИЕ

select ПРИМЕЧАНИЕ

from Н_ОЦЕНКИ;

  • Выдать специальности и их коды, предлагаемые нашим университетом

select КОД_НАПРСПЕЦ, НАИМЕНОВАНИЕ

from Н_НАПР_СПЕЦ;

Исключение дубликатов

  1. Выдать неповторяющиеся имена людей из таблицы Н_ЛЮДИ.

select distinct ИМЯ

from Н_ЛЮДИ;

  1. Какие состояния студентов (признаки) используются в таблице Н_УЧЕНИКИ.

select distinct ПРИЗНАК

from Н_УЧЕНИКИ;

  • Из таблицы НТ_ОЦЕНКИ_СТУДЕНТА получить неповторяющиеся значения столбца КОНТР

select distinct КОНТР

from НТ_ОЦЕНКИ_СТУДЕНТА;

  • Выдать неповторяющиеся фамилии из таблицы Н_ЛЮДИ

select distinct ФАМИЛИЯ

from Н_ЛЮДИ;

Выборка вычисляемых значений.

  1. Из таблицы Н_УЧЕБНЫЕ_ГОДА получить названия и продолжительность каждого учебного года (напомним, что единица измерения дат - одни сутки).

select УЧЕБНЫЙ_ГОД, (КОНЕЦ - НАЧАЛО)ПРОД

from Н_УЧЕБНЫЕ_ГОДА;

  1. Используя сведения из таблицы Н_ИЗМ_ЛЮДИ, определить:

а) целое число дней, прошедших с момента изменения фамилии до текущей даты (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 ИД;