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

Ліве з’єднання (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

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