Download as pdf or txt
Download as pdf or txt
You are on page 1of 24

Subqueries inside

WHERE and SELECT


clauses
J O I N I N G D ATA I N S Q L

Chester Ismay
Data Science Evangelist, DataRobot
Subquery inside WHERE clause set-up
+-----------+--------------+-------------+--------------------+
| name | indep_year | fert_rate | women_parli_perc |
|-----------+--------------+-------------+--------------------|
| Australia | 1901 | 1.88 | 32.74 |
| Brunei | 1984 | 1.96 | 6.06 |
| Chile | 1810 | 1.8 | 15.82 |
| Egypt | 1922 | 2.7 | 14.9 |
| Haiti | 1804 | 3.03 | 2.74 |
| India | 1947 | 2.43 | 11.58 |
| Liberia | 1847 | 4.64 | 11.65 |
| Norway | 1905 | 1.93 | 39.6 |
| Oman | 1951 | 2.75 | 8.82 |
| Portugal | 1143 | 1.31 | 34.8 |
| Spain | 1492 | 1.53 | 38.64 |
| Uruguay | 1828 | 2.03 | 22.31 |
| Vietnam | 1945 | 1.7 | 24 |
+-----------+--------------+-------------+--------------------+

JOINING DATA IN SQL


Average fert_rate
SELECT AVG(fert_rate)
FROM states;

+---------+
| avg |
|---------|
| 2.28385 |
+---------+

JOINING DATA IN SQL


Asian countries below average `fert_rate`
SELECT name, fert_rate
FROM states
WHERE continent = 'Asia'

JOINING DATA IN SQL


Asian countries below average `fert_rate`
SELECT name, fert_rate
FROM states
WHERE continent = 'Asia'
AND fert_rate <

JOINING DATA IN SQL


Asian countries below average `fert_rate`
SELECT name, fert_rate
FROM states
WHERE continent = 'Asia'
AND fert_rate <
(SELECT AVG(fert_rate)
FROM states);

JOINING DATA IN SQL


Asian countries below average `fert_rate`
SELECT name, fert_rate
FROM states
WHERE continent = 'Asia'
AND fert_rate <
(SELECT AVG(fert_rate)
FROM states);

+---------+-------------+
| name | fert_rate |
|---------+-------------|
| Brunei | 1.96 |
| Vietnam | 1.7 |
+---------+-------------+

JOINING DATA IN SQL


Subqueries inside SELECT clauses - setup
SELECT DISTINCT continent
FROM prime_ministers;

+---------------+
| continent |
|---------------|
| Africa |
| Asia |
| Europe |
| North America |
| Oceania |
+---------------+

JOINING DATA IN SQL


Subquery inside SELECT clause - complete
SELECT DISTINCT continent,
(SELECT COUNT(*)
FROM states
WHERE prime_ministers.continent = states.continent) AS countries_num every time you do subquery inside select statement you
need to give the subquery an alias
FROM prime_ministers;

+---------------+-----------------+
| continent | countries_num |
|---------------+-----------------|
| Africa | 2 |
| Asia | 4 |
| Europe | 3 |
| North America | 1 |
| Oceania | 1 |
+---------------+-----------------+

JOINING DATA IN SQL


/*
SELECT countries.name AS country, COUNT(*) AS cities_num
In this exercise, you'll see how some queries can be written FROM cities
using either a join or a subquery. INNER JOIN countries
ON countries.code = cities.country_code
You have seen previously how to use GROUP BY with GROUP BY country
aggregate functions and an inner join to get summarized ORDER BY cities_num DESC, country
information from multiple tables. LIMIT 9;
*/
The code given in query.sql selects the top nine countries
in terms of number of cities appearing in the cities table. . SELECT countries.name AS country,
(SELECT COUNT(*)
FROM cities
WHERE countries.code = cities.country_code) AS cities_num
FROM countries
ORDER BY cities_num DESC, country
LIMIT 9;

Let's practice!
J O I N I N G D ATA I N S Q L
Subquery inside the
FROM clause
J O I N I N G D ATA I N S Q L

Chester Ismay
Data Science Evangelist, DataRobot
Build-up
SELECT continent, MAX(women_parli_perc) AS max_perc
FROM states
GROUP BY continent
ORDER BY continent;

+---------------+------------+
| continent | max_perc |
|---------------+------------|
| Africa | 14.9 |
| Asia | 24 |
| Europe | 39.6 |
| North America | 2.74 |
| Oceania | 32.74 |
| South America | 22.31 |
+---------------+------------+

JOINING DATA IN SQL


Focusing on records in monarchs
SELECT monarchs.continent
FROM monarchs, states
WHERE monarchs.continent = states.continent
ORDER BY continent;

+-------------+
| continent |
|-------------|
| Asia |
| Asia |
| Asia |
| Asia |
| Asia |
| Asia |
| Asia |
| Asia |
| Europe |
| Europe |
| Europe |
| Europe |
| Europe |
| Europe |
+-------------+

JOINING DATA IN SQL


Finishing off the subquery
SELECT DISTINCT monarchs.continent, subquery.max_perc determine the number of languages spoken for each
country, identified by the country's local name

FROM monarchs,
(SELECT continent, MAX(women_parli_perc) AS max_perc
-- Select fields
select local_name,subquery.lang_num
-- From countries
FROM states from countries,
-- Subquery (alias as subquery)
GROUP BY continent) AS subquery (SELECT code, COUNT(*) AS lang_num
FROM languages
GROUP BY code) AS subquery
WHERE monarchs.continent = subquery.continent -- Where codes match
WHERE countries.code=subquery.code
ORDER BY continent; -- Order by descending number of languages
ORDER BY lang_num ;

+-------------+------------+
| continent | max_perc |
|-------------+------------|
| Asia | 24 |
| Europe | 39.6 |
+-------------+------------+

JOINING DATA IN SQL


Let's practice!
J O I N I N G D ATA I N S Q L
Course Review
J O I N I N G D ATA I N S Q L

Chester Ismay
Data Science Evangelist, DataRobot
Types of joins
INNER JOIN
Self-joins

OUTER JOIN
LEFT JOIN

RIGHT JOIN

FULL JOIN

CROSS JOIN

Semi-join / Anti-join

JOINING DATA IN SQL


INNER JOIN vs LEFT JOIN

JOINING DATA IN SQL


RIGHT JOIN vs FULL JOIN

JOINING DATA IN SQL


CROSS JOIN with code
SELECT table1.id AS id1,
table2.id AS id2
FROM table1
CROSS JOIN table2;

JOINING DATA IN SQL


Set Theory Clauses

JOINING DATA IN SQL


Semi-joins and Anti-joins

JOINING DATA IN SQL


Types of basic subqueries
Subqueries inside WHERE clauses

Subqueries inside SELECT clauses

Subqueries inside FROM clauses

JOINING DATA IN SQL


-- Select fields
SELECT DISTINCT c.name, e.total_investment, e.imports
get the country names and
-- From table (with alias)
other 2015 data in the You are now tasked with determining the top 10 capital cities in Europe
FROM countries AS c
economies table and the and the Americas in terms of a calculated percentage using
-- Join with table (with alias)
countries table for Central city_proper_pop and metroarea_pop in cities.
LEFT JOIN economies AS e
American countries with an
-- Match on code
official language.
ON (c.code = e.code
-- and code in Subquery -- Select fields
AND c.code IN ( SELECT cities.name, cities.country_code,city_proper_pop,metroarea_pop,
SELECT l.code -- Calculate city_perc
FROM languages AS l (city_proper_pop /metroarea_pop * 100) AS city_perc
WHERE official = 'true' -- From appropriate table

Own the challenge


)) FROM cities
-- Where region and year are correct -- Where
WHERE c.region = 'Central America' AND year = 2015 WHERE name IN
-- Order by field -- Subquery
ORDER BY c.name; (SELECT capital
FROM countries

problems! You got


WHERE (continent = 'Europe'
OR continent LIKE '%America'))
AND metroarea_pop IS NOT NULL
-- Select fields -- Order appropriately
SELECT c.region, c.continent, avg(fertility_rate) AS avg_fert_rate ORDER BY city_perc DESC
calculate the average fertility -- From left table -- Limit amount

this!
rate for each region in 2015 FROM countries AS c LIMIT 10;
-- Join to right table
INNER JOIN populations AS p
-- Match on join condition
ON c.code = p.country_code
-- Where specific records matching some condition
Remember that you'll WHERE year = 2015
need to GROUP BY
all fields that
-- Group appropriately J O I N I N G D ATA I N S Q L
GROUP BY c.region, c.continent
aren't included in
-- Order appropriately
the aggregate
ORDER BY avg_fert_rate;
function of SELECT

You might also like