- •Державна податкова адміністрація україни
- •Поняття інформаційної системи
- •Життєвий цикл інформаційної системи
- •Історія розвитку субд
- •Реляційна модель даних
- •Математичні відношення
- •Реляційні ключі
- •Реляційна цілісність
- •Реляційна алгебра
- •Операції з’єднання
- •Нормалізовані відношення
- •Коли субд можна вважати реляційною
- •Основні типи даних визначених стандартом 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)
Ліве з’єднання (left join)
Ліве з’єднання таблиць, наприклад table_a і table_b, застосовують тоді, коли потрібно, щоб результат містив всі рядки однієї таблиці (наприклад table_a) і лише ті рядки з іншої таблиці (наприклад table_b), для яких в першій таблиці є відповідники. Наприклад, ліве з’єднання таблиць table_a і 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 LEFT JOIN table_b b ON 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 |
3 |
28 |
NULL |
NULL |
Для стовпчика kod таблиці table_a зі значенням 3 у таблиці table_b немає відповідника, тому в результуючій таблиці у стовпчиках, які відповідають стовпчикам таблиці table_b стоять значення NULL.
Наведемо приклад з’єднання 3-х таблиць. Змінимо структуру таблиці Vidomist, а саме:
kod |
year |
mounth |
D |
1 |
2002 |
1 |
367.78 |
2 |
2002 |
1 |
1309.55 |
3 |
2002 |
1 |
2709.98 |
1 |
2002 |
2 |
400 |
2 |
2002 |
2 |
500 |
3 |
2002 |
2 |
600 |
де стовпчики year i mounth означають відповідно рік і місяць виплати зарплати. Додамо нову таблицю Osoba, в якій зберігається інформація про працівників:
kod |
priz |
1 |
Іванов |
2 |
Петров |
3 |
Сидоров |
4 |
Петренко |
Задача. Потрібно сформувати відомість зарплати за 2-й місяць 2002 року з колонками: “Прізвище”, “Нараховано”, “Сума податку”, “До виплати”.
Відповідний SQL-оператор матиме вид:
SELECT a.priz AS Прізвище, b.D AS Нараховано, (b.D-c.d_l)*c.p+c.c AS [Сума податку], b.D-((b.D-c.d_l)*c.p+c.c) AS [До виплати]
FROM (Osoba a INNER JOIN Vidomist b ON a.kod=b.kod) INNER JOIN tpp c ON((b.D>c.d_l) AND (b.D<=c.d_r))
WHERE b.year=2002 AND b.mounth=2
Еквівалентна форма даного SQL-оператора матиме вид:
SELECT a.priz AS Прізвище, b.D AS Нараховано, (b.D-c.d_l)*c.p+c.c AS [Сума податку], b.D-((b.D-c.d_l)*c.p+c.c) AS [До виплати]
FROM Osoba a, Vidomist b, tpp c
WHERE a.kod=b.kod AND (b.D>c.d_l) AND (b.D<=c.d_r) AND
b.year=2002 AND b.mounth=2
Результуюча таблиця матиме вид:
-
Прізвище
Нараховано
Сума податку
До виплати
Іванов
400
65,55
334,45
Петров
500
85,55
414,45
Сидоров
600
105,55
494,45
Сортування результату (фраза order by)
Взагалі кажучи, рядки результуючої таблиці SQL-запиту не впорядковані якимось чином. Але їх можна впорядкувати певним чином, для чого в операторі SELECT використовується фраза ORDER BY. Фраза ORDER BY містить список розділених комами ідентифікаторів стовпчиків таблиць по яким потрібно впорядкувати результуючу таблицю. Фраза ORDER BY дозволяє впорядкувати вибрані записи в порядку зростання (ASC) або спадання (DESC) значення стовпчиків, незалежно від того є вони в результуючій таблиці чи ні. Але в деяких діалектах вимагається, щоб фраза ORDER BY містила лише назви стовпчиків, які зустрічаються в списку виборки оператора SELECT. Отже, якщо потрібно впорядкувати результат запиту з попереднього прикладу по коду, необхідно в кінці SQL-оператора додати ORDER BY a.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 LEFT JOIN table_b b ON a.kod=b.kod
ORDER BY a.kod
Результат запиту матиме вид:
kod_a |
suma_a |
kod_b |
suma_b |
1 |
100 |
1 |
50 |
1 |
100 |
1 |
47 |
1 |
55 |
1 |
50 |
1 |
55 |
1 |
47 |
1 |
40 |
1 |
50 |
1 |
40 |
1 |
47 |
2 |
150 |
2 |
35 |
2 |
150 |
2 |
80 |
2 |
89 |
2 |
35 |
2 |
89 |
2 |
80 |
3 |
28 |
NULL |
NULL |
а результат SQL-оператора
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 LEFT JOIN table_b b ON a.kod=b.kod
ORDER BY a.kod, a.suma
матиме вид:
kod_a |
suma_a |
kod_b |
suma_b |
1 |
40 |
1 |
50 |
1 |
40 |
1 |
47 |
1 |
55 |
1 |
50 |
1 |
55 |
1 |
47 |
1 |
100 |
1 |
50 |
1 |
100 |
1 |
47 |
2 |
89 |
2 |
35 |
2 |
89 |
2 |
80 |
2 |
150 |
2 |
35 |
2 |
150 |
2 |
80 |
3 |
28 |
NULL |
NULL |