Скачиваний:
68
Добавлен:
15.03.2015
Размер:
360.16 Кб
Скачать

Санкт-Петербургский Государственный Университет Телекоммуникаций имени проф. М.А. Бонч-Бруевича

Факультет Информационных систем и технологий Кафедра Безопасности информационных систем

Отчет по лабораторной работе №3

По дисциплине: Управление данными

Выполнил: Николаев А.Н., ИСТ-12

Преподаватель: Сабинин О.Ю.

Санкт-Петербург

2014

Создаем реляционную модель.

Выполняем запросы:

  1. Вывод всей информации из таблицы EMPLOYEES.

SELECT * FROM EMPLOYEES;

Результат:

  1. Вывести фамилии сотрудников и зарплаты сотрудников, получающих зарплату, большую 10000. Фамилии сотрудников вывести заглавными буквами.

SELECT UPPER(LAST_NAME), SALARY FROM EMPLOYEES

WHERE SALARY > 10000;

Результат:

  1. Вывести фамилии сотрудников с фамилиями, начинающимися на букву K и имеющими букву n на третьем месте.

SELECT LAST_NAME FROM EMPLOYEES

WHERE LAST_NAME LIKE ‘K_n%’;

  1. Вывести фамилии сотрудников и первые буквы имен (в одном столбце), а также зарплату с добавленным знаком $. Имена столбцов вывести по-русски. Отсортировать в порядке убывания зарплат.

SELECT LAST_NAME||’ ‘||SUBSTR(FIRST_NAME, 1, 1) AS “ФАМИЛИЯ_ИМЯ”, SALARY||’$’ AS “ЗАРПЛАТА” FROM EMPLOYEE;

Результат:

  1. Определить сумму зарплат, среднюю зарплату и количество сотрудников.

SELECT SUM(SALARY), AVG(SALARY), COUNT(EMPLOYEE_ID) FROM EMPLOYEES;

Результат:

  1. Вывести текущую дату.

SELECT SYSDATE

FROM DUAL;

Результат:

  1. Вывести дату и день недели, которые будут через 1000 дней. Информацию вывести в виде

22-Апрель-2017, Пятница

SELECT to_char (SYSDATE+1000, 'DD-FMMONTH-YYYY, DAY', 'NLS_Date_Language=Russian') AS "IN 1000 DAYS"

FROM DUAL;

Результат:

  1. Определить количество прожитых Вами часов.

SELECT ((SYSDATE-TO_DATE(‘15-10-1993’, ‘DD-MM-YYYY’))*24) AS “HOURS LIVED”

FROM DUAL;

Результат:

  1. Определить день недели, который будет через 1000 дней.

SELECT TO_CHAR(SYSDATE+1000, ‘DAY’) AS “IN 1000 DAYS”

FROM DUAL;

  1. 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;

  1. Выделить второе слово в адресе отдела (Таблица 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;

  1. Определить сумму цифр в произвольном символьном выражении.

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;

  1. Определить список сотрудников, принятых на работу в 2004-м году, даты приема на работу и зарплаты. Имена столбцов должны быть - Фамилия, Дата приема на работу, Зарплата.

SELECT LAST_NAME "Фамилия", HIRE_DATE "Дата принятия", SALARY "Зарплата"

FROM EMPLOYEES

WHERE HIRE_DATE >= to_date('010104', 'DDMMYY') AND HIRE_DATE <= to_date('311204', 'DDMMYY');

  1. Вывести список сотрудников, имеющих три буквы a в фамилии (независимо от регистра) и не имеющих комиссионных процентов.

SELECT LAST_NAME "Фамилия"

FROM EMPLOYEES

WHERE LOWER(LAST_NAME) LIKE '%a%a%a%' AND COMMISSION_PCT IS NULL;

  1. В произвольной символьной строке оставить между словами только по одному пробелу.

SELECT REPLACE(REPLACE(REPLACE('1 2 3', ' ', ' A'), 'A ', ''), 'A', '') "TO 1 SPACE"

FROM DUAL;

  1. Написать команду, которая позволит выводить фамилию сотрудника через запятую столько раз, сколько букв в его фамилии.

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;