OBJETIVO

Colocar em prática os conceitos de SQL abordados na segunda sessão de back-end usando Docker e utilizando o bando de dados Northwind.

Para clonar e testar
  1. Clone o repositório
git clone git@github.com:georgia-rocha/mysql-all-for-one.git
  1. Entre na pasta do repositório que você acabou de clonar:
  cd mysql-all-for-one
2. Escolha se vai rodar o projeto localmente ou pelo Docker e faça o npm install:
🐋 Rodando no Docker vs Localmente

Com Docker

⚠️ Antes de começar, seu docker-compose precisa estar na versão 1.29 ou superior. Veja aqui ou na documentação como instalá-lo. No primeiro artigo, você pode substituir onde está com 1.26.0 por 1.29.2.

ℹ️ Rode os serviços node e db com o comando docker-compose up -d.

  • Lembre-se de parar o mysql se estiver usando localmente na porta padrão (3306), ou adapte, caso queria fazer uso da aplicação em containers
  • Esses serviços irão inicializar um container chamado all_for_one e outro chamado all_for_one_db.
  • A partir daqui você pode rodar o container all_for_one via CLI ou abri-lo no VS Code.

ℹ️ Use o comando docker exec -it all_for_one bash.

  • Ele te dará acesso ao terminal interativo do container criado pelo compose, que está rodando em segundo plano.
  • As credencias de acesso ao banco de dados estão definidas no arquivo docker-compose.yml, e são acessíveis no container através das variáveis de ambiente MYSQL_USER e MYSQL_PASSWORD. 💡

ℹ️ Instale as dependências [Caso existam] com npm install. (Instale dentro do container)

  • ⚠️ Atenção: Caso opte por utilizar o Docker, TODOS os comandos disponíveis no package.json (npm start, npm test, npm run dev, ...) devem ser executados DENTRO do container, ou seja, no terminal que aparece após a execução do comando docker exec citado acima.

  • ⚠️ Atenção: O git dentro do container não vem configurado com suas credenciais. Ou faça os commits fora do container, ou configure as suas credenciais do git dentro do container.

  • ⚠️ Atenção: Não rode o comando npm audit fix! Ele atualiza várias dependências do projeto, e essa atualização gera conflitos com o avaliador.

  • Dica: A extensão Remote - Containers (que estará na seção de extensões recomendadas do VS Code) é indicada para que você possa desenvolver sua aplicação no container Docker direto no VS Code, como você faz com seus arquivos locais.


Sem Docker

ℹ️ Instale as dependências [Caso existam] com npm install

  • ⚠️ Atenção: Não rode o comando npm audit fix! Ele atualiza várias dependências do projeto, e essa atualização gera conflitos com o avaliador.

  • ✨ Dica: Para rodar o projeto desta forma, obrigatoriamente você deve ter o node instalado em seu computador.

  • ✨ Dica: O avaliador espera que a versão do node utilizada seja a 16.


📑 Instruções para testar as queries

Para executar os testes locais com Docker 🐋

  • Após ter seguido os passos anteriores do docker-compose up -d e docker exec -it all_for_one bash, dentro do terminal interativo do container, rode:
npm test

Para executar os testes locais usando a instalação do MySQL feita na sua máquina 💻

  • Para executar localmente os testes é preciso escrever o seguinte no seu terminal:
MYSQL_USER=<SEU_NOME_DE_PESSOA_USUARIA> MYSQL_PASSWORD=<SUA SENHA> HOSTNAME=<NOME_DO_HOST> PORT=<PORTA> npm test
  • Não esqueça de substituir os locais indicados com < > por suas credenciais:
MYSQL_USER=root MYSQL_PASSWORD=password HOSTNAME=localhost PORT=3306 npm test

Dicas e pontos de atenção

  • Dica: variáveis de ambiente definidas na mesma linha do comando valem apenas para aquele comando. Se preferir, você pode exportar as variáveis de ambiente para toda a sessão (todos os comandos até você fechar aquele terminal). Por exemplo:
export MYSQL_USER=root MYSQL_PASSWORD=password HOSTNAME=localhost PORT=3306

E depois disso você só precisa rodar npm test quando for testar os projetos.

  • Dica: Caso queira utilizar Docker para rodar os testes localmente, basta executar o comando:
docker run -p 3306:3306 --name mysql_57 -e MYSQL_ROOT_PASSWORD=1234 -d mysql:5.7 mysqld --default-authentication-plugin=mysql_native_password
  • Depois de usar o comando acima, agora basta executar os testes digitando no terminal:
MYSQL_USER=root MYSQL_PASSWORD=1234 HOSTNAME=localhost npm test
O que está sendo feito na dica acima
- :point_right: flag --name:
> Define um nome para o nosso _container_: "meu-mysql-5_7".

- :point_right: flag -e:
> Define a variável de ambiente "MYSQL_ROOT_PASSWORD" com o valor "1234".

- :point_right: flag -d:
> Define que o container rode em segundo plano.

- :point_right: flag -p:
> Mapeia uma porta local a uma porta do _container_.

- :point_right: mysql:5.7:
> Define qual versão da imagem  mySQL queremos, no caso, a 5.7, que é a esperada pelo avaliador.
  • ⚠️ Atenção: O avaliador espera que a versão do MySQL seja a 5.7. Em caso de erro nos testes, verifique se essa é a versão que está sendo usada por você.

  • ⚠️ Atenção: Não é necessário colocar USE northwind ou SET SQL_SAFE_UPDATES = 0; no início dos seus arquivos

  • ⚠️ Atenção: Após a execução dos teste locais, o banco de dados northwind é recriado ⚠️

  1. Verifique se os testes estão executando:
npm test

** O docker-compose precisou estar na versão 1.29 ou superior.**

Requisitos Obrigatórios 100%

Desafios Iniciais

  • 1 - Exiba apenas os nomes dos produtos na tabela products.
  • 2 - Exiba os dados de todas as colunas da tabela products.
  • 3 - Escreva uma query que exiba os valores da coluna que representa a primary key da tabela products.
  • 4 - Conte quantos registros existem na coluna product_name da tabela products.
  • 5 - Monte uma query que exiba os dados da tabela products a partir do quarto registro até o décimo terceiro.
  • 6 - Exiba os dados das colunas product_name e id da tabela products de maneira que os resultados estejam em ordem alfabética dos nomes.
  • 7 - Mostre apenas os ids dos 5 últimos registros da tabela products (a ordenação deve ser baseada na coluna id).
  • 8 - Faça uma consulta na tabela employees que retorne o nome completo da pessoa colaboradora (colunas first_name e last_name) com o nome full_name e também a localização completa (colunas city, state_province e address) com o nome location.

Desafios sobre filtragem de dados

  • 9 - Mostre todos os valores de notes da tabela purchase_orders que não são nulos.
  • 10 - Mostre todos os dados da tabela purchase_orders em ordem decrescente, ordenados por created_by em que o created_by é maior ou igual a 3.
  • 11 - Exiba os dados da coluna notes da tabela purchase_orders em que seu valor de Purchase generated based on Order é maior ou igual a 30 e menor ou igual a 39.
  • 12 - Mostre as submitted_date de purchase_orders em que a submitted_date é do dia 26 de abril de 2006.
  • 13 - Mostre o supplier_id das purchase_orders em que o supplier_id seja 1 ou 3.
  • 14 - Mostre os resultados da coluna supplier_id da tabela purchase_orders em que o supplier_id seja maior ou igual a 1 e menor ou igual 3.
  • 15 - Mostre somente as horas (sem os minutos e os segundos) da coluna submitted_date de todos registros da tabela purchase_orders.
  • 16 - Exiba a submitted_date das purchase_orders que estão entre 2006-01-26 00:00:00 e 2006-03-31 23:59:59.
  • 17 - Mostre os registros das colunas id e supplier_id das purchase_orders em que os supplier_id sejam tanto 1, ou 3, ou 5, ou 7.
  • 18 - Mostre todos os registros de purchase_orders que tem o supplier_id igual a 3 e status_id igual a 2.
  • 19 - Mostre a quantidade de pedidos que foram feitos na tabela orders pelo employee_id igual a 5 ou 6, e que foram enviados através do método(coluna) shipper_id igual a 2.

Desafios de manipulação de tabelas

  • 20 - Adicione à tabela order_details um registro com order_id: 69, product_id: 80, quantity: 15.0000, unit_price: 15.0000, discount: 0, status_id: 2, date_allocated: NULL, purchase_order_id: NULL e inventory_id: 129.
  • 21 - Adicione com um único INSERT, duas linhas à tabela order_details com os mesmos dados do requisito 20.
  • 22 - Atualize todos os dados da coluna discount, na tabela order_details, para 15.
  • 23 - Atualize os dados da coluna discount da tabela order_details para 30, onde o valor na coluna unit_price seja menor que 10.0000.
  • 24 - Atualize os dados da coluna discount da tabela order_details para 45, onde o valor na coluna unit_price seja maior que 10.0000 e o id seja um número entre 30 e 40.
  • 25 - Delete todos os dados em que a unit_price da tabela order_details seja menor que 10.0000.
  • 26 - Delete todos os dados em que a unit_price da tabela order_details seja maior que 10.0000.
  • 27 - Delete todos os dados da tabela order_details.