SQL Master Class: Подзаявки (Subqueries)

Научете се да влагате заявки една в друга за решаване на сложни проблеми

1. Какво е подзаявка?

Подзаявката (Subquery) е SELECT заявка, която е "скрита" вътре в друга заявка (обикновено в WHERE клаузата). Тя се изпълнява първа, а резултатът ѝ се предава на външната заявка.

Външна заявка ( Вложена заявка ( Резултат ) -> Обработка ) -> Финален резултат

2. Скаларни подзаявки (Връщат една стойност)

Тези подзаявки връщат точно една клетка (един ред и една колона). Например: Каква е средната заплата?

Използват се със стандартни оператори за сравнение: =, >, <, >=, <=.

Пример:

Искаме да намерим всички служители, които взимат над средната заплата.

SELECT first_name, salary 
FROM employees 
WHERE salary > (
    SELECT AVG(salary) FROM employees
);

Обяснение: SQL първо изчислява средната заплата (напр. 5000), и след това външната заявка става: WHERE salary > 5000.

🤔 Бърз въпрос:

Ако вътрешната заявка (SELECT AVG(salary)...) върне стойност 2000, а служителят Иван има заплата 1800, ще бъде ли включен Иван в резултата при условие WHERE salary > (...)?

3. Списъчни подзаявки (Оператор IN)

Тези подзаявки връщат една колона с много редове (списък от стойности). Не можем да използваме = (равно), защото една стойност не може да е равна на цял списък.

Затова използваме оператора IN (включено в списъка) или NOT IN.

Пример:

Искаме имената на служители, които работят в отдели, намиращи се в София (location_id = 100).

SELECT first_name, last_name 
FROM employees 
WHERE department_id IN (
    SELECT department_id 
    FROM departments 
    WHERE location_id = 100
);

Логика: Подзаявката връща списък (напр. отдели 1, 5 и 10 са в София). Външната заявка търси служители от тези отдели.

🤔 Бърз въпрос:

Ако подзаявката връща списък с ID-та: (10, 20, 30), кой оператор трябва да използвате, за да намерите служители, които НЕ работят в тези отдели?

4. Оператори ANY и ALL

Тези оператори се използват, когато сравняваме единична стойност със списък от стойности.

Пример:

Най-богатите: Заплата по-голяма от заплатата на всички служители в отдел "Marketing".

WHERE salary > ALL (
    SELECT salary FROM employees WHERE department = 'Marketing'
);

🤔 Логическа задача:

Имаме списък от числа: (100, 200, 300).

Кое условие е вярно за числото 250?

5. Практическо упражнение (Geography DB)

Сега опитайте да напишете заявка по следното условие, използвайки знанията за подзаявки.

Задача: Намерете имената на държавите (country_name), чиято площ (area_in_sq_km) е равна на най-голямата площ в цялата таблица.

Виж подсказка

Трябва ви подзаявка: SELECT MAX(area_in_sq_km) FROM countries.


Виж решение
SELECT country_name 
FROM countries 
WHERE area_in_sq_km = (
    SELECT MAX(area_in_sq_km) 
    FROM countries
);