Skip to content

Instantly share code, notes, and snippets.

@nikokozak
Created April 20, 2026 21:41
Show Gist options
  • Select an option

  • Save nikokozak/f7fcee158ace389571b626c8e7536695 to your computer and use it in GitHub Desktop.

Select an option

Save nikokozak/f7fcee158ace389571b626c8e7536695 to your computer and use it in GitHub Desktop.
ex3_kozak.ipynb
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exercise #3\n",
"\n",
"In this assignment, you'll exercise your SQL query skills.\n",
"\n",
"## The scenario\n",
"\n",
"In the year 20XX, I have won the lottery and decided to leave my programming days behind me in order to pursue my true calling as a [cat café](https://en.wikipedia.org/wiki/Cat_caf%C3%A9) tycoon. I've stored information about my cats and cafés in [this SQLite database](catcafes.db), which you should download and put in the same directory as this file.\n",
"\n",
"The following cell loads the JupySQL extension and the cat cafés database:"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The sql extension is already loaded. To reload it, use:\n",
" %reload_ext sql\n"
]
}
],
"source": [
"%load_ext sql\n",
"%sql sqlite:///catcafes.db\n",
"import pandas, matplotlib"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Because I'm focused on taking care of cats and scouting out new café locations, I need some help querying the database. And that's what you're going to do in this notebook! Let's take a look at the structure of the database.\n",
"\n",
"There are three tables:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>Name</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>cafe</td>\n",
" </tr>\n",
" <tr>\n",
" <td>cat</td>\n",
" </tr>\n",
" <tr>\n",
" <td>cat_cafe</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+----------+\n",
"| Name |\n",
"+----------+\n",
"| cafe |\n",
"| cat |\n",
"| cat_cafe |\n",
"+----------+"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%sqlcmd tables"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `cafe` table lists all of the cafés in my growing cat café empire. Each café has a name, a ZIP code, and a unique ID number:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>name</th>\n",
" <th>type</th>\n",
" <th>nullable</th>\n",
" <th>default</th>\n",
" <th>primary_key</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>id</td>\n",
" <td>INTEGER</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>name</td>\n",
" <td>VARCHAR(40)</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>zipcode</td>\n",
" <td>VARCHAR(5)</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+---------+-------------+----------+---------+-------------+\n",
"| name | type | nullable | default | primary_key |\n",
"+---------+-------------+----------+---------+-------------+\n",
"| id | INTEGER | True | None | 1 |\n",
"| name | VARCHAR(40) | True | None | 0 |\n",
"| zipcode | VARCHAR(5) | True | None | 0 |\n",
"+---------+-------------+----------+---------+-------------+"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%sqlcmd columns -t cafe"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `cat` table contains information about every cat who currently lives in one of my cafés. Each cat has a unique ID, a name, its weight in pounds, its fur color, and the pattern of the fur. If you're interested, [read more on the interesting topic of cat coat genetics](https://en.wikipedia.org/wiki/Cat_coat_genetics)."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>name</th>\n",
" <th>type</th>\n",
" <th>nullable</th>\n",
" <th>default</th>\n",
" <th>primary_key</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>id</td>\n",
" <td>INTEGER</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>name</td>\n",
" <td>VARCHAR(40)</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>weight</td>\n",
" <td>NUMERIC(10, 2)</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>color</td>\n",
" <td>VARCHAR(40)</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>pattern</td>\n",
" <td>VARCHAR(40)</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+---------+----------------+----------+---------+-------------+\n",
"| name | type | nullable | default | primary_key |\n",
"+---------+----------------+----------+---------+-------------+\n",
"| id | INTEGER | True | None | 1 |\n",
"| name | VARCHAR(40) | True | None | 0 |\n",
"| weight | NUMERIC(10, 2) | True | None | 0 |\n",
"| color | VARCHAR(40) | True | None | 0 |\n",
"| pattern | VARCHAR(40) | True | None | 0 |\n",
"+---------+----------------+----------+---------+-------------+"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%sqlcmd columns -t cat"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, there is a linking table called `cat_cafe` which associates cats to cafés. Each café has a number of cats, and some cats are moved regularly between locations. Thus there is a many-to-many relationship between cats and cafés. The `active` field indicates the cat's current location."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>name</th>\n",
" <th>type</th>\n",
" <th>nullable</th>\n",
" <th>default</th>\n",
" <th>primary_key</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>cat_id</td>\n",
" <td>INTEGER</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>cafe_id</td>\n",
" <td>INTEGER</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>active</td>\n",
" <td>BOOLEAN</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+---------+---------+----------+---------+-------------+\n",
"| name | type | nullable | default | primary_key |\n",
"+---------+---------+----------+---------+-------------+\n",
"| cat_id | INTEGER | True | None | 0 |\n",
"| cafe_id | INTEGER | True | None | 0 |\n",
"| active | BOOLEAN | True | None | 0 |\n",
"+---------+---------+----------+---------+-------------+"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%sqlcmd columns -t cat_cafe"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Thank you for helping out!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 1: Columns and equals\n",
"\n",
"Modify the query below so that the query returns the names of all tabby cats.\n",
"\n",
"Expected output:\n",
"\n",
"| name |\n",
"| --------- |\n",
"| Georges |\n",
"| Scaredy |\n",
"| Charlotte |\n",
"| Minka |\n",
"| Carlos |\n",
"| Chanel |\n",
"| Jiji |\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<span style=\"None\">Running query in &#x27;sqlite:///catcafes.db&#x27;</span>"
],
"text/plain": [
"Running query in 'sqlite:///catcafes.db'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>name</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>Georges</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Scaredy</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Charlotte</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Minka</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Carlos</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Chanel</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Jiji</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+-----------+\n",
"| name |\n",
"+-----------+\n",
"| Georges |\n",
"| Scaredy |\n",
"| Charlotte |\n",
"| Minka |\n",
"| Carlos |\n",
"| Chanel |\n",
"| Jiji |\n",
"+-----------+"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT name\n",
"FROM cat\n",
"WHERE pattern = 'tabby'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 2: Order and limits\n",
"\n",
"Modify the query below so that it returns the name and zipcode of the cafe whose name comes last in alphabetical order.\n",
"\n",
"Expected output:\n",
"\n",
"| name | zipcode |\n",
"|:----------:|:-------:|\n",
"| Tall Tails | 11222 |"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<span style=\"None\">Running query in &#x27;sqlite:///catcafes.db&#x27;</span>"
],
"text/plain": [
"Running query in 'sqlite:///catcafes.db'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>name</th>\n",
" <th>zipcode</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>Tall Tails</td>\n",
" <td>11222</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+------------+---------+\n",
"| name | zipcode |\n",
"+------------+---------+\n",
"| Tall Tails | 11222 |\n",
"+------------+---------+"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT name, zipcode\n",
"FROM cafe\n",
"ORDER BY name DESC\n",
"LIMIT 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 3: Inequality expressions\n",
"\n",
"Modify the query below so that it returns the names of all cats whose coloring is either white or black, and who weight more than 9 lbs, listed in alphabetical order by name.\n",
"\n",
"Expected output:\n",
"\n",
"| name |\n",
"| --------- |\n",
"| Charly |\n",
"| Georges |\n",
"| Jack |\n",
"| Jiji |\n",
"| Lafayette |\n",
"| Mimi |\n",
"| Sylvester |\n",
"| Whiskers |\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<span style=\"None\">Running query in &#x27;sqlite:///catcafes.db&#x27;</span>"
],
"text/plain": [
"Running query in 'sqlite:///catcafes.db'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>name</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>Charly</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Georges</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Jack</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Jiji</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Lafayette</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Mimi</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Sylvester</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Whiskers</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+-----------+\n",
"| name |\n",
"+-----------+\n",
"| Charly |\n",
"| Georges |\n",
"| Jack |\n",
"| Jiji |\n",
"| Lafayette |\n",
"| Mimi |\n",
"| Sylvester |\n",
"| Whiskers |\n",
"+-----------+"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT name\n",
"FROM cat\n",
"WHERE weight > 9 AND (color = \"black\" OR color = \"white\")\n",
"ORDER BY name"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 4: Aggregation and grouping\n",
"\n",
"Modify the SQL statement below so that it returns a list of cat colors along with the weight of the heaviest cat having that color. Only show colors whose heaviest cat weighs more than 10.5 lbs.\n",
"\n",
"Expected output:\n",
"\n",
"| color | max(weight) |\n",
"| -------- | ----------- |\n",
"| brown | 10.88 |\n",
"| cinnamon | 11.37 |\n",
"| lilac | 10.76 |\n",
"| red | 12 |\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<span style=\"None\">Running query in &#x27;sqlite:///catcafes.db&#x27;</span>"
],
"text/plain": [
"Running query in 'sqlite:///catcafes.db'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>color</th>\n",
" <th>max(weight)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>brown</td>\n",
" <td>10.88</td>\n",
" </tr>\n",
" <tr>\n",
" <td>cinnamon</td>\n",
" <td>11.37</td>\n",
" </tr>\n",
" <tr>\n",
" <td>lilac</td>\n",
" <td>10.76</td>\n",
" </tr>\n",
" <tr>\n",
" <td>red</td>\n",
" <td>12</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+----------+-------------+\n",
"| color | max(weight) |\n",
"+----------+-------------+\n",
"| brown | 10.88 |\n",
"| cinnamon | 11.37 |\n",
"| lilac | 10.76 |\n",
"| red | 12 |\n",
"+----------+-------------+"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT color, max(weight)\n",
"FROM cat\n",
"GROUP BY color\n",
"HAVING max(weight) > 10.5"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 5: Joins, part 1\n",
"\n",
"Modify the query below so that it shows the name of every tortoiseshell cat along with the `id` field of the café where the cat can currently be found (i.e., the `active` field is true).\n",
"\n",
"Expected output:\n",
"\n",
"| name | cafe_id |\n",
"| --------- | ------- |\n",
"| Luna | 2 |\n",
"| Angel | 4 |\n",
"| Moritz | 2 |\n",
"| O'Malley | 3 |\n",
"| Lafayette | 5 |"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<span style=\"None\">Running query in &#x27;sqlite:///catcafes.db&#x27;</span>"
],
"text/plain": [
"Running query in 'sqlite:///catcafes.db'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>name</th>\n",
" <th>cafe_id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>Luna</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Angel</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Moritz</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>O'Malley</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Lafayette</td>\n",
" <td>5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+-----------+---------+\n",
"| name | cafe_id |\n",
"+-----------+---------+\n",
"| Luna | 2 |\n",
"| Angel | 4 |\n",
"| Moritz | 2 |\n",
"| O'Malley | 3 |\n",
"| Lafayette | 5 |\n",
"+-----------+---------+"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT cat.name, cat_cafe.cafe_id\n",
"FROM cat\n",
"JOIN cat_cafe ON cat_cafe.cat_id = cat.id\n",
"WHERE cat.pattern = 'tortoiseshell' AND cat_cafe.active = true"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 6: Joins, part 2\n",
"\n",
"The following query is just like the one above, except it shows the name of the café instead of its ID. Add the additional `JOIN` to make the query work.\n",
"\n",
"Expected output:\n",
"\n",
"| name | name_1 |\n",
"| --------- | ----------------- |\n",
"| Luna | Independent Claws |\n",
"| Angel | Tall Tails |\n",
"| Moritz | Independent Claws |\n",
"| O'Malley | Paws and Play |\n",
"| Lafayette | Cats Meow |"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<span style=\"None\">Running query in &#x27;sqlite:///catcafes.db&#x27;</span>"
],
"text/plain": [
"Running query in 'sqlite:///catcafes.db'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>name</th>\n",
" <th>name_1</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>Luna</td>\n",
" <td>Independent Claws</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Angel</td>\n",
" <td>Tall Tails</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Moritz</td>\n",
" <td>Independent Claws</td>\n",
" </tr>\n",
" <tr>\n",
" <td>O'Malley</td>\n",
" <td>Paws and Play</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Lafayette</td>\n",
" <td>Cats Meow</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+-----------+-------------------+\n",
"| name | name_1 |\n",
"+-----------+-------------------+\n",
"| Luna | Independent Claws |\n",
"| Angel | Tall Tails |\n",
"| Moritz | Independent Claws |\n",
"| O'Malley | Paws and Play |\n",
"| Lafayette | Cats Meow |\n",
"+-----------+-------------------+"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT cat.name, cafe.name\n",
"FROM cat\n",
"JOIN cat_cafe ON cat_cafe.cat_id = cat.id\n",
"JOIN cafe ON cafe.id = cat_cafe.cafe_id\n",
"WHERE cat.pattern = 'tortoiseshell' AND cat_cafe.active = true"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 7: Joins with DISTINCT\n",
"\n",
"Quick, I need to know which zip codes have lilac tabby cats! Fix the query below to give me this information.\n",
"\n",
"Expected output:\n",
"\n",
"| zipcode |\n",
"| ------- |\n",
"| 11215 |\n",
"| 11237 |"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<span style=\"None\">Running query in &#x27;sqlite:///catcafes.db&#x27;</span>"
],
"text/plain": [
"Running query in 'sqlite:///catcafes.db'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>zipcode</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>11215</td>\n",
" </tr>\n",
" <tr>\n",
" <td>11237</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+---------+\n",
"| zipcode |\n",
"+---------+\n",
"| 11215 |\n",
"| 11237 |\n",
"+---------+"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT DISTINCT(cafe.zipcode)\n",
"FROM cat\n",
"JOIN cat_cafe ON cat_cafe.cat_id = cat.id\n",
"JOIN cafe ON cafe.id = cat_cafe.cafe_id \n",
"WHERE cat.color = 'lilac' AND cat.pattern = 'tabby' AND cat_cafe.active = true"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 8 (advanced): Joins with aggregation\n",
"\n",
"Okay, time to take off the training wheels. Modify the query below so that it returns the name of each café along with the average weight of all of the cats at that location.\n",
"\n",
"Expected output:\n",
"\n",
"| name | avg(cat.weight) |\n",
"| ----------------- | ----------------- |\n",
"| Cats Meow | 9.754999999999999 |\n",
"| Hang In There | 9.254285714285714 |\n",
"| Independent Claws | 9.334545454545456 |\n",
"| Paws and Play | 9.284545454545453 |\n",
"| Tall Tails | 9.817142857142857 |"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<span style=\"None\">Running query in &#x27;sqlite:///catcafes.db&#x27;</span>"
],
"text/plain": [
"Running query in 'sqlite:///catcafes.db'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>name</th>\n",
" <th>avg(cat.weight)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>Cats Meow</td>\n",
" <td>9.754999999999999</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Hang In There</td>\n",
" <td>9.254285714285714</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Independent Claws</td>\n",
" <td>9.334545454545456</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Paws and Play</td>\n",
" <td>9.284545454545453</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Tall Tails</td>\n",
" <td>9.817142857142857</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+-------------------+-------------------+\n",
"| name | avg(cat.weight) |\n",
"+-------------------+-------------------+\n",
"| Cats Meow | 9.754999999999999 |\n",
"| Hang In There | 9.254285714285714 |\n",
"| Independent Claws | 9.334545454545456 |\n",
"| Paws and Play | 9.284545454545453 |\n",
"| Tall Tails | 9.817142857142857 |\n",
"+-------------------+-------------------+"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT cafe.name, avg(cat.weight)\n",
"FROM cafe\n",
"JOIN cat_cafe ON cafe.id = cat_cafe.cafe_id\n",
"JOIN cat ON cat.id = cat_cafe.cat_id\n",
"WHERE cat_cafe.active = true\n",
"GROUP BY cafe.name"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 9 (advanced): Joins with order and limit\n",
"\n",
"Write a query below that returns the name of the café with the most tortoiseshell cats, along with the number of tortoiseshell cats at that location.\n",
"\n",
"Expected output:\n",
"\n",
"| name | count(cat.name) |\n",
"| ----------------- | --------------- |\n",
"| Independent Claws | 2 |"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<span style=\"None\">Running query in &#x27;sqlite:///catcafes.db&#x27;</span>"
],
"text/plain": [
"Running query in 'sqlite:///catcafes.db'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>name</th>\n",
" <th>count(cat.name)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>Independent Claws</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"+-------------------+-----------------+\n",
"| name | count(cat.name) |\n",
"+-------------------+-----------------+\n",
"| Independent Claws | 2 |\n",
"+-------------------+-----------------+"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT cafe.name, count(cat.name)\n",
"FROM cat\n",
"JOIN cat_cafe ON cat.id = cat_cafe.cat_id\n",
"JOIN cafe ON cafe.id = cat_cafe.cafe_id\n",
"WHERE cat_cafe.active = true AND cat.pattern = 'tortoiseshell'\n",
"GROUP BY cafe.name\n",
"ORDER BY count(cat.name) DESC\n",
"LIMIT 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 10 (advanced): Pandas integration\n",
"\n",
"Write code in the cell below to show a histogram of cat weights with eight bins. Do this by assigning the result of the query to a variable and fetching the Pandas dataframe.\n",
"\n",
"Expected output:\n",
"\n",
"<img src=\"data:image/png;base64,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\">"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<span style=\"None\">Running query in &#x27;sqlite:///catcafes.db&#x27;</span>"
],
"text/plain": [
"Running query in 'sqlite:///catcafes.db'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<Axes: ylabel='Frequency'>"
]
},
"execution_count": 89,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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uuqqYh2M7t27x4knnhhLliwpW3sBgMpS1iCzfv36OPLII+Pmm2/e7uM33HBD3HjjjTF9+vR45plnomfPnjFixIjYuHFjm7cVAKg8ZV008pRTTim27Um9MVOnTo3vfve7MWrUqGLfHXfcEf369St6bs4444w2bi0AUGkqtkbmlVdeiddff724nNSoT58+ceyxx8bcuXN3+LpNmzZFXV1dsw0AaJ8qNsikEJOkHpgtpfuNj21PbW1tEXgat4EDB5a8rQBAeVRskGmpiRMnxpo1a5q2lStXlrtJAEC1BZn+/fsXt2+88Uaz/el+42Pb07Vr1+jdu3ezDQBonyo2yAwePLgILLNmzWral+pd0uilT3/602VtGwBQGco6amndunWxdOnSZgW+L7zwQuy+++4xaNCguOiii+Laa6+N/fffvwg2V155ZTHnzOjRo8vZbACgQpQ1yMybNy+GDx/edP+SSy4pbseOHRu33357fOc73ynmmvmXf/mXWL16dQwbNiwefvjh6NatWxlbDQBUig4NacKWdixdjkqjl1Lhr3oZqlHNhIeiPVs2eWS5mwCU8fu7YmtkAADejyADAGRLkAEAsiXIAADZEmQAgGwJMgBAtgQZACBbggwAkC1BBgDIliADAGRLkAEAsiXIAADZEmQAgGwJMgBAtgQZACBbggwAkC1BBgDIliADAGRLkAEAsiXIAADZEmQAgGwJMgBAtgQZACBbggwAkC1BBgDIVudyNwDgo6iZ8FC7PoHLJo8sdxOgoumRAQCyJcgAANkSZACAbAkyAEC2BBkAIFuCDACQLUEGAMiWIAMAZEuQAQCyJcgAANkSZACAbAkyAEC2BBkAIFuCDACQLUEGAMiWIAMAZEuQAQCyJcgAANkSZACAbAkyAEC2BBkAIFuCDACQLUEGAMiWIAMAZEuQAQCyJcgAANkSZACAbFV0kNm8eXNceeWVMXjw4OjevXsMGTIkrrnmmmhoaCh30wCACtA5Ktj1118f06ZNixkzZsShhx4a8+bNi3HjxkWfPn3iggsuKHfzAIAyq+gg8/TTT8eoUaNi5MiRxf2ampq4++6749lnny130wCAClDRl5aOO+64mDVrVixevLi4v3DhwpgzZ06ccsopO3zNpk2boq6urtkGALRPFd0jM2HChCKIHHTQQdGpU6eiZua6666LMWPG7PA1tbW1MWnS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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cat_weights = %sql SELECT weight FROM cat\n",
"df = pandas.DataFrame(cat_weights)\n",
"df.plot.hist(bins=8)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Great work! You're hired."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.14.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment