Використання вкладених запитів в SQL

Нехай нам потрібно з таблиці Cars вибрати автомобілі з типом кузова «Седан», значення id якого ми не знаємо. Одним із способів отримати даний результат — це послідовне виконання двох запитів. Спочатку запит до таблиці Body_Type, щоб з'ясувати значення поля id для типу кузова «Седан», а потім, сформувати другий запит, який буде вибирити із таблиці Cars автомобілі, у яких поле body_type_id дорівнює отриманому значенню.

Вкладені запитиВкладені запити

Можна скористатись другим способом і обійтись одним запитом, який містить вкладений запит:

SELECT Model, Year, Price
FROM Cars
WHERE body_type_id=( SELECT id FROM Body_Type WHERE body_type='Седан');

Зауваження: підзапит не можна поставити праворуч від знака дорівнює, тобто формування підзапиту наступним чином є грубою помилкою: WHERE (SELECT id FROM Body_Type WHERE body_type='Седан')=body_type_id.

Також при використанні підзапитів необхідно уважно стежити, щоб вкладений запит забезпечував результат, допустимий в предикаті, для якого він використовується. Наприклад, якщо ми запишемо наступний запит:

SELECT Model, Year, Price
FROM Cars
WHERE body_type_id=( SELECT id FROM Body_Type WHERE body_type LIKE 'С%');

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

Проте, якщо ми той самий запит запишемо наступним чином:

SELECT Model, Year, Price
FROM Cars
WHERE body_type_id=( SELECT id FROM Body_Type WHERE body_type LIKE 'К%');

то в результаті отримаємо помилку, яка зумовлена тим, що таблиця Body_Type містить декілька записів, а саме три, для яких значення поля body_type починається на букву 'К'.

Для того, щоб на практиці уникати помилок такого типу, слід в операнді WHERE головного запиту використовувати оператор IN:

SELECT Model, Year, Price
FROM Cars
WHERE body_type_id IN ( SELECT id FROM Body_Type WHERE body_type LIKE 'К%');

Даний запит завжди буде безпомилковим і повертатиме необхідний результат.

Матеріал був корисним, поділись в соціальних мережах:

Якщо тобі сподобалась дана тема, залиш свій коментар