Съставяне на подзаявки
| Информационни технологии | 2009-12-04 | 63 сваляния |
7
Съставяне на подзаявки
SQL предоставя възможност за влагане на заявки една в друга. Например:
1) Заявка, извеждаща данните за продуктите с минимална доставна цена.
SELECT * FROM Products
WHERE price = ( SELECT MIN(price) FROM Products );
2) Заявка, извеждаща данните за продуктите с доставна цена, по-голяма от средната доставна цена на всички продукти.
SELECT * FROM Products
WHERE price > ( SELECT AVG(price) FROM Products );
В тези примери трябва подзаявката да връща една стойност един ред и една колона, в противен случай се получава съобщение за грешка. За да се осигури връщане на точно една стойност, се използват обобщаващи функции или условие за стойността на колоната (колоните) на първичния ключ или на колона (колони) с ограничение за уникалност. Когато подзаявката не върне резултат, конструкцията няма да върне грешка, но и основната заявка няма да върне резултат.
Разширение на стандартния SQL позволява извеждане на резултата от подзаявката в списъка с полета на главната заявка. Например:
3) Заявка, извеждаща име на продукт и брой на продажбите на съответния продукт.
SELECT ProductName, ( SELECT COUNT(*)
FROM SaleDetails sd
WHERE sd.ProductID = p.ProductID )
AS CountOfProductsSales
FROM Products p;
Тази заявка е еквивалентна на следната:
SELECT ProductName,
COUNT(sd.ProductID) AS CountOfProductsSales
FROM Products p
LEFT JOIN SaleDetails sd ON sd.ProductID = p.ProductID
GROUP BY ProductName;
За подзаявки, генериращи произволен брой редове, се използва специалния оператор IN. Например:
4) Заявка, извеждаща данните за продажбите на служителите с дадена фамилия.
SELECT *
FROM Sales
WHERE EmployeeID IN ( SELECT EmployeeID FROM Employees
WHERE LastName = "Име" );
Тази заявка е еквивалентна на следната:
SELECT s.*
FROM Sales s
INNER JOIN Employees e ON e.EmployeeID = s.EmployeeID
WHERE LastName = "Име";
Едно съединение може да се напише като подзаявка, но обратното не винаги е вярно. Съединението в повечето случаи се изпълнява по-бързо, отколкото еквивалентната подзаявка, но целта на заявката е по-ясно определена, когато даден въпрос бъде решен чрез подзаявка.
5) Заявка, извеждаща данните за клиентите, намиращи се в градове, в които има доставчици.
SELECT * FROM Customers
Тагове от реферата: подзявки, съствяне











