Вложени SQL заявки: FROM, WHERE (с видео)

Това е първата статия от поредицата SQL: Тънкости и техники при SELECT заявки и тя е посветена на вложените заявки, които са един полезен и мощен инструмент при извличане на данни от таблиците.

Част 1: Вложени заявки

Вложените заявки могат да се използват при разработка на приложения или в процеса на подготовка справки и отчети с изчисления, за прецизно филтриране на данни или като източник на данни за други заявки.

Вижте в следващото видео кратко представяне на резултатите, които можете да получите с вложени заявки

Първият въпрос, който възниква е

В кои части на SELECT могат да се влагат заявки?

Езикът SQL е изключително гъвкав и позволява влагане на заявки в почти всички клаузи на
SELECT заявка стига да бъдат спазени ограниченията на съответната клауза и използвани оператори.

FROM

Най-естественото място за влагане на заявки представлява FROM клаузата, тъй като тя се явява източник на данни за основната заявка. В документацията на Oracle подобни заявки се наричат inline view т.е. те имат същата идея като изгледите създавани с CREATE VIEW заявка, но са поставени директно във FROM клаузата.

Във FROM имаме и най-голяма свобода по отношение на броя на редовете и колоните, които се връщат от вложената заявка. Единствените ограничения са задължителния псевдоним, с който след това можем да се обръщаме към колоните от вложената заявка и това, че в основната заявка можем да се обръщаме само към колоните изброени в SELECT на вложената заявка.

Вижте как можете да използвате вложени заявки във FROМ в следващото видео:

Влагането на заявки във FROM е толкова разпространена техника, че в някои SQL сървъри (Oracle, MS SQL) съществува специална клауза – WITH, в която могат да се поставят вложените заявки, така че основната заявка да остане в компактен и прегледен вид.

Можете да видите как се използва WITH в следващото видео:

WHERE

Вложените заявки във WHERE клаузата позволяват стойностите за филтриране на данните да се изчисляват динамично. Класически пример е извеждането на списък на продуктите, чиято цена е над (или под) средната цена на продукт от таблицата с продукти.

Естествено, можем лесно да изчислим средната цена на продукт и след това да филтрираме таблицата с продукти, но средната цена може да е величина, която често се променя, а подобна заявка може да се налага да бъде изпълнявана често и тогава няма да бъде удобно всеки път да се изчислява средната стойност, вместо това въпросната стойност може да се изчислява директно във WHERE клаузата на основната заявка.

Ограниченията по отношение на вложената във WHERE клаузата заявка зависят от операторите, които използваме за филтриране на данните. Например, IN ( … ) допуска да бъдат подадени множество стойности т.е. вложената заявка може да връща множество от редове, но само по една колона.

От друга страна, операторите <. >. =, <>, <=, => очакват само една стойност и съответно вложената заявка трябва да връща само една стойност, но има и изключения от това правило, когато тези оператори се комбинират с ALL или ANI.

Вижте примери за влагане на SELECT заявки във WHERE клаузата както и как можете да използвате операторите ALL, ANY и EXISTS в следващото видео:

SELECT

Ако сте запознати с Pivot таблиците в MS Excel или Crosstab заявките в MS Access, то подобни резултати можете да получите и с SQL заявка, която съдържа вложени заявки в SELECT клаузата-звучи по-сложно от колкото е в действителност.

Можете да се убедите в това от следващото видео.

В следващата статия ще ви разкажа за йерархичните SELECT заявки или как да направите отчет по таблица, която е свързана със самата себе си.

Искате да научите повече за вложените заявки в SQL?

Включете се в курса SQL Анализ на данни и изготвяне на отчети.

Научете повече

Автор: Дикран Хачикян