
- •Содержание
- •Основные понятия
- •Понятие данных
- •Файловые системы
- •Системы баз данных
- •История развития субд
- •Трехуровневая архитектура ansi/sparc
- •Общая характеристика моделей данных
- •Основные понятия модели данных
- •Представление статических и динамических свойств
- •Общая характеристика структурных компонентов. Множества: домены и атрибуты
- •Общая характеристика структурных компонентов. Отношения: сущности
- •Общая характеристика структурных компонентов. Отношения: связи
- •Общая характеристика ограничений целостности
- •Модель данных «сущность – связь»
- •Уровни представления информации
- •Уровень 1 – информация о сущностях и связях
- •Уровень 2. Структура информации
- •Ограничения целостности в модели сущность-связь
- •Расширенная модель данных сущность-связь: нотация idef1x
- •Реляционная модель данных
- •Базовые структурные компоненты реляционной модели данных
- •Целостная часть реляционной модели данных
- •Языковые средства описания данных
- •Манипуляционная часть реляционной модели данных
- •Подмножество sql для манипулирования данными
- •Примеры написания запросов
- •I. И еще несколько примеров написания запросов из документации [10]
- •Краткая характеристика языка sql pl db2® udb
- •Дополнительные возможности описания ограничений целостности
- •Дополнительные возможности db2
- •Описание данных
- •Манипулирование данными
- •Дополнительные возможности формирования запросов
- •Типы данных, определенные пользователем
- •Функции, определенные пользователем
- •Теория проектирования реляционных баз данных
- •Цели проектирования
- •Функциональные зависимости
- •1. Рефлексивность
- •2. Пополнение
- •3. Транзитивность
- •4. Псевдотранзитивность
- •5. Аддитивность (объединение)
- •6. Декомпозиция (проективность)
- •7. Композиция
- •Нормализация отношений
- •Внутренние структуры хранения
- •Структурная схема обработки запроса
- •Бинарные деревья
- •Многоходовые деревья
- •Сравнение методов индексирования
- •Создание индексов в db2®
- •Организация файлов базы данных в db2®
I. И еще несколько примеров написания запросов из документации [10]
Используются таблицы из базы данных Sample.
Получить всю информацию, хранящуюся в таблице EMPLOYEE.
SELECT * FROM EMPLOYEE
Соединить таблицы EMP_ACT и EMPLOYEE, выбрать все колонки из таблицы EMP_ACT и добавить фамилию сотрудника (LastName) из таблицы EMPLOYEE к каждой строке результата.
SELECT EMP_ACT.*, LastName
FROM EMP_ACT, EMPLOYEE
WHERE EMP_ACT.EmpNo = EMPLOYEE.EmpNo
Соединить таблицы EMPLOYEE и DEPARTMENT, выбрать номер сотрудника (EmpNo), фамилию (LastName), номер отдела (WorkDept в таблице EMPLOYEE или DeptNo в таблице DEPARTMENT) и название отдела (DeptName) для всех сотрудников, родившихся (Birthdate) ранее 1930 года.
SELECT EmpNo, LastName, WorkDept, DeptName
FROM EMPLOYEE, DEPARTMENT
WHERE WorkDept = DeptNo AND YEAR(Birthdate) < 1930
Выбрать должность (JOB) и минимальный и максимальный оклады (Salary) для каждой группы строк с одинаковым кодом должности из таблицы EMPLOYEE, но только для тех групп, которые содержат более одной строки и имеют максимальный оклад, не меньший, чем 27000.
SELECT Job, MIN(Salary), MAX(Salary)
FROM EMPLOYEE
GROUP BY Job
HAVING COUNT(*) > 1 AND MAX(Salary) >= 27000
Выбрать все строки из таблицы EMP_ACT для сотрудников (EmpNo) из отдела (WorkDept) ‘E11’ (номера отделов, в которых работают сотрудники, находятся в таблице EMPLOYEE).
SELECT * FROM EMP_ACT
WHERE EmpNo IN
(SELECT EmpNo FROM EMPLOYEE
WHERE WorkDept = ’E11’)
Из таблицы EMPLOYEE выбрать номер отдела (WorkDept) и максимальный оклад в отделе (Salary) для всех отделов, у которых максимальный оклад меньше среднего оклада всех сотрудников.
SELECT WorkDept, MAX(Salary)
FROM EMPLOYEE
GROUP BY WorkDept
HAVING MAX(Salary) < (SELECT AVG(Salary)
FROM EMPLOYEE)
Подзапрос, включенный в конструкцию HAVING, выполнится в данном примере только один раз.
Используя таблицу EMPLOYEE, выбрать номер отдела (WorkDept) и максимальный оклад в отделе (Salary) для всех отделов, у которых максимальный оклад меньше среднего оклада по всем отделам.
SELECT WorkDept, MAX(Salary)
FROM EMPLOYEE EMP_COR
GROUP BY WorkDept
HAVING MAX(Salary) < (SELECT AVG(Salary)
FROM EMPLOYEE
WHERE NOT WorkDept = EMP_COR. WorkDept)
В отличие от примера A6, в этом примере подзапрос в конструкции HAVING должен выполняться для каждой группы.
Определить номера сотрудников, занимающих должности SALESREP, и их оклады, представленные вместе со средним окладом и общим количеством сотрудников в отделах, в которых работают данные сотрудники.
Этот запрос, прежде всего, должен создать вложенное табличное выражение (DINFO), для того чтобы получить колонки AvgSalary и EmpCount, а также колонку DeptNo, которая используется в конструкции WHERE.
SELECT THIS_EMP.EmpNo, THIS_EMP.Salary, DINFO.AvgSalary, DINFO.EmpCount
FROM EMPLOYEE THIS_EMP,
(SELECT OTHERS.WorkDept AS DeptNo,
AVG(OTHERS.Salary) AS AvgSalary,
COUNT(*) AS EmpCount
FROM EMPLOYEE OTHERS
GROUP BY OTHERS.WorkDept
) AS DINFO
WHERE THIS_EMP.Job = 'SALESREP'
AND THIS_EMP.WorkDept = DINFO.DeptNo
Использование в данном примере вложенного табличного выражения избавляет от необходимости создания обычного представления DINFO.
Вывести средний уровень образования и зарплату сотрудников для пяти случайных групп сотрудников.
Этот запрос требует использования вложенного табличного выражения для присваивания каждому сотруднику некоторого случайного значения, так чтобы в дальнейшем это значение можно было использовать в конструкции GROUP BY.
SELECT RandID, AVG(EdLevel), AVG(Salary)
FROM (SELECT EdLevel, Salary, INTEGER(RAND() * 5) AS RandID
FROM EMPLOYEE
) AS EMPRAND
GROUP BY RandID
Выполнить запрос к таблице EMP_ACT и вернуть те номера проектов, которые имеют сотрудников, чья зарплата входит в первую десятку наибольших зарплат по всем сотрудникам.
SELECT EMP_ACT.EmpNo,ProjNo
FROM EMP_ACT
WHERE EMP_ACT.EmpNo IN
(SELECT EMPLOYEE.EmpNo
FROM EMPLOYEE
ORDER BY Salary DESC
FETCH FIRST 10 ROWS ONLY)