Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Авт_ПМП / Metod_BD.doc
Скачиваний:
31
Добавлен:
05.02.2016
Размер:
574.98 Кб
Скачать

Використання значення null в умовах відбору (is null / not null)

Для знаходження незаповнених значень певного стовпчика деякої таблиці використовується спеціальне ключове слово IS NULL. Наприклад, для формування списку підпрємств з незаповненими адресами потрібно написати такий запит:

SELECT *

FROM ustanova

WHERE Adresa IS NULL

і навпаки, запит

SELECT *

FROM ustanova

WHERE Adresa IS NOT NULL

сформує список підприємств із заповненими адресами.

Використання множини таблиць в одному запиті

До цих пір кожний запит базувався на одній таблиці. Але на практиці цього недостатньо. Для того, щоб об’єднати в результуючий таблиці даних з декількох таблиць, необхідно виконати операцію з’єднання. Для виконання з’єднання двох і більше таблиць в одному запиті необхідно після ключового слова FROM вказати імена цих таблиць, розділивши їх комами, після чого додати в запит ключове слово WHERE з визначенням стовпчиків, які використовуються для з’єднання вказаних таблиць. Крім того, замість імен таблиць можна використовувати назначені їм в розділі FROM псевдоніми(аліаси). В цьому випадку імена таблиць і назначені їм аліаси повинні розділятись комами.

Імена таблиць і стовпчиків

Повне ім’я стовпчика складається з імені таблиці, безпосередньо за яким стоїть крапка, а за нею - ім’я стовпчика. Наприклад, table_a.kod,table_b.suma, table_a.suma. В наведених раніше прикладах імена таблиць можна було опускати, оскільки запити використовували тільки одну таблицю. Навіть формуючи запит до декількох таблиць їх імена можна опустити, якщо імена цих таблиць різні. Одначе так буває не завжди.

З’єднання таблиць (join)

Припустимо, необхідно встановити зв’язок між закупленим товаром і проданим. Для цього потрібно прирівняти код купленого товару до коду проданого товару, тобто table_a.kod=table_b.kod. Отже запит матиме вид:

SELECT a.kod AS kod_a,a.suma AS suma_a, b.kod AS kod_b,b.suma AS suma_b

FROM table_a a,table_b b

WHERE a.kod=b.kod

Результат запиту матиме вид:

kod_a

suma_a

kod_b

Suma_b

1

100

1

50

1

100

1

47

2

150

2

35

2

150

2

80

1

55

1

50

1

55

1

47

1

40

1

50

1

40

1

47

2

89

2

35

2

89

2

80

Тепер пояснимо роботу оператора SELECT, в якому використовується декілька таблиць. На основі таблиць, які зустрічаються після ключового слова FROM (в нашому випадку – table_a i table_b) , будується декартовиий добуток множин рядків таблиць. В одержаному добутку перевіряється істинність предикату заданого у WHERE, якщо предикат приймає значення істина, рядок поміщається в рельтуючу множину, в противному разі – не включається. Тепер стає зрозумілим, чому в результаті є 6 рядків в яких kod_a i kod_b приймають значення 1 (в таблиці table_a значення 1 в колонці kod зустрічається 3 рази, а у таблиці table_b відповідно 2 рази, отже в декартовому добутку буде 6 рядків) і 4 рядки, в яких kod_a i kod_b приймають значення 2 (в таблиці table_a значення 2 в колонці kod зустрічається 2 рази і в таблиці table_b 2 рази, отже в декартовому добутку буде 4 рядків). Оскільки, в table_b в колонці kod 3 не зустрічається, тому в результаті не має рядка з kod_a=kod_b=3.

В наведеному вище прикладі продемонстровано з’єднання (join) двох таблиць. З’єднання, яке використовує предикати, які побудовані виключно на рівностях, називається еквіз’єднанням. Еквіз’єднання є найбільш поширеним типом з’єднанням, але існують і інші типи з’єднання. Фактично в з’єднанні можна використовувати любу операцію зрівняння. Наприклад,

SELECT a.kod AS kod_a,a.suma AS suma_a, b.kod AS kod_b,b.suma AS suma_b

FROM table_a a,table_b b

WHERE a.kod>b.kod

Результат запиту матиме вид:

kod_a

suma_a

kod_b

Suma_b

1

100

2

35

1

100

2

80

1

55

2

35

1

55

2

80

1

40

2

35

1

40

2

80

Наведемо приклад більш практичної задачі. Для обчислення прибуткового податку з громадян в Excel’і користуються такою формулою

Якщо(Дохід<=17; 0;

Якщо(Дохід<=85; (Дохід-17)*0.1;

Якщо(Дохід<=170; (Дохід-85)*0.15+6.8;

Якщо(Дохід<=1020; (Дохід-170)*0.2+19.55;

Якщо(Дохід<=1700; (Дохід-1020)*0.3+189.55;

(Дохід-1700)*0.4+393.55)))));

Нижче наведена таблиця tppобрахування прибуткового податку на зарплату:

d_l

d_r

P

c

0

17

0

0

17

85

0.1

0

85

170

0.15

6.8

170

1020

0.2

19.55

1020

1700

0.3

189.55

1700

109

0.4

393.55

Якщо D – дохід, то податок P на прибуток обраховується за формулою:

(D-d_l)*p+c.

Рядок, з якого вибираються відповідні d_l, p i c, визначається нерівностями:

d_l<D<=d_r

Очевидно, ці нерівності однозначно визначають рядок таблиці tpp.

Нехай таблиця Vidomist має вид:

kod

priz

D

1

Іванов

367.78

2

Петров

1309.55

3

Сидоров

2709.98

де через kod позначено ідентифікаційний код особи, priz – прізвище особи, D – суму сукупного доходу.

Для того, щоб сформувати відомість нарахованих сум податку на прибуток, необхідно застосувати такий оператор SELECT:

SELECT a.kod,a.priz, (a.D-b.d_l)*b.p+b.c AS podatok

FROM Vidomist a, tpp b

WHERE (a.D>b.d_l) AND (a.D<=b.d_r)

Стандарт SQL-92 додатково надає і таку можливість створення цього з’єднання:

FROM Vidomist a INNER JOIN tpp b ON((a.D>b.d_l) AND (a.D<=b.d_r))

Таким чином, запит виглядатиме так:

SELECT a.kod,a.priz, (a.D-b.d_l)*b.p+b.c AS podatok

FROM Vidomist a INNER JOIN tpp b ON((a.D>b.d_l) AND (a.D<=b.d_r))

Запит, який з’єднує таблиці table_a i table_b матиме вид:

SELECT a.kod AS kod_a,a.suma AS suma_a, b.kod AS kod_b,b.suma AS suma_b

FROM table_a a INNER JOIN table_b b ON a.kod=b.kod

Соседние файлы в папке Авт_ПМП