Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции О_о DataBase.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
8.68 Mб
Скачать

I. И еще несколько примеров написания запросов из документации [10]

Используются таблицы из базы данных Sample.

  1. Получить всю информацию, хранящуюся в таблице EMPLOYEE.

SELECT * FROM EMPLOYEE

  1. Соединить таблицы EMP_ACT и EMPLOYEE, выбрать все колонки из таблицы EMP_ACT и добавить фамилию сотрудника (LastName) из таблицы EMPLOYEE к каждой строке результата.

SELECT EMP_ACT.*, LastName

FROM EMP_ACT, EMPLOYEE

WHERE EMP_ACT.EmpNo = EMPLOYEE.EmpNo

  1. Соединить таблицы 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

  1. Выбрать должность (JOB) и минимальный и максимальный оклады (Salary) для каждой группы строк с одинаковым кодом должности из таблицы EMPLOYEE, но только для тех групп, которые содержат более одной строки и имеют максимальный оклад, не меньший, чем 27000.

SELECT Job, MIN(Salary), MAX(Salary)

FROM EMPLOYEE

GROUP BY Job

HAVING COUNT(*) > 1 AND MAX(Salary) >= 27000

  1. Выбрать все строки из таблицы EMP_ACT для сотрудников (EmpNo) из отдела (WorkDept) ‘E11’ (номера отделов, в которых работают сотрудники, находятся в таблице EMPLOYEE).

SELECT * FROM EMP_ACT

WHERE EmpNo IN

(SELECT EmpNo FROM EMPLOYEE

WHERE WorkDept = ’E11’)

  1. Из таблицы EMPLOYEE выбрать номер отдела (WorkDept) и максимальный оклад в отделе (Salary) для всех отделов, у которых максимальный оклад меньше среднего оклада всех сотрудников.

SELECT WorkDept, MAX(Salary)

FROM EMPLOYEE

GROUP BY WorkDept

HAVING MAX(Salary) < (SELECT AVG(Salary)

FROM EMPLOYEE)

Подзапрос, включенный в конструкцию HAVING, выполнится в данном примере только один раз.

  1. Используя таблицу 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 должен выполняться для каждой группы.

  1. Определить номера сотрудников, занимающих должности 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.

  1. Вывести средний уровень образования и зарплату сотрудников для пяти случайных групп сотрудников.

Этот запрос требует использования вложенного табличного выражения для присваивания каждому сотруднику некоторого случайного значения, так чтобы в дальнейшем это значение можно было использовать в конструкции GROUP BY.

SELECT RandID, AVG(EdLevel), AVG(Salary)

FROM (SELECT EdLevel, Salary, INTEGER(RAND() * 5) AS RandID

FROM EMPLOYEE

) AS EMPRAND

GROUP BY RandID

  1. Выполнить запрос к таблице 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)