{"id":28223413,"url":"https://github.com/lmuffato/project-mysql-one-for-all-trybe","last_synced_at":"2026-05-08T00:31:43.141Z","repository":{"id":139798697,"uuid":"413960952","full_name":"lmuffato/Project-mysql-one-for-all-Trybe","owner":"lmuffato","description":"Projeto mysql one for all - Projeto avaliativo da Trybe do Bloco 21: Normalização e Modelagem de Banco de Dados","archived":false,"fork":false,"pushed_at":"2021-10-05T19:58:11.000Z","size":4717,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"lmuffato-mysql-one-for-all","last_synced_at":"2025-06-12T00:43:02.887Z","etag":null,"topics":["back-end","data","database","database-modeling","mysql","mysqlworkbench","query","sql","trybe-projects"],"latest_commit_sha":null,"homepage":"https://github.com/tryber/sd-010-a-mysql-one-for-all/pull/116","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lmuffato.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-10-05T19:57:15.000Z","updated_at":"2021-11-22T23:34:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"9c846450-7e02-4021-8054-27144b4cfd77","html_url":"https://github.com/lmuffato/Project-mysql-one-for-all-Trybe","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lmuffato/Project-mysql-one-for-all-Trybe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmuffato%2FProject-mysql-one-for-all-Trybe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmuffato%2FProject-mysql-one-for-all-Trybe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmuffato%2FProject-mysql-one-for-all-Trybe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmuffato%2FProject-mysql-one-for-all-Trybe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lmuffato","download_url":"https://codeload.github.com/lmuffato/Project-mysql-one-for-all-Trybe/tar.gz/refs/heads/lmuffato-mysql-one-for-all","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmuffato%2FProject-mysql-one-for-all-Trybe/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266462912,"owners_count":23932881,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["back-end","data","database","database-modeling","mysql","mysqlworkbench","query","sql","trybe-projects"],"created_at":"2025-05-18T08:09:35.734Z","updated_at":"2026-05-08T00:31:37.373Z","avatar_url":"https://github.com/lmuffato.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"### Termos e acordos\n\nAo iniciar este projeto, você concorda com as diretrizes do Código de Ética e Conduta e do Manual da Pessoa Estudante da Trybe.\n\n---\n\n# Boas vindas ao repositório do projeto One For All!\n\nVocê já usa o GitHub diariamente para desenvolver os exercícios, certo? Agora, para desenvolver os projetos, você deverá seguir as instruções a seguir. Fique atento a cada passo e, se tiver qualquer dúvida, nos envie por Slack! #vqv 🚀\n\nAqui você vai encontrar os detalhes de como estruturar o desenvolvimento do seu projeto a partir desse repositório, utilizando uma branch específica e um Pull Request para colocar seus códigos.\n\n---\n\n# SUMÁRIO\n\n- [Habilidades](#habilidades)\n- [Entregáveis](#entregáveis)\n  - [O que deverá ser desenvolvido](#o-que-deverá-ser-desenvolvido)\n  - [Desenvolvimento](#desenvolvimento)\n  - [Data de entrega](#data-de-entrega)\n- [Instruções para entregar seu projeto](#instruções-para-entregar-seu-projeto)\n  - [Antes de começar a desenvolver](#antes-de-começar-a-desenvolver)\n  - [Durante o desenvolvimento](#durante-o-desenvolvimento)\n- [Como desenvolver](#como-desenvolver)\n  - [Problema a ser resolvido](#problema-a-ser-resolvido)\n  - [Implmentações técnicas](#implementações-técnicas)\n- [Requisitos do projeto](#requisitos-do-projeto)\n  - [Desafio 1](#desafio-1)\n  - [Desafio 2](#desafio-2)\n  - [Desafio 3](#desafio-3)\n  - [Desafio 4](#desafio-4)\n  - [Desafio 5](#desafio-5)\n  - [Desafio 6](#desafio-6)\n  - [Desafio 7](#desafio-7)\n  - [Desafio 8](#desafio-8)\n  - [Desafio 9](#desafio-9)\n  - [Desafio 10](#desafio-10)\n  - [Desafio 11](#desafio-11)\n- [Depois de terminar o desenvolvimento](#depois-de-terminar-o-desenvolvimento)\n- [Revisando um pull request](#revisando-um-pull-request)\n- [Avisos Finais](#avisos-finais)\n\n---\n\n# Habilidades\nNeste projeto, verificamos se voce é capaz de:\n\n  * Modelar um banco de dados\n\n  * Identificar entidades , atributos e relacionamentos\n  \n  * Aplicar a 1ª, 2ª e 3ª Forma Normal\n\n  * Criar tabelas\n  \n  * Lidar com VIEWs\n\n  * Alterar tabelas existentes\n\n  * Criar reações dinâmicas com TRIGGERS\n\n---\n\n# Entregáveis\n\nPara entregar o seu projeto você deverá criar um Pull Request neste repositório.\n\nLembre-se que você pode consultar nosso conteúdo sobre\n[Git \u0026 GitHub](https://course.betrybe.com/intro/git/) sempre que precisar!\n\n---\n\n## O que deverá ser desenvolvido\n\nHoje, no projeto ***One For All***, você usará **uma** tabela para revisar e consolidar **todos** os principais conceitos vistos até o momento.\n\nVocê receberá uma tabela não normalizada, a qual deverá ser normalizada e populada, para que você possa executar queries sobre ela com o intuito de encontrar as informações solicitadas.\n\n## Desenvolvimento\n\nNormalize uma tabela na terceira forma normal e acesse as informações desta tabela através de `queries` utilizando `SQL`.\n\n## Data de Entrega\n\n  - Serão `1` dias de projeto.\n  - Data de entrega para avaliação final do projeto: `10/08/2021 - 14:00h`.\n\n---\n\n## Instruções para entregar seu projeto:\n\n### Antes de começar a desenvolver\n\n1. Clone o repositório\n  * `git clone https://github.com/tryber/sd-010-a-mysql-one-for-all.git`.\n  * Entre na pasta do repositório que você acabou de clonar:\n    * `cd sd-010-a-mysql-one-for-all`\n\n2. Instale as dependências\n  * `npm install`\n\n3. Crie uma branch a partir da branch `master`\n  * Verifique que você está na branch `master`\n    * Exemplo: `git branch`\n  * Se não estiver, mude para a branch `master`\n    * Exemplo: `git checkout master`\n  * Agora, crie uma branch onde você vai guardar os `commits` do seu projeto\n    * Você deve criar uma branch no seguinte formato: `nome-de-usuario-nome-do-projeto`\n    * Exemplo: `git checkout -b seunome-mysql-one-for-all`\n\n4. Para cada exercício você deve criar um novo arquivo sql seguindo a seguinte estrutura:\n  * desafio1.sql, desafio2.sql, desafio3.sql, desafio4.sql, ..., desafioN.sql\n\n5. Adicione as mudanças ao _stage_ do Git e faça um `commit`\n  * Verifique que as mudanças ainda não estão no _stage_\n    * Exemplo: `git status` (deve aparecer o arquivo que você alterou como desafio1.sql)\n  * Adicione o novo arquivo ao _stage_ do Git\n      * Exemplo:\n        * `git add .` (adicionando solução para desafio 1)\n        * `git status` (deve aparecer listado o arquivo _desafio1.sql_ em verde)\n  * Faça o `commit` inicial\n      * Exemplo:\n        * `git commit -m 'iniciando o projeto MySQL One For All'` (fazendo o primeiro commit)\n        * `git status` (deve aparecer uma mensagem tipo _nothing to commit_ )\n\n\n## Durante o desenvolvimento\n\n* Faça `commits` das alterações que você fizer no código regularmente\n\n* Lembre-se de sempre após um (ou alguns) `commits` atualizar o repositório remoto\n\n* Os comandos que você utilizará com mais frequência são:\n  1. `git status` _(para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage)_\n  2. `git add` _(para adicionar arquivos ao stage do Git)_\n  3. `git commit` _(para criar um commit com os arquivos que estão no stage do Git)_\n  4. `git push -u origin nome-da-branch` _(para enviar o commit para o repositório remoto na primeira vez que fizer o `push` de uma nova branch)_\n  5. `git push` _(para enviar o commit para o repositório remoto após o passo anterior)_\n\n---\n\n# Como desenvolver\n\nPara cada desafio, crie um arquivo SQL e inclua sua solução nele.\n\n1. Leia a pergunta e crie um arquivo **na pasta raiz do projeto** chamado `desafioN.sql`, em que N é o número do desafio (exemplo: desafio3.sql). Para o [primeiro desafio](#desafio-1), é preciso criar também o arquivo de configurações `desafio1.json` *também na pasta raiz do projeto*.\n\n2. O arquivo deve conter apenas o código SQL do desafio resolvido. **Não se esqueça de incluir o ponto e vírgula (\";\")** no final de suas queries e também de **colocar o nome do banco_de_dados.tabela por completo**, como no exemplo a seguir:\n```sql\nSELECT * FROM SpotifyClone.artista;\n```\n\n**Dica:** sempre seguir esse padrão e não utilizar a linha abaixo nos arquivos `desafionN.sql`,\n```sql\nuse SpotifyClone;\n```\n\n3. Atente-se a detalhes de digitação em seu código. Qualquer diferença em nomes, apelidos, ou CAIXA ALTA e caixa baixa podem invalidar suas respostas.\n\n4. Faça isso até finalizar todos os desafios e depois siga as instruções de como entregar o projeto em [**Instruções para entregar seu projeto**](#instruções-para-entregar-seu-projeto)\n\n5. Para entregar o seu projeto você deverá criar um _Pull Request_ neste repositório. Este _Pull Request_ deverá conter tanto o arquivo de configurações `desafio1.json` do [primeiro desafio](#desafio-1) quanto os arquivos `desafio1.sql`, `desafio2.sql` e assim por diante até o `desafio11.sql`, que conterão seu código `SQL` de cada desafio, respectivamente.\n\n## ⚠️ É importante que seus arquivos tenham exatamente estes nomes! ⚠️\n\nQualquer dúvida, procure a monitoria. Lembre-se que você pode consultar nosso conteúdo sobre [Git \u0026 GitHub](https://course.betrybe.com/intro/git/) sempre que precisar!\n\n---\n\n## Problema a ser resolvido\n\nVocê receberá uma tabela não normalizada semelhante ao que poderia ser uma versão simplificada do banco de dados do Spotify. O trabalho consistirá de duas partes:\n\n1. Normalizar essa tabela, criar o schema no seu banco de dados local e populá-lo;\n\n2. Realizar os desafios no seu banco normalizado e populado.\n\n**Aviso:** Todos os dados da tabela abaixo são fictícios e foram gerados aleatoriamente através de ferramentas, com o intuito de deixar o projeto mais real para vocês 😉. Quaisquer similaridades com informações reais são meras coincidências.\n\n**Observação:** O banco de dados real do Spotify é muito mais completo e complexo que o mostrado abaixo. No entanto, use APENAS as informações passadas e solicitadas aqui. Não crie dados que não foram solicitados.\n\n## Normalize as tabelas para a 3ª Forma Normal\n\nAbaixo você pode visualizar e baixar uma planilha com as tabelas que deverão ser normalizadas:\n\n![Tabela não normalizada \"Spotify Clone\"](./images/non-normalized-tables.png)\n[Faça o download dela aqui](./SpotifyClone-Non-NormalizedTable.xlsx)\n\nAntes de tudo, você deverá modelar e normalizar essas tabelas para a 3° Forma Normal. Monte quantas planilhas e tabelas forem necessárias para criar essa versão normalizada, desde que você siga as regras de negócio. Não é necessário criar o código SQL neste momento.\n\n**Embora não seja necessário, é recomendado que você crie suas planilhas na sequência 1ª -\u003e 2ª -\u003e 3ª Forma Normal**.\n\nCaso haja dúvidas, consulte o material já passado até hoje para te auxiliar.\n\nSeu banco de dados deve seguir as regras de negócio e ser capaz de recuperar:\n\n* Informações sobre quais planos estão disponíveis e seus detalhes;\n  * Cada pessoa usuária pode possuir apenas um plano.\n\n* Informações sobre todas as pessoas artistas;\n  * Uma pessoa artista pode ter vários álbuns;\n  * Uma pessoa artista pode ser seguida por várias pessoas usuárias.\n\n* Informações sobre todos os álbuns de cada artista;\n  * Para fins deste projeto, considere que cada álbum possui apenas uma pessoa artista como principal;\n  * Cada álbum possui várias canções.\n\n* Informações sobre todas as canções de cada álbum;\n  * Para fins deste projeto, considere que cada canção está contida em apenas um álbum.\n\n* Informações sobre todas as pessoas usuárias, seus planos, seu histórico de reprodução e pessoas artistas seguidas.\n  * Uma pessoa usuária pode possuir apenas um plano;\n  * Cada música do histórico de reprodução pode aparecer uma única vez por pessoa (para simplificar, considere que o objetivo do histórico é saber **quais** canções já foram reproduzidas e **não quantas vezes** foram reproduzidas);\n  * Uma pessoa usuária pode seguir várias pessoas artistas, mas cada pessoa artista pode ser seguida apenas uma vez por pessoa usuária.\n\n---\n\n## Implementações técnicas\n\nAlgumas coisas devem seguir um padrão pré-estabelecido para que os testes de correção funcionem adequadamente:\n\n1. Ao modelar o banco de dados no [desafio 1](#desafio-1):\n\n  * Quando for preciso que uma `coluna_a` referencie uma coluna `coluna_b` em outra tabela, é **necessário** que na `coluna_a` haja restrição de foreign key e que `coluna_b` seja uma primary key;\n\n  * Quando for necessário fazer uso do relacionamento muitos para muitos (`N..N`), a tabela criada para modelar esse tipo de relacionamento **precisa** ter sua chave primária composta por suas foreign keys.\n\n2. **Todos** os desafios que pedirem para criar uma view **devem** possuir no seu arquivo `.sql` correspondente **somente** a query para a criação da view.\n\n3. Para executar localmente os testes, é preciso escrever o seguinte no seu terminal:\n    ```sh\n    MYSQL_USER=\u003cSEU_NOME_DE_PESSOA_USUARIA\u003e MYSQL_PASSWORD=\u003cSUA SENHA\u003e HOSTNAME=\u003cNOME_DO_HOST\u003e npm test\n    ```\n\n  * Ou seja, suponha que para poder acessar a base de dados feita neste projeto você tenha `root` como seu nome de pessoa usuária, `password` como senha e `localhost` como host. Logo, você executaria:\n    ```sh\n    MYSQL_USER=root MYSQL_PASSWORD=password HOSTNAME=localhost npm test\n    ```\n\n  * Usando o exemplo anterior de base, suponha que você não tenha setado uma senha para `root`. Neste caso, você executaria:\n    ```sh\n    MYSQL_USER=root MYSQL_PASSWORD= HOSTNAME=localhost npm test\n    ```\n---\n\n# Requisitos do projeto\n\n## Desafio 1\n\n* Crie um banco com o nome de **`SpotifyClone`**.\n\n* Providencie as queries necessárias para criar tabelas normalizadas que atendam aos requisitos descritos na seção anterior;\n\n* Providencie as queries necessárias para popular as tabelas de acordo com os dados listados na seção anterior;\n\n* Crie um arquivo de configurações `desafio1.json`, que mapeará em qual tabela e coluna se encontram as informações necessárias para a avaliação automatizada deste desafio. As configurações devem possuir o seguinte formato:\n\n```json\n{\n  \"coluna_usuario\": \"nome-da-coluna\",\n  \"tabela_que_contem_usuario\": \"nome-da-tabela-que-armazena-a-coluna\",\n  \"coluna_plano\": \"nome-da-coluna\",\n  \"tabela_que_contem_plano\": \"nome-da-tabela-que-armazena-a-coluna\",\n  \"coluna_historico_de_reproducoes\": \"nome-da-coluna\",\n  \"tabela_que_contem_historico_de_reproducoes\": \"nome-da-tabela-que-armazena-a-coluna\",\n  \"coluna_seguindo_artistas\": \"nome-da-coluna\",\n  \"tabela_que_contem_seguindo_artistas\": \"nome-da-tabela-que-armazena-a-coluna\",\n  \"coluna_artista\": \"nome-da-coluna\",\n  \"tabela_que_contem_artista\": \"nome-da-tabela-que-armazena-a-coluna\",\n  \"coluna_album\": \"nome-da-coluna\",\n  \"tabela_que_contem_album\": \"nome-da-tabela-que-armazena-a-coluna\",\n  \"coluna_cancoes\": \"nome-da-coluna\",\n  \"tabela_que_contem_cancoes\": \"nome-da-tabela-que-armazena-a-coluna\"\n}\n```\n\nEssa configuração deve ser feita baseada no seu banco de dados **após a normalização**. Ou seja, se você criou uma tabela chamada `users` que possui a coluna `name`, você substituiria `\"coluna_usuario\"` e `\"tabela_que_contem_usuario\"` da seguinte forma:\n\n```json\n{\n  \"coluna_usuario\": \"name\",\n  \"tabela_que_contem_usuario\": \"users\",\n  ...\n}\n```\n\n* Salve as queries criadas no arquivo `desafio1.sql`. Seu código deverá ser similar ao seguinte:\n\n```sql\nDROP DATABASE IF EXISTS SpotifyClone;\n\nCREATE DATABASE SpotifyClone;\n\nUSE SpotifyClone;\n\nCREATE TABLE tabela1(\n    coluna1 tipo restricoes,\n    coluna2 tipo restricoes,\n    colunaN tipo restricoes,\n) engine = InnoDB;\n\nCREATE TABLE tabela2(\n    coluna1 tipo restricoes,\n    coluna2 tipo restricoes,\n    colunaN tipo restricoes,\n) engine = InnoDB;\n\nINSERT INTO tabela1 (coluna1, coluna2)\nVALUES\n  ('exemplo de dados 1', 'exemplo de dados A'),\n  ('exemplo de dados 2', 'exemplo de dados B'),\n  ('exemplo de dados 3', 'exemplo de dados C');\n\nINSERT INTO tabela2 (coluna1, coluna2)\nVALUES\n  ('exemplo de dados 1', 'exemplo de dados X'),\n  ('exemplo de dados 2', 'exemplo de dados Y');\n```\n\nO que será verificado:\n\n- Será validado se os planos estão na tabela normalizada.\n\n- Será validado se o histórico de reprodução está na tabela normalizada.\n\n- Será validado se as informações sobre pessoas seguindo artistas estão na tabela normalizada.\n\n- Será validado se os álbuns estão na tabela normalizada.\n\n- Será validado se os canções estão na tabela normalizada.\n\n- Será validado se as informações sobre pessoas usuárias estão na tabela normalizada.\n\n- Será validado se as informações sobre pessoas artistas estão na tabela normalizada.\n\n⚠️ Note que uma vez executado um teste, a sua base de dados `SpotifyClone` **será dropada**. Logo, **se atente** a salvar seu progresso nos arquivos de desafio! ⚠️\n\n---\n\n## Desafio 2\n\nCrie uma `VIEW` chamada `estatisticas_musicais` que exiba três colunas:\n\n1. A primeira coluna deve exibir a quantidade total de canções. Dê a essa coluna o alias \"**cancoes**\".\n\n2. A segunda coluna deve exibir a quantidade total de artistas e deverá ter o alias \"**artistas**\".\n\n3. A terceira coluna deve exibir a quantidade de álbuns e deverá ter o alias \"**albuns**\".\n\nSua `VIEW` deve retornar a seguinte informação ao ser consultada:\n\n![Estatísticas musicais](./images/estatisticas_musicais.png)\n\nO que será verificado:\n\n- Será validado se existe uma `VIEW` chamada `estatisticas_musicais` que exibe os dados corretos nas colunas **cancoes**, **artistas** e **albuns**\".\n\n---\n\n## Desafio 3\n\nCrie uma `VIEW` chamada `historico_reproducao_usuarios`. Essa `VIEW` deverá ter apenas duas colunas:\n\n1. A primeira coluna deve possuir o alias \"**usuario**\" e exibir o nome da pessoa usuária.\n\n2. A segunda coluna deve possuir o alias \"**nome**\" e exibir o nome da canção ouvida pela pessoa com base no seu histórico de reprodução.\n\nOs resultados devem estar ordenados por nome da pessoa usuária em ordem alfabética e em caso de empate no nome os resultados devem ser ordenados pelo nome da canção em ordem alfabética.\n\nSua `VIEW` deve retornar a seguinte informação, ao ser consultada:\n\n![Histórico de reprodução das pessoas usuárias](./images/HistoricoReproducaoUsuarios.png)\n\nO que será verificado:\n\n- Será validado se existe uma `VIEW` chamada `historico_reproducao_usuarios` que exibe os dados corretos nas colunas **usuario** e **nome**\".\n\n- Será validado se as colunas estão ordenadas de forma correta.\n\n---\n\n## Desafio 4\n\nCrie uma `VIEW` com o nome `top_3_artistas` que deve mostrar somente as três pessoas artistas mais populares no banco `SpotifyClone`, possuindo as seguintes colunas:\n\n1. A primeira coluna deve possuir o alias \"**artista**\" e exibir o nome da pessoa artista.\n\n2. A segunda coluna deve ter o alias \"**seguidores**\" e exibir a quantidade de pessoas que estão seguindo aquela pessoa artista.\n\nSeu resultado deve estar ordenado em ordem decrescente, baseando-se na quantidade de seguidores. Em caso de empate, ordene os resultados pelo nome da pessoa artista em ordem alfabética.\n\nSua `VIEW` deve retornar a seguinte informação, ao ser consultada:\n\n![Top 3 artistas](./images/top_3_artistas.png)\n\nO que será verificado:\n\n- Será validado se existe uma `VIEW` chamada `top_3_artistas` que exibe os dados corretos nas colunas **artista** e **seguidores**\".\n\n- Será validado se as colunas estão ordenadas de forma correta.\n\n---\n\n## Desafio 5\n\nEstamos fazendo um estudo das músicas mais tocadas e precisamos saber quais são as duas músicas mais tocadas no momento. Crie uma `VIEW` chamada `top_2_hits_do_momento` que possua duas colunas:\n\n1. A primeira coluna deve possuir o alias \"**cancao**\" e exibir o nome da canção.\n\n2. A segunda coluna deve possuir o alias \"**reproducoes**\" e exibir a quantidade de pessoas que já escutaram a canção em questão.\n\nSeu resultado deve estar ordenado em ordem decrescente, baseando-se no número de reproduções. Em caso de empate, ordene os resultados pelo nome da canção em ordem alfabética. Queremos apenas o top 2 de músicas mais tocadas.\n\nSua `VIEW` deve retornar a seguinte informação, ao ser consultada:\n\n![Top 2 hits do momento](./images/top_2_hits_do_momento.png)\n\n\nO que será verificado:\n\n- Será validado se existe uma `VIEW` chamada `top_2_hits_do_momento`, que exibe os dados corretos nas colunas **cancao** e **reproducoes**\".\n\n- Será validado se as colunas estão ordenadas de forma correta.\n\n---\n\n## Desafio 6\n\nTendo como base o valor dos planos e o plano que cada pessoa usuária cadastrada possui no banco, queremos algumas informações sobre o faturamento da empresa. Crie uma `VIEW` chamada `faturamento_atual` que deve exibir quatro dados:\n\n1. A primeira coluna deve ter o alias \"**faturamento_minimo**\" e exibir o menor valor de plano existente para uma pessoa usuária.\n\n2. A segunda coluna deve ter o alias \"**faturamento_maximo**\" e exibir o maior valor de plano existente para uma pessoa usuária.\n\n3. A terceira coluna deve ter o alias \"**faturamento_medio**\" e exibir o valor médio dos planos possuídos por pessoas usuárias até o momento.\n\n4. Por fim, a quarta coluna deve ter o alias \"**faturamento_total**\" e exibir o valor total obtido com os planos possuídos por pessuas usuárias.\n\nPara cada um desses dados, por se tratarem de valores monetários, deve-se arredondar o faturamento usando apenas duas casas decimais.\n\nSua `VIEW` deve retornar a seguinte informação, ao ser consultada:\n\n![Faturamento atual](./images/faturamento_atual.png)\n\nO que será verificado:\n\n- Será validado se existe uma `VIEW` chamada `faturamento_atual`, que exibe os dados corretos nas colunas **faturamento_minimo**, **faturamento_maximo**, **faturamento_medio** e **faturamento_total**.\n\n---\n\n## Desafio 7\n\nMostre uma relação de todos os álbuns produzidos por cada pessoa artista, com a quantidade de seguidores que ela possui, de acordo com os detalhes a seguir. Para tal, crie uma `VIEW` chamada `perfil_artistas`, com as seguintes colunas:\n\n1. A primeira coluna deve exibir o nome da pessoa artista, com o alias \"**artista**\".\n\n2. A segunda coluna deve exibir o nome do álbum, com o alias \"**album**\".\n\n3. A terceira coluna deve exibir a quantidade de pessoas seguidoras que aquela pessoa artista possui e deve possuir o alias \"**seguidores**\".\n\nSeus resultados devem estar ordenados de forma decrescente, baseando-se no número de pessoas seguidoras. Em caso de empate no número de pessoas, ordene os resultados pelo nome da pessoa artista em ordem alfabética e caso há artistas com o mesmo nome, ordene os resultados pelo nome do álbum alfabeticamente.\n\nSua `VIEW` deve retornar a seguinte informação, ao ser consultada:\n\n![PerfilArtistas](./images/perfil_artistas.png)\n\nO que será verificado:\n\n- Será validado se existe uma `VIEW` chamada `perfil_artistas`, que exibe os dados corretos nas colunas **artista**, **album** e **seguidores**.\n\n- Será validado se as colunas estão ordenadas de forma correta.\n\n---\n\n## Desafio 8\n\nCrie uma trigger chamada `trigger_usuario_delete` que deve ser disparada sempre que uma pessoa usuária for excluída do banco de dados, refletindo essa exclusão em todas as tabelas que ela estiver.\n\nTeste a funcionalidade correta de sua trigger, fazendo a exclusão da usuária `\"Thati\"`.\n\nO que será verificado:\n\n- Será validado se ao excluir uma pessoa usuária do banco de dados a `trigger_usuario_delete` é ativada e a ação de exclusão reflete em todas as tabelas em que esta pessoa está presente.\n\n---\n\n## Desafio 9\n\nCrie uma procedure chamada `albuns_do_artista` que recebe como parâmetro o nome de uma pessoa artista e em retorno deve exibir as seguintes colunas:\n\n1. O nome da pessoa artista, com o alias \"**artista**\".\n\n2. O nome do álbum, com o alias \"**album**\".\n\nOs resultados devem ser ordenados pelo nome do álbum em ordem alfabética.\n\nConfirme a execução correta da procedure, chamando-a e passando o nome igual a `\"Walter Phoenix\"`. Sua procedure deve retornar o mesmo que o resultado abaixo:\n\n`CALL albuns_do_artista('Walter Phoenix');`\n\n![Álbuns da pessoa artista](./images/AlbunsDoArtista.png)\n\nO que será verificado:\n\n- Será validado se a procedure `albuns_do_artista` retorna a coluna **artista** contendo o nome da pessoa artista e a coluna **album** contendo o nome do album.\n\n- Será validado se as colunas estão ordenadas de forma correta.\n\n---\n\n## Desafio 10\n\nCrie uma function chamada de `quantidade_musicas_no_historico` que exibe a quantidade de músicas que estão presentes atualmente no histórico de reprodução de uma pessoa usuária. Ao receber o código identificador da pessoa, exiba a quantidade de canções em seu histórico de reprodução.\n\nConfirme a execução correta da function, chamando-a e passando o id para a pessoa usuária com o nome igual a `\"Bill\"`. Sua function deve retornar o mesmo que o resultado abaixo:\n\n![Quantidade de músicas no histórico](./images/quantidade_musicas_no_historico.png)\n\n\nO que será verificado:\n\n- Será validado se a function `quantidade_musicas_no_historico`, ao receber o código identificador de uma pessoa usuária, retorna a quantidade correta de canções presentes no histórico de reprodução desta pessoa.\n\n---\n\n## Desafio 11\n\nCrie uma `VIEW` chamada `cancoes_premium` que exiba o nome e a quantidade de vezes que cada canção foi tocada por pessoas usuárias do plano familiar ou universitário, de acordo com os detalhes a seguir:\n\n* A primeira coluna deve exibir o nome da canção, com o alias \"**nome**\";\n\n* A segunda coluna deve exibir a quantidade de pessoas que já escutaram aquela canção, com o alias \"**reproducoes**\";\n\n* Seus resultados devem estar agrupados pelo nome da canção e ordenados em ordem alfabética.\n\nSua `VIEW` deve retornar a seguinte informação, ao ser consultada:\n\n![Canções premium](./images/cancoes_premium.png)\n\nO que será verificado:\n\n- Será validado se existe uma `VIEW` chamada `cancoes_premium`, que exibe os dados corretos nas colunas **nome** e **reproducoes**.\n\n- Será validado se as colunas estão ordenadas de forma correta.\n\n---\n\n## Depois de terminar o desenvolvimento\n\nPara **\"entregar\"** seu projeto, siga os passos a seguir:\n\n* Vá até a página **DO SEU** _Pull Request_, adicione a label de _\"code-review\"_ e marque seus colegas\n  * No menu à direita, clique no _link_ **\"Labels\"** e escolha a _label_ **code-review**\n  * No menu à direita, clique no _link_ **\"Assignees\"** e escolha **o seu usuário**\n  * No menu à direita, clique no _link_ **\"Reviewers\"** e digite `students`, selecione o time `tryber/students-sd-00`\n\nSe ainda houver alguma dúvida sobre como entregar seu projeto, [aqui tem um video explicativo](https://vimeo.com/362189205).\n\n---\n\n### Revisando um pull request\n\nÀ medida que você e as outras pessoas que estudam na Trybe forem entregando os projetos, vocês receberão um alerta via Slack para também fazer a revisão dos Pull Requests dos seus colegas. Fiquem atentos às mensagens do \"Pull Reminders\" no Slack!\n\nUse o material que você já viu sobre [Code Review](https://course.betrybe.com/real-life-engineer/code-review/) para te ajudar a revisar os projetos que chegaram para você.\n\n---\n\n# Avisos Finais\n\n\nAo finalizar e submeter o projeto, não se esqueça de avaliar sua experiência preenchendo o formulário. Leva menos de 3 minutos!\n\nLink: [FORMULÁRIO DE AVALIAÇÃO DE PROJETO](https://bit.ly/39qMu3s)\n\nO avaliador automático não necessariamente avalia seu projeto na ordem em que os requisitos aparecem no readme. Isso acontece para deixar o processo de avaliação mais rápido. Então, nãose assuste se isso acontecer, ok?\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flmuffato%2Fproject-mysql-one-for-all-trybe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flmuffato%2Fproject-mysql-one-for-all-trybe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flmuffato%2Fproject-mysql-one-for-all-trybe/lists"}