или
SELECT Name, Lastname, Surname FROM ADMIN_PAY.Staff, ADMIN_PAY.Pay WHERE (Staff.T_number = Pay.T_number) AND Pay_day = to_date('15-MAR-2003', 'dd-mm-yyyy') AND ((Sum_pay>=2000) AND (Sum_pay<3000));
23. Вывести НЕПОВТОРЯЮЩИЙСЯ список табельных номеров и имен сотрудников с табельными номерами 12 – 30 или с зарплатами, превысившими размер 5000 руб.:
– в VFP, MS SQL Server, Access:
SELECT DISTINCT Name, Lastname, Surname, Staff.T_number FROM Staff, Pay WHERE (Staff.T_number = Pay.T_number) AND ( (Staff.T_Number BETWEEN 12 AND 30) OR Sum_pay>5000)
– в Oracle:
SELECT DISTINCT Name, Lastname, Surname, Staff.T_number FROM
ADMIN_PAY.Staff, ADMIN_PAY.Pay WHERE (Staff.T_number =
Pay.T_number) AND ( (Staff.T_Number BETWEEN 12 AND 30) OR
Sum_pay>5000);
24. Вывести список сотрудников с датами рождения 01.01.1950 – 01.01.1960 или табельными номерами из диапазона 10 – 150 (рис. 10):
– в VFP:
SELECT Name, Lastname, Surname, Birthday, T_number FROM Staff WHERE (Birthday BETWEEN CTOD(‘01.01.1950’) AND CTOD(‘01.01.1960’)) OR (T_number>=10 AND T_number<=150)
Name |
Lastname |
Surname |
Birthday |
T_number |
Василий |
Михайлович |
Сидоров |
14.06.1954 |
2 |
Иван |
Васильевич |
Артемьев |
05.12.1970 |
67 |
Виктор |
Семенович |
Ушаков |
30.05.1970 |
11 |
Анна |
Михайловна |
Иванова |
12.03.1960 |
15 |
Рис. 10. Результат запроса с несколькими условиями
– в MS SQL Server:
SELECT Name, Lastname, Surname, Birthday, T_number FROM Staff WHERE (Birthday BETWEEN '01-JAN-1950' AND '01-JAN-1960') OR (T_number>=10 AND T_number<=150)
– в Access:
SELECT Name, Lastname, Surname, Birthday, T_number FROM Staff WHERE (Birthday BETWEEN #01.01.1950# AND #01.01.1960#) OR (T_number>=10 AND T_number<=150)
28
– в Oracle:
SELECT Name, Lastname, Surname, Birthday, T_number FROM ADMIN_PAY.Staff WHERE (Birthday BETWEEN '01-JAN-1950' AND '01- JAN-1960') OR (T_number>=10 AND T_number<=150);
Многотабличные запросы (выборка из двух таблиц, выборка из трех таблиц с использованием JOIN).
25. Вывести список сотрудников, получающих одну из следующих надбавок к зарплате: ‘премию’, ‘оплату учебы’, ‘поощрение’:
– в VFP, MS SQL Server, Access:
SELECT Name, Lastname, Surname FROM Staff INNER JOIN Pay INNER JOIN Items_pay ON Pay.Code_pay = Items_pay.Code_pay ON Staff.T_number = Pay.T_number WHERE Item_pay IN('премия', 'оплата учебы', 'поощрение')
или
SELECT Name, Lastname, Surname FROM (Staff INNER JOIN Pay ON Staff.T_number = Pay.T_number) INNER JOIN Items_pay ON Pay.Code_pay = Items_pay.Code_pay WHERE Item_pay IN('премия', 'оплата учебы', 'поощрение')
– в Oracle:
SELECT Name, Lastname, Surname FROM (ADMIN_PAY.Staff INNER JOIN ADMIN_PAY.Pay ON Staff.T_number = Pay.T_number) INNER JOIN ADMIN_PAY.Items_pay ON Pay.Code_pay = Items_pay.Code_pay WHERE Item_pay IN('премия', 'оплата учебы', 'поощрение');
INNER JOIN создает объединение пары таблиц, из которого выбираются только те записи, которые содержат совпадающие значения в полях связи, указанных после ключевого слова ON.
LEFT JOIN создает объединение пары таблиц, из которого выбираются все записи из левой таблицы, а также записи из правой таблицы, значения поля связи которой совпадают со значениями поля связи левой таблицы.
RIGHT JOIN создает объединение пары таблиц, из которой выбираются все записи из правой таблицы, а также записи из левой таблицы, значения поля связи которой совпадают со значениями поля связи правой таблицы.
ON – ключевое слово, после которого указывается условие связи пары таблиц.
26. Вывести неповторяющийся список всех сотрудников, у которых размер зарплаты составил от 2000 до 3000 руб. (рис. 11):
29
– в VFP, MS SQL Server, Access:
SELECT DISTINCT Name, Lastname, Surname FROM Staff INNER JOIN Pay ON Staff.T_number = Pay.T_number WHERE (Sum_pay>=2000) AND (Sum_pay<3000)
– в Oracle:
SELECT DISTINCT Name, Lastname, Surname FROM ADMIN_PAY.Staff INNER JOIN ADMIN_PAY.Pay ON Staff.T_number = Pay.T_number WHERE (Sum_pay>=2000) AND (Sum_pay<3000);
Name |
Lastname |
Surname |
Василий |
Михайлович |
Сидоров |
Иван |
Петрович |
Иванов |
Савел |
Игнатьевич |
Соянов |
Рис. 11. Результат многотабличного запроса
27.Вывести коды зарплат, в которых была статья вычетов ‘за бездетность’:
– в VFP, MS SQL Server, Access:
SELECT Pay.Code_pay FROM Pay INNER JOIN Items_pay ON Pay.Code_pay = Items_pay.Code_pay WHERE Item_pay = 'за бездетность'
– в Oracle:
SELECT Pay.Code_pay FROM ADMIN_PAY.Pay INNER JOIN ADMIN_PAY.Items_pay ON Pay.Code_pay = Items_pay.Code_pay WHERE Item_pay = 'за бездетность';
28.Вывести неповторяющийся список всех сотрудников, в которых была в зарплате статья вычетов ‘за бездетность’:
– в VFP, MS SQL Server, Access:
SELECT DISTINCT Name, Lastname, Surname FROM Staff INNER JOIN Pay INNER JOIN Items_pay ON Pay.Code_pay = Items_pay.Code_pay ON Staff.T_number = Pay.T_number WHERE Item_pay = 'за бездетность'
– в Oracle:
SELECT DISTINCT Name, Lastname, Surname FROM ADMIN_PAY.Staff INNER JOIN ADMIN_PAY.Pay INNER JOIN ADMIN_PAY.Items_pay ON Pay.Code_pay = Items_pay.Code_pay ON Staff.T_number = Pay.T_number WHERE Item_pay = 'за бездетность';
Вычисления.
29. Вывести список сотрудников, должности и срок их работы в годах с сортировкой по уменьшению стажа (рис. 12):
30
– в VFP, Access:
SELECT Name, Lastname, Surname, Post, (Date() - Date_input)/365.25
FROM Staff ORDER BY Date_input
– в MS SQL Server:
SELECT Name, Lastname, Surname, Post, CAST((GetDate() - Date_input) AS Bigint)/365.25 FROM Staff ORDER BY Date_input
– в Oracle:
SELECT Name, Lastname, Surname, Post, (SysDate - Date_input)/365.25
FROM ADMIN_PAY.Staff ORDER BY Date_input;
Name |
Lastname |
Surname |
Post |
Exp_5 |
Анна |
Михайловна |
Иванова |
Строитель |
25.1061 |
Савел |
Игнатьевич |
Соянов |
Строитель |
24.4873 |
Иван |
Васильевич |
Артемьев |
Главный инженер |
6.8583 |
|
|
|
Начальник отдела |
|
Василий |
Михайлович |
Сидоров |
кадров |
5.1006 |
Иван |
Петрович |
Иванов |
Бухгалтер |
4.6899 |
|
|
|
Специалист отдела |
|
Петр |
Аркадьевич |
Васильков |
кадров |
4.0548 |
Виктор |
Семенович |
Ушаков |
Бухгалтер |
1.0897 |
Рис. 12. Результат запроса с вычислением
30. Вывести список сотрудников, у которых еще не было дня рождения в текущем году, а также вывести количество дней до их дней рождения в текущем году:
– в VFP:
SET DATE TO GERMAN
&& необходима для установки даты в формате дд.мм.гг
SELECT Name, Lastname, Surname, Post, Birthday, CTOD(str(day(Birthday))+'.'+str(month(Birthday))+'.'+str(YEAR(Date())))- DATE() FROM Staff Where CTOD (str(day(Birthday)) + ' . ' + str (month(Birthday)) + ' . ' + str (YEAR(Date())))-DATE()) >0
– в MS SQL SERVER:
SET DATEFORMAT dmy --дата в формате дд.мм.гггг
SELECT Name, Lastname, Surname, Post, Birthday,
DATEDIFF(day, getdate(), CAST(str(day(Birthday))+ '.' + str(month(Birthday)) + '.' +str(YEAR(GetDate())) AS datetime)) AS [Дней до дня рождения] FROM Staff Where DATEDIFF(day, getdate(), CAST(str(day(Birthday)) + '.' + str(month(Birthday)) + '.' + str(YEAR(GetDate())) AS datetime))>0
31
– в Oracle:
SELECT Surname, TO_NUMBER( TO_DATE( ( to_char(Birthday, 'dd')||'.'||to_char(Birthday, 'mm')||'.'||to_char(Sysdate,'yyyy') ), 'DD-MM-YYYY')- SYSDATE) FROM ADMIN_PAY.Staff WHERE TO_NUMBER( TO_DATE( ( to_char( Birthday,'dd')||'.'||to_char( Birthday,'mm')||'.'||to_char(Sysdate,'yyyy') ), 'DD-MM-YYYY')-SYSDATE) >0;
31. Вывести список всех сотрудников, их табельные номера, даты и суммы получения зарплаты на руки и зарплаты, если бы у них не брали налог ‘за бездетность’:
– в VFP, MS SQL Server, Access:
SELECT Staff.T_number, Name, Surname, Pay_day, Sum_pay, (Sum_payItem_sum) FROM Staff INNER JOIN Pay INNER JOIN Items_pay ON Pay.Code_pay = Items_pay.Code_pay ON Staff.T_number = Pay.T_number WHERE Item_pay = 'за бездетность'
– в Oracle:
SELECT Staff.T_number, Name, Surname, Pay_day, Sum_pay, (Sum_payItem_sum) FROM ADMIN_PAY.Staff INNER JOIN ADMIN_PAY.Pay INNER JOIN ADMIN_PAY.Items_pay ON Pay.Code_pay = Items_pay.Code_pay ON Staff.T_number = Pay.T_number WHERE Item_pay
='за бездетность';
Вформуле запроса стоит минус, т.к. в таблице значения налогов хранятся как отрицательные числа.
Вычисление итоговых значений с использованием агрегатных функций.
32. Вывести среднюю зарплату, которая когда-либо выдавалась на предприятии:
–в VFP, MS SQL Server, Access: SELECT AVG(Sum_pay) FROM Pay
–в Oracle:
SELECT AVG(Sum_pay) FROM ADMIN_PAY.Pay;
32