Управление данными УД / Управление данными_ИСТ-11-12-15 / ИСТ-12 / 3-Основы языка SQL / Ципуринда лаб 3
.docxСанкт-Петербургский Государственный Университет Телекоммуникаций имени проф. М.А. Бонч-Бруевича
Факультет Информационных систем и технологий Кафедра Информационных и управляющих систем
Отчет к лабораторной работе №3
«Основы языка SQL»
По дисциплине: Управление данными
Выполнил: Ципуринда С.Л.
Группа ИСТ-12
Преподаватель:
Сабинин О.Ю.
Санкт-Петербург
2014
Задание:
-
Подключение к СУБД Oracle
Запустить SQL Developer
Создать новое соединение:
Connection Name: Фамилия
Username: hr
Password: hr
Hostname: localhost
Port: 1521
SID: xe
-
Используя Data Modeler получить реляционную модель. Изучить структуру и информацию в таблицах
Описание схемы HR
В записях о штате сотрудников каждый сотрудник имеет идентификационный номер, адрес электронной почты, идентификатор должности, оклад и (идентификатор) руководителя. Некоторые сотрудники дополнительно к окладу зарабатывают комиссионные.
Также компания хранит информацию о должностях в рамках организации. У каждой должности есть идентификатор, название и диапазон ("вилка") окладов.
Некоторые сотрудники долгое время работают в компании и занимали в ней разные должности. При уходе сотрудника с должности записываются сведения о продолжительности его работы в данной должности, её идентификатор и подразделение, в котором работал сотрудник.
Компания из данного примера работает в нескольких регионах, поэтому хранятся сведения о местах расположения её складов и подразделений. Каждый сотрудник приписан к одному подразделению, а каждое подразделение идентифицируется уникальным номером. Каждое подразделение связано (находится во взаимно однозначном соответствии) с одним местоположением, а для каждого местоположения хранится полный адрес, содержащий название улицы, почтовый индекс, город, штат или область и код страны.
Для местоположений подразделений и складов хранится детализированная информация: название страны и географический регион, где расположена страна.
Диаграмма Сущность-Связь

-
Синтаксис команды SELECT:
SELECT * | список столбцов
FROM имена таблиц
WHERE условие отбора строк
GROUP BY список столбцов для группировки
HAVING условие отбора сгруппированных строк
ORDER BY список столбцов для сортировки
Ход работы:
-
Вывести всю информацию из таблицы 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 employees
ORDER BY-Salary;

-
Определить сумму зарплат, среднюю зарплату и количество сотрудников.
SELECT sum(salary), AVG(salary), count(employee_id) FROM Employees;

-
Вывести текущую дату.
SELECT sysdate from dual;

-
Вывести дату и день недели, которые будут через 1000 дней. Информацию вывести в виде:
22-Апрель-2017, Пятница
SELECT to_char(sysdate+10000,'DD-FMMonth-YYYY, Day','NLS_DATE_LANGUAGE=Russian')
FROM DUAL;

-
Определить количество прожитых Вами часов.
SELECT (SYSDATE-TO_DATE('17 Aug 1994','DD Mon YYYY'))*24 FROM DUAL;

-
Определить день недели, который будет через 1000 дней.
SELECT to_char(sysdate+10000,'day','nls_date_language=russian')
from dual;

-
Определить полное количество прожитых Вами лет, количество полных месяцев (которые не вошли в полные года) и количество дней. Пример результата:
25 лет. 10 мес. 5 дн.
SELECT
TRUNC(MONTHS_BETWEEN(SYSDATE, to_date('17081994', 'DDMMYYYY'))/12) || 'лет.' ||
TRUNC(MONTHS_BETWEEN(SYSDATE, (ADD_MONTHS(to_date('01081994', 'DDMMYYYY'),
(TRUNC(MONTHS_BETWEEN(SYSDATE, to_date('17081994', 'DDMMYYYY'))/12))*12)))) || 'мес.' ||
TRUNC(SYSDATE - ADD_MONTHS((ADD_MONTHS(to_date('17081994', 'DDMMYYYY'),
(TRUNC(MONTHS_BETWEEN(SYSDATE, to_date('17081994', 'DDMMYYYY'))/12))*12)),
TRUNC(MONTHS_BETWEEN(SYSDATE, (ADD_MONTHS(to_date('17081994', 'DDMMYYYY'),
(TRUNC(MONTHS_BETWEEN(SYSDATE, to_date('17081994', 'DDMMYYYY'))/12))*12)))))) || 'дн.'
FROM DUAL;

-
Выделить второе слово в адресе отдела (Таблица Locacions).
SELECT
SUBSTR(street_address,
INSTR(street_address,' ',1)+1,
INSTR(street_address ||' ',' ',
INSTR(street_address,' ',1)+1)-INSTR(street_address,' ',1))
FROM locations;

-
Определить сумму цифр в произвольном символьном выражении. Например, для выражения
Fg4h55jkl37
результат должен быть: 25.
WITH STR AS (SELECT 'Fg4h55jk137' X FROM dual)
SELECT 1 * (LENGTH(X) - LENGTH (REPLACE(X, '1', '')))
+ 2 * (LENGTH(X) - LENGTH(REPLACE(X, '2', '')))
+ 3 * (LENGTH(X) - LENGTH(REPLACE(X, '3', '')))
+ 4 * (LENGTH(X) - LENGTH(REPLACE(X, '4', '')))
+ 5 * (LENGTH(X) - LENGTH(REPLACE(X, '5', '')))
+ 6 * (LENGTH(X) - LENGTH(REPLACE(X, '6', '')))
+ 7 * (LENGTH(X) - LENGTH(REPLACE(X, '7', '')))
+ 8 * (LENGTH(X) - LENGTH(REPLACE(X, '8', '')))
+ 9 * (LENGTH(X) - LENGTH(REPLACE(X, '9', '')))
FROM STR;

-
Определить список сотрудников, принятых на работу в 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 last_name LIKE '%a%a%a%' AND commission_pct IS NULL;

-
В произвольной символьной строке оставить между словами только по одному пробелу.
SELECT
REPLACE(REPLACE(REPLACE('12 gh kl', ' ', ' _'), '_ '), '_')
FROM DUAL;

-
Написать команду, которая позволит выводить фамилию сотрудника через запятую столько раз, сколько букв в его фамилии.
SELECT
LPAD(last_name,(LENGTH(last_name)*(LENGTH(last_name)+2)-2),last_name||', ')
FROM EMPLOYEES;

