Разделы презентаций


Заняття 6. Формування багатотабличного SQL- запиту

Содержание

Зв’язані (корельовані) підзапитиОсновною ознакою зв’язаного (корельованого) підзапиту є те, що він не може бути виконаним самостійно, без зв’язку з основним запитом.Формально це реалізується тим, що підзапит посилається на таблицю, яка вказується

Слайды и текст этой презентации

Слайд 1Заняття 6. Формування багатотабличного SQL-запиту

Заняття 6. Формування багатотабличного  SQL-запиту

Слайд 2Зв’язані (корельовані) підзапити
Основною ознакою зв’язаного (корельованого) підзапиту є те, що

він не може бути виконаним самостійно, без зв’язку з основним

запитом.
Формально це реалізується тим, що підзапит посилається на таблицю, яка вказується в основній частині запиту.

Зв’язані (корельовані) підзапитиОсновною ознакою зв’язаного (корельованого) підзапиту є те, що він не може бути виконаним самостійно, без

Слайд 3Типовий абстрактний зв’язаний підзапит:
SELECT A FROM T1 WHERE T1.B =
(SELECT

T2.B FROM T2 WHERE T2.C = T1.C)
Цей запит використовує дві

таблиці T1 і T2, в яких є стовпці з однаковими іменами B, C, і однаковими типами.

Типовий абстрактний зв’язаний підзапит:SELECT A FROM T1 WHERE T1.B =(SELECT T2.B FROM T2 WHERE T2.C = T1.C)Цей

Слайд 4Виконання запиту з корельованим підзапитом
Спочатку береться увесь перший запис

з таблиці T1. Цей запис називається поточним. Значення стовпців для

цього запису є доступними і можуть використовуватись у підзапиті.
Після цього виконується підзапит, який повертає список значень стовпця B таблиці T2 у тих записах, в яких значення стовпця C рівне значенню стовпця C з таблиці T1. Припускаємо, що підзапит повертає єдине значення (оскільки в операторі WHERE основного запиту операція =).
Тепер виконується оператор WHERE основного запиту. Якщо значення стовпця B поточного запису таблиці T1 рівне значенню, яке вибрав підзапит, то цей запис виділяється зовнішнім запитом і поміщається в результатну таблицю. Якщо умова оператора WHERE основного запиту не виконується, то вибраний запис ігнорується.
Після цього відбувається перехід на наступний запис таблиці T1. Аналогічно все виконується для кожного запису таблиці T1.


Виконання запиту з корельованим підзапитом Спочатку береться увесь перший запис з таблиці T1. Цей запис називається поточним.

Слайд 5Зв’язані (корельовані) підзапити
Приклад 1. Знайти інформацію про усіх замовників, що

здійснювали замовлення 3 жовтня:
SELECT * FROM Customers
WHERE '2009-10-03' IN
(SELECT odate

FROM Orders
WHERE Customers.cnum = Orders.cnum);
Зв’язані (корельовані) підзапитиПриклад 1. Знайти інформацію про усіх замовників, що здійснювали замовлення 3 жовтня:SELECT * FROM CustomersWHERE

Слайд 6Приклад 2. (Зв’язані підзапити у фразі HAVING). Просумувати платежі за

кожен день, виводячи дати, де сума платежів була б на

2000 більша від максимального платежу за цей день.
SELECT odate, SUM(amt)
FROM Orders o1
GROUP BY odate
HAVING SUM(amt) >
(SELECT 2000.00 + MAX(amt)
FROM Orders o2
WHERE o1.odate = o2.odate);
Приклад 2. (Зв’язані підзапити у фразі HAVING). Просумувати платежі за кожен день, виводячи дати, де сума платежів

Слайд 7Використання предиката EXISTS
Приклад 3. (Перевірка на непорожній результат). Отримати

відомості про замовників, які зробили хоча б одну покупку.
SELECT *

FROM Customers
WHERE EXISTS
(SELECT DISTINCT onum FROM Orders
WHERE Customers.cnum = Orders.cnum);

Використання предиката EXISTS Приклад 3. (Перевірка на непорожній результат). Отримати відомості про замовників, які зробили хоча б

Слайд 8Внутрішнє з’єднання (INNER JOIN)
NATURAL JOIN – природне з'єднання.
JOIN…ON – з’єднання

за умовою.
JOIN…USING – з’єднання за іменами стовпців.

Внутрішнє з’єднання (INNER JOIN)NATURAL JOIN – природне з'єднання.JOIN…ON – з’єднання за умовою.JOIN…USING – з’єднання за іменами стовпців.

Слайд 9Природне з’єднання (NATURAL JOIN)
Перевіряються на рівність усі одноіменні стовпці

таблиці (з’єднання за рівністю).
Синтаксис:
SELECT Таблиця1.*, Таблиця2.*
FROM Таблиця1 NATURAL JOIN

Таблиця2;

Природне з’єднання  (NATURAL JOIN) Перевіряються на рівність усі одноіменні стовпці таблиці (з’єднання за рівністю). Синтаксис:SELECT Таблиця1.*,

Слайд 10Умовне з’єднання (JOIN…ON), з’єднання за іменами стовпців (JOIN…USING)
JOIN…ON використовується,

коли потрібно з’єднати за іншими логічними умовами, не обов’язково за

рівністю.
JOIN…USING подібне на природне з’єднання. Відмінність полягає в тому, що можна вказати, які саме стовпці повинні перевірятись.
Умовне з’єднання (JOIN…ON),  з’єднання за іменами стовпців (JOIN…USING) JOIN…ON використовується, коли потрібно з’єднати за іншими логічними

Слайд 11Внутрішнє з’єднання (INNER JOIN)
При внутрішньому з'єднанні рядки таблиць, що не

співпадають виключаються.
Приклад 4. Вивести імена продавців і замовників з

однакових міст.
SELECT Sellers.sname, Sellers.city, Customers.cname
FROM Sellers, Customers
WHERE Sellers.snum = Customers.snum AND Sellers.city = Customers.city ;

SELECT s.sname, s.city, c.cname
FROM Sellers s INNER JOIN Customers c
ON s.snum = c.snum WHERE s.city = c.city;

Внутрішнє з’єднання (INNER JOIN)При внутрішньому з'єднанні рядки таблиць, що не співпадають виключаються. Приклад 4. Вивести імена продавців

Слайд 12Приклад 5. Знайти усі операції купівлі-продажу, в яких брали участь

замовники, які знаходяться у інших містах, ніж продавці, які їх

обслуговували.
SELECT Orders.onum, Orders.amt, Orders.odate, Customers.cname, Sellers.sname
FROM Sellers, Customers, Orders
WHERE Customers.city <> Sellers.city
AND Orders.cnum = Customers.cnum
AND Orders.snum = Sellers.snum;
Приклад 5. Знайти усі операції купівлі-продажу, в яких брали участь замовники, які знаходяться у інших містах, ніж

Слайд 13 SELECT o.onum, o.amt, o.odate, c.cname, s.sname
FROM Customers c JOIN

Orders o ON c.cnum = o.cnum
JOIN Sellers s ON

o.snum = s.snum
WHERE c.city <> s.city;

SELECT o.onum, o.amt, o.odate, c.cname, s.sname
FROM Customers c JOIN Orders o ON c.cnum = o.cnum
JOIN Sellers s ON o.snum = s.snum
AND c.city <> s.city;

SELECT o.onum, o.amt, o.odate, c.cname, s.snameFROM Customers c JOIN Orders o ON c.cnum = o.cnum JOIN

Слайд 14З’єднання таблиці з собою
Приклад 6. Знайти усі пари замовників, які

мають однаковий рейтинг.
Рішення 1 (з дублюванням):
SELECT c1.cname, c2.cname, c1.rating


FROM Customers c1 JOIN Customers c2
ON c1.rating = c2.rating;

З’єднання таблиці з собоюПриклад 6. Знайти усі пари замовників, які мають однаковий рейтинг. Рішення 1 (з дублюванням):SELECT

Слайд 15Рішення 2 (без дублювання):
SELECT c1.cname, c2.cname, c1.rating
FROM Customers c1,

Customers c2
WHERE c1.rating = c2.rating
AND c1.cname < c2.cname;


Або
SELECT c1.cname, c2.cname, c1.rating
FROM Customers c1 JOIN Customers c2
ON c1.rating = c2.rating
AND c1.cname < c2.cname;

Рішення 2 (без дублювання):SELECT c1.cname, c2.cname, c1.rating FROM Customers c1, Customers c2 WHERE c1.rating = c2.rating AND

Слайд 16Перехресне з’єднання (CROSS JOIN)
Відповідає операції розширеного декартового добутку, тобто операції

з’єднання двох таблиць, при якому кожний запис першої таблиці з’єднується

з кожним записом другої таблиці.
У деяких СУБД не використовується (В MySQL використовується).
SELECT <список стовпців>
FROM Таблиця1, Таблиця2;
Або
SELECT <список стовпців>
FROM Таблиця1 CROSS JOIN Таблиця2;

Перехресне з’єднання  (CROSS JOIN)Відповідає операції розширеного декартового добутку, тобто операції з’єднання двох таблиць, при якому кожний

Слайд 17Зовнішні з’єднання
LEFT OUTER JOIN – ліве з’єднання.
RIGHT OUTER JOIN –

праве з’єднання.
FULL JOIN – повне з’єднання.
UNION JOIN – об’єднане

з’єднання.

Зовнішні з’єднанняLEFT OUTER JOIN – ліве з’єднання.RIGHT OUTER JOIN – праве з’єднання.FULL JOIN – повне з’єднання. UNION

Слайд 18Відмінність внутрішнього і зовнішнього з’єднання
При внутрішньому з’єднанні відкидаються усі

записи, для яких немає відповідних записів одночасно в обох таблицях.
При

зовнішньому з’єднанні такі невідповідні записи повинні залишатись.

Відмінність внутрішнього і зовнішнього з’єднання При внутрішньому з’єднанні відкидаються усі записи, для яких немає відповідних записів одночасно

Слайд 19Ліве з’єднання (LEFT OUTER JOIN)
При лівому зовнішньому з’єднанні невідповідні записи,

які є в лівій таблиці (від оператора JOIN), зберігаються в

результатній таблиці, а ті, які є в правій таблиці – відкидаються.
Ліве з’єднання  (LEFT OUTER JOIN)При лівому зовнішньому з’єднанні невідповідні записи, які є в лівій таблиці (від

Слайд 20Приклад 7. Переглянути всіх продавців разом із їх операціями купівлі-продажу,

які вони обслуговували 3 жовтня 2009 року.
SELECT s.sname, o.onum
FROM Sellers

s LEFT JOIN Orders o
ON o.odate = '2009-10-03'
AND s.snum = o.snum;


Приклад 7. Переглянути всіх продавців разом із їх операціями купівлі-продажу, які вони обслуговували 3 жовтня 2009 року.SELECT

Слайд 21Альтернативний варіант LEFT JOIN:
SELECT s.sname, o.onum
FROM Sellers s, Orders o
WHERE

o.odate = '2009-10-03'
AND s.snum = o.snum
UNION
SELECT s.sname, NULL
FROM Sellers s
WHERE

s.sname NOT IN
(SELECT s.sname
FROM Sellers s, Orders o
WHERE o.odate = '2009-10-03'
AND s.snum = o.snum);


Альтернативний варіант LEFT JOIN:SELECT s.sname, o.onumFROM Sellers s, Orders oWHERE o.odate = '2009-10-03'AND s.snum = o.snumUNIONSELECT s.sname,

Слайд 22Праве з’єднання (RIGHT OUTER JOIN)
При правому зовнішньому з’єднанні невідповідні записи,

які є у правій таблиці, зберігаються в результатній таблиці, а

ті, які є в лівій таблиці – відкидаються.
Праве з’єднання  (RIGHT OUTER JOIN)При правому зовнішньому з’єднанні невідповідні записи, які є у правій таблиці, зберігаються

Слайд 23Приклад 8. Переглянути всіх клієнтів разом з продавцями, які їх

обслуговують, а також відобразити продавців які не мають клієнтів.
SELECT c.cnum,

s.sname
FROM customers c RIGHT JOIN sellers s
ON c.snum = s.snum;

Приклад 8. Переглянути всіх клієнтів разом з продавцями, які їх обслуговують, а також відобразити продавців які не

Слайд 24Повне з’єднання (FULL JOIN)
Повне з'єднання є комбінацією лівого і правого

з'єднань.
Воно показує всі рядки з обох таблиць: за наявності

збігів – з'єднані, в іншому випадку – з NULL-значеннями в стовпцях з іншої таблиці.
В MySQL немає оператора FULL JOIN!
Для використання FULL JOIN в MySQL потрібно об'єднати два однакові запити із LEFT JOIN та RIGHT JOIN за допомогою оператора UNION.
Повне з’єднання (FULL JOIN)Повне з'єднання є комбінацією лівого і правого з'єднань. Воно показує всі рядки з обох

Слайд 25Об’єднане з’єднання (UNION JOIN)
При об’єднаному з’єднанні створюється віртуальна таблиця, яка

містить усі стовпці двох вихідних таблиць.
При цьому стовпці з

лівої вихідної таблиці містять усі свої записи, а в тих же записах в стовпцях з правої таблиці містяться значення NULL.
Аналогічно, стовпці з правої таблиці містять усі свої записи, а ці ж записи з лівої таблиці містять NULL.
Загальна кількість записів, які містяться в результатній таблиці рівна сумі кількості записів, які є в обох вихідних таблицях.
Як правило, результат об’єднаного з’єднання розглядається в якості проміжного при виконанні більш складного запиту.
В MySQL немає оператора UNION JOIN!


Об’єднане з’єднання (UNION JOIN)При об’єднаному з’єднанні створюється віртуальна таблиця, яка містить усі стовпці двох вихідних таблиць. При

Слайд 27Теоретико-множинні операції в SQL
UNION – об’єднання наборів записів.
INTERSECT –

перетин наборів записів.
EXEPT – віднімання наборів записів.

Теоретико-множинні операції в SQLUNION – об’єднання наборів записів. INTERSECT – перетин наборів записів. EXEPT – віднімання наборів

Слайд 28Об’єднання наборів записів (UNION)
Запит1 UNION Запит2;
До набору рядків, які виводяться одним

запитом додаються рядки, які виводяться другим запитом.
Об’єднуються рядки двох чи

більше таблиць з подібними структурами в одну таблицю.
При об’єднанні в результатній таблиці залишаються лише різні рядки.
Щоб зберегти в результатній таблиці усі рядки, необхідно написати UNION ALL.
Коли використовується об’єднання більш ніж двох запитів, можна використовувати дужки для визначення порядку запитів.

Об’єднання наборів записів (UNION)Запит1 UNION Запит2;До набору рядків, які виводяться одним запитом додаються рядки, які виводяться другим

Слайд 29Приклад 9. Вивести усіх продавців та замовників з Лондона:
SELECT snum

AS num, sname AS name
FROM Sellers
WHERE

city = 'London'
UNION
SELECT cnum AS num, cname AS name
FROM Customers
WHERE city = 'London'
ORDER BY name DESC;

Приклад 9. Вивести усіх продавців та замовників з Лондона:	SELECT snum AS num, sname AS name 	 FROM

Слайд 30Правила використання оператора UNION
При об’єднанні рядків двох таблиць їх стовпці повинні

бути сумісними.
Це означає, що кожний запит повинен вказувати однакову

кількість стовпців і в однаковому порядку.
Типи полів повинні бути теж сумісні.
Однак, імена відповідних стовпців та їх розміри можуть бути різними.
Щоб об’єднати рядки таблиць з несумісними (по типу даних) стовпцями, необхідно застосувати функцію перетворення типу даних CAST().

Правила використання оператора UNIONПри об’єднанні рядків двох таблиць їх стовпці повинні бути сумісними. Це означає, що кожний

Слайд 31Упорядкування об’єднання наборів записів
Використовується фраза:
ORDER BY

за декількома полями, одне всередині іншого, і вказати ASC або

DESC для кожного.

Упорядкування об’єднання наборів записівВикористовується фраза:ORDER BY

Слайд 32Перетин наборів записів (INTERSECT)
Запит1 INTERSECT Запит2;
Перетин наборів рядків повертає таблицю,

рядки якої містяться одночасно у двох наборах.
При перетині в результатній

таблиці залишаються лише різні записи.
Щоб зберегти в ній усі записи, необхідно написати INTERSECT ALL.
В MySQL немає оператора INTERSECT!



Перетин наборів записів (INTERSECT)Запит1 INTERSECT Запит2;Перетин наборів рядків повертає таблицю, рядки якої містяться одночасно у двох наборах.При

Слайд 33Приклад 10. Вивести номери усіх продавців, які обслуговували операції купівлі-продажу

і 3 жовтня, і 6.
Із використанням оператора INTERSECT (в MySQL

не працюватиме):
SELECT snum FROM Orders
WHERE odate = '2009-10-03';
INTERSECT ALL
SELECT snum FROM Orders
WHERE odate = '2009-10-06';

Приклад 10. Вивести номери усіх продавців, які обслуговували операції купівлі-продажу і 3 жовтня, і 6.Із використанням оператора

Слайд 34Без використання оператора INTERSECT:
SELECT DISTINCT snum FROM Orders
WHERE snum

IN
(SELECT snum FROM Orders WHERE odate = '2009-10-03')
AND snum

IN
(SELECT snum FROM Orders WHERE odate = '2009-10-06');
Без використання оператора INTERSECT:SELECT DISTINCT snum FROM Orders WHERE snum IN(SELECT snum FROM Orders WHERE odate =

Слайд 35Віднімання наборів записів (EXEPT)
Запит1 EXEPT Запит2;
Віднімання наборів рядків повертає таблицю,

рядки якої містяться в одному наборі за виключенням тих, які

містяться в другому наборі.
В MySQL немає оператора EXEPT!


Віднімання наборів записів (EXEPT)Запит1 EXEPT Запит2; Віднімання наборів рядків повертає таблицю, рядки якої містяться в одному наборі

Слайд 36Приклад 11. Вивести номери усіх продавців, які обслуговували операції купівлі-продажу

3 жовтня, але не обслуговували 6 жовтня.
Без використанням оператора EXEPT:
SELECT

DISTINCT snum FROM Orders
WHERE snum IN
(SELECT snum FROM Orders WHERE odate = '2009-10-03')
AND snum NOT IN
(SELECT snum FROM Orders WHERE odate = '2009-10-06');

Приклад 11. Вивести номери усіх продавців, які обслуговували операції купівлі-продажу 3 жовтня, але не обслуговували 6 жовтня.Без

Слайд 37Завдання 1. Написати багатотабличні запити для власної бази даних
Написати 2

запити із корельованими підзапитами.
Перевірити 1 пару таблиць на непорожні значення

зовнішніх ключів (оператори LEFT JOIN або RIGHT JOIN).
Написати 1 запит із аналогом INTERSECT або EXEPT.
Написати декілька запитів для внутрішнього з'єднання таблиць (мінімум 4).


Завдання 1. Написати багатотабличні запити для власної бази данихНаписати 2 запити із корельованими підзапитами.Перевірити 1 пару таблиць

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика