Научете се да влагате заявки една в друга за решаване на сложни проблеми
Подзаявката (Subquery) е SELECT заявка, която е "скрита" вътре в друга заявка (обикновено в WHERE клаузата). Тя се изпълнява първа, а резултатът ѝ се предава на външната заявка.
Тези подзаявки връщат точно една клетка (един ред и една колона). Например: Каква е средната заплата?
Използват се със стандартни оператори за сравнение: =, >, <, >=, <=.
Искаме да намерим всички служители, които взимат над средната заплата.
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 > (...)?
Тези подзаявки връщат една колона с много редове (списък от стойности). Не можем да използваме = (равно), защото една стойност не може да е равна на цял списък.
Затова използваме оператора 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), кой оператор трябва да използвате, за да намерите служители, които НЕ работят в тези отдели?
Тези оператори се използват, когато сравняваме единична стойност със списък от стойности.
> ALL: По-голямо от всички числа в списъка (т.е. по-голямо от най-голямото).> ANY: По-голямо от поне едно число в списъка (т.е. по-голямо от най-малкото).Най-богатите: Заплата по-голяма от заплатата на всички служители в отдел "Marketing".
WHERE salary > ALL (
SELECT salary FROM employees WHERE department = 'Marketing'
);
Имаме списък от числа: (100, 200, 300).
Кое условие е вярно за числото 250?
Сега опитайте да напишете заявка по следното условие, използвайки знанията за подзаявки.
Задача: Намерете имената на държавите (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
);