Окончание табл. 5
|
T_number |
Code_pay |
|
Pay_day |
Sum_pay |
|
|
|||
|
1 |
|
3 |
|
01.03.2003 |
12542.00 |
|
|
||
|
2 |
|
4 |
|
01.01.2003 |
1452.00 |
|
|
||
|
2 |
|
5 |
|
01.02.2003 |
2145.00 |
|
|
||
|
2 |
|
6 |
|
01.03.2003 |
2135.00 |
|
|
||
|
3 |
|
7 |
|
01.01.2003 |
4511.00 |
|
|
||
|
3 |
|
8 |
|
01.02.2003 |
1542.00 |
|
|
||
|
3 |
|
9 |
|
01.03.2003 |
1542.00 |
|
|
||
|
4 |
|
10 |
|
01.03.2003 |
2456.00 |
|
|
||
|
|
|
|
|
|
|
|
Таблица 6 |
||
Пример заполнения таблицы Items_pay (фрагмент) |
||||||||||
|
|
|
|
|
|
|
||||
Code_pay |
|
Item_pay |
|
Item_sum |
Code_Items |
|||||
1 |
|
Премия |
|
124.00 |
|
1 |
|
|
||
1 |
|
Налог |
|
-451.00 |
|
2 |
|
|
||
1 |
|
Оклад |
|
1457.00 |
|
3 |
|
|
||
1 |
Поощрение |
|
4512.00 |
|
4 |
|
|
|||
1 |
Оплата учебы |
|
145.00 |
|
5 |
|
|
|||
2 |
|
Оклад |
|
4656.00 |
|
6 |
|
|
||
2 |
|
Налог |
|
-415.00 |
|
7 |
|
|
||
2 |
Поощрение |
|
326.00 |
|
8 |
|
|
|||
3 |
|
Оклад |
|
1654.00 |
|
9 |
|
|
||
|
|
|
Премия |
|
|
|
|
|
|
|
3 |
квартальная |
|
1213.00 |
|
10 |
|
|
|||
10 |
За бездетность |
|
-154.00 |
|
11 |
|
|
|||
10 |
|
Оклад |
|
1456.00 |
|
12 |
|
|
||
10 |
Премия разовая |
|
1245.00 |
|
13 |
|
|
|||
|
|
|
Налог |
|
|
|
|
|
|
|
10 |
подоходный |
|
-452.00 |
|
14 |
|
|
|||
Рассмотрим возможности программного создания описанного фрагмента базы данных в разных СУБД.
В SQL Server:
CREATE DATABASE DB_pay
/*создание БД с названием DB_pay, команда выполняется отдельно от остальных, так как занимает некоторое время*/ USE DB_pay
/*сделать активной БД с названием DB_pay*/
CREATE TABLE Staff(T_number INT IDENTITY(1,1) PRIMARY KEY, Surname CHAR(25), Name CHAR(25), Lastname CHAR(25), Birthday SMALLDATETIME, Phone Numeric(13,0), Post CHAR(30),
13
Type_post CHAR(8) DEFAULT 'Служащий', Date_input
SMALLDATETIME DEFAULT Getdate())
CREATE TABLE Pay(T_number INT FOREIGN KEY
REFERENCES Staff(T_number) ON UPDATE CASCADE, Code_pay INT IDENTITY(1,1) PRIMARY KEY, Pay_day SMALLDATETIME DEFAULT Getdate(), Sum_pay Numeric(8,2))
CREATE TABLE Items_pay(Code_pay INT FOREIGN KEY
REFERENCES Pay(Code_pay), Item_pay CHAR(20) DEFAULT 'Оклад',
Item_sum Numeric(8,2), Code_Items BIGINT IDENTITY(1,1) PRIMARY
KEY)
В ORACLE:
/*Вводим набор операторов для создания администратора создаваемой БД*/
CREATE USER "ADMIN_PAY" PROFILE "DEFAULT" IDENTIFIED BY "P@ssw0rd" DEFAULT TABLESPACE "USERS"
TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK;
GRANT "CONNECT" TO "ADMIN_PAY" WITH ADMIN OPTION; GRANT "DBA" TO "ADMIN_PAY" WITH ADMIN OPTION;
GRANT "EXP_FULL_DATABASE" TO "ADMIN_PAY" WITH ADMIN OPTION;
/*Теперь приступаем к созданию табличного пространства программно*/
CREATE TABLESPACE "DB_PAY" LOGGING
DATAFILE 'C:\ORACLE\ORADATA\ORCL\DB_PAY.dbf' SIZE 5M EXTENT
MANAGEMENT LOCAL;
/*Теперь переопределяем ранее созданного пользователя ADMIN_PAY на работу только в табличном пространстве DB_PAY*/
ALTER USER "ADMIN_PAY" DEFAULT TABLESPACE "DB_PAY";
CREATE TABLE ADMIN_PAY.Staff (T_number NUMBER(5),
CONSTRAINT "ID_STAFF" PRIMARY KEY(T_number) USING
14
INDEX TABLESPACE "DB_PAY", Surname CHAR(25), Name CHAR(25), Lastname CHAR(25), Birthday DATE, Phone NUMBER(13,0), Post CHAR(30), Type_post CHAR(8) DEFAULT 'Служащий', Date_input DATE DEFAULT Sysdate) TABLESPACE "DB_PAY";
CREATE TABLE ADMIN_PAY.Pay(T_number NUMBER(5),
CONSTRAINT "ID_STAFF_FK" FOREIGN KEY(T_number)
REFERENCES ADMIN_PAY.Staff(T_number), Code_pay NUMBER(6),
CONSTRAINT "ID_PAY" PRIMARY KEY(Code_pay) USING INDEX
TABLESPACE "DB_PAY", Pay_day DATE DEFAULT Sysdate, Sum_pay
NUMBER(8,2)) TABLESPACE "DB_PAY";
CREATE TABLE ADMIN_PAY.Items_pay(Code_pay NUMBER(6),
CONSTRAINT "ID_PAY_FK" FOREIGN KEY(Code_pay)
REFERENCES ADMIN_PAY.Pay(Code_pay), Item_pay CHAR(20)
DEFAULT 'Оклад', Item_sum Numeric(8,2), Code_Items NUMBER(8)
PRIMARY KEY USING INDEX TABLESPACE "DB_PAY")
TABLESPACE "DB_PAY";
--создание последовательности для каждого ключевого поля
CREATE SEQUENCE ADMIN_PAY.ID_STAFF_SEQ INCREMENT BY
1 START WITH 1 MAXVALUE 99999 MINVALUE 1 NOCYCLE CACHE
20 NOORDER;
CREATE SEQUENCE ADMIN_PAY.ID_PAY_SEQ INCREMENT BY 1 START WITH 1 MAXVALUE 999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER;
CREATE SEQUENCE ADMIN_PAY.ID_ITEM_SEQ INCREMENT BY 1 START WITH 1 MAXVALUE 99999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER;
1.2. Упражнения с использованием операторов обработки данных SQL
Сортировка.
1. Вывести все сведения о сотрудниках из таблицы Staff и отсортировать результат по табельному номеру:
– в VFP, MS SQL Server, Access:
SELECT * FROM Staff ORDER BY T_number
– в Oracle:
SELECT * FROM ADMIN_PAY.Staff ORDER BY T_number;
15
SELECT – ключевое слово, обозначающее начало SQL запроса, за ним обычно следует перечень полей, информация из которых помещается в результат выполнения запроса.
* – условное обозначение, которое позволит помещать в результат запроса информацию из всех полей таблицы, в которой осуществляется поиск (в некоторых СУБД используется ключевое слово ALL).
FROM – ключевое слово, после которого указывается имя источника/ов данных (если источников несколько, то они разделяются запятыми) для выполнения запроса.
При выполнении запроса в MS SQL Server убедитесь, что БД DB_Pay активна, или выполните команду USE DB_Pay.
При выполнении запроса в Oracle перед именем таблицы обязательно указывается имя схемы, к которой принадлежит таблица. В данном примере ADMIN_PAY.
2. Вывести список фамилий, имен, отчеств сотрудников, их должности, отсортировать результат по названиям должностей по возрастанию и по фамилиям по убыванию:
– в VFP, MS SQL Server, Access:
SELECT Surname, Name, Lastname, Post FROM Staff ORDER BY Post ASC, Surname DESC
– в Oracle:
SELECT Surname, Name, Lastname, Post FROM ADMIN_PAY.Staff ORDER BY Post ASC, Surname DESC;
ORDER BY – сортирует результаты запроса на основании данных, содержащихся в одном или нескольких столбцах, по умолчанию сортировка выполняется по возрастанию. Если это предложение не указано, результаты запроса не будут отсортированы.
ASC – сортировка данных по возрастанию значений поля, после которого стоит ключевое слово ASC.
DESC – сортировка данных по убыванию значений поля, после которого стоит ключевое слово DESC.
Если сортировка выполняется по нескольким полям, то порядок сортировки следующий:
–выполняется сортировка строк по первому указанному полю;
–внутри групп повторяющихся значений первого поля выполняется сортировка строк по второму полю и т.д.
16
3. Выбрать из таблицы Pay табельные номера сотрудников и даты получения зарплат и отсортировать результат по дате по убыванию (рис. 2):
– в VFP, MS SQL Server, Access:
SELECT T_number, Pay_day FROM Pay ORDER BY Pay_day DESC
– в Oracle:
SELECT T_number, Pay_day FROM ADMIN_PAY.Pay ORDER BY Pay_day DESC;
T_Number |
Pay_day |
1 |
01.03.2003 |
2 |
01.03.2003 |
3 |
01.03.2003 |
4 |
01.03.2003 |
1 |
01.02.2003 |
2 |
01.02.2003 |
3 |
01.02.2003 |
1 |
01.01.2003 |
2 |
01.01.2003 |
3 |
01.01.2003 |
Рис. 2. Сортировка по дате
Изменение порядка следования полей.
4. Вывести все сведения о сотрудниках из таблицы Staff таким образом, чтобы в результате порядок столбцов был следующим: Name, Lastname, Surname, Post, Date_input, Phone, Birthday, T_number, Type_post (рис. 3):
– в VFP, MS SQL Server, Access:
SELECT Name, Lastname, Surname, Post, Date_input, Phone, Birthday, T_number, Type_post FROM Staff
– в Oracle:
SELECT Name, Lastname, Surname, Post, Date_input, Phone, Birthday,
T_number, Type_post FROM ADMIN_PAY.Staff;
Surname |
Post |
Date_input |
Phone |
Birthday |
T_number |
Type_post |
Иванов |
Бухгалтер |
12.04.2000 |
124563 |
12.01.1971 |
1 |
Служащий |
Сидоров |
Начальник отдела кадров |
14.11.1999 |
451263 |
14.06.1954 |
2 |
ИТР |
Васильков |
Специалист отдела кадров |
30.11.2000 |
145236 |
14.06.1981 |
3 |
Служащий |
Артемьев |
Главный инженер |
10.02.1998 |
365462 |
05.12.1970 |
67 |
ИТР |
Соянов |
Строитель |
25.06.1980 |
121212 |
15.05.1981 |
4 |
Рабочий |
Ушаков |
Бухгалтер |
18.11.2003 |
156462 |
30.05.1970 |
11 |
Служащий |
17