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
- Clone o repositório
git clone git@github.com:georgia-rocha/mysql-all-for-one.git
- 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
1.26.0
por 1.29.2
.
ℹ️ Rode os serviços
node
edb
com o comandodocker-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 chamadoall_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 ambienteMYSQL_USER
eMYSQL_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 nopackage.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 comandodocker 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.
ℹ️ 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
- Após ter seguido os passos anteriores do
docker-compose up -d
edocker exec -it all_for_one bash
, dentro do terminal interativo do container, rode:
npm test
- 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
- ✨ 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 colocarUSE northwind
ouSET SQL_SAFE_UPDATES = 0;
no início dos seus arquivos -
⚠️ Atenção: Após a execução dos teste locais, o banco de dadosnorthwind
é recriado⚠️
- Verifique se os testes estão executando:
npm test
** O docker-compose precisou estar na versão 1.29 ou superior.**
- 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 tabelaproducts
. - 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
eid
da tabelaproducts
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 colunaid
). - 8 - Faça uma consulta na tabela
employees
que retorne o nome completo da pessoa colaboradora (colunasfirst_name
elast_name
) com o nomefull_name
e também a localização completa (colunascity
,state_province
eaddress
) com o nomelocation
.
- 9 - Mostre todos os valores de
notes
da tabelapurchase_orders
que não são nulos. - 10 - Mostre todos os dados da tabela
purchase_orders
em ordem decrescente, ordenados porcreated_by
em que ocreated_by
é maior ou igual a 3. - 11 - Exiba os dados da coluna
notes
da tabelapurchase_orders
em que seu valor dePurchase generated based on Order
é maior ou igual a 30 e menor ou igual a 39. - 12 - Mostre as
submitted_date
depurchase_orders
em que asubmitted_date
é do dia 26 de abril de 2006. - 13 - Mostre o
supplier_id
daspurchase_orders
em que osupplier_id
seja 1 ou 3. - 14 - Mostre os resultados da coluna
supplier_id
da tabelapurchase_orders
em que osupplier_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 tabelapurchase_orders
. - 16 - Exiba a
submitted_date
daspurchase_orders
que estão entre2006-01-26 00:00:00
e2006-03-31 23:59:59
. - 17 - Mostre os registros das colunas
id
esupplier_id
daspurchase_orders
em que ossupplier_id
sejam tanto 1, ou 3, ou 5, ou 7. - 18 - Mostre todos os registros de
purchase_orders
que tem osupplier_id
igual a 3 estatus_id
igual a 2. - 19 - Mostre a quantidade de pedidos que foram feitos na tabela
orders
peloemployee_id
igual a 5 ou 6, e que foram enviados através do método(coluna)shipper_id
igual a 2.
- 20 - Adicione à tabela
order_details
um registro comorder_id
: 69,product_id
: 80,quantity
: 15.0000,unit_price
: 15.0000,discount
: 0,status_id
: 2,date_allocated
: NULL,purchase_order_id
: NULL einventory_id
: 129. - 21 - Adicione com um único
INSERT
, duas linhas à tabelaorder_details
com os mesmos dados do requisito 20. - 22 - Atualize todos os dados da coluna
discount
, na tabelaorder_details
, para 15. - 23 - Atualize os dados da coluna
discount
da tabelaorder_details
para 30, onde o valor na colunaunit_price
seja menor que 10.0000. - 24 - Atualize os dados da coluna
discount
da tabelaorder_details
para 45, onde o valor na colunaunit_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 tabelaorder_details
seja menor que 10.0000. - 26 - Delete todos os dados em que a
unit_price
da tabelaorder_details
seja maior que 10.0000. - 27 - Delete todos os dados da tabela
order_details
.