Difference between revisions of "SELECT .. SELECT"
From SQLZOO
| (10 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
| − | + | __NOTOC__ | |
| − | <p> | + | ==Subquery Table, Derived Tables, Nested Queries== |
| − | + | <p>You can use the results from one query in another query</p> | |
| − | + | ==Subquery with FROM== | |
| − | + | <div class='qu'> | |
| − | + | You may use a SELECT statement in the FROM line. | |
| − | </p> | + | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | < | + | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | In this case the derived table X has columns <code>name</code> and <code>gdp_per_capita</code>. | |
| + | The calculated values in the inner SELECT can be used in the outer SELECT. | ||
| + | <source lang='sql' class='def'> | ||
| + | SELECT name, ROUND(gdp_per_capita) | ||
| + | FROM | ||
| + | (SELECT name, | ||
| + | gdp/population AS gdp_per_capita | ||
| + | FROM bbc) X | ||
| + | WHERE gdp_per_capita>20000 | ||
| + | </source> | ||
| + | Notice that | ||
| + | *the inner table is given an alias X | ||
| + | *the first column in the inner query keeps its name | ||
| + | *the second column in the inner query has an alias | ||
| + | </div> | ||
| + | ==Subquery with IN== | ||
<div class='qu'> | <div class='qu'> | ||
| − | You may use a SELECT statement in the | + | <p class='imper'>Find the countries in the same region as Bhutan</p> |
| − | + | You may use a SELECT statement in the WHERE line - this returns a list of regions. | |
| + | |||
<source lang='sql' class='def'> | <source lang='sql' class='def'> | ||
| − | SELECT name | + | SELECT name |
| − | FROM bbc | + | FROM bbc |
| − | (SELECT region | + | WHERE region IN |
| − | + | (SELECT region FROM bbc | |
| − | + | WHERE name='Bhutan') | |
| − | + | ||
| − | + | ||
</source> | </source> | ||
| + | </div> | ||
| − | <source lang='sql' class=' | + | ==Correlated Subquery== |
| − | SELECT name | + | <div class='qu'> |
| − | + | <p>If a value from the outer query appears in the inner query this is "correlated subquery".</p> | |
| − | (SELECT | + | <p class='imper'>Show the countries where the population is greater than 5 times the average for its region</p> |
| − | + | ||
| − | + | <source lang='sql' class='def'> | |
| − | + | SELECT name | |
| + | FROM bbc b1 | ||
| + | WHERE population> | ||
| + | 5*(SELECT AVG(population) FROM bbc | ||
| + | WHERE region=b1.region) | ||
</source> | </source> | ||
</div> | </div> | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
<div>See also:</div> | <div>See also:</div> | ||
<ul> | <ul> | ||
Revision as of 01:33, 9 August 2012
Subquery Table, Derived Tables, Nested Queries
You can use the results from one query in another query
Subquery with FROM
You may use a SELECT statement in the FROM line.
In this case the derived table X has columns name and gdp_per_capita.
The calculated values in the inner SELECT can be used in the outer SELECT.
SELECT name, ROUND(gdp_per_capita) FROM (SELECT name, gdp/population AS gdp_per_capita FROM bbc) X WHERE gdp_per_capita>20000
Notice that
- the inner table is given an alias X
- the first column in the inner query keeps its name
- the second column in the inner query has an alias
Subquery with IN
Find the countries in the same region as Bhutan
You may use a SELECT statement in the WHERE line - this returns a list of regions.
SELECT name FROM bbc WHERE region IN (SELECT region FROM bbc WHERE name='Bhutan')
If a value from the outer query appears in the inner query this is "correlated subquery".
Show the countries where the population is greater than 5 times the average for its region
SELECT name FROM bbc b1 WHERE population> 5*(SELECT AVG(population) FROM bbc WHERE region=b1.region)
See also: