<expression> <comparison operator> SOME|ANY (<subquery>)
SOME and ANY are synonyms, i.e. any of them may be used. The subquery results is a single value column. If any value V returned by the subquery evaluates the operation "<expression value> <comparison operator> V" to TRUE, the ANY predicate is also equal to TRUE.
is similar to that with ANY, except that all values returned by the subquery must meet the predicate "<expression> <comparison operator> V ".
Example. Find the PC makers whose models are not presently sold (i.e. they are not available in the PC table):
Let us consider that example in details. The predicate
model = ANY (SELECT model FROM PC);
returns TRUE if the model specified by the model column in the main query will be in the PC-table model list (returned by the subquery). Because of the predicate using the NOT negation, TRUE will be obtained unless the model is in the list. That predicate is checked for each row in the main query that return all PC models (type = 'PC' predicate) in the Product table. The result set consists of single column - maker's name. The DISTINCT keyword is used to eliminate any maker duplicates that may occur when a maker produces more than one model absent from the PC table. DISTINCT.
Example. Find the models and prices for laptops with priced above any PC:
Here are the formal rules for evaluating the predicate with ANY|SOME and ALL parameters:
Suggested exercises:
17, 24, 30.It should be noted that a query returns generally a collection of values, so a run-time error may occur during the query execution if one uses the subquery in the WHERE clause without EXISTS, IN, ALL, and ANY operators, which result in Boolean value.
Example. Find the models and the prices of PC priced above laptops at minimal price:
This query is quite correct, i.e. the scalar value of the price is compared with the subquery which returns a single value. As a result we get three PC models:
However, if in answer to question regarding the models and the prices of PCs that cost the same as a laptop one writes the following query:
This error is due to comparison of the scalar value to the subquery, which returns either more that single value or none.
In its turn, subqueries may also include nested queries.
On the other hand, it is natural that subquery returning a number of rows and consisting of multiple columns may as well be used in the FROM clause. This restricts a column/row set when joining tables.
Example. Find the maker, the type, and the processor's speed of the laptops
with speed above 600 MGz.
For example, this query may be formulated as follows:
And finally, queries may be present in the SELECT clause. Sometimes, this allows a query to be formulated in a shorthand form.
Example. Find the difference between the average prices of PCs and laptops,
i.e. by how mach is the laptop price higher than that of PC in average.
Generally speaking, a single SELECT clause is sufficient in this case:
Here is the result set:
Suggested exercises:
18, 25, 26, 27, 28, 37, 39, 46, 56, 57.