diff --git a/exercises/README.md b/exercises/README.md index 4113ea3..99743f4 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -1,9 +1,25 @@ -# Seleção de Exercícios por Assunto +# Seleção de Exercícios por Dificuldade ## SQL ### SELECT básico (com JOIN implícito) e agrupamento +* [Receitas](../sql/receitas/exercicios/) + * Notebook `s01-receitas-basico.ipynb` + * [resolução](../sql/receitas/resolucao/) + * [Estradas](../sql/estradas/exercicios) * Notebook `estradas-03-sql.ipynb`, exercícios de 1 a 5 - * [resolução](../sql/estradas/resolucao) \ No newline at end of file + * [resolução](../sql/estradas/resolucao) + +* [Táxi](../sql/taxi/exercicios) + * Notebook `taxi01-sql-basico.ipynb`, bloco I + * [resolução e exemplos](../sql/taxi/resolucao-exemplos/) + * este notebook tem resoluções (algumas passo a passo) dos exercícios, mas também tem exemplos demonstrativos e explicações extra dos assuntos. + +* [Food Intake](../sql/food-intake) + * Notebook `estradas-03-sql.ipynb`, todos os exercícios + +* [Marcadores](../sql/lab05-hierarquia) + * Notebook `hierarquia-lab-05-sql.ipynb`, exercícios 1 e 2 + * no exercício 2 considere apenas o nível imediatamente subordinado a cada categoria \ No newline at end of file diff --git a/sql/receitas/exercicios/s01-receitas-basico.ipynb b/sql/receitas/exercicios/s01-receitas-basico.ipynb index c342854..c783457 100644 --- a/sql/receitas/exercicios/s01-receitas-basico.ipynb +++ b/sql/receitas/exercicios/s01-receitas-basico.ipynb @@ -1,14 +1,47 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Receitas\n", + "## Bloco de Questões I - SQL Básico\n", + "\n", + "Considere os comandos SQL a seguir para criar tabelas que controlam Produtos e Receitas, bem como o respectivo esquema relacional simplificado abaixo. A tabela de Produto mantém um cadastro de produtos, com seu código, nome e custo_unitario, que corresponde ao custo de aquisição de uma unidade do produto. Cada Receita tem um código, nome, tipo (e.g., vegana, regular, light) e custo_total (corresponde ao custo de produção da receita inteira). Cada entrada na tabela Ingrediente indica que um Produto é componente de uma Receita em uma certa quantidade.\n", + "\n", + "### Esquema Relacional\n", + "~~~\n", + "Produto(codigo_produto, nome_produto, custo_unitario)\n", + "Receita(codigo_receita, nome_receita, tipo_receita, custo_total)\n", + "Ingrediente(codigo_receita, codigo_produto, quantidade)\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ativando uma conexão de banco de dados em memória usando o SGBD H2:" + ] + }, { "cell_type": "code", "execution_count": 1, "metadata": {}, + "outputs": [], + "source": [ + "%defaultDatasource jdbc:h2:mem:db" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a5ccd43d-70aa-4378-a93a-1a18d3b37c81", + "model_id": "33001cae-013a-4621-a524-de0fb9696a39", "version_major": 2, "version_minor": 0 }, @@ -20,7 +53,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a17be32a-5cf1-47c1-987e-c6ac836b3d34", + "model_id": "11ec9ee4-43f0-46b5-8c0d-0604be2e034b", "version_major": 2, "version_minor": 0 }, @@ -32,7 +65,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "5674c1b7-ff4d-4bf0-8308-7c3388ef4a67", + "model_id": "42ba6e15-8096-4981-ac19-4f9054fda733", "version_major": 2, "version_minor": 0 }, @@ -43,8 +76,6 @@ } ], "source": [ - "%defaultDatasource jdbc:h2:file:~/data/receitas/receitas\n", - "\n", "DROP Table IF EXISTS Ingrediente;\n", "DROP Table IF EXISTS Receita;\n", "DROP Table IF EXISTS Produto;\n", @@ -52,21 +83,22 @@ "CREATE TABLE Produto (\n", " codigo_produto VARCHAR(7),\n", " nome_produto VARCHAR(80),\n", - " custo_unitario FLOAT,\n", + " custo_unitario DECIMAL(5,2),\n", " PRIMARY KEY (codigo_produto)\n", ");\n", "\n", "CREATE TABLE Receita (\n", " codigo_receita VARCHAR(7),\n", " nome_receita VARCHAR(80),\n", - " tipo_receita VARCHAR(6),\n", + " tipo_receita VARCHAR(10),\n", + " custo_total DECIMAL(5,2),\n", " PRIMARY KEY (codigo_receita));\n", " \n", "CREATE TABLE Ingrediente (\n", " codigo_receita VARCHAR(7),\n", " codigo_produto VARCHAR(7),\n", - " quantidade FLOAT,\n", - " PRIMARY KEY (codigo_receita, codigo_produto),\n", + " quantidade DECIMAL(5,2),\n", + " PRIMARY KEY (codigo_receita, codigo_produto, quantidade),\n", " FOREIGN KEY (codigo_receita)\n", " REFERENCES Receita (codigo_receita),\n", " FOREIGN KEY (codigo_produto)\n", @@ -78,13 +110,14 @@ "INSERT INTO Produto VALUES ('SUCRA', 'Sucralose', 5.0);\n", "INSERT INTO Produto VALUES ('FAR', 'Farinha', 1.0);\n", "\n", - "INSERT INTO Receita VALUES ('BOLOCE', 'Bolo Cenoura', 'vegana');\n", - "INSERT INTO Receita VALUES ('BOLOCH', 'Bolo Chocolate', 'normal');\n", - "INSERT INTO Receita VALUES ('BOLOCEL', 'Bolo Cenoura Light', 'light');\n", + "INSERT INTO Receita VALUES ('BOLOCE', 'Bolo Cenoura', 'vegana', 6.0);\n", + "INSERT INTO Receita VALUES ('BOLOCH', 'Bolo Chocolate', 'regular', 6.7);\n", + "INSERT INTO Receita VALUES ('BOLOCEL', 'Bolo Cenoura Light', 'light', 10.0);\n", "\n", "INSERT INTO Ingrediente VALUES ('BOLOCE', 'CENO', 1.0);\n", "INSERT INTO Ingrediente VALUES ('BOLOCE', 'ACU', 1.0);\n", "INSERT INTO Ingrediente VALUES ('BOLOCE', 'FAR', 3.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'ACU', 2.0);\n", "INSERT INTO Ingrediente VALUES ('BOLOCH', 'CHOCO', 1.0);\n", "INSERT INTO Ingrediente VALUES ('BOLOCH', 'ACU', 1.0);\n", "INSERT INTO Ingrediente VALUES ('BOLOCH', 'FAR', 3.0);\n", @@ -97,130 +130,147 @@ "SELECT * FROM Ingrediente;" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 1\n", + "\n", + "Liste o código de todas as receitas e o código dos ingredientes das receitas." + ] + }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "cae8045b-b2bb-4436-9ed2-f632289ab362", - "version_major": 2, - "version_minor": 0 - }, - "method": "display_data" - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ - "SELECT I.CODIGO_RECEITA, P.CODIGO_PRODUTO\n", - "FROM Ingrediente I, Produto P\n", - "WHERE I.CODIGO_PRODUTO = P.CODIGO_PRODUTO" + "## Questão 2\n", + "\n", + "Liste o nome de todas as receitas e o nome dos ingredientes das receitas." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "add533c2-035c-477b-bbc7-99e54d19e0f1", - "version_major": 2, - "version_minor": 0 - }, - "method": "display_data" - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ - "SELECT I.CODIGO_RECEITA, SUM(I.quantidade * P.custo_unitario) custo_receita\n", - "FROM Ingrediente I, Produto P\n", - "WHERE I.CODIGO_PRODUTO = P.CODIGO_PRODUTO\n", - "GROUP BY I.CODIGO_RECEITA;" + "## Questão 3\n", + "Liste o nome de todos os produtos que aparecem em receitas veganas, cujo custo unitário é maior que 1.0. Nomes de produtos não devem aparecer duplicados." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "67fdf921-c3f2-4c23-9aed-b75ec5843962", - "version_major": 2, - "version_minor": 0 - }, - "method": "display_data" - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ - "UPDATE Produto P\n", - "SET P.custo_unitario = P.custo_unitario * 1.1;\n", + "## Questão 4\n", "\n", - "SELECT *\n", - "FROM Produto P;" + "Em algumas receitas o mesmo produto aparece mais de uma vez com quantidades diferentes. Apresente a mesma tabela de Ingredientes de modo que não haja produtos que aparecem mais de uma vez. Para isso, junte os produtos que aparecem mais de uma vez na mesma receita e some as suas quantidades." ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "c3ddf4a7-21bc-4df3-bb74-0d8731cdaf57", - "version_major": 2, - "version_minor": 0 - }, - "method": "display_data" - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ - "SELECT I.CODIGO_RECEITA, SUM(I.quantidade * P.custo_unitario) custo_receita\n", - "FROM Ingrediente I, Produto P\n", - "WHERE I.CODIGO_PRODUTO = P.CODIGO_PRODUTO\n", - "GROUP BY I.CODIGO_RECEITA;" + "## Questão 5\n", + "Liste o nome dos Produtos que aparecem em mais de uma Receita." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "e65bc6d2-38ff-4b09-8b2f-8d58cd1dc845", - "version_major": 2, - "version_minor": 0 - }, - "method": "display_data" - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ - "SELECT P.nome_produto\n", - "FROM Produto P, Ingrediente I, Receita R\n", - "WHERE R.codigo_receita=I.codigo_receita AND P.codigo_produto=I.codigo_produto\n", - " AND R.tipo_receita='vegana' AND P.custo_unitario > 1.0" + "## Questão 6\n", + "\n", + "A coluna `custo_total` de uma Receita deveria calculado pelo somatório do `custo_unitario` de cada ingrediente multiplicado pela sua quantidade na receita. Escreva para verificar se a coluna está correta. A consulta apresenta o nome de todas as receitas cujo custo_total não atende a este critério, seu custo presente na `coluna_total` e seu custo calculado a patir dos ingredientes.\n", + "\n", + "Tente fazer a questão diretamente. Se não conseguir, resolva o passo a passo a seguir (6.1 a 6.3)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Questão 6 - Passo 1\n", + "Liste o nome de todas as receitas e o seu custo total (coluna `custo_total`)." ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Questão 6 - Passo 2\n", + "Amplie a query do passo 1 acrescentando uma terceira coluna de custo calculado a partir dos ingredientes. Esse custo é calculado pelo somatório do custo de cada ingrediente multiplicado pela sua quantidade na receita." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Questão 6 - Passo 3\n", + "\n", + "Apresente aquelas receitas em que o valor da coluna `custo_total` não corresponde ao custo calculado." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -236,6 +286,19 @@ "name": "SQL", "nbconverter_exporter": "", "version": "" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": false, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false } }, "nbformat": 4, diff --git a/sql/receitas/exercicios/s02-receitas-avancado.ipynb b/sql/receitas/exercicios/s02-receitas-avancado.ipynb new file mode 100644 index 0000000..12771a9 --- /dev/null +++ b/sql/receitas/exercicios/s02-receitas-avancado.ipynb @@ -0,0 +1,244 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Receitas\n", + "## Bloco de Questões II - Queries Avançadas e de Atualização\n", + "\n", + "Considere os comandos SQL a seguir para criar tabelas que controlam Produtos e Receitas, bem como o respectivo esquema relacional simplificado abaixo. A tabela de Produto mantém um cadastro de produtos, com seu código, nome e custo_unitario, que corresponde ao custo de aquisição de uma unidade do produto. Cada Receita tem um código, nome, tipo (e.g., vegana, regular, light) e custo_total (corresponde ao custo de produção da receita inteira). Cada entrada na tabela Ingrediente indica que um Produto é componente de uma Receita em uma certa quantidade.\n", + "\n", + "### Esquema Relacional\n", + "~~~\n", + "Produto(codigo_produto, nome_produto, custo_unitario)\n", + "Receita(codigo_receita, nome_receita, tipo_receita, custo_total)\n", + "Ingrediente(codigo_receita, codigo_produto, quantidade)\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ativando uma conexão de banco de dados em memória usando o SGBD H2:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%defaultDatasource jdbc:h2:mem:db" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c2d9528c-b031-4fbc-a3db-ec1112f88086", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "090784b1-b513-4596-938e-8c4e6c20c836", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "21e4b6d7-e7a7-4a5f-9288-2c1a1b5c2433", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "DROP Table IF EXISTS Ingrediente;\n", + "DROP Table IF EXISTS Receita;\n", + "DROP Table IF EXISTS Produto;\n", + "\n", + "CREATE TABLE Produto (\n", + " codigo_produto VARCHAR(7),\n", + " nome_produto VARCHAR(80),\n", + " custo_unitario DECIMAL(5,2),\n", + " PRIMARY KEY (codigo_produto)\n", + ");\n", + "\n", + "CREATE TABLE Receita (\n", + " codigo_receita VARCHAR(7),\n", + " nome_receita VARCHAR(80),\n", + " tipo_receita VARCHAR(10),\n", + " custo_total DECIMAL(5,2),\n", + " PRIMARY KEY (codigo_receita));\n", + " \n", + "CREATE TABLE Ingrediente (\n", + " codigo_receita VARCHAR(7),\n", + " codigo_produto VARCHAR(7),\n", + " quantidade DECIMAL(5,2),\n", + " PRIMARY KEY (codigo_receita, codigo_produto, quantidade),\n", + " FOREIGN KEY (codigo_receita)\n", + " REFERENCES Receita (codigo_receita),\n", + " FOREIGN KEY (codigo_produto)\n", + " REFERENCES Produto (codigo_produto) );\n", + "\n", + "INSERT INTO Produto VALUES ('CHOCO', 'Chocolate', 3.0);\n", + "INSERT INTO Produto VALUES ('CENO', 'Cenoura', 1.5);\n", + "INSERT INTO Produto VALUES ('ACU', 'Acucar', 0.5);\n", + "INSERT INTO Produto VALUES ('SUCRA', 'Sucralose', 5.0);\n", + "INSERT INTO Produto VALUES ('FAR', 'Farinha', 1.0);\n", + "\n", + "INSERT INTO Receita VALUES ('BOLOCE', 'Bolo Cenoura', 'vegana', 6.0);\n", + "INSERT INTO Receita VALUES ('BOLOCH', 'Bolo Chocolate', 'regular', 6.7);\n", + "INSERT INTO Receita VALUES ('BOLOCEL', 'Bolo Cenoura Light', 'light', 10.0);\n", + "\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'CENO', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'ACU', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'FAR', 3.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'ACU', 2.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCH', 'CHOCO', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCH', 'ACU', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCH', 'FAR', 3.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCEL', 'CENO', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCEL', 'SUCRA', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCEL', 'FAR', 3.0);\n", + "\n", + "SELECT * FROM Produto;\n", + "SELECT * FROM Receita;\n", + "SELECT * FROM Ingrediente;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 1\n", + "\n", + "Atualize o custo unitário de todos os produtos em 1%." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 2\n", + "\n", + "Crie uma VIEW para o resultado da query da Questão 4 do Bloco de Questões I.\n", + "\n", + "Em algumas receitas o mesmo produto aparece mais de uma vez com quantidades diferentes. Apresente a mesma tabela de Ingredientes de modo que não haja produtos que aparecem mais de uma vez. Para isso, junte os produtos que aparecem mais de uma vez na mesma receita e some as suas quantidades." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 3\n", + "Estenda a questão anterior aplicando a seguinte regra: se o produto aparecer duas vezes, junte os dois em um e some as suas quantidades, se aparecer mais do que duas vezes ele não deve entrar na tabela Ingredientes nova." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 4\n", + "Escreva uma consulta que liste o nome daqueles Produtos que não aparecem em nenhuma Receita." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 5\n", + "\n", + "Escreva uma consulta que mostre o nome das receitas que não têm produtos que aparecem mais de uma vez." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SQL", + "language": "SQL", + "name": "sql" + }, + "language_info": { + "codemirror_mode": "sql", + "file_extension": ".sql", + "mimetype": "", + "name": "SQL", + "nbconverter_exporter": "", + "version": "" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": false, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sql/receitas/resolucao/s01-receitas-basico.ipynb b/sql/receitas/resolucao/s01-receitas-basico.ipynb new file mode 100644 index 0000000..ec729ad --- /dev/null +++ b/sql/receitas/resolucao/s01-receitas-basico.ipynb @@ -0,0 +1,463 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Receitas\n", + "## Bloco de Questões I - SQL Básico\n", + "\n", + "Considere os comandos SQL a seguir para criar tabelas que controlam Produtos e Receitas, bem como o respectivo esquema relacional simplificado abaixo. A tabela de Produto mantém um cadastro de produtos, com seu código, nome e custo_unitario, que corresponde ao custo de aquisição de uma unidade do produto. Cada Receita tem um código, nome, tipo (e.g., vegana, regular, light) e custo_total (corresponde ao custo de produção da receita inteira). Cada entrada na tabela Ingrediente indica que um Produto é componente de uma Receita em uma certa quantidade.\n", + "\n", + "### Esquema Relacional\n", + "~~~\n", + "Produto(codigo_produto, nome_produto, custo_unitario)\n", + "Receita(codigo_receita, nome_receita, tipo_receita, custo_total)\n", + "Ingrediente(codigo_receita, codigo_produto, quantidade)\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ativando uma conexão de banco de dados em memória usando o SGBD H2:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%defaultDatasource jdbc:h2:mem:db" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "34b50e70-b3e5-4fe1-9c35-e0841dc51ee4", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1bcfbff3-9bea-4986-9c80-79066236064f", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d6ab6e1f-ccf7-41c4-b864-99c3166a6034", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "DROP Table IF EXISTS Ingrediente;\n", + "DROP Table IF EXISTS Receita;\n", + "DROP Table IF EXISTS Produto;\n", + "\n", + "CREATE TABLE Produto (\n", + " codigo_produto VARCHAR(7),\n", + " nome_produto VARCHAR(80),\n", + " custo_unitario DECIMAL(5,2),\n", + " PRIMARY KEY (codigo_produto)\n", + ");\n", + "\n", + "CREATE TABLE Receita (\n", + " codigo_receita VARCHAR(7),\n", + " nome_receita VARCHAR(80),\n", + " tipo_receita VARCHAR(10),\n", + " custo_total DECIMAL(5,2),\n", + " PRIMARY KEY (codigo_receita));\n", + " \n", + "CREATE TABLE Ingrediente (\n", + " codigo_receita VARCHAR(7),\n", + " codigo_produto VARCHAR(7),\n", + " quantidade DECIMAL(5,2),\n", + " PRIMARY KEY (codigo_receita, codigo_produto, quantidade),\n", + " FOREIGN KEY (codigo_receita)\n", + " REFERENCES Receita (codigo_receita),\n", + " FOREIGN KEY (codigo_produto)\n", + " REFERENCES Produto (codigo_produto) );\n", + "\n", + "INSERT INTO Produto VALUES ('CHOCO', 'Chocolate', 3.0);\n", + "INSERT INTO Produto VALUES ('CENO', 'Cenoura', 1.5);\n", + "INSERT INTO Produto VALUES ('ACU', 'Acucar', 0.5);\n", + "INSERT INTO Produto VALUES ('SUCRA', 'Sucralose', 5.0);\n", + "INSERT INTO Produto VALUES ('FAR', 'Farinha', 1.0);\n", + "\n", + "INSERT INTO Receita VALUES ('BOLOCE', 'Bolo Cenoura', 'vegana', 6.0);\n", + "INSERT INTO Receita VALUES ('BOLOCH', 'Bolo Chocolate', 'regular', 6.7);\n", + "INSERT INTO Receita VALUES ('BOLOCEL', 'Bolo Cenoura Light', 'light', 10.0);\n", + "\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'CENO', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'ACU', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'FAR', 3.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'ACU', 2.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCH', 'CHOCO', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCH', 'ACU', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCH', 'FAR', 3.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCEL', 'CENO', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCEL', 'SUCRA', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCEL', 'FAR', 3.0);\n", + "\n", + "SELECT * FROM Produto;\n", + "SELECT * FROM Receita;\n", + "SELECT * FROM Ingrediente;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 1\n", + "\n", + "Liste o código de todas as receitas e o código dos ingredientes das receitas." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e54eaa74-f500-4c60-8ef0-1bcc98ad16fd", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT I.CODIGO_RECEITA, I.CODIGO_PRODUTO\n", + "FROM Ingrediente I;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 2\n", + "\n", + "Liste o nome de todas as receitas e o nome dos ingredientes das receitas." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fe189db5-7752-42e7-beeb-de16b860b9cf", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT R.NOME_RECEITA, P.NOME_PRODUTO\n", + "FROM Receita R, Ingrediente I, Produto P\n", + "WHERE R.CODIGO_RECEITA = I.CODIGO_RECEITA AND I.CODIGO_PRODUTO = P.CODIGO_PRODUTO;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 3\n", + "Liste o nome de todos os produtos que aparecem em receitas veganas, cujo custo unitário é maior que 1.0. Nomes de produtos não devem aparecer duplicados." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Cenoura" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SELECT DISTINCT P.nome_produto\n", + "FROM Produto P, Ingrediente I, Receita R\n", + "WHERE R.codigo_receita=I.codigo_receita AND P.codigo_produto=I.codigo_produto\n", + " AND R.tipo_receita='vegana' AND P.custo_unitario > 1.0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 4\n", + "\n", + "Em algumas receitas o mesmo produto aparece mais de uma vez com quantidades diferentes. Apresente a mesma tabela de Ingredientes de modo que não haja produtos que aparecem mais de uma vez. Para isso, junte os produtos que aparecem mais de uma vez na mesma receita e some as suas quantidades." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "80d40075-3a73-4e66-ae76-bb153dbbe246", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT CODIGO_RECEITA, CODIGO_PRODUTO, SUM(QUANTIDADE) QUANTIDADE\n", + "FROM INGREDIENTE\n", + "GROUP BY CODIGO_RECEITA, CODIGO_PRODUTO;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 5\n", + "Liste o nome dos Produtos que aparecem em mais de uma Receita." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4e69349c-9b07-49bf-96ee-a84ebdd343f6", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT P.nome_produto\n", + "FROM PRODUTO P, INGREDIENTE I\n", + "WHERE P.CODIGO_PRODUTO = I.CODIGO_PRODUTO\n", + "GROUP BY I.CODIGO_PRODUTO\n", + "HAVING COUNT(*) >= 2;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 6\n", + "\n", + "A coluna `custo_total` de uma Receita deveria calculado pelo somatório do `custo_unitario` de cada ingrediente multiplicado pela sua quantidade na receita. Escreva para verificar se a coluna está correta. A consulta apresenta o nome de todas as receitas cujo custo_total não atende a este critério, seu custo presente na `coluna_total` e seu custo calculado a patir dos ingredientes.\n", + "\n", + "Tente fazer a questão diretamente. Se não conseguir, resolva o passo a passo a seguir (6.1 a 6.3)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4d9b3a5f-0d53-4c3f-80aa-50237895c384", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT R.NOME_RECEITA, R.CUSTO_TOTAL, SUM(I.quantidade * P.custo_unitario) CUSTO_CALCULADO\n", + "FROM Receita R, Ingrediente I, Produto P\n", + "WHERE R.CODIGO_RECEITA = I.CODIGO_RECEITA AND I.CODIGO_PRODUTO = P.CODIGO_PRODUTO\n", + "GROUP BY I.CODIGO_RECEITA\n", + "HAVING R.CUSTO_TOTAL <> CUSTO_CALCULADO;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Questão 6 - Passo 1\n", + "Liste o nome de todas as receitas e o seu custo total (coluna `custo_total`)." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4c7ca6e3-765a-47a3-88bd-290e1a7ec652", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT R.NOME_RECEITA, R.CUSTO_TOTAL\n", + "FROM RECEITA R;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Questão 6 - Passo 2\n", + "Amplie a query do passo 1 acrescentando uma terceira coluna de custo calculado a partir dos ingredientes. Esse custo é calculado pelo somatório do custo de cada ingrediente multiplicado pela sua quantidade na receita." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d115a37e-863e-46ec-92c3-995d47780122", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT R.NOME_RECEITA, R.CUSTO_TOTAL, SUM(I.quantidade * P.custo_unitario) CUSTO_CALCULADO\n", + "FROM Receita R, Ingrediente I, Produto P\n", + "WHERE R.CODIGO_RECEITA = I.CODIGO_RECEITA AND I.CODIGO_PRODUTO = P.CODIGO_PRODUTO\n", + "GROUP BY I.CODIGO_RECEITA;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Questão 6 - Passo 3\n", + "\n", + "Apresente aquelas receitas em que o valor da coluna `custo_total` não corresponde ao custo calculado." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3899fae3-bd12-4342-b918-28891326c1ad", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT R.NOME_RECEITA, R.CUSTO_TOTAL, SUM(I.quantidade * P.custo_unitario) CUSTO_CALCULADO\n", + "FROM Receita R, Ingrediente I, Produto P\n", + "WHERE R.CODIGO_RECEITA = I.CODIGO_RECEITA AND I.CODIGO_PRODUTO = P.CODIGO_PRODUTO\n", + "GROUP BY I.CODIGO_RECEITA\n", + "HAVING R.CUSTO_TOTAL <> CUSTO_CALCULADO;" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SQL", + "language": "SQL", + "name": "sql" + }, + "language_info": { + "codemirror_mode": "sql", + "file_extension": ".sql", + "mimetype": "", + "name": "SQL", + "nbconverter_exporter": "", + "version": "" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": false, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sql/receitas/resolucao/s02-receitas-avancado.ipynb b/sql/receitas/resolucao/s02-receitas-avancado.ipynb new file mode 100644 index 0000000..99322fe --- /dev/null +++ b/sql/receitas/resolucao/s02-receitas-avancado.ipynb @@ -0,0 +1,263 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Receitas\n", + "## Bloco de Questões II - Queries Avançadas e de Atualização\n", + "\n", + "Considere os comandos SQL a seguir para criar tabelas que controlam Produtos e Receitas, bem como o respectivo esquema relacional simplificado abaixo. A tabela de Produto mantém um cadastro de produtos, com seu código, nome e custo_unitario, que corresponde ao custo de aquisição de uma unidade do produto. Cada Receita tem um código, nome, tipo (e.g., vegana, regular, light) e custo_total (corresponde ao custo de produção da receita inteira). Cada entrada na tabela Ingrediente indica que um Produto é componente de uma Receita em uma certa quantidade.\n", + "\n", + "### Esquema Relacional\n", + "~~~\n", + "Produto(codigo_produto, nome_produto, custo_unitario)\n", + "Receita(codigo_receita, nome_receita, tipo_receita, custo_total)\n", + "Ingrediente(codigo_receita, codigo_produto, quantidade)\n", + "~~~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ativando uma conexão de banco de dados em memória usando o SGBD H2:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%defaultDatasource jdbc:h2:mem:db" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8bec5d7e-15b7-4ffb-8371-25d93dc3967c", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "268a0b4d-aa8a-411a-9d05-8d488eaf9e42", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2f1da95f-d9c3-4cb9-9d02-f1f231a1a9ad", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "DROP Table IF EXISTS Ingrediente;\n", + "DROP Table IF EXISTS Receita;\n", + "DROP Table IF EXISTS Produto;\n", + "\n", + "CREATE TABLE Produto (\n", + " codigo_produto VARCHAR(7),\n", + " nome_produto VARCHAR(80),\n", + " custo_unitario DECIMAL(5,2),\n", + " PRIMARY KEY (codigo_produto)\n", + ");\n", + "\n", + "CREATE TABLE Receita (\n", + " codigo_receita VARCHAR(7),\n", + " nome_receita VARCHAR(80),\n", + " tipo_receita VARCHAR(10),\n", + " custo_total DECIMAL(5,2),\n", + " PRIMARY KEY (codigo_receita));\n", + " \n", + "CREATE TABLE Ingrediente (\n", + " codigo_receita VARCHAR(7),\n", + " codigo_produto VARCHAR(7),\n", + " quantidade DECIMAL(5,2),\n", + " PRIMARY KEY (codigo_receita, codigo_produto, quantidade),\n", + " FOREIGN KEY (codigo_receita)\n", + " REFERENCES Receita (codigo_receita),\n", + " FOREIGN KEY (codigo_produto)\n", + " REFERENCES Produto (codigo_produto) );\n", + "\n", + "INSERT INTO Produto VALUES ('CHOCO', 'Chocolate', 3.0);\n", + "INSERT INTO Produto VALUES ('CENO', 'Cenoura', 1.5);\n", + "INSERT INTO Produto VALUES ('ACU', 'Acucar', 0.5);\n", + "INSERT INTO Produto VALUES ('SUCRA', 'Sucralose', 5.0);\n", + "INSERT INTO Produto VALUES ('FAR', 'Farinha', 1.0);\n", + "\n", + "INSERT INTO Receita VALUES ('BOLOCE', 'Bolo Cenoura', 'vegana', 6.0);\n", + "INSERT INTO Receita VALUES ('BOLOCH', 'Bolo Chocolate', 'regular', 6.7);\n", + "INSERT INTO Receita VALUES ('BOLOCEL', 'Bolo Cenoura Light', 'light', 10.0);\n", + "\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'CENO', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'ACU', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'FAR', 3.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCE', 'ACU', 2.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCH', 'CHOCO', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCH', 'ACU', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCH', 'FAR', 3.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCEL', 'CENO', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCEL', 'SUCRA', 1.0);\n", + "INSERT INTO Ingrediente VALUES ('BOLOCEL', 'FAR', 3.0);\n", + "\n", + "SELECT * FROM Produto;\n", + "SELECT * FROM Receita;\n", + "SELECT * FROM Ingrediente;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 1\n", + "\n", + "Atualize o custo unitário de todos os produtos em 1%." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c4e75136-48cf-4918-8494-906459fa6660", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "UPDATE Produto P\n", + "SET P.custo_unitario = P.custo_unitario * 1.1;\n", + "\n", + "SELECT *\n", + "FROM Produto P;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 2\n", + "\n", + "Crie uma VIEW para o resultado da query da Questão 4 do Bloco de Questões I.\n", + "\n", + "Em algumas receitas o mesmo produto aparece mais de uma vez com quantidades diferentes. Apresente a mesma tabela de Ingredientes de modo que não haja produtos que aparecem mais de uma vez. Para isso, junte os produtos que aparecem mais de uma vez na mesma receita e some as suas quantidades." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 3\n", + "Estenda a questão anterior aplicando a seguinte regra: se o produto aparecer duas vezes, junte os dois em um e some as suas quantidades, se aparecer mais do que duas vezes ele não deve entrar na tabela Ingredientes nova." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 4\n", + "Escreva uma consulta que liste o nome daqueles Produtos que não aparecem em nenhuma Receita." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questão 5\n", + "\n", + "Escreva uma consulta que mostre o nome das receitas que não têm produtos que aparecem mais de uma vez." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SQL", + "language": "SQL", + "name": "sql" + }, + "language_info": { + "codemirror_mode": "sql", + "file_extension": ".sql", + "mimetype": "", + "name": "SQL", + "nbconverter_exporter": "", + "version": "" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": false, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sql/taxi/exercicios/taxi01-sql-basico.ipynb b/sql/taxi/exercicios/taxi01-sql-basico.ipynb new file mode 100644 index 0000000..88e2005 --- /dev/null +++ b/sql/taxi/exercicios/taxi01-sql-basico.ipynb @@ -0,0 +1,684 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# TÁXI\n", + "## SQL Básico\n", + "\n", + "Baseado no exemplo criado por prof. Geovane Cayres Magalhães http://www.ic.unicamp.br/~geovane/mo410-091/caso.html\n", + "\n", + "Ativando uma conexão de banco de dados em memória usando o SGBD H2:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%defaultDatasource jdbc:h2:mem:db" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conjunto de tabelas para consultas básicas" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "DROP TABLE IF EXISTS Taxi;\n", + "DROP TABLE IF EXISTS Cliente;\n", + "DROP TABLE IF EXISTS Corrida;" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "CREATE TABLE Taxi (\n", + " Placa VARCHAR(7) NOT NULL,\n", + " Marca VARCHAR(30) NOT NULL,\n", + " Modelo VARCHAR(30) NOT NULL,\n", + " AnoFab INTEGER,\n", + " Licenca VARCHAR(9),\n", + " PRIMARY KEY(Placa)\n", + ");\n", + "\n", + "CREATE TABLE Cliente (\n", + " CliId VARCHAR(4) NOT NULL,\n", + " Nome VARCHAR(80) NOT NULL,\n", + " CPF VARCHAR(14) NOT NULL,\n", + " PRIMARY KEY(CliId)\n", + ");\n", + "\n", + "CREATE TABLE Corrida (\n", + " CliId VARCHAR(4) NOT NULL,\n", + " Placa VARCHAR(7) NOT NULL,\n", + " DataPedido DATE NOT NULL,\n", + " PRIMARY KEY(CliId, Placa, DataPedido),\n", + " FOREIGN KEY(CliId)\n", + " REFERENCES Cliente(CliId)\n", + " ON DELETE NO ACTION\n", + " ON UPDATE NO ACTION,\n", + " FOREIGN KEY(Placa)\n", + " REFERENCES Taxi(Placa)\n", + " ON DELETE NO ACTION\n", + " ON UPDATE NO ACTION\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "INSERT INTO Cliente VALUES ('1532', 'Asdrúbal', '448.754.253-65');\n", + "INSERT INTO Cliente VALUES ('1755', 'Doriana', '567.387.387-44');\n", + "INSERT INTO Cliente VALUES ('1780', 'Quincas', '546.373.762-02');\n", + "INSERT INTO Cliente VALUES ('1888', 'Melissa', '123.456.789-10');\n", + "\n", + "INSERT INTO Taxi VALUES ('DAE6534', 'Ford', 'Fiesta', 1999, 'MN572345');\n", + "INSERT INTO Taxi VALUES ('DKL4598', 'Wolkswagen', 'Gol', 2001, 'AU876543');\n", + "INSERT INTO Taxi VALUES ('DKL7878', 'Ford', 'Fiesta', 2001, 'OP102938');\n", + "INSERT INTO Taxi VALUES ('JDM8776', 'Wolkswagen', 'Santana', 2002, 'QM365923');\n", + "INSERT INTO Taxi VALUES ('JJM3692', 'Chevrolet', 'Corsa', 1999, 'UU335577');\n", + "\n", + "INSERT INTO Corrida VALUES ('1755', 'DAE6534', '2003-02-15');\n", + "INSERT INTO Corrida VALUES ('1780', 'JDM8776', '2003-02-18');\n", + "INSERT INTO Corrida VALUES ('1755', 'DKL7878', '2003-02-16');\n", + "INSERT INTO Corrida VALUES ('1780', 'DKL4598', '2003-02-17');\n", + "INSERT INTO Corrida VALUES ('1532', 'DKL4598', '2003-02-18');\n", + "INSERT INTO Corrida VALUES ('1780', 'DAE6534', '2003-02-16');\n", + "INSERT INTO Corrida VALUES ('1755', 'DAE6534', '2003-02-18');\n", + "INSERT INTO Corrida VALUES ('1532', 'DKL4598', '2003-02-20');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bloco I - SELECT Básico (com JOIN implícito) e Agrupamento" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SELECT Básico" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Todos os Táxis com todos os atributos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Marca e Modelo dos Taxis disponíveis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Taxis fabricados depois do ano 2000" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Placas que comecem com DK" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Placas com '7' na penultima posicao" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Produto Cartesiano" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Produto Cartesiano entre Clientes e Corridas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# JOIN Implícito" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cientes e as respectivas corridas - Join Implícito" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Modelo de taxi para cada corrida" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Modelos de Táxi por Cliente (estágio 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Modelos de Táxi por Cliente (estágio 2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ORDER BY" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Nome dos clientes ordenado alfabeticamente" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Modelos de taxi e os clientes que os tomaram\n", + "\n", + "Ordena por Modelo, mas não por Cliente:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ordena por Modelo e, para cada Modelo, por Cliente:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cliente e os modelos de taxi tomados\n", + "Ordena por Cliente, mas não por Modelo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ordena por Cliente e, para cada Cliente, por Modelo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# GROUP BY" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Modelos de Táxi cadastrados" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Total de Táxis por Modelo\n", + "\n", + "Modelos de Táxi cadastrados e quantos táxis há em cada modelo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Agregando em mais de um nível" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Modelos de taxi tomados por cada cliente (agrupando por Cliente e por Modelo)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Contando Itens Distintos" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Quantos clientes distintos tomaram cada modelo de táxi" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Funções de agregação sem agrupamento\n", + "\n", + "### Maior e menor ano de fabricação para todos os Táxis e a média de anos\n", + "\n", + "Quando é usada função de agregação sem especificação de agrupamento, toda a tabela é agregada como se fosse um único grupo." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# HAVING" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Número de Táxis por Modelo somente para os Táxis com ano de fabricação abaixo de 2000" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Modelos de Táxi que têm mais de um Táxi do respectivo modelo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Modelos de Táxi cujo menor Ano de Fabricação seja após 2000" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bloco II - JOIN Explícito e VIEW" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## JOIN explícito" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Clientes e respectivas corridas (para clientes que fizeram corrida)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Taxis e respectivas corridas (para taxis que fizeram corrida)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NATURAL JOIN" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## LEFT JOIN\n", + "\n", + "### Clientes e respectivas corridas (para todos os clientes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Taxis e respectivas corridas (para todos os taxis)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RIGHT JOIN\n", + "\n", + "### Corridas e respectivos clientes (para todos os clientes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# VIEW\n", + "\n", + "### Total de Táxis por Modelo\n", + "\n", + "Agrupamento sem o uso de `VIEW`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tabela de Total de Táxis por Modelo\n", + "\n", + "Transformando o agrupamento na tabela `Contagem_Modelo` com o `VIEW`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Usando a tabela criada com a `VIEW`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SQL", + "language": "SQL", + "name": "sql" + }, + "language_info": { + "codemirror_mode": "sql", + "file_extension": ".sql", + "mimetype": "", + "name": "SQL", + "nbconverter_exporter": "", + "version": "" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": false, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sql/taxi/taxi01-sql-basico.ipynb b/sql/taxi/resolucao-exemplos/taxi01-sql-basico.ipynb similarity index 90% rename from sql/taxi/taxi01-sql-basico.ipynb rename to sql/taxi/resolucao-exemplos/taxi01-sql-basico.ipynb index d555c61..d9f8958 100644 --- a/sql/taxi/taxi01-sql-basico.ipynb +++ b/sql/taxi/resolucao-exemplos/taxi01-sql-basico.ipynb @@ -4,7 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# SQL Básico\n", + "# TÁXI\n", + "## SQL Básico\n", + "\n", + "Baseado no exemplo criado por prof. Geovane Cayres Magalhães http://www.ic.unicamp.br/~geovane/mo410-091/caso.html\n", + "\n", + "## Resoluções e Explicações\n", + "\n", + "Este notebook tem resoluções (algumas passo a passo) dos exercícios do notebook de mesmo nome na pasta `exercicios`, mas também tem exemplos demonstrativos e explicações extra dos assuntos.\n", "\n", "Ativando uma conexão de banco de dados em memória usando o SGBD H2:" ] @@ -18,15 +25,6 @@ "%defaultDatasource jdbc:h2:mem:db" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exemplo dos Táxis\n", - "\n", - "Baseado no exemplo criado por prof. Geovane Cayres Magalhães http://www.ic.unicamp.br/~geovane/mo410-091/caso.html" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -110,6 +108,13 @@ "INSERT INTO Corrida VALUES ('1532', 'DKL4598', '2003-02-20');" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bloco I - SELECT Básico (com JOIN implícito) e Agrupamento" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -132,7 +137,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b7aba13e-b2f3-4f22-9c60-eb1c57ad651a", + "model_id": "c5ef6fb1-5859-43bc-a452-8af766dacff0", "version_major": 2, "version_minor": 0 }, @@ -163,7 +168,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a2db7b2b-7e90-4e72-b972-d4e2e2471b3b", + "model_id": "c6c48e98-b108-49d4-9743-3117a201a9ba", "version_major": 2, "version_minor": 0 }, @@ -192,7 +197,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "59e804da-75e5-4753-9f68-b57bd047a4d7", + "model_id": "69358c0d-c221-4e38-8daf-bd34e935b3c4", "version_major": 2, "version_minor": 0 }, @@ -221,7 +226,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "2d632301-5426-471a-aa8f-a0d66c0a7a4d", + "model_id": "c56df008-dbe2-449c-8e8a-1a46c14ca548", "version_major": 2, "version_minor": 0 }, @@ -250,7 +255,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "1488067f-8f2b-4345-881a-4501191ac4cc", + "model_id": "79e8359b-cc74-4b5f-8ad8-325cb0571b00", "version_major": 2, "version_minor": 0 }, @@ -286,7 +291,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ffbc82b6-7aa3-447d-8979-3c6929083f85", + "model_id": "0f4c95c2-b556-45f9-8e0b-ee83a89584b8", "version_major": 2, "version_minor": 0 }, @@ -323,7 +328,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4199b81b-d08f-4932-b46e-7f63fb5efc13", + "model_id": "2d890124-3a78-43c8-8290-f92c6450c11c", "version_major": 2, "version_minor": 0 }, @@ -354,7 +359,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "da1ad8dd-c0c6-4021-b341-c1eb31b85581", + "model_id": "5b57aa51-608a-4365-bc4a-1f3f96a23386", "version_major": 2, "version_minor": 0 }, @@ -385,7 +390,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "aa0e737b-ecfb-4d29-9ed5-adc857970149", + "model_id": "474ccf6d-1f84-4c1d-ad70-7af8349ac5cb", "version_major": 2, "version_minor": 0 }, @@ -416,7 +421,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "90b817e0-32fd-4d54-ac5c-f93b85572406", + "model_id": "6d4c9fab-f677-439d-9c77-4d056b5aff49", "version_major": 2, "version_minor": 0 }, @@ -448,13 +453,13 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ef7975f5-524b-4b39-88d4-6b480c6ab51f", + "model_id": "439541c9-39c6-4301-9b34-158791f3591d", "version_major": 2, "version_minor": 0 }, @@ -487,7 +492,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "44468c8b-bbbf-4d3f-a8c6-5addcef44280", + "model_id": "3cc34d8d-1704-43dc-b28a-1402dfe35e1e", "version_major": 2, "version_minor": 0 }, @@ -520,7 +525,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "efe07346-9336-4014-840a-ae621fd52645", + "model_id": "f8a46c74-00eb-47f3-996b-c29b07d9c0df", "version_major": 2, "version_minor": 0 }, @@ -554,7 +559,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6e458511-db72-4ba7-a2d8-1f8c4aa32726", + "model_id": "2dd2371c-20aa-41a9-a86b-a7556a4b0e18", "version_major": 2, "version_minor": 0 }, @@ -587,7 +592,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c2712648-75db-47e2-b0c5-6ca18850ed15", + "model_id": "be058712-13b5-4f4a-8e54-942790711c22", "version_major": 2, "version_minor": 0 }, @@ -605,205 +610,6 @@ " ORDER BY Cl.Nome, T.Modelo;" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## JOIN explícito" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Clientes e respectivas corridas (para clientes que fizeram corrida)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "13c471a4-2535-4eb6-8c35-f44ef23a48b1", - "version_major": 2, - "version_minor": 0 - }, - "method": "display_data" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "SELECT Cl.CliId, Cl.Nome,\n", - " Co.Placa, Co.DataPedido\n", - " FROM Cliente Cl JOIN Corrida Co\n", - " ON Cl.CliId = Co.CliId;" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Taxis e respectivas corridas (para taxis que fizeram corrida)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "d85dbc38-70dc-4b86-b5bb-70476ff8facb", - "version_major": 2, - "version_minor": 0 - }, - "method": "display_data" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "SELECT Tx.placa, Co.cliid\n", - " FROM Taxi Tx JOIN Corrida Co\n", - " ON Tx.placa = Co.placa;" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## NATURAL JOIN" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "d780514b-c004-4d90-98cc-31a797a93186", - "version_major": 2, - "version_minor": 0 - }, - "method": "display_data" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "SELECT Tx.placa, Co.cliid\n", - " FROM Taxi Tx\n", - " NATURAL JOIN Corrida Co;" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## LEFT JOIN\n", - "\n", - "### Clientes e respectivas corridas (para todos os clientes)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "315b218f-e111-45f5-befc-16bfbeb121ea", - "version_major": 2, - "version_minor": 0 - }, - "method": "display_data" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "SELECT Cl.CliId, Cl.Nome,\n", - " Co.Placa, Co.DataPedido\n", - " FROM Cliente Cl LEFT JOIN Corrida Co\n", - " ON Cl.CliId = Co.CliId;" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Taxis e respectivas corridas (para todos os taxis)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "f13f511d-1046-435f-a0a0-19ace68bb1e7", - "version_major": 2, - "version_minor": 0 - }, - "method": "display_data" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "SELECT Tx.placa, Co.cliid\n", - " FROM Taxi Tx LEFT JOIN Corrida Co\n", - " ON Tx.placa = Co.placa;" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## RIGHT JOIN\n", - "\n", - "### Corridas e respectivos clientes (para todos os clientes)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "1fd651c2-95b2-450a-b263-6725d0a65cb9", - "version_major": 2, - "version_minor": 0 - }, - "method": "display_data" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "SELECT Co.placa, Cl.nome\n", - " FROM Corrida Co RIGHT JOIN Cliente Cl\n", - " ON Co.cliid = Cl.cliid;" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -820,13 +626,13 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "bf886757-10eb-4743-b1d1-b4b33506be9c", + "model_id": "b80e20ca-6f1a-48ea-9f90-ee338716312b", "version_major": 2, "version_minor": 0 }, @@ -853,13 +659,13 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "9b1f868d-f82d-4f22-ae29-b1746721d217", + "model_id": "e72f97ab-8d1a-4a5d-8a11-cafbc0777dfa", "version_major": 2, "version_minor": 0 }, @@ -891,13 +697,13 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c703a780-287f-4c70-8f77-63e0d53320ad", + "model_id": "6ba03389-8d0a-40cc-970b-113b0779f339", "version_major": 2, "version_minor": 0 }, @@ -916,13 +722,13 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4d6585f7-eb45-4273-b3e6-4bf973ccd6e9", + "model_id": "f17c2f26-43e4-4394-b1ce-0a5f241e9143", "version_major": 2, "version_minor": 0 }, @@ -941,13 +747,13 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "f1817a12-84f8-4d0b-bb72-a4d2804046f7", + "model_id": "6d156e27-8209-4ec7-afed-a6a2676ec532", "version_major": 2, "version_minor": 0 }, @@ -967,13 +773,13 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "bf598a87-db3c-476d-8733-170038021bf7", + "model_id": "d54d5b5f-bf22-430d-99cf-32b49430061e", "version_major": 2, "version_minor": 0 }, @@ -1002,18 +808,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Quantos clientes distintos tomaram cada modelo de táxi" + "### Quantos clientes distintos tomaram cada modelo de táxi\n", + "\n", + "Primeiro verificando cada modelo de taxi, clientes e quantas vezes tomaram o modelo." ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c9d5a0ad-4e19-4f05-af98-2c1ff87b43a2", + "model_id": "f7ed2766-ab2c-40bf-9b94-78da8692baa6", "version_major": 2, "version_minor": 0 }, @@ -1040,13 +848,13 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3f79acc3-a311-4f4c-a540-2d5d7f94d15b", + "model_id": "928c63e3-2b43-4141-8c09-6462203eb138", "version_major": 2, "version_minor": 0 }, @@ -1072,13 +880,13 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "200d23e7-e3b1-4560-ae74-ca8b99e9dd98", + "model_id": "ad3e4282-c662-44f8-aa23-2d0675d07e72", "version_major": 2, "version_minor": 0 }, @@ -1101,20 +909,20 @@ "source": [ "## Funções de agregação sem agrupamento\n", "\n", - "### Média de ano de fabricação para todos os Táxis\n", + "### Maior e menor ano de fabricação para todos os Táxis e a média de anos\n", "\n", "Quando é usada função de agregação sem especificação de agrupamento, toda a tabela é agregada como se fosse um único grupo." ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4021678b-a559-49a0-83b8-85950fd71a52", + "model_id": "5a4c6bb3-b0dd-4cff-b7a6-bea9a0099455", "version_major": 2, "version_minor": 0 }, @@ -1130,13 +938,13 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c194a1f5-49f5-4c89-a8d6-ae596bed5760", + "model_id": "4916150f-315e-415e-a232-34c107950e3a", "version_major": 2, "version_minor": 0 }, @@ -1152,27 +960,6 @@ " GROUP BY Modelo;" ] }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2002" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "-- Maior ano de fabricação de toda a tabela\n", - "SELECT MAX(AnoFab) FROM Taxi;" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1184,13 +971,13 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ba55be36-e61e-484c-9b35-c822834c29fb", + "model_id": "0124b93c-f35f-48b4-b729-b9cd3757770e", "version_major": 2, "version_minor": 0 }, @@ -1216,7 +1003,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -1249,13 +1036,13 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e9b1d513-1d86-4295-8a72-3f9c86eed6a6", + "model_id": "a89f3196-21b6-4e05-909c-66279fe73587", "version_major": 2, "version_minor": 0 }, @@ -1289,13 +1076,13 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3755fd11-c608-4230-9d67-bb50be2bcd5f", + "model_id": "db633311-885f-4b7a-9b0b-c68e56c1a316", "version_major": 2, "version_minor": 0 }, @@ -1313,13 +1100,13 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c38896be-3388-47a9-a22e-68cdca42bbbc", + "model_id": "8d416f61-9d2f-43ab-85e4-d2cc8e3da9e3", "version_major": 2, "version_minor": 0 }, @@ -1337,13 +1124,13 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8edab26a-9f2d-460f-be88-c52fde5fdad6", + "model_id": "367263f6-4af6-4f6b-be81-cc66c9fbe5c0", "version_major": 2, "version_minor": 0 }, @@ -1372,13 +1159,13 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ec5a9c5c-bb27-4f39-b08d-58eaa6489194", + "model_id": "cc2d4b89-ede9-4386-b5a8-bbaf1a419df1", "version_major": 2, "version_minor": 0 }, @@ -1397,13 +1184,13 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "64608e1e-f8b0-46ee-acc7-2a0a6fb06be5", + "model_id": "d0672f36-472d-4314-903b-add48f1981c6", "version_major": 2, "version_minor": 0 }, @@ -1434,7 +1221,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -1468,13 +1255,13 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "37371f14-eee5-4574-b883-5ccc64b7834c", + "model_id": "4e434aeb-6aa6-4c96-bc2c-7445a740f1e2", "version_major": 2, "version_minor": 0 }, @@ -1493,13 +1280,13 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "93f52f16-b45c-4507-b507-eeda15056c4f", + "model_id": "3081b823-8940-414d-a92e-09eabb1543f7", "version_major": 2, "version_minor": 0 }, @@ -1517,6 +1304,212 @@ " HAVING MaiorAno < 2000;" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bloco II - JOIN Explícito e VIEW" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## JOIN explícito" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Clientes e respectivas corridas (para clientes que fizeram corrida)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "511eb5e8-dd7b-4174-856b-96106706bfdb", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT Cl.CliId, Cl.Nome,\n", + " Co.Placa, Co.DataPedido\n", + " FROM Cliente Cl JOIN Corrida Co\n", + " ON Cl.CliId = Co.CliId;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Taxis e respectivas corridas (para taxis que fizeram corrida)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "80d3282c-f7fb-47c1-b743-2e49ee2e7564", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT Tx.placa, Co.cliid\n", + " FROM Taxi Tx JOIN Corrida Co\n", + " ON Tx.placa = Co.placa;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NATURAL JOIN" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b5e00a85-c518-4520-976f-f8102271f119", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT Tx.placa, Co.cliid\n", + " FROM Taxi Tx\n", + " NATURAL JOIN Corrida Co;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## LEFT JOIN\n", + "\n", + "### Clientes e respectivas corridas (para todos os clientes)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "00ac07fc-c4d8-4c1f-86a0-c38ec81328c2", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT Cl.CliId, Cl.Nome,\n", + " Co.Placa, Co.DataPedido\n", + " FROM Cliente Cl LEFT JOIN Corrida Co\n", + " ON Cl.CliId = Co.CliId;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Taxis e respectivas corridas (para todos os taxis)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e542ce7c-1b3c-49b9-af14-92d5835c31aa", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT Tx.placa, Co.cliid\n", + " FROM Taxi Tx LEFT JOIN Corrida Co\n", + " ON Tx.placa = Co.placa;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RIGHT JOIN\n", + "\n", + "### Corridas e respectivos clientes (para todos os clientes)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8d9a5647-8787-4996-b52a-5a040a18087a", + "version_major": 2, + "version_minor": 0 + }, + "method": "display_data" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "SELECT Co.placa, Cl.nome\n", + " FROM Corrida Co RIGHT JOIN Cliente Cl\n", + " ON Co.cliid = Cl.cliid;" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1530,13 +1523,13 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ba920327-911c-47cf-ad07-36a7e9cb8927", + "model_id": "d16c5bc0-a814-4120-8f99-cf454d270536", "version_major": 2, "version_minor": 0 }, @@ -1563,13 +1556,13 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "98561721-ba65-42de-af11-d99b5d078f40", + "model_id": "00e2e4fc-f05c-4c53-9944-927e0185b51e", "version_major": 2, "version_minor": 0 }, @@ -1597,7 +1590,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 50, "metadata": {}, "outputs": [ { @@ -1606,7 +1599,7 @@ "2" ] }, - "execution_count": 48, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -1626,13 +1619,13 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "1d67a773-cb25-4f6b-b232-8422c5e63ec1", + "model_id": "7195fa6c-725d-441b-942b-e566f19fc304", "version_major": 2, "version_minor": 0 }, diff --git a/sql/taxi/taxi02-select-aninhado.ipynb b/sql/taxi/resolucao-exemplos/taxi02-select-aninhado.ipynb similarity index 100% rename from sql/taxi/taxi02-select-aninhado.ipynb rename to sql/taxi/resolucao-exemplos/taxi02-select-aninhado.ipynb diff --git a/sql/taxi/taxi03-delete-update.ipynb b/sql/taxi/resolucao-exemplos/taxi03-delete-update.ipynb similarity index 100% rename from sql/taxi/taxi03-delete-update.ipynb rename to sql/taxi/resolucao-exemplos/taxi03-delete-update.ipynb diff --git a/sql/taxi/taxi04-conjuntos.ipynb b/sql/taxi/resolucao-exemplos/taxi04-conjuntos.ipynb similarity index 100% rename from sql/taxi/taxi04-conjuntos.ipynb rename to sql/taxi/resolucao-exemplos/taxi04-conjuntos.ipynb