Управление данными УД / Управление данными_ИСТ-11-12-15 / ИСТ-12 / 3-Основы языка SQL / Николаев А.Н. 3
.docxСанкт-Петербургский Государственный Университет Телекоммуникаций имени проф. М.А. Бонч-Бруевича
Факультет Информационных систем и технологий Кафедра Безопасности информационных систем
Отчет по лабораторной работе №3
По дисциплине: Управление данными
Выполнил: Николаев А.Н., ИСТ-12
Преподаватель: Сабинин О.Ю.
Санкт-Петербург
2014
Создаем реляционную модель.

Выполняем запросы:
-
Вывод всей информации из таблицы EMPLOYEES.
SELECT * FROM EMPLOYEES;
Результат:

-
Вывести фамилии сотрудников и зарплаты сотрудников, получающих зарплату, большую 10000. Фамилии сотрудников вывести заглавными буквами.
SELECT UPPER(LAST_NAME), SALARY FROM EMPLOYEES
WHERE SALARY > 10000;
Результат:

-
Вывести фамилии сотрудников с фамилиями, начинающимися на букву K и имеющими букву n на третьем месте.
SELECT LAST_NAME FROM EMPLOYEES
WHERE LAST_NAME LIKE ‘K_n%’;

-
Вывести фамилии сотрудников и первые буквы имен (в одном столбце), а также зарплату с добавленным знаком $. Имена столбцов вывести по-русски. Отсортировать в порядке убывания зарплат.
SELECT LAST_NAME||’ ‘||SUBSTR(FIRST_NAME, 1, 1) AS “ФАМИЛИЯ_ИМЯ”, SALARY||’$’ AS “ЗАРПЛАТА” FROM EMPLOYEE;
Результат:

-
Определить сумму зарплат, среднюю зарплату и количество сотрудников.
SELECT SUM(SALARY), AVG(SALARY), COUNT(EMPLOYEE_ID) FROM EMPLOYEES;
Результат:
![]()
-
Вывести текущую дату.
SELECT SYSDATE
FROM DUAL;
Результат:
![]()
-
Вывести дату и день недели, которые будут через 1000 дней. Информацию вывести в виде
22-Апрель-2017, Пятница
SELECT to_char (SYSDATE+1000, 'DD-FMMONTH-YYYY, DAY', 'NLS_Date_Language=Russian') AS "IN 1000 DAYS"
FROM DUAL;
Результат:
![]()
-
Определить количество прожитых Вами часов.
SELECT ((SYSDATE-TO_DATE(‘15-10-1993’, ‘DD-MM-YYYY’))*24) AS “HOURS LIVED”
FROM DUAL;
Результат:
![]()
-
Определить день недели, который будет через 1000 дней.
SELECT TO_CHAR(SYSDATE+1000, ‘DAY’) AS “IN 1000 DAYS”
FROM DUAL;
![]()
-
SELECT TRUNC(MONTHS_BETWEEN(SYSDATE, to_date('15101993', 'DDMMYYYY'))/12) YEARS,
TRUNC(MONTHS_BETWEEN(SYSDATE, (ADD_MONTHS(to_date('15101993', 'DDMMYYYY'), (TRUNC(MONTHS_BETWEEN(SYSDATE, to_date('15101993', 'DDMMYYYY'))/12))*12)))) MONTHS,
TRUNC(SYSDATE - ADD_MONTHS((ADD_MONTHS(to_date('15101993', 'DDMMYYYY'), (TRUNC(MONTHS_BETWEEN(SYSDATE, to_date('15101993', 'DDMMYYYY'))/12))*12)),
TRUNC(MONTHS_BETWEEN(SYSDATE, (ADD_MONTHS(to_date('15101993', 'DDMMYYYY'), (TRUNC(MONTHS_BETWEEN(SYSDATE, to_date('15101993', 'DDMMYYYY'))/12))*12)))))) DAYS
FROM DUAL;
![]()
-
Выделить второе слово в адресе отдела (Таблица Locacions).
SELECT CASE
WHEN INSTR(STREET_ADDRESS, ' ', 1, 2) = 0 THEN SUBSTR(STREET_ADDRESS, INSTR(STREET_ADDRESS, ' ', 1, 1), LENGTH(STREET_ADDRESS) - INSTR(STREET_ADDRESS, ' ', 1, 1) + 1)
WHEN INSTR(STREET_ADDRESS, ' ', 1, 2) > 1 THEN SUBSTR(STREET_ADDRESS, INSTR(STREET_ADDRESS, ' ', 1, 1), INSTR(STREET_ADDRESS, ' ', 1, 2) - INSTR(STREET_ADDRESS, ' ', 1, 1))
END AS "SECOND WORD"
FROM LOCATIONS;

-
Определить сумму цифр в произвольном символьном выражении.
SET serveroutput ON;
DECLARE
s NUMBER := 0;
str VARCHAR(9) := '8i9ok7jh5';
BEGIN
FOR i IN 1..LENGTH(str)
LOOP IF (SUBSTR(str, i, 1)) >= '0' AND (SUBSTR(str, i, 1)) <= '9'
THEN s := s + (SUBSTR(str, i, 1));
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(s);
END;

-
Определить список сотрудников, принятых на работу в 2004-м году, даты приема на работу и зарплаты. Имена столбцов должны быть - Фамилия, Дата приема на работу, Зарплата.
SELECT LAST_NAME "Фамилия", HIRE_DATE "Дата принятия", SALARY "Зарплата"
FROM EMPLOYEES
WHERE HIRE_DATE >= to_date('010104', 'DDMMYY') AND HIRE_DATE <= to_date('311204', 'DDMMYY');

-
Вывести список сотрудников, имеющих три буквы a в фамилии (независимо от регистра) и не имеющих комиссионных процентов.
SELECT LAST_NAME "Фамилия"
FROM EMPLOYEES
WHERE LOWER(LAST_NAME) LIKE '%a%a%a%' AND COMMISSION_PCT IS NULL;

-
В произвольной символьной строке оставить между словами только по одному пробелу.
SELECT REPLACE(REPLACE(REPLACE('1 2 3', ' ', ' A'), 'A ', ''), 'A', '') "TO 1 SPACE"
FROM DUAL;

-
Написать команду, которая позволит выводить фамилию сотрудника через запятую столько раз, сколько букв в его фамилии.
SET SERVEROUTPUT ON;
BEGIN
FOR item in (SELECT * FROM EMPLOYEES)
LOOP
FOR i IN 1..LENGTH(item.LAST_NAME)
LOOP
IF i < LENGTH(item.LAST_NAME) THEN DBMS_OUTPUT.PUT(item.LAST_NAME||', '); END IF;
IF i = LENGTH(item.LAST_NAME) THEN DBMS_OUTPUT.PUT(item.LAST_NAME); END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE('');
END LOOP;
END;

