{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "SQL-modulo_4_aula.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "toc_visible": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KJqp9AANOCtf"
      },
      "source": [
        "<img src=\"https://raw.githubusercontent.com/andre-marcos-perez/ebac-course-utils/main/media/logo/newebac_logo_black_half.png\" alt=\"ebac-logo\">\n",
        "\n",
        "---\n",
        "\n",
        "# **Módulo** | SQL: Filtrando & Seleção Condicional\n",
        "Caderno de **Aula**<br> \n",
        "Professor [Mariane Neiva](www.linkedin.com/in/mariane-neiva)\n",
        "\n",
        "---"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "d9jDtUbDOE1-"
      },
      "source": [
        "# **Tópicos**\n",
        "\n",
        "<ol type=\"1\">\n",
        "  <li>Filtros and, or, in e between;</li>\n",
        "  <li>Filtros like e wildcards;</li>\n",
        "  <li>Seleção condicional;</li>\n",
        "</ol>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "SmoHgt-lwkpD"
      },
      "source": [
        "---"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GABI6OW8OfQ2"
      },
      "source": [
        "# **Aulas**"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "NF7Pdc6hJ8oF"
      },
      "source": [
        "Nessa aula, usaremos a seguinte tabela:"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QkH5jQruJG-L"
      },
      "source": [
        "```sql\n",
        "CREATE TABLE transacoes (\n",
        "  id_cliente INT,   \n",
        "  id_transacao INT PRIMARY KEY,\n",
        "  data_compra DATE UNIQUE,\n",
        "  valor FLOAT NOT NULL, \n",
        "  id_loja varchar(25),\n",
        "  CHECK (valor > 0) \n",
        ");\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MLdOjQcDKCXc"
      },
      "source": [
        "Também temos os seguintes valores inseridos na tabela"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "I34tqzZrKOma"
      },
      "source": [
        "```sql\n",
        "INSERT INTO transacoes VALUES (1,768805383,'2021-06-10',50.74,'magalu');\n",
        "INSERT INTO transacoes VALUES (2,768805399,'2021-06-13',30.90,'giraffas');\n",
        "INSERT INTO transacoes VALUES (3,818770008,'2021-06-05',110.00,'postoshell');\n",
        "INSERT INTO transacoes VALUES (1,76856563,'2021-07-10',2000.90,'magalu');\n",
        "INSERT INTO transacoes VALUES (1,767573759,'2021-06-20',15.70,'subway');\n",
        "INSERT INTO transacoes VALUES (3,818575758,'2021-06-25',2.99,'seveneleven');\n",
        "INSERT INTO transacoes VALUES (4,764545534,'2021-07-11',50.74,'extra');\n",
        "INSERT INTO transacoes VALUES (5,76766789,'2021-08-02',10.00,'subway');\n",
        "INSERT INTO transacoes VALUES (3,8154567758,'2021-08-15',1100.00,'shopee');\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rRBLidUaK7NJ"
      },
      "source": [
        "Como resultado da função SELECT, temos a seguinte tabela:\n",
        "\n",
        "| id_cliente | id_transacao | data_compra |valor | id_loja |\n",
        "|------------|----------|----|-----| ------- |\n",
        "| 1| 768805383    | 2021-06-10    | 50.74 |magalu \n",
        "| 2 | 768805399    | 2021-06-13    |  30.90 | giraffas \n",
        "| 3 | 818770008    |2021-06-05   |  110.00 |  postoshell  \n",
        "|1 |76856563 | 2021-07-10 |2000.90 |magalu\n",
        "|1|767573759|2021-06-20|15.70|subway\n",
        "| 3|818575758|2021-06-25|2.99|seveneleven\n",
        " |4|764545534|2021-07-10|50.74|extra\n",
        "|5|76766789|2021-08-92|10.00|subway\n",
        "|3|8154567758|2021-08-15|1100.00|shopee "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ok889VghEyKq"
      },
      "source": [
        "#1. Filtros *and, or, in* e *between*\n",
        "\n",
        "Temos visto o comando SELECT de diversas formas durante as aulas, hoje vamos complementa-lo ainda mais com o comandos **where, and, or, in** e **between**.\n",
        "\n",
        "> **Atenção:** o comando **where** pode ser utilizado em conjunto com diversas funcionalidades como DELETE e UPDATE (mostramos isso no módulo 2)!\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "eqtRcYZgF94g"
      },
      "source": [
        "## **1.1 Comando WHERE + AND**\n",
        "\n",
        "O comando **AND** seleciona aquelas instâncias que condizem com duas (ou mais) condições.  \n",
        "```sql \n",
        "SELECT <coluna1>, <coluna2>, ...\n",
        "FROM <nome_tabela>\n",
        "WHERE <condicao1> AND <condicao2>, ...,  AND <condicao3>;\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Es70o6l6Pse2"
      },
      "source": [
        "No nosso exemplo:\n",
        "\n",
        "```sql \n",
        "SELECT *\n",
        "FROM transacoes\n",
        "WHERE valor > 30 AND data_compra > 2020-07-01;\n",
        "```\n",
        "\n",
        "O resultado:\n",
        "\n",
        "| id_cliente | id_transacao | data_compra |valor | id_loja |\n",
        "|------------|----------|----|-----| ------- |\n",
        "|1 |76856563 | 2021-07-10 |2000.90 |magalu\n",
        " |4|764545534|2021-07-11|50.74|extra\n",
        "|3|8154567758|2021-08-15|1100.00|shopee"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "RJaiLiVwGKVN"
      },
      "source": [
        "## **1.2 Comando WHERE + OR**\n",
        "\n",
        "O comando **OR** seleciona aquelas instâncias que condizem com pelo menos um dos critérios.\n",
        "\n",
        "```sql \n",
        "SELECT <coluna1>, <coluna2>, ...\n",
        "FROM <nome_tabela>\n",
        "WHERE <condicao1> OR <condicao2>, ...,  OR <condicao3>;\n",
        "```\n",
        "\n",
        "No nosso exemplo:\n",
        "\n",
        "```sql \n",
        "SELECT *\n",
        "FROM transacoes\n",
        "WHERE valor > 30 OR data_compra > 2020-07-01;\n",
        "```\n",
        "\n",
        "O resultado:\n",
        "\n",
        "| id_cliente | id_transacao | data_compra |valor | id_loja |\n",
        "|------------|----------|----|-----| ------- |\n",
        "| 1| 768805383    | 2021-06-10    | 50.74 |magalu \n",
        "| 2 | 768805399    | 2021-06-13    |  30.90 | giraffas \n",
        "| 3 | 818770008    |2021-06-05   |  110.00 |  postoshell  \n",
        "|1 |76856563 | 2021-07-10 |2000.90 |magalu\n",
        " |4|764545534|2021-07-11|50.74|extra\n",
        "|5|76766789|2021-08-92|10.00|subway\n",
        "|3|8154567758|2021-08-15|1100.00|shopee"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ndHXYm1SSZg_"
      },
      "source": [
        "## **1.3 Comando WHERE + IN**\n",
        "\n",
        "Ao invés de utilizar vários comandos OR, podemos utilizar o comando **IN**\n",
        "```sql\n",
        "SELECT <coluna1>, <coluna2>, ..., <coluna>\n",
        "FROM <nome_tabela>\n",
        "WHERE <coluna> IN (<valor1>, <valor2>, ...)\n",
        "```\n",
        "\n",
        "No nosso exemplo:\n",
        "\n",
        "```sql \n",
        "SELECT *\n",
        "FROM transacoes\n",
        "WHERE id_loja IN ('magalu','subway') AND valor > 10;\n",
        "```\n",
        "\n",
        "O resultado:\n",
        "\n",
        "| id_cliente | id_transacao | data_compra |valor | id_loja |\n",
        "|------------|----------|----|-----| ------- |\n",
        "| 1| 768805383    | 2021-06-10    | 50.74 |magalu \n",
        "|1 |76856563 | 2021-07-10 |2000.90 |magalu\n",
        "|1|767573759|2021-06-20|15.70|subway\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "txyqCB4IRdZi"
      },
      "source": [
        "## **1.4 Comando WHERE + BETWEEN**\n",
        "\n",
        "Com o comando BETWEEN, podemos encontrar instâncias entre < valor1 > e < valor2 >\n",
        "```sql\n",
        "SELECT <coluna1>, <coluna2>, ..., <coluna>\n",
        "FROM <nome_tabela>\n",
        "WHERE <coluna> BETWEEN <valor1> AND <valor2>\n",
        "```\n",
        "\n",
        "No nosso exemplo:\n",
        "\n",
        "```sql \n",
        "SELECT *\n",
        "FROM transacoes\n",
        "WHERE valor BETWEEN 60 AND 1000;\n",
        "```\n",
        "\n",
        "O resultado:\n",
        "\n",
        "| id_cliente | id_transacao | data_compra |valor | id_loja |\n",
        "|------------|----------|----|-----| ------- |\n",
        "| 3 | 818770008    |2021-06-05   |  110.00 |  postoshell  \n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "48xTKCdcRmn-"
      },
      "source": [
        "#2. Filtros *like* e *wildcards*\n",
        "\n",
        "Muitas vezes precisamos encontrar valores de texto dentro da tabela. Em alguns casos, poderiamos utilizar buscas exatas com as condições where e o '='. \n",
        "\n",
        "No entanto, nem sempre temos o valor exato da busca e para isso podemos utilizar os *wildcards* (na tabela) junto com a palavra **LIKE**. No SQL temos os seguintes elementos para utilizar:\n",
        "\n",
        "|Elemento | Onde usar | Como usar |\n",
        "|---------|-----------|-----------|\n",
        "|%| Pode ser substituido por 0 ou mais caracteres | LIKE 'h%t' retorna instâncias com início h e fim t como  hat, hit, hot e height\n",
        "|_| Pode ser substituido por 1 caracter | LIKE h_t retorna instâncias com hat, hit, hot mas não height\n",
        "|[ ] | Pode ser substítuido pelos caracteres indicados dentro dos [] | LIKE h[oa]t retorna instâncias hot e hat mas não hit\n",
        "| ^ | Pode ser substítuido pelos caracteres que NÃO estão indicados dentro dos [^  ] | LIKE h[^oa]t retornaria hit mas não hot e hat\n",
        "|-|\t Retorna instância que são capazes de ser substítuidos por caracteres dentro de um certo intervalo [<intervalo1>-<intervalo2>] | LIKE h[a-l]t retorna hat e hit mas não retorna hot\n",
        "\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "veTg4-TieoOQ"
      },
      "source": [
        "Como utilizar\n",
        "\n",
        "```sql\n",
        "SELECT <coluna1>, <coluna2>, ...\n",
        "FROM <nome_tabela>\n",
        "WHERE <coluna> LIKE <padrao_utilizando_wildcards>;\n",
        "```\n",
        "No nosso caso para encontrar 'magalu' podemos utilizar\n",
        "```sql \n",
        "WHERE id_loja LIKE 'mag%'\n",
        "WHERE id_loja LIKE 'mag_lu'\n",
        "WHERE id_loja LIKE '[mn]agalu'\n",
        "WHERE id_loja LIKE 'mag[^ou]lu'\n",
        "WHERE id_loja LIKE 'maga[a-k]u'\n",
        "```\n",
        "\n",
        "Vamos testar uma das formas?\n",
        "\n",
        "```sql \n",
        "SELECT * \n",
        "FROM transacoes \n",
        "WHERE id_loja LIKE 'mag%'\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6yilarozf1tQ"
      },
      "source": [
        "| id_cliente | id_transacao | data_compra |valor | id_loja |\n",
        "|------------|----------|----|-----| ------- |\n",
        "| 1| 768805383    | 2021-06-10    | 50.74 |magalu \n",
        "|1 |76856563 | 2021-07-10 |2000.90 |magalu\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-25d04EWg49R"
      },
      "source": [
        "Os wildcards podem ser diferentes de acordo com a ferramenta de banco de dados. Verifique a documentação específica."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FrA84v9uR7XJ"
      },
      "source": [
        "# 3. Seleção condicional"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BcvbtBk5R9-f"
      },
      "source": [
        "Caso tenhamos diversas condições e para cada uma dela queremos retornar uma seleção diferente, podemos utilizar o comando **CASE** associado com **WHEN**, **THEN** e **ELSE** (opcional). \n",
        "\n",
        "\n",
        "```sql\n",
        "CASE \n",
        "  WHEN <condicao1> THEN <comando1>\n",
        "  WHEN <condicao2> THEN <comando2>\n",
        "  ...\n",
        "  WHEN <condicaoN> THEN <comandoN>\n",
        "  ELSE <comando_caso_nenhuma_condicao_nao_seja_satisfeita>\n",
        "END\n",
        "```\n",
        "\n",
        "Na tradução literal, podemos ler da seguinte forma: \n",
        "* Caso a \\<condicao1\\> seja satisfeita, faça o \\<comando1\\> e saia\n",
        "* Caso a \\<condicao1\\> não seja satisfeita, check a \\<condicao2\\>\n",
        "* Caso a \\<condicao2\\> seja satisfeita, faça o \\<comando2\\> e saia\n",
        "* Siga checando as condições até encontrar uma que seja satisfeita \n",
        "* Caso nenhuma condição seja satisfeita, execute o  \\<comando_caso_nenhuma_condicao_nao_seja_satisfeita\\>\n",
        "\n",
        "O comando pode ser utilizando dentro de vários comando como SELECT, UPDATE e DELETE e até isoladamente (com o SELECT, UPDATE E DELETE,... dentro do < comandoN >).\n",
        "\n",
        "Vamos ao exemplo?\n",
        "\n",
        "```sql\n",
        "SELECT id_cliente, id_loja, valor,\n",
        "CASE\n",
        "    WHEN valor > 1000 THEN 'Compra com alto valor'\n",
        "    WHEN valor < 1000 THEN 'Compra com baixo valor'\n",
        "END \n",
        "AS classeValor \n",
        "FROM transacoes \n",
        "WHERE valor > 50;\n",
        "```\n",
        "\n",
        "\n",
        "O resultado: \n",
        "\n",
        "| id_cliente | valor | id_loja | classeValor\n",
        "|------------|----------| ------- |------|\n",
        "| 1 |50.74 |magalu | Compra com baixo valor |\n",
        "| 3 |  110.00 |  postoshell  | Compra com baixo valor |\n",
        "|1 |2000.90 |magalu | Compra com alto valor|\n",
        " |4|50.74|extra| Compra com baixo valor|\n",
        "|3|1100.00|shopee| Compra com alto valor|\n"
      ]
    }
  ]
}