Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тема4_ДСН.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
59.07 Кб
Скачать

Пропозиція inner join (внутрішнє з'єднання)

Є альтернативним варіантом пропозицій FROM і WHERE для з'єднання таблиць по рівності:

SELECT Список полів

FROM Таблица1INNER JOIN Таблиця2

ON Умова з'єднання;

У результуючу таблицю потраплять тільки ті записи, які мають однакові значення в зв'язаних полях.

Для вибірки з 3-х таблиць використовується вкладений INNER JOIN:

SELECT Список полів

FROM Таблиця1 INNER JOIN (Таблиця2 INNER JOIN Таблиця3

ON Умова з'єднання Таблиці2 і таблиці3)

ON Умова з'єднання Таблиці1 і таблиці3;

Пропозиція LEFT JOIN (ліве з'єднання)

SELECT Список полів

FROM Таблиця1 LEFT JOIN Таблиця2

ON Умова з'єднання;

У результуючу таблицю входять всі рядки з таблиці1, а частини результуючих кортежів, для яких немає відповідних значень в таблиці2, доповнюються значеннями NULL(невизначено).

Пропозиція RIGHT JOIN (праве з'єднання)

SELECT Список полів

FROM Таблиця1 RIGHT JOIN Таблиця2

ON Умова з'єднання;

У результуючу таблицю входять всі рядки з таблиці2, а частини результуючих кортежів, для яких немає відповідних значень в таблиці1, доповнюються значеннями NULL(невизначено).

Пропозиції LEFT JOIN і RIGHT JOIN можуть бути вкладені в INNER JOIN, але не навпаки.

24. Видати прізвища клієнтів, найменування товару і суму заплачених грошей за ці товари.

SELECT прізвище, найменування, sum(продано*ціна) AS[Cумма]

FROM товари INNER JOIN (клієнти INNER JOIN продажі ON клієнти.код_клієнта = продажи.код_клієнта) ON товари.код_товара = продажи.код_товара

GROUP BY прізвище, найменування;

25. Вибрати список всіх товарів з вказівкою суми, на яку продані ці товари

SELECT найменування, sum(продано*ціна) AS [Сума]

FROM товари LEFT JOIN продажу ON товари.код_товара = продажи.код_товара

GROUP BY найменування;

У останніх двох запитах в пропозиції SELECT створені обчислювані поля. SQL дозволяє створювати такі поля в тексті запиту. У виразах застосовуються арифметичні і математичні операції.

Підпорядковані запити

Це SELECT - запити упроваджені в тіло іншого SELECT - запиту. Зовнішній оператор SELECT використовує результат виконання внутрішнього оператора для визначення змісту остаточного результату всієї операції. Внутрішні запити можуть бути поміщені в пропозиції WHERE і HAVING зовнішнього оператора SELECT - в цьому випадку вони одержують назву підзапитів або вкладених запитів. Крім того, внутрішні оператори SELECT можуть використовуватися в операторах INSERT, UPDATE, DELETE. Існує три типу підзапитів:

- скалярний підзапит; повертає єдине значення.

- строковий підзапит; повертає значення декількох стовпців таблиці, але у вигляді єдиного рядка.

- табличний підзапит; повертає значення одного або більше стовпців таблиці, розміщені в більш ніж одному рядку. Табличний підзапит може використовуватися скрізь, де допускається указувати таблицю - наприклад, як операнд предиката IN.

Правила запису:

1. Текст підзапиту записується в круглих дужках.

2. У підзапитах не можна використовувати пропозицію ORDER BY.

3. У основному запиті не можна використовувати BETWEEN.

4. Підзапити, що повертають більше одного запису, можуть використовуватися тільки з багатозначними функціями.

5. Якщо підзапит є одним з двох операндів, що беруть участь в операції порівняння, то запит указується в правій частині порівняння.

Приклади. Розглянемо відношення Співробітники (таб_номер, ФІО, оклад, номер_отдела)

1. Скласти список всіх співробітників, що мають оклад вище за середнє по підприємству.

SELECT ФІО

FROM Співробітники

WHERE Оклад>(SELECT AVG(оклад)

FROM співробітники);

2. Одержати список співробітників, одержуючих зарплату вище за хоч би одного співробітника відділу №1.

SELECT ФІО

FROM Співробітники

WHERE Оклад>ANY (SELECT оклад

FROM співробітники

WHERE номер_отдела=1);

3. Скласти список всіх співробітників, чия зарплата більше зарплати будь-якого співробітника отдела №2.

SELECT ФІО

FROM Співробітники

WHERE Оклад>ALL (SELECT оклад

FROM співробітники

WHERE номер_отдела=2);

З табличними підзапитами використовуються ключові слова EXISTS і NOT EXISTS. Результат їх обробки є логічним значенням TRUE або FALSE. Для ключового слова EXISTS результат рівний TRUE тільки в тому випадку, якщо в повертаному підзапитом результуючій таблиці присутній хоч би 1 рядок. Інакше - буде значення FALSE. Для NOT EXISTS - навпаки. Тобто за ключовими словами EXISTS і NOT EXISTS перевіряється наявність рядків в таблиці підзапиту( ця таблиця може містити довільне число стовпців).