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

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

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

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

«Основы языка SQL»

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

Выполнил: Ципуринда С.Л.

Группа ИСТ-12

Преподаватель:

Сабинин О.Ю.

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

2014

Задание:

  1. Подключение к СУБД Oracle

Запустить SQL Developer

Создать новое соединение:

Connection Name: Фамилия

Username: hr

Password: hr

Hostname: localhost

Port: 1521

SID: xe

  1. Используя Data Modeler получить реляционную модель. Изучить структуру и информацию в таблицах

Описание схемы HR

В записях о штате сотрудников каждый сотрудник имеет идентификационный номер, адрес электронной почты, идентификатор должности, оклад и (идентификатор) руководителя. Некоторые сотрудники дополнительно к окладу зарабатывают комиссионные.

Также компания хранит информацию о должностях в рамках организации. У каждой должности есть идентификатор, название и диапазон ("вилка") окладов.

Некоторые сотрудники долгое время работают в компании и занимали в ней разные должности. При уходе сотрудника с должности записываются сведения о продолжительности его работы в данной должности, её идентификатор и подразделение, в котором работал сотрудник.

Компания из данного примера работает в нескольких регионах, поэтому хранятся сведения о местах расположения её складов и подразделений. Каждый сотрудник приписан к одному подразделению, а каждое подразделение идентифицируется уникальным номером. Каждое подразделение связано (находится во взаимно однозначном соответствии) с одним местоположением, а для каждого местоположения хранится полный адрес, содержащий название улицы, почтовый индекс, город, штат или область и код страны.

Для местоположений подразделений и складов хранится детализированная информация: название страны и географический регион, где расположена страна.

Диаграмма Сущность-Связь

  1. Синтаксис команды SELECT:

SELECT * | список столбцов

FROM имена таблиц

WHERE условие отбора строк

GROUP BY список столбцов для группировки

HAVING условие отбора сгруппированных строк

ORDER BY список столбцов для сортировки

Ход работы:

  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 employees

ORDER BY-Salary;

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

SELECT sum(salary), AVG(salary), count(employee_id) FROM Employees;

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

SELECT sysdate from dual;

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

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

SELECT to_char(sysdate+10000,'DD-FMMonth-YYYY, Day','NLS_DATE_LANGUAGE=Russian')

FROM DUAL;

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

SELECT (SYSDATE-TO_DATE('17 Aug 1994','DD Mon YYYY'))*24 FROM DUAL;

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

SELECT to_char(sysdate+10000,'day','nls_date_language=russian')

from dual;

  1. Определить полное количество прожитых Вами лет, количество полных месяцев (которые не вошли в полные года) и количество дней. Пример результата:

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;

  1. Выделить второе слово в адресе отдела (Таблица Locacions).

SELECT

SUBSTR(street_address,

INSTR(street_address,' ',1)+1,

INSTR(street_address ||' ',' ',

INSTR(street_address,' ',1)+1)-INSTR(street_address,' ',1))

FROM locations;

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

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;

  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 last_name LIKE '%a%a%a%' AND commission_pct IS NULL;

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

SELECT

REPLACE(REPLACE(REPLACE('12 gh kl', ' ', ' _'), '_ '), '_')

FROM DUAL;

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

SELECT

LPAD(last_name,(LENGTH(last_name)*(LENGTH(last_name)+2)-2),last_name||', ')

FROM EMPLOYEES;