{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "SQL-modulo_3_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: Selecionando & Ordenando\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>Restrição de colunas;</li>\n",
        "  <li>Selecionando dados;</li>\n",
        "  <li>Ordenando e limitando os resultados;</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,\n",
        "  data_compra DATE,\n",
        "  valor FLOAT, \n",
        "  id_loja varchar(25)\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 \n",
        "\n",
        "Para realizar os testes no SQL, [clique aqui](https://sqliteonline.com/)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ok889VghEyKq"
      },
      "source": [
        "#1. Restrição de colunas\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "eqtRcYZgF94g"
      },
      "source": [
        "## **1.1 Tipos de chaves**"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7Lw72AUdE1Xk"
      },
      "source": [
        "### 1.1.1 Chave primária (PRIMARY KEY)\n",
        "\n",
        "Para identificar uma tabela, podemos utilizar uma chave primária. Existem algumas regras que devem ser respeitadas na coluna designada a ser chave primária:\n",
        "\n",
        "1. O valor da coluna não pode se repetir na tabela\n",
        "2. O valor da coluna não pode ser nulo\n",
        "\n",
        "Você pode utilizar a chave primária de uma tabela para identificar uma instância em outra tabela. "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "to1BzvRhNml8"
      },
      "source": [
        "```sql\n",
        "CREATE TABLE <nome_tabela> (\n",
        "  <nome_da_coluna_primaria> <tipo_da_coluna_primaria> PRIMARY KEY,\n",
        "  <nome_da_coluna_2> <tipo_da_coluna_2>, \n",
        "  ...\n",
        ");\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5geFfCGFOAHP"
      },
      "source": [
        "No exemplo, podemos colocar a chave primeira como o **id_transacao**, já que toda transação deve ser única (indice não se repete) e não nula (não pode existir um valor de transação que não foi preenchido):\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WIlOQQf_OZSQ"
      },
      "source": [
        "```sql\n",
        "CREATE TABLE transacoes (\n",
        "  id_cliente INT, \n",
        "  id_transacao INT PRIMARY KEY,\n",
        "  data_compra DATE,\n",
        "  valor FLOAT, \n",
        "  id_loja varchar(25)\n",
        ");\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YAQ4T5LFOegA"
      },
      "source": [
        "> Atenção: existe a opção de utilizar o AUTO_INCREMENT para que o valor de id_transacao seja automaticamente adicionado de 1 a cada nova transação no banco de dados. Entenda mais clicando [aqui](https://www.w3schools.com/sql/sql_autoincrement.asp)."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "IgElXkVXE429"
      },
      "source": [
        "### 1.1.2. Chave estrangeira (FOREIGN KEY)\n",
        "\n",
        "Quando queremos relacionar duas tabelas, utilizamos a chave estrangeira. Isso significa que uma coluna na tabela atual, está relaciona com alguma instância de outra tabela. No exemplo para o MySQL:\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Sdq3Bh6VUTV6"
      },
      "source": [
        "```sql\n",
        "CREATE TABLE <nome_tabela> (\n",
        "  <nome_da_coluna> <tipo_da_coluna>, \n",
        "  <nome_da_coluna> <tipo_da_coluna>, \n",
        "  ...,\n",
        "  <nome_da_coluna> <tipo_da_coluna>, \n",
        "  \n",
        "  FOREIGN KEY <nome_da_coluna> REFERENCES <nome_tabela_da_chave_relacionada>(<nome_da_coluna_na_tabela_relacionada>)\n",
        ");\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "X2mWxvO4UZ8g"
      },
      "source": [
        "**Exemplo**: Na nossa tabela transações, faz sentido ter a chave primária como **id_transacoes** como fizemos anteriormente e deixar a chave estrangeira como o **id_cliente**. Isso porque, deve existir uma tabela clientes onde esse **id_cliente** é a chave primeira. "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9gK5t6PPVtpT"
      },
      "source": [
        "```sql\n",
        "CREATE TABLE transacoes(\n",
        "  id_cliente INT,\n",
        "  id_transacao INT PRIMARY KEY,   \n",
        "  data_compra DATE,\n",
        "  valor FLOAT, \n",
        "  id_loja varchar(25),\n",
        "  FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)\n",
        ");\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-0aFBjkrWEc0"
      },
      "source": [
        "**Atenção:** Não há alteração visual quando adicionamos primary key ou foreign key na tabela. Por isso não mostraremos o resultado aqui. \n",
        "\n",
        "> Mais informações e outros formatos: [clique aqui](https://www.w3schools.com/sql/sql_foreignkey.asp)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "RJaiLiVwGKVN"
      },
      "source": [
        "## **1.2. Tipos de restrições**\n",
        "\n",
        "Algumas regras podem ser estabelecidas aos dados da sua tabela. Definindo-as na hora da criação da tabela, garantirá segurança na inserção dos dados. Veremos algumas nessa aula."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "isokYYxeE85o"
      },
      "source": [
        "### 1.2.1 Valores não nulos (NOT NULL)\n",
        "\n",
        "Define que os valores da coluna não podem ser nulos.\n",
        "\n",
        "```sql\n",
        "CREATE TABLE <nome_tabela> (\n",
        "  <nome_da_coluna> <tipo_da_coluna> NOT NULL ,\n",
        "  <nome_da_coluna_2> <tipo_da_coluna_2> , \n",
        "  ...\n",
        ");\n",
        "```\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "68HDlnzWW9rO"
      },
      "source": [
        "No nosso exemplo (unindo tudo que já aprendemos):"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "e-zfdUFbXHjI"
      },
      "source": [
        "```sql\n",
        "CREATE TABLE transacoes (\n",
        "  id_cliente INT,\n",
        "  id_transacao INT PRIMARY KEY,   \n",
        "  data_compra DATE,\n",
        "  valor FLOAT NOT NULL, \n",
        "  id_loja varchar(25),\n",
        "  FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)\n",
        ");\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1qEfCSp3FMb0"
      },
      "source": [
        "### 1.2.2 Valores únicos (UNIQUE)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GwZOq7JkXXC4"
      },
      "source": [
        "Define que os valores da coluna devem ser únicos.\n",
        "\n",
        "```sql\n",
        "CREATE TABLE <nome_tabela> (\n",
        "  <nome_da_coluna> <tipo_da_coluna> UNIQUE ,\n",
        "  <nome_da_coluna_2> <tipo_da_coluna_2> , \n",
        "  ...\n",
        ");\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MXZzNA24XhLB"
      },
      "source": [
        "No nosso exemplo (unindo tudo que já aprendemos):"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "y4rItWbfXjaW"
      },
      "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",
        "  FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)\n",
        ");\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kyvCIpVSFSnJ"
      },
      "source": [
        "### 1.2.3 Checando restrições (CHECK)\n",
        "\n",
        "Esse comando certifica que algumas condições devem ser satisfeitas ao inserir um dados na tabela.\n",
        "\n",
        "```sql\n",
        "CREATE TABLE <nome_tabela> (\n",
        "  <nome_da_coluna> <tipo_da_coluna>  ,\n",
        "  <nome_da_coluna_2> <tipo_da_coluna_2> , \n",
        "  CHECK (<condicao>)\n",
        "  ...\n",
        ");\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cZiDRv5sYMB2"
      },
      "source": [
        "No nosso caso, podemos avaliar se não há valor negativo nas transações:"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "H92wVsxMYQ09"
      },
      "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",
        "  FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)\n",
        "  CHECK (valor > 0) \n",
        ");\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "60JJ6w62cr7l"
      },
      "source": [
        "**Atenção:** Não há alteração visual quando adicionamos primary key ou foreign key na tabela. Por isso não mostraremos o resultado aqui. \n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "muD1vxozykSC"
      },
      "source": [
        "# 2. Selecionando dados"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5a3_syBIP6yO"
      },
      "source": [
        "## **2.1. Comando SELECT** "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QC-fpTLYf8H_"
      },
      "source": [
        "Para visualizar todos os dados da tabela, utilize asterisco (*):\n",
        "```sql\n",
        "SELECT * FROM <nome_tabela>;\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FsRdfaOsShwj"
      },
      "source": [
        "Para visualizar colunas específicas da tabela:\n",
        "```sql\n",
        "SELECT <nome_coluna_1>,<nome_coluna_2> FROM <nome_tabela>;\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Akc9qo1HYx30"
      },
      "source": [
        "Temos visto diversos exemplos durante os módulos 1 e 2. Mas hoje vamos além!"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "s_Dj-BgThLg5"
      },
      "source": [
        "## **2.2. Comando AS** \n",
        "\n",
        "Você pode criar um apelido (*alias*) na hora se mostrar sua coluna com o comando **AS**:\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-WX56uZlEVEb"
      },
      "source": [
        "```sql\n",
        "SELECT <nome_da_coluna> AS <apelido_para_coluna> FROM <nome_da_tabela>;\n",
        "```\n",
        "\n",
        "ou\n",
        "\n",
        "```sql\n",
        "SELECT <nome_coluna1> AS <apelido_para_coluna1>, <nome_da_coluna2> AS <apelido_para_coluna2> FROM <nome_da_tabela>;\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ZFeplQe4aT2m"
      },
      "source": [
        "No nosso exemplo:"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6oozDbW-aZHs"
      },
      "source": [
        "\n",
        "```sql\n",
        "SELECT id_cliente,id_transacao, data_compra, id_loja AS nome_loja FROM transacoes;\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "OIM6YJl7al5d"
      },
      "source": [
        "O resultado da query:"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Tjp2Dfd2aqYa"
      },
      "source": [
        "| id_cliente | id_transacao | data_compra |valor | **nome_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-11|50.74|extra\n",
        "|5|76766789|2021-08-02|10.00|subway\n",
        "|3|8154567758|2021-08-15|1100.00|shopee "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "URjNJfwd7-tw"
      },
      "source": [
        "## **2.3 Comando SELECT DISTINCT**\n",
        "\n",
        "Supondo que existam várias lojas (id_loja) diferentes no nosso banco de dados transações, com o uso do select distinct, o SQL só mostra quais são as lojas cadastradas na tabela, sem repetição. \n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "em-qyyB28c7I"
      },
      "source": [
        "```sql\n",
        "SELECT DISTINCT <nome_da_coluna>  FROM <nome_da_tabela>;\n",
        "```\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wR_GtZYTb6dy"
      },
      "source": [
        "No nosso caso:\n",
        "\n",
        "```sql\n",
        "SELECT DISTINCT id_loja AS nome_loja  FROM transacoes;\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ewqs_Hl9dHAT"
      },
      "source": [
        "O resultado:\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JikTCkaWdLg_"
      },
      "source": [
        "| nome_loja | \n",
        "| ------- |\n",
        "|magalu| \n",
        "| giraffas| \n",
        " |  postoshell  |\n",
        "|subway|\n",
        "|seveneleven|\n",
        "|extra|\n",
        "|shopee| "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "zGFzJFUNHP2u"
      },
      "source": [
        "# 3. Ordenando e limitando resultados"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1jIvay1oHT8B"
      },
      "source": [
        "## **3.1 Comando ORDER** \n",
        "\n",
        "Na hora de mostrar os resultados, é possível ordena-los de acordo com alguma varíavel(coluna) com a função **ORDER**. "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YGiApwOZZqGq"
      },
      "source": [
        "```sql\n",
        "SELECT <coluna1>,... <coluna2>, ...\n",
        "FROM <nome_tabela>\n",
        "ORDER BY <coluna1> ASC|DESC;\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oPDyBdf6Z5A2"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UZhZPSMTZ75d"
      },
      "source": [
        "```sql\n",
        "SELECT id_cliente, valor \n",
        "FROM transacoes\n",
        "WHERE id_cliente= 1\n",
        "ORDER BY valor DESC;\n",
        "```\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rJ7dutSIaGCn"
      },
      "source": [
        "O resultado da query:"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DcWaCnoTawhh"
      },
      "source": [
        "| id_cliente |valor |\n",
        "|------------| ------- |\n",
        "|1 |2000.90 |\n",
        "| 1 | 50.74 |  \n",
        "|1 | 15.70| \n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JU03xEfbHnX-"
      },
      "source": [
        "## **3.2. Comando LIMIT**\n",
        "\n",
        "Você pode limitar quantas linhas serão mostradas na sua seleção de dados com o comando LIMIT:\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "X3ATucbfa8Gz"
      },
      "source": [
        "```sql\n",
        "SELECT <nome_coluna>\n",
        "FROM <nome_tabela>\n",
        "LIMIT <numero_de_linhas>;\n",
        "```\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yoPZal35bQev"
      },
      "source": [
        "No nosso exemplo:\n",
        "\n",
        "```sql\n",
        "SELECT id_transacao, valor \n",
        "FROM transacoes \n",
        "LIMIT 3;\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "E1XmR40MbT40"
      },
      "source": [
        "O resultado: \n",
        "\n",
        " | id_transacao | valor | \n",
        "|------------| ------- |\n",
        "|768805383   | 50.74 |\n",
        " | 768805399     |  30.90 |\n",
        " | 818770008     |  110.00 |   \n",
        "\n"
      ]
    }
  ]
}