Читайте также: |
|
(select номер_студента, min(r) min_r
from t1
group by номер_студента) – можно же сразу добавить partition by в row_number
/*Определяем номер первого вхождения для каждого студента.*/
select case r when min_r then фамилия else ' ' end ФИО,
/*Выводим фамилию только в случае первого вхождения.*/
название "Дисциплина", оценка "Оценка", дата "Дата",
case min_d when дата then ' ' else 'Пересдача' end "Примечания"
/*Заполняем столбец "Примечания", если дата сдачи экзамена не совпадает с датой первой попытки.*/
from t1 inner join t2 using(номер_студента);
б) ВОЗМОЖНО, НЕВЕРНО
select Фамилия ФИО, Название, Оценка, Дата,
(select case min(Дата) when у2.Дата then ' ' else 'Пересдача' end
from Успеваемость у1
where у1.номер_студента = у2.номер_студента and у1.номер_дисциплины = у2.номер_дисциплины
group by номер_студента, номер_дисциплины) примечание
from Успеваемость у2 inner join студенты on (у2.номер_студента = студенты.номер_студента) inner join дисциплины on (у2.номер_дисциплины = дисциплины.номер_дисциплины)
9. В таблицу записана информация, об удачных и неудачных попытках подключения к базе данных (Пользователь, Время, Удачно\Неудачно). Требуется получить список пользователей, которые совершили подряд три неудачные попытки подключения. После трех подряд неудачных попыток отсчет попыток начинается с начала.
ВОЗМОЖНО, НЕВЕРНО
/*create table Подключения
(Пользователь varchar2(30),
Время date,
"Удачно/Неудачно" varchar(4));
commit;
insert into Подключения values ('igovla', sysdate, 'fail');
insert into Подключения values ('babka', sysdate, 'fail');
insert into Подключения values ('babka2', sysdate, 'ok');
insert into Подключения values ('igovla', sysdate, 'fail');
insert into Подключения values ('babka', sysdate, 'fail');
insert into Подключения values ('babka2', sysdate, 'ok');
insert into Подключения values ('igovla', sysdate, 'fail');
insert into Подключения values ('babka', sysdate, 'fail');
insert into Подключения values ('babka2', sysdate, 'fail');
insert into Подключения values ('igovla', sysdate, 'fail');
insert into Подключения values ('babka', sysdate, 'ok');
insert into Подключения values ('babka2', sysdate, 'fail');
insert into Подключения values ('igovla', sysdate, 'fail');
insert into Подключения values ('babka', sysdate, 'fail');*/
SELECT rownum rn, n
FROM (SELECT rn, n, sm - nvl(last_value(err ignore nulls) over (partition by n order by rn), 0) chk
FROM (SELECT rn, n, nok, sm, case when sm-lag(sm,1) over (PARTITION BY n ORDER BY rn) = 0 then sm ELSE null END err
FROM (SELECT rn, n,nok, sum (nok) OVER (PARTITION BY n ORDER BY rn RANGE UNBOUNDED PRECEDING) sm
FROM (SELECT rn, n, c, CASE WHEN c='fail' THEN 1 ELSE 0 END nok
FROM (SELECT rownum rn,ПОЛЬЗОВАТЕЛЬ n, "Удачно/Неудачно" c
FROM ПОДКЛЮЧЕНИЯ)))))
10. Создать запрос для вывода списка фамилий студентов-хвостистов с указанием дисциплин, которые им необходимо еще досдать в данную сессию. Названия дисциплин должны быть перечислены для каждого студента через запятую.
With
t as
(select distinct номер_студента, номер_дисциплины
from студенты с inner join группы г on с.номер_группы=Г.НОМЕР_ГРУППЫ
inner join учебные_планы уч on Г.КОД_СПЕЦИАЛЬНОСТИ=УЧ.КОД_СПЕЦИАЛЬНОСТИ
minus
select distinct номер_студента, номер_дисциплины
from успеваемость
where оценка > 2)
/*Представление содержит перечень долгов для каждого студента.*/
select фамилия, wm_concat(название) долги
from t inner join студенты c on t.номер_студента=C.НОМЕР_СТУДЕНТА
inner join дисциплины д on t.номер_дисциплины=Д.НОМЕР_ДИСЦИПЛИНЫ
group by фамилия;
/*Соединяем представление с таблицами СТУДЕНТЫ и ДИСЦИПЛИНЫ
для вывода фамилий и названий дисциплин. Выводим долги в одну строку при помощи
функции wm_concat ()*/
With
t as
--curr и prior для соединения строк позже при помощи sys_connect_by_path
(select distinct номер_студента, номер_дисциплины,
row_number() over (partition by номер_студента order by номер_дисциплины) as curr,
row_number() over (partition by номер_студента order by номер_дисциплины) -1 as prev
from
(select distinct номер_студента, номер_дисциплины
from студенты с inner join группы г on с.номер_группы=Г.НОМЕР_ГРУППЫ
inner join учебные_планы уч on Г.КОД_СПЕЦИАЛЬНОСТИ=УЧ.КОД_СПЕЦИАЛЬНОСТИ
minus
select distinct номер_студента, номер_дисциплины
from успеваемость
where оценка > 2))
/*Представление содержит перечень долгов для каждого студента.*/
select фамилия, substr(max(SYS_CONNECT_BY_PATH(название, ',')), 2) долги
from t inner join студенты c on t.номер_студента=C.НОМЕР_СТУДЕНТА
inner join дисциплины д on t.номер_дисциплины=Д.НОМЕР_ДИСЦИПЛИНЫ
group by фамилия
connect by prev = prior curr and фамилия = prior фамилия
start with curr = 1;
/*Соединяем представление с таблицами СТУДЕНТЫ и ДИСЦИПЛИНЫ
для вывода фамилий и названий дисциплин. Выводим долги в одну строку при помощи
11. Создать запрос для вывода списка фамилий студентов с указанием количества несданных ими в сессию дисциплин.
With
t as
(select distinct номер_студента, номер_дисциплины
from студенты с inner join группы г on с.номер_группы=Г.НОМЕР_ГРУППЫ
inner join учебные_планы уч on Г.КОД_СПЕЦИАЛЬНОСТИ=УЧ.КОД_СПЕЦИАЛЬНОСТИ
minus
select distinct номер_студента, номер_дисциплины
from успеваемость
where оценка > 2)
/*Представление содержит перечень долгов для каждого студента.*/
select фамилия, count(номер_дисциплины)
from t right join студенты с on t.номер_студента=с.номер_студента
/*Считаем количество долгов.*/
12. В произвольной строке, состоящей из символьных элементов, разделенных запятыми, отсортировать элементы по алфавиту. Например, символьную строку
abc,cde,ef,gh,mn,test,ss, df,fw,ewe,wwe
преобразовать к виду:
abc,cde,df,ef,ewe, fw,gh,mn,ss,test,wwe.
--в одну строку
Select wm_concat(token)
from(
--разделяем строку на части
Select Trim(Substr (txt
, instr (txt, ',', 1, level) + 1
, instr (txt, ',', 1, level+1) - instr (txt, ',', 1, level) -1
)
)
AS token
from (select ',' || '&text' || ',' txt from dual)
connect by level <= length(txt)- length (replace(txt,',',''))-1
--сортируем
order by token);
Другой способ:
Select substr((max(sys_connect_by_path(token,','))),2) res
from(
--разделяем строку на части, r и r1 для последующего соединения
select token, rownum r, rownum+1 r1
from
(Select Trim(Substr (txt
, instr (txt, ',', 1, level) + 1
, instr (txt, ',', 1, level+1) - instr (txt, ',', 1, level) -1
)
)
AS token
from (select ',' || '&text' || ',' txt from dual)
connect by level <= length(txt)- length (replace(txt,',',''))-1
--сортируем
order by token))
connect by r = prior r1
start with r =1;
13. Создать запрос для вывода списка групп, в которых нет должников.
ВОЗМОЖНО, НЕВЕРНО
With
t as
(select distinct номер_студента, номер_дисциплины
from студенты с inner join группы г on с.номер_группы=Г.НОМЕР_ГРУППЫ
inner join учебные_планы уч on Г.КОД_СПЕЦИАЛЬНОСТИ=УЧ.КОД_СПЕЦИАЛЬНОСТИ
minus
select distinct номер_студента, номер_дисциплины
from успеваемость
where оценка > 2)
/*Представление содержит перечень долгов для каждого студента.*/
select distinct номер_группы
from группы
minus
select distinct номер_группы
from t inner join студенты с on t.номер_студента=с.номер_студента
group by номер_группы
having count(номер_дисциплины)>0
/*Из множества всех групп исключаем те, в которых общее количество долгов
у студентов больше 0.*/
14. Создать запрос для получения информации о группах:
Группа | Кол-во студентов | Название Специальности | Кол-во круглых отличников | Кол-во должников |
…… |
With
/*Оценки*/
t1 as
(select с.номер_студента, с.номер_группы, min(nvl(оценка,2)) min_Score
from студенты с inner join группы г on с.номер_группы=г.номер_группы
inner join учебные_планы уч on уч.код_специальности=г.код_специальности
left join успеваемость у on с.номер_студента=у.номер_студента and у.номер_дисциплины=уч.номер_дисциплины
GROUP BY с.номер_студента, с.номер_группы),
/*Должники*/
t2 as
(select номер_студента, номер_группы
from t1
where min_Score < 3), -студент мог пересдать полученную двойку
/*Отличники*/
t3 as
(select номер_студента, номер_группы
from t1
where min_Score = 5)
select номер_группы "Группа",
(select count(*) from студенты с where с.номер_группы = г.номер_группы) "Кол-во студентов",
название_специальности "Название Специальности",
(select count(*) from t3 where t3.номер_группы = г.номер_группы) "Кол-во круглых отличников",
(select count(*) from t2 where t2.номер_группы = г.номер_группы) "Кол-во должников"
from группы г inner join специальности сп on г.код_специальности=сп.код_специальности
GROUP BY номер_группы, название_специальности;
/*Считаем количество студентов, отличников и должников для каждой специальности.*/
15. Создать три таблицы Системы Автоматического Управления, Математическое Обеспечение ЭВМ, Вычислительные Сети и Системы. Используя возможности многотабличной вставки, записать в эти таблицы информацию о студентах в соответствии со специальностью, на которой они учатся.
CREATE TABLE САУ
(номер_студента number(5),
фамилия varchar2(15),
имя varchar2(15),
отчество varchar2(15),
стипендия number(7,2),
номер_группы varchar2(15));
CREATE TABLE Математическое_Обеспечение_ЭВМ
(номер_студента number(5),
фамилия varchar2(15),
имя varchar2(15),
отчество varchar2(15),
стипендия number(7,2),
номер_группы varchar2(15));
CREATE TABLE Вычислительные_Сети_и_Системы
(номер_студента number(5),
фамилия varchar2(15),
имя varchar2(15),
отчество varchar2(15),
стипендия number(7,2),
номер_группы varchar2(15));
COMMIT;
INSERT ALL
WHEN код_специальности = 1
THEN INTO САУ VALUES (номер_студента, фамилия, имя, отчество, стипендия, номер_группы)
WHEN код_специальности = 2
THEN INTO Математическое_Обеспечение_ЭВМ VALUES (номер_студента, фамилия, имя, отчество, стипендия, номер_группы)
WHEN код_специальности = 3
THEN INTO Вычислительные_Сети_и_Системы VALUES (номер_студента, фамилия, имя, отчество, стипендия, номер_группы)
SELECT *
FROM студенты NATURAL JOIN группы NATURAL JOIN специальности;
COMMIT;
SELECT *
FROM САУ;
SELECT *
FROM Математическое_Обеспечение_ЭВМ;
SELECT *
FROM Вычислительные_Сети_и_Системы;
16. Создать представление для получения информации по специальностям: Средняя оценка среди студентов специальности, сдавших экзамены; Количество студентов специальности, сдавших экзамены, Общее количество студентов на специальности.
drop view report_view;
CREATE VIEW Report_View ("Название специальности", "Средняя оценка", "Количество сдавших", "Всего студентов") AS
SELECT название_специальности, avg_score, COUNT(*), studs
FROM(
--выборка средних баллов студентов на специальности
SELECT DISTINCT название_специальности, номер_студента, AVG(оценка) OVER (PARTITION BY название_специальности) avg_score,
--считаем количество студентов, обучающихся на каждой специальности
(SELECT COUNT(*) FROM Специальности NATURAL JOIN Группы NATURAL JOIN Студенты WHERE Специальности.название_специальности = x.название_специальности) studs
FROM(
--считаем высший балл
SELECT номер_студента, название_специальности, оценка, MIN(nvl(оценка,0)) OVER (PARTITION BY номер_студента) min_score
FROM Студенты NATURAL JOIN Группы NATURAL JOIN Специальности LEFT JOIN Учебные_планы USING (код_специальности)
LEFT JOIN Успеваемость USING (номер_студента, номер_дисциплины)/*не учитываем студентов, сдававших экзамены не по их специальности*/) x
WHERE min_score > 2)
GROUP BY название_специальности, avg_score, studs;
Select * from Report_View;
17. Увеличить вдвое стипендию студентам, которые сдали все предусмотренные учебным планом для их специальности экзамены с первого раза на отлично.
update студенты
set стипендия = стипендия * 2
where номер_студента in
(select номер_студента
from студенты left join группы using(номер_группы) left join учебные_планы using (код_специальности) left join успеваемость using(номер_студента, номер_дисциплины)
group by номер_студента
-- если бы сдали не все экзамены не с первого раза, то средняя оценка была бы меньше 5
having avg(nvl(оценка, 0))=5);
select * from студенты;
18. Создать запрос для вывода всех дат, отсутствующих в некоторой последовательности дат. Например, в списке
16-11-2008
18-11-2008
19-11-2008
23-11-2008
отсутствуют даты:
17-11-2008
20-11-2008
21-11-2008
22-11-2008
Граница последовательности дат должна определяться некоторым (в данном случае максимальным) значением даты.
Create table DateList (
dates date)
;
--тестовые данные
Insert All
Into DateList Values (TO_DATE('16-11-2008','DD-MM-YYYY'))
Into DateList Values (TO_DATE('18-11-2008','DD-MM-YYYY'))
Into DateList Values (TO_DATE('19-11-2008','DD-MM-YYYY'))
Into DateList Values (TO_DATE('23-11-2008','DD-MM-YYYY'))
select * from dual
commit
;
--генерируем даты в заданном промежутке
Select MinDate + level
From (Select min(dates) as MinDate, max(dates) as MaxDate From DateList)
CONNECT BY MinDate + level < MaxDate
Minus
--убираем те, которые уже есть
Select * From DateList
19. Создать запрос, который позволит получить информацию о таблицах схемы HR в виде:
Главная таблица | Список столбцов первичного ключа | Список подчиненных таблиц | Список вторичных ключей |
В качестве разделителей в списках использовать запятую. Для каждого вторичного ключа в скобках указать список столбцов.
ВОЗМОЖНО, НЕВЕРНО
with
cons as
(select table_name tn, constraint_type ct, CONSTRAINT_NAME cn, R_CONSTRAINT_NAME rn,column_name cn1
from all_constraints natural join all_cons_columns
where owner = 'HR'
And constraint_type in('R','P'))
/*Представление содержит необходимую информацию о таблицах схемы HR.*/
select c1.tn "Главная таблица",wm_concat(distinct c1.cn1) "Список столбцов первич ключа",
wm_concat(c2.tn) "Список подчиненных таблиц",wm_concat(c2.cn1) "Список вторичных ключей"
from cons c1 inner join cons c2 on c1.cn=c2.rn AND c1.ct='P'
group by c1.tn;
20. Создать запрос для распознавания строк, заключенных в двойные кавычки. Предполагается, что любой символ может быть в строке, в том числе и двойные кавычки, если им предшествует нечетное число обратных слэшей.
ВОЗМОЖНО, НЕВЕРНО
select mySubstr
from(select mySubstr
-- length(mySubstr) - length(Rtrim(mySubstr, '\') это собственно число обратных слешей в конце строки, считаем для каждой подстроки, получееной на предыдущем шаге
from (select mySubstr, length(mySubstr) - length(Rtrim(mySubstr, '\')) as slash_count
-- анализ строки, ищем level + 1 (+1, потому что первые кавычки это начало строки) вхождение кавычек. В таблицу помещаем подстроку от начала строки до текущих кавычек
from (select substr(input,1,instr(input, '"',1,level + 1) - 1) as mySubstr
-- обрезаем начало строки до первых двойных кавычек (т.к. искомая строка заключена между двойными кавычками)
from (select substr(input, instr(input, '"') + 1) as input
-- ввод строки
from (select '&input' as input from dual))
Connect by (instr(input, '"',1,level) > 0)))
-- выбираем только те подстроки, где в конце нет либо четное число слешей
where mod(slash_count, 2) = 0)
-- первая такая подстрока и будет ответом
where rownum = 1
ВАРИАНТ 5
(Базы данных Студент и Human Resources)
1. Создать запрос, возвращающий один столбец, содержащий календарь на текущий месяц текущего года:
· номер дня в месяце (две цифры),
· полное название месяца по-английски заглавными буквами (в верхнем регистре),
· год (четыре цифры),
· полное название дня недели по-английски строчными буквами (в нижнем регистре)
Каждое "подполе" должно быть отделено от следующего одним пробелом. В результате не должно быть начальных и хвостовых пробелов. Количество возвращаемых строк должно точно соответствовать количеству дней в текущем месяце. Строки должны быть упорядочены по номерам дней в месяце по возрастанию.
SELECT to_char(trunc(sysdate, 'mm')+level-1, 'dd fmMONTH yyyy day', 'NLS_DATE_LANGUAGE=AMERICAN') calendar
FROM DUAL
CONNECT BY level <= to_char(last_day(sysdate), 'dd')
ORDER BY substr(calendar, 1,2);
Результат:
CALENDAR
---------------------------
01 MAY 2012 tuesday
02 MAY 2012 wednesday
03 MAY 2012 thursday
04 MAY 2012 friday
05 MAY 2012 saturday
06 MAY 2012 sunday
07 MAY 2012 monday
…
29 MAY 2012 tuesday
30 MAY 2012 wednesday
31 MAY 2012 thursday
31 rows selected
Комментарий:
Обрезаем системную дату до месяца. Затем строим с помощью конструкции level календарь до последнего числа этого месяца. С помощью функции преобразования to_char приводим календарь к нужному виду(NLS_DATE_LANGUAGE=AMERICAN – для того, чтобы названия месяце и дней выводились на английском языке). Затем сортируем по номерам дней.
2. Создать запрос для вывода сведений о сотрудниках, которые подчиняются тем же непосредственным руководителям, что и сотрудники Rajs или Abel, работают в тех же подразделениях компании, что и сотрудники Rajs или Abel. Сведения о сотрудниках Rajs и Abel выводить не нужно
Требуется вывести: Фамилию сотрудника, Название должности сотрудника, Фамилию непосредственного руководителя сотрудника, Название подразделения компании, где работает сотрудник.
Сведения должны быть отсортированы по возрастанию: по названию подразделения компании, где работает сотрудник; по фамилии сотрудника.
SELECT t.last_name, jobs.job_title, e.last_name manager, d.department_name
FROM (SELECT last_name, job_id, manager_id, department_id
FROM employees
where (manager_id, department_id) in
(
select manager_id, department_id
from employees
where last_name in ('Rajs', 'Abel')
)
and last_name not in ('Rajs', 'Abel')
) t
INNER JOIN employees e
ON t.manager_id = e.employee_id
INNER JOIN jobs
ON jobs.job_id = t.job_id
INNER JOIN departments d
ON d.department_id = t.department_id
ORDER BY d.department_name, t.last_name;
LAST_NAME JOB_TITLE MANAGER DEPARTMENT_NAME
------------------- ----------------------------------- ------------------------- --------------------------------
Hutton Sales Representative Zlotkey Sales
Johnson Sales Representative Zlotkey Sales
Livingston Sales Representative Zlotkey Sales
Taylor Sales Representative Zlotkey Sales
Davies Stock Clerk Mourgos Shipping
Feeney Shipping Clerk Mourgos Shipping
Grant Shipping Clerk Mourgos Shipping
Matos Stock Clerk Mourgos Shipping
OConnell Shipping Clerk Mourgos Shipping
Vargas Stock Clerk Mourgos Shipping
Walsh Shipping Clerk Mourgos Shipping
11 rows selected
Комментарий:
В подзапросе выбираем сотрудников, которые подчиняются тем же руководителям, что и Rajs или Abel и работают в тех же подразделениях. При этом исключая информацию о самих Rajs или Abel. Затем полученную выборку соединяем с таблицей employers, чтобы узнать какой сотрудник какому менеждеру подчиняется. Потом соединяем с таблицей Jobs, чтобы узнать должность каждого сотрудника. И наконец соединяем с таблицей departments, чтобы определить департамент. Результат сортируем.
3. Создать запрос для вывода сведений о сотрудниках компании, оклады которых наиболее близки к среднему окладу по подразделению, к которому они приписаны. Требуется вывести: Идентификатор сотрудника, Фамилию сотрудника, Идентификатор должности, которую занимает сотрудник, Идентификатор подразделения, к которому приписан сотрудник, Оклад, установленный сотруднику, Средний оклад по подразделению, к которому приписан сотрудник (округлить до целых).
Сведения должны быть отсортированы по возрастанию: по идентификатору подразделения, к которому приписан сотрудник; по окладу, установленному сотруднику; по фамилии сотрудника.
WITH
tab1 AS (SELECT employee_id, last_name, job_id, department_id, salary, sal_dep, deviation,
rank() OVER (PARTITION BY department_id ORDER BY deviation) rn
FROM (SELECT employee_id, last_name, job_id, department_id, salary,
round(AVG(salary) OVER (PARTITION BY department_id)) sal_dep,
abs(salary-round(AVG(salary) OVER (PARTITION BY department_id))) deviation
FROM employees))
SELECT employee_id, last_name, job_id, department_id, salary, sal_dep
FROM tab1
WHERE rn =1 and department_id IS NOT NULL
ORDER BY department_id, salary, last_name;
EMP_ID LAST_NAME JOB_ID DEPARTMENT_ID SALARY SAL_DEP
200 Whalen AD_ASST 10 4400 4400
202 Fay MK_REP 20 6000 9500
201 Hartstein MK_MAN 20 13000 9500
115 Khoo PU_CLERK 30 3100 4150
203 Mavris HR_REP 40 6500 6500
141 Rajs ST_CLERK 50 3500 3476
104 Ernst IT_PROG 60 6000 5760
204 Baer PR_REP 70 10000 10000
152 Hall SA_REP 80 9000 8956
158 McEwen SA_REP 80 9000 8956
102 De Haan AD_VP 90 17000 19333
101 Kochhar AD_VP 90 17000 19333
110 Chen FI_ACCOUNT 100 8200 8600
109 Faviet FI_ACCOUNT 100 9000 8600
206 Gietz AC_ACCOUNT 110 8300 10150
205 Higgins AC_MGR 110 12000 10150
16 rows selected
Комментарий:
Выбираем средний оклад по подразделениям. Затем находим отклонения зарплаты каждого сотрудника от средней зарплаты и ранжируем по отклонению. Сведения о сотрудниках компании, оклады которых наиболее которых наиболее близки к среднему окладу по подразделению, к которому они приписаны находятся в строках, пронумерованных единицей (rn = 1).
4. Вывести информацию о сотрудниках, приписанных к отделам компании с номерами 10, 30, 50, 90.
Выборка должна быть отсортирована: по номеру отдела компании (по возрастанию); по окладу сотрудника (по убыванию); по фамилии сотрудника (по возрастанию).
Вывод команды SELECT должен содержать столбцы:
a. Сквозной порядковый номер сотрудника в выборке.
b. Порядковый номер сотрудника внутри подвыборки по подразделению компании.
c. Идентификатор подразделения компании, к которому приписан данный сотрудник.
d. Идентификатор должности сотрудника.
e. Фамилия сотрудника.
f. Оклад, установленный сотруднику.
g. Ранг оклада сотрудника в подразделении компании, где он работает (Самый большой
оклад имеет ранг=1, следующий - ранг=2 и т.д.)
Номер отдела должен быть выведен только один раз.
Пример результирующей выборки:
ЕМР_NUM | ЕМР_NUM_IN_DEPT | DEPTNO | JOB | ENAME | SAL | DEPT_SAL_RANK |
PRESIDENT | KING | |||||
MANAGER | CLARK | |||||
CLERK | MILLER | |||||
MANAGER | BLAKE | |||||
SALESMAN | ALLEN | |||||
SALESMAN | TURNER | |||||
SALESMAN | MARTIN | |||||
SALESMAN | WARD | |||||
CLERK | JAMES |
Дата добавления: 2015-08-18; просмотров: 97 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Main_Table PK User_Constraints 1 страница | | | Main_Table PK User_Constraints 3 страница |