- •Державна податкова адміністрація україни
- •Поняття інформаційної системи
- •Життєвий цикл інформаційної системи
- •Історія розвитку субд
- •Реляційна модель даних
- •Математичні відношення
- •Реляційні ключі
- •Реляційна цілісність
- •Реляційна алгебра
- •Операції з’єднання
- •Нормалізовані відношення
- •Коли субд можна вважати реляційною
- •Основні типи даних визначених стандартом iso
- •Integer
- •Формати представлення дат
- •Формат time
- •Коротка характеристика сучасних субд
- •Основи мови sql
- •Insert into ustanova(kod,nazva) values(10234,’Академія дпс України’)
- •Прості запити
- •Умова відбору (ключове слово where)
- •Зрівняння
- •Використання діапазонів (between / not between)
- •Умови відбору з перевіркою входження у множину (in / not in)
- •Умови відбору з допомогою шаблону (like / not like)
- •Використання значення null в умовах відбору (is null / not null)
- •Використання множини таблиць в одному запиті
- •Імена таблиць і стовпчиків
- •З’єднання таблиць (join)
- •Ліве з’єднання (left join)
- •Сортування результату (фраза order by)
- •Групування результатів (фраза group by). Агрегатні функції
- •Використання фрази group by
- •Використання фрази having
- •Підзапити
- •Ключові слова any I all
- •Ключові слова exists I not exists
- •Комбінування результуючих таблиць (операції union, intersect і except)
- •Поновлення бази даних
- •Вставка нових даних
- •Модифікація даних (оператор update)
- •Використання inner join, left join в операторі update
- •Видалення даних з бази(оператор delete)
- •Визначення даних
- •Створення баз даних
- •Створення таблиць (оператор create table)
- •Видалення таблиць (оператор drop table)
- •Створення індексу (оператор create index)
- •Видалення індексу (оператор drop index)
- •Модифікація структури таблиці (оператор alter table)
- •Використання транзакцій
- •Управління доступом даних
- •Надання привілеїв іншим користувачам (оператор grant)
- •Відміна наданих привілеїв (оператор revoke)
Використання значення 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