База данных Employee (Firebird): схема, таблицы и SQL-задачи
Employee — учебная база, которая поставляется вместе с Firebird: сотрудники, отделы, должности, проекты, клиенты и продажи небольшой компании. На SQLtest.online с ней можно работать прямо в браузере: решать задачи с автоматической проверкой и писать свои запросы в песочнице, ничего не устанавливая.
- 10 таблиц и 1 представление
- 42 сотрудника
- 21 отдел
- 33 SQL-задачи
Что такое Employee
Employee — классическая учебная база Firebird, доставшаяся от InterBase. Она описывает небольшую международную компанию: дерево отделов, сотрудников и историю зарплат, проекты с бюджетами и продажи клиентам.
База небольшая, поэтому результаты легко проверить глазами, но связи в ней интересные: иерархия отделов, составной внешний ключ от сотрудника к должности и связь «многие ко многим» между сотрудниками и проектами. Заодно на ней удобно освоить диалект SQL Firebird.
ER-диаграмма
Диаграмма показывает таблицы Employee и связи между ними по внешним ключам. Нажмите, чтобы открыть её в полном размере.
Из чего состоит база
Таблицы делятся на три группы.
Персонал
EMPLOYEE, DEPARTMENT (у каждого отдела есть вышестоящий), JOB и SALARY_HISTORY.
Проекты
PROJECT, таблица связей EMPLOYEE_PROJECT и годовые бюджеты в PROJ_DEPT_BUDGET.
Продажи
CUSTOMER, SALES (заказы) и COUNTRY с валютами.
Главное, что стоит запомнить: должность определяется сразу тремя столбцами (код, разряд и страна), поэтому соединение EMPLOYEE с JOB требует всех трёх. Представление PHONE_LIST объединяет сотрудников с телефонами их отделов.
Сколько данных в таблицах:
| Таблица | Строк | Что хранит |
|---|---|---|
| EMPLOYEE | 42 | сотрудники |
| DEPARTMENT | 21 | отделы |
| JOB | 31 | должности и вилки зарплат |
| SALARY_HISTORY | 49 | изменения зарплат |
| PROJECT | 6 | проекты |
| EMPLOYEE_PROJECT | 28 | сотрудники ↔ проекты |
| PROJ_DEPT_BUDGET | 24 | бюджеты проектов по отделам и годам |
| CUSTOMER | 15 | клиенты |
| SALES | 33 | заказы |
| COUNTRY | 16 | страны и валюты |
Структура таблиц
Нажмите на таблицу, чтобы увидеть её столбцы, пример строки и ключи.
Список таблиц
- COUNTRYНазвание страны
- CURRENCYВалюта, используемая в стране
| COUNTRY | CURRENCY |
|---|---|
| USA | Dollar |
- JOB_CODEКод работы
- JOB_GRADEКатегория работы
- JOB_COUNTRYСтрана, связанная с работой
- JOB_TITLEНазвание работы
- MIN_SALARYМинимальная зарплата по работе
- MAX_SALARYМаксимальная зарплата по работе
- JOB_REQUIREMENTТребования к работе
- LANGUAGE_REQТребования к языку
| JOB_CODE | JOB_GRADE | JOB_COUNTRY | JOB_TITLE | MIN_SALARY | MAX_SALARY | JOB_REQUIREMENT | LANGUAGE_REQ |
|---|---|---|---|---|---|---|---|
| CEO | 1 | USA | Генеральный директор | 130000.00 | 250000.00 | Нет специфических требований. | [null] |
- FOREIGN KEY (JOB_COUNTRY) REFERENCES COUNTRY(COUNTRY)
- DEPT_NOНомер отдела
- DEPARTMENTНазвание отдела
- HEAD_DEPTГлавный отдел (может быть null)
- MNGR_NOНомер менеджера
- BUDGETБюджет отдела
- LOCATIONМестоположение отдела
- PHONE_NOТелефонный номер отдела
| DEPT_NO | DEPARTMENT | HEAD_DEPT | MNGR_NO | BUDGET | LOCATION | PHONE_NO |
|---|---|---|---|---|---|---|
| 000 | Корпоративный офис | [null] | 105 | 1000000.00 | Монтерей | (408) 555-1234 |
- FOREIGN KEY (HEAD_DEPT) REFERENCES DEPARTMENT(DEPT_NO)
- EMP_NOНомер сотрудника
- FIRST_NAMEИмя сотрудника
- LAST_NAMEФамилия сотрудника
- PHONE_EXTНомер телефона сотрудника
- HIRE_DATEДата приема на работу
- DEPT_NOНомер отдела
- JOB_CODEКод должности сотрудника
- JOB_GRADEКатегория должности сотрудника
- JOB_COUNTRYСтрана, связанная с должностью сотрудника
- SALARYЗаработная плата сотрудника
- FULL_NAMEПолное имя сотрудника
| EMP_NO | FIRST_NAME | LAST_NAME | PHONE_EXT | HIRE_DATE | DEPT_NO | JOB_CODE | JOB_GRADE | JOB_COUNTRY | SALARY | FULL_NAME |
|---|---|---|---|---|---|---|---|---|---|---|
| 2 | Robert | Nelson | 250 | 1988-12-28 00:00:00 | 600 | VP | 2 | USA | 105900.00 | Nelson, Robert |
- FOREIGN KEY (DEPT_NO) REFERENCES DEPARTMENT(DEPT_NO)
- FOREIGN KEY (JOB_CODE) REFERENCES JOB(JOB_CODE)
- PROJ_IDИдентификатор проекта
- PROJ_NAMEНазвание проекта
- PROJ_DESCОписание проекта
- TEAM_LEADERРуководитель проекта
- PRODUCTПродукт, связанный с проектом
| PROJ_ID | PROJ_NAME | PROJ_DESC | TEAM_LEADER | PRODUCT |
|---|---|---|---|---|
| VBASE | Video Database | Разработка системы управления видео базой данных для управления видео распределением по запросу. | 45 | software |
- FOREIGN KEY (TEAM_LEADER) REFERENCES EMPLOYEE(EMP_NO)
- EMP_NOНомер сотрудника
- PROJ_IDИдентификатор проекта
| EMP_NO | PROJ_ID |
|---|---|
| 144 | DGPII |
- FOREIGN KEY (EMP_NO) REFERENCES EMPLOYEE(EMP_NO)
- FOREIGN KEY (PROJ_ID) REFERENCES PROJECT(PROJ_ID)
- FISCAL_YEARФискальный год
- PROJ_IDИдентификатор проекта
- DEPT_NOНомер отдела
- QUART_HEAD_CNTКоличество сотрудников в отделе за квартал (может быть null)
- PROJECTED_BUDGETПроектируемый бюджет на фискальный год
| FISCAL_YEAR | PROJ_ID | DEPT_NO | QUART_HEAD_CNT | PROJECTED_BUDGET |
|---|---|---|---|---|
| 1994 | GUIDE | 100 | [null] | 200000.00 |
- FOREIGN KEY (PROJ_ID) REFERENCES PROJECT(PROJ_ID)
- FOREIGN KEY (DEPT_NO) REFERENCES DEPARTMENT(DEPT_NO)
- EMP_NOНомер сотрудника
- CHANGE_DATEДата изменения заработной платы
- UPDATER_IDИдентификатор обновляющего
- OLD_SALARYПредыдущая заработная плата
- PERCENT_CHANGEПроцентное изменение заработной платы
- NEW_SALARYНовая заработная плата после изменения
| EMP_NO | CHANGE_DATE | UPDATER_ID | OLD_SALARY | PERCENT_CHANGE | NEW_SALARY |
|---|---|---|---|---|---|
| 28 | 1992-12-15 00:00:00 | admin2 | 20000.00 | 10.000000 | 22000.000000 |
- FOREIGN KEY (EMP_NO) REFERENCES EMPLOYEE(EMP_NO)
- CUST_NOНомер клиента
- CUSTOMERНазвание клиента
- CONTACT_FIRSTИмя контактного лица
- CONTACT_LASTФамилия контактного лица
- PHONE_NOНомер телефона клиента
- ADDRESS_LINE1Адрес, строка 1
- ADDRESS_LINE2Адрес, строка 2 (может быть null)
- CITYГород клиента
- STATE_PROVINCEШтат или провинция клиента
- COUNTRYСтрана клиента
- POSTAL_CODEПочтовый индекс клиента
- ON_HOLDСтатус "На удержании" (может быть null)
| CUST_NO | CUSTOMER | CONTACT_FIRST | CONTACT_LAST | PHONE_NO | ADDRESS_LINE1 | ADDRESS_LINE2 | CITY | STATE_PROVINCE | COUNTRY | POSTAL_CODE | ON_HOLD |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1001 | Signature Design | Dale J. | Little | (619) 530-2710 | 15500 Pacific Heights Blvd. | [null] | San Diego | CA | USA | 92121 | [null] |
- FOREIGN KEY (COUNTRY) REFERENCES COUNTRY(COUNTRY)
- PO_NUMBERНомер заказа
- CUST_NOНомер клиента, связанный с заказом
- SALES_REPНомер представителя по продажам
- ORDER_STATUSСтатус заказа
- ORDER_DATEДата заказа
- SHIP_DATEДата отгрузки
- DATE_NEEDEDТребуемая дата (может быть null)
- PAIDСтатус оплаты
- QTY_ORDEREDЗаказанное количество
- TOTAL_VALUEОбщая стоимость заказа
- DISCOUNTПримененная скидка
- ITEM_TYPEТип товара в заказе
- AGEDЗначение старения
| PO_NUMBER | CUST_NO | SALES_REP | ORDER_STATUS | ORDER_DATE | SHIP_DATE | DATE_NEEDED | PAID | QTY_ORDERED | TOTAL_VALUE | DISCOUNT | ITEM_TYPE | AGED |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| V91E0210 | 1004 | 11 | shipped | 1991-03-04 00:00:00 | 1991-03-05 00:00:00 | [null] | y | 10 | 5000.00 | 0.100000 | hardware | 1.000000000 |
- FOREIGN KEY (CUST_NO) REFERENCES CUSTOMER(CUST_NO)
- FOREIGN KEY (SALES_REP) REFERENCES EMPLOYEE(EMP_NO)
Список представлений этой БД:
- EMP_NOНомер сотрудника
- FIRST_NAMEИмя сотрудника
- LAST_NAMEФамилия сотрудника
- PHONE_EXTДобавочный номер сотрудника
- LOCATIONМестоположение отдела
- PHONE_NOТелефонный номер отдела
| EMP_NO | FIRST_NAME | LAST_NAME | PHONE_EXT | LOCATION | PHONE_NO |
|---|---|---|---|---|---|
| 2 | Robert | Nelson | 250 | Monterey | (408) 555-1234 |
Примеры запросов
Эти запросы показывают, как связаны данные. Скопируйте любой и запустите в песочнице.
Сотрудник, отдел и должность — соединение по составному ключу из трёх столбцов:
SELECT FIRST 3 e.FIRST_NAME, e.LAST_NAME, d.DEPARTMENT, j.JOB_TITLE
FROM EMPLOYEE e
JOIN DEPARTMENT d ON d.DEPT_NO = e.DEPT_NO
JOIN JOB j ON j.JOB_CODE = e.JOB_CODE
AND j.JOB_GRADE = e.JOB_GRADE
AND j.JOB_COUNTRY = e.JOB_COUNTRY
ORDER BY e.EMP_NO;
| FIRST_NAME | LAST_NAME | DEPARTMENT | JOB_TITLE |
|---|---|---|---|
| Robert | Nelson | Engineering | Vice President |
| Bruce | Young | Software Development | Engineer |
| Kim | Lambert | Field Office: East Coast | Engineer |
Заказы и клиенты — в Firebird число строк ограничивают через FIRST n:
SELECT FIRST 3 s.PO_NUMBER, c.CUSTOMER, s.ORDER_DATE, s.TOTAL_VALUE
FROM SALES s
JOIN CUSTOMER c ON c.CUST_NO = s.CUST_NO
ORDER BY s.ORDER_DATE;
| PO_NUMBER | CUSTOMER | ORDER_DATE | TOTAL_VALUE |
|---|---|---|---|
| V91E0210 | Central Bank | 1991-03-04 00:00:00 | 5000.00 |
| V92J1003 | MPM Corporation | 1992-07-26 00:00:00 | 2985.00 |
| V92E0340 | Central Bank | 1992-10-15 00:00:00 | 70000.00 |
SQL-задачи по темам
Задач на базе Employee: 33 — от простых выборок до оконных функций и изменения данных. Решение проверяется автоматически на настоящем Firebird. Число справа — количество задач в теме, цветные метки — диапазон сложности.
- Основы SQL 3
- Агрегатные функции 3
- Оконные функции 2
- Аналитические запросы 1
- Манипулирование данными (DML) 1
С чего начать
Первые задачи по базе Employee:
- Список подразделений
- Страны, где не используется доллар/евро
- Список под-отделов (JOIN)
- Показать список под-отделов
- Список иностранных сотрудников
- Выбрать сотрудников отдела
- Найти зарплату сотрудника
- Сотрудники с высокой зарплатой
- Сотрудники с зарплатой выше средней
- Поиск отдела
Частые вопросы
Нужно ли устанавливать Firebird, чтобы работать с Employee?
Нет. Задачи и песочница на SQLtest.online выполняют запросы на сервере, достаточно браузера. В песочнице Employee доступна в Firebird 4.0.
Откуда взялась база Employee?
Она поставляется с Firebird как пример базы данных (employee.fdb) и ведёт историю ещё от InterBase — предшественника Firebird.
Чем отличается SQL в Firebird?
Большая часть стандартного SQL работает как обычно. Первое, с чем вы столкнётесь: FIRST n / SKIP n или FETCH FIRST n ROWS ONLY для ограничения строк и имена объектов в верхнем регистре.