Материал: 2391

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Иван

Петрович

Иванов

Петр

Аркадьевич

Васильков

Иван

Васильевич

Артемьев

Савел

Игнатьевич

Соянов

Виктор

Семенович

Ушаков

Рис. 15. Результат запроса

сиспользованием переменных

43.Вывести список сотрудников с фамилиями, начинающимися на

‘Ив’:

– в VFP:

Local Perem

&& объявление местной переменной

Perem = ‘Ив’

 

SET ANSI OFF

&& настройка правила сравнения

SELECT Name, Lastname, Surname FROM Staff WHERE Surname =

Perem

– в MS SQL Server:

Declare @Perem VarChar(10) -- назначение переменной

SET @Perem= 'Ив'

SELECT Name, Lastname, Surname FROM Staff WHERE Surname LIKE RTRIM(@Perem)+'%'

– в Oracle:

Declare

Perem VarChar2(10);

Surname_ ADMIN_PAY.Staff.Surname%TYPE; -- назначение переменной

BEGIN Perem:= 'Ив';

SELECT Surname INTO Surname_ FROM ADMIN_PAY.Staff WHERE Surname LIKE RTRIM(Perem)+'%';

END;

Использование переменных вместо названий таблиц.

44. Вывести список всех сотрудников, их табельные номера, даты и суммы получения зарплаты на руки и зарплаты, если бы у них не брали ‘подоходный налог’:

– в VFP, MS SQL Server, Access:

SELECT a.T_number, Name, Surname, Pay_day, Sum_pay, (Sum_payItem_sum) FROM Staff a, Pay b, Items_pay c WHERE b.Code_pay =

38

c.Code_pay AND a.T_number = b.T_number AND Item_pay = 'подоходный налог'

– в Oracle:

SELECT a.T_number, Name, Surname, Pay_day, Sum_pay, (Sum_payItem_sum) FROM ADMIN_PAY.Staff a, ADMIN_PAY.Pay b, ADMIN_PAY.Items_pay c WHERE b.Code_pay = c.Code_pay AND a.T_number = b.T_number AND Item_pay = 'подоходный налог';

Использование переменных вместо названий таблиц позволяет сократить размер кода создаваемого запроса и сделать его более читаемым.

45. Вывести список сотрудников и суммарную зарплату каждого

(рис. 16):

– в VFP, MS SQL Server, Access:

SELECT Name, Lastname, Surname, d.T_number, SUM(Sum_pay) FROM Staff d, Pay f WHERE (d.T_number = f.T_number) GROUP BY d.T_number

– в Oracle:

SELECT Surname, d.T_number, SUM(Sum_pay) FROM ADMIN_PAY.Staff d, ADMIN_PAY.Pay f WHERE (d.T_number = f.T_number) GROUP BY d.T_number, Surname;

Name

Lastname

Surname

T_number

Sum_sum_pay

Иван

Петрович

Иванов

1

19607.00

Василий

Михайлович

Сидоров

2

5732.00

Петр

Аркадьевич

Васильков

3

7595.00

Савел

Игнатьевич

Соянов

4

2456.00

Рис. 16. Результат запроса

46. Вывести список сотрудников, получающих одну из следующих надбавок к зарплате: ‘премию’, ‘оплату учебы’, ‘поощрение’, и коды их зарплат:

– в VFP, MS SQL Server, Access:

SELECT Name, Lastname, Surname, b.Code_pay FROM Staff a, Pay b, Items_pay c WHERE b.Code_pay = c.Code_pay AND a.T_number = b.T_number AND Item_pay IN('премия', 'оплата учебы', 'поощрение')

– в Oracle:

SELECT Name, Lastname, Surname, b.Code_pay FROM ADMIN_PAY.Staff a, ADMIN_PAY.Pay b, ADMIN_PAY.Items_pay c WHERE b.Code_pay = c.Code_pay AND a.T_number = b.T_number AND Item_pay IN('премия', 'оплата учебы', 'поощрение');

Выбор результата в курсор.

39

47. Вывести все сведения о зарплатах сотрудника с фамилией ‘Алеев’ и именем ‘Павел’ и поместить результат во временную таблицу с названием Temp1:

– в VFP:

SELECT Name, Lastname, Surname, Sum_pay, Pay_Day FROM Staff, Pay INTO CURSOR Temp1 WHERE (Staff.T_number = Pay.T_number) AND Surname = ‘Алеев’ AND Name = ‘Павел’

– в MS SQL Server:

Declare TEMP1 CURSOR FOR SELECT Name, Lastname, Surname,

Sum_pay, Pay_Day FROM Staff, Pay WHERE (Staff.T_number =

Pay.T_number) AND Surname = 'Алеев' AND Name = 'Павел'

– в Oracle (с примером построчного вывода данных из курсора):

SET SERVEROUTPUT ON

DECLARE

Name1 ADMIN_PAY.Staff.Name%TYPE;

Lastname1 ADMIN_PAY.Staff.Lastname%TYPE;

Surname1 ADMIN_PAY.Staff.Surname%TYPE;

Sum_pay1 ADMIN_PAY.Pay.Sum_pay%TYPE;

Pay_Day1 ADMIN_PAY.Pay.Pay_Day%TYPE;

CURSOR TEMP1 IS SELECT Name, Lastname, Surname, Sum_pay, Pay_Day FROM ADMIN_PAY.Staff, ADMIN_PAY.Pay WHERE (Staff.T_number = Pay.T_number) AND Surname = 'Алеев' AND Name = 'Павел';

BEGIN OPEN TEMP1;

WHILE TEMP1%found LOOP

FETCH TEMP1 INTO Name1, Lastname1, Surname1, Sum_pay1, Pay_Day1;

DBMS_OUTPUT.PUT_LINE(Name1||' '|| Lastname1||' '||Surname1||' '|| Sum_pay1||' '|| Pay_Day1);

END LOOP;

CLOSE TEMP1; END;

Для того чтобы использовать результаты запроса в дальнейшем коде программы, необходимо запрос сохранить либо на диске в таблице (ключевая фраза INTO DBF или INTO TABLE) с заданным названием, либо во временной таблице, которая сохраняется только на период работы программы или в рамках сессии.

INTO CURSOR – поместить результат запроса во временную

40

таблицу с указанным названием (в примере Temp1), которая будет удалена из памяти по окончании работы программы.

48. Вывести все сведения о сотрудниках с табельными номерами 12– 54 и поместить результат во временную таблицу с названием Temp2 (рис. 17):

– в VFP:

SELECT * FROM Staff INTO CURSOR Temp2 WHERE T_number BETWEEN 12 AND 54

– в MS SQL Server:

Declare Temp2 CURSOR FOR SELECT * FROM Staff WHERE T_number BETWEEN 12 AND 54

– в Oracle:

DECLARE

CURSOR TEMP1 IS SELECT * FROM ADMIN_PAY.Staff WHERE

T_number BETWEEN 12 AND 54;

BEGIN

Null;

END;

T_number

Surname

Name

Lastname

Birthday

…

Date_input

15

Иванова

Анна

Михайловна

12.03.1960

…

12.11.1979

Рис. 17. Фрагмент выбора результата в курсор

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

49. Вывести неповторяющийся список сотрудников, которые получали премию:

– в VFP, MS SQL Server, Access:

SELECT DISTINCT Name, Lastname, Surname FROM Staff, Pay WHERE Staff.T_number = Pay.T_number AND EXISTS(SELECT * FROM Items_pay WHERE Items_pay.Code_pay = Pay.Code_pay AND Item_pay='премия')

– в Oracle:

SELECT DISTINCT Name, Lastname, Surname FROM ADMIN_PAY.Staff, ADMIN_PAY.Pay WHERE Staff.T_number = Pay.T_number AND EXISTS(SELECT * FROM ADMIN_PAY.Items_pay WHERE Items_pay.Code_pay = Pay.Code_pay AND Item_pay='премия');

EXISTS( ) – квантор существования, понятие, заимствованное из формальной логики. Возвращает два значения: либо ИСТИНА, либо ЛОЖЬ. ИСТИНА – если условие, указанное в скобках, выполнилось и

41

имеет ненулевой результат, ЛОЖЬ – если условие вернуло пустое множество.

50. Вывести список сотрудников, которые ни разу не получали зарплаты:

– в VFP, MS SQL Server, Access:

SELECT Surname, Name, Lastname FROM Staff WHERE NOT EXISTS(SELECT * FROM Pay WHERE Staff.T_number = Pay.T_number)

– в Oracle:

SELECT Surname, Name, Lastname FROM ADMIN_PAY.Staff WHERE NOT EXISTS(SELECT * FROM ADMIN_PAY.Pay WHERE Staff.T_number

=Pay.T_number);

51.Вывести список сотрудников, у которых размер зарплаты не меньше 3000 руб. (рис. 18):

– в VFP, MS SQL Server, Access:

SELECT Surname, Name, Lastname FROM Staff WHERE EXISTS(SELECT * FROM Pay WHERE Staff.T_number = Pay.T_number AND Sum_pay >=3000)

– в Oracle:

SELECT Surname, Name, Lastname FROM ADMIN_PAY.Staff WHERE EXISTS(SELECT * FROM ADMIN_PAY.Pay WHERE Staff.T_number = Pay.T_number AND Sum_pay >=3000);

Surname

Name

Lastname

Иванов

Иван

Петрович

Васильков

Петр

Аркадьевич

Рис. 18. Результат запроса с использованием квантора существования

Использование функций совместно с подзапросом.

52. Вывести список сотрудников и даты с размерами полученных зарплат, которые превысили средний размер их же зарплат (рис. 19):

– в VFP, MS SQL Server, Access:

SELECT Surname, Name, Lastname, Sum_pay, Pay_Day FROM Staff INNER JOIN PAY ON Staff.T_number = Pay.T_number WHERE Pay.Sum_pay>(SELECT AVG(Sum_pay) FROM Pay)

– в Oracle:

SELECT Surname, Name, Lastname, Sum_pay, Pay_Day FROM ADMIN_PAY.Staff INNER JOIN ADMIN_PAY.PAY ON Staff.T_number =

42

Источник: https://studfile.net/preview/16408448/