{"id":18624855,"url":"https://github.com/gabrieldarezzo/inwork-sql","last_synced_at":"2026-03-07T13:32:36.250Z","repository":{"id":106273032,"uuid":"85850871","full_name":"gabrieldarezzo/inwork-sql","owner":"gabrieldarezzo","description":"Ex de Banco de dados, Altos :key: FK","archived":false,"fork":false,"pushed_at":"2021-05-14T02:23:12.000Z","size":21,"stargazers_count":15,"open_issues_count":0,"forks_count":7,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-10-08T21:25:42.498Z","etag":null,"topics":["example","how-use-sql","inner-join","sql","tutorial"],"latest_commit_sha":null,"homepage":"","language":null,"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/gabrieldarezzo.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":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-22T16:25:05.000Z","updated_at":"2023-07-03T01:38:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"14c9184c-e816-4264-99d4-793a02f7204f","html_url":"https://github.com/gabrieldarezzo/inwork-sql","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gabrieldarezzo/inwork-sql","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrieldarezzo%2Finwork-sql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrieldarezzo%2Finwork-sql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrieldarezzo%2Finwork-sql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrieldarezzo%2Finwork-sql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gabrieldarezzo","download_url":"https://codeload.github.com/gabrieldarezzo/inwork-sql/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrieldarezzo%2Finwork-sql/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30215677,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T13:25:55.541Z","status":"ssl_error","status_checked_at":"2026-03-07T13:25:38.596Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["example","how-use-sql","inner-join","sql","tutorial"],"created_at":"2024-11-07T04:31:29.162Z","updated_at":"2026-03-07T13:32:36.224Z","avatar_url":"https://github.com/gabrieldarezzo.png","language":null,"readme":"# Exercícios em Banco de Dados\n\n\n\n## Previa leitura antes de tudo:\n:mag_right: -\u003e [Wiki Banco de dados relacional](https://pt.wikipedia.org/wiki/Banco_de_dados_relacional)\n\n\n\n## Começando....\n\n\n\n:memo:Dos [diversos](https://pt.wikipedia.org/wiki/Lista_de_bancos_de_dados) banco de dados relacionais que existem.  \nVamos utilizar Mysql como Server/Client, pois bem [popular](http://db-engines.com/en/ranking_trend/system/Microsoft+SQL+Server%3BMySQL%3BOracle)\n\nDurante os exemplos utilizei como server de MySql o [WampServer](http://www.wampserver.com/en/) devido a sua facil instalação (Next/Next/Finish), e como client utilizei o [MySQL Workbench](https://dev.mysql.com/downloads/workbench/)\n\n\nCaso você esteja com **zero** vontade de baixar toda essa caralhada de coisas e configurar.   \nVocê pode simplesmente usar um site como esse:  \nhttp://sqlfiddle.com/\n\n\n## Explicação de como criar um Banco, Tabela\n\nMysql   \nManeira simplista...  \n-\u003e O Banco armazena tabelas   \n-\u003e Tabelas armazena Registros.   \n\nEntão pela lógica, armazenar registros (nome, email, telefone, data de nascimento, etc precisamos de um banco...)\n\no SQL-Statment é:  \n```sql\nCREATE DATABASE nome_do_banco\n```\n\nVamos criar o banco 'exemplo'... com o nome de `exemplo` (Inception Feelings)\n```sql\nCREATE DATABASE exemplo;\n```\n\nE criar uma tabela chamada `produto` que contem um número indentificador incremental (id) e nome do produto (nome_produto).\n```sql\nUSE exemplo;\nCREATE TABLE produto(\n\t id             INT(8) PRIMARY KEY AUTO_INCREMENT\n\t,nome_produto   VARCHAR(50) NOT NULL\n);\n```\n\nOUWWWWW! É coisa pra caramba nova aqui hehe.\n\nBasicamente informamos que a tabela produto tem dois campos **(id, nome_produto)**  \nE cada um desses campos possui um data_type/tipo primitivo (INT/DOUBLE/CHAR/VARCHAR).   \n \nNo caso o tipo/data_type da coluna **id** é um INT (inteiro)  \u003cdel\u003eInteligencia +8 tipo RPG :( \u003c/del\u003e  \n  - -\u003eUma CONSTRAINT de **PRIMARY KEY** :key:.    \n  - -\u003ePRIMARY KEY significa que é uma chave única (impossivel de ter 2x o mesmo número) e automaticamente obrigatório (NOT NULL).    \n\nLeia mais:   \nhttps://pt.wikipedia.org/wiki/Chave_prim%C3%A1ria  \n\n\nNOT NULL é exatamente a tradução fala.... :exclamation:NÃO PODE SER NULO AQUI NÃO TIOZÃO:exclamation:   \n\nJá no caso do **nome_produto** temos VARCHAR(50), que recebe um texto até 50 caracteres (caso exceda, ele ignora o restante)\n\n\nEntenda mais sobre INT,VARCHAR, CHAR, TEXT, DATE, DATETIME  \nhttp://www.rcoli.com.br/2012/08/tipos-de-campos-no-mysql-saiba-como-escolher-o-tipo-correto/  \n\n\nMais informação a respeito do CREATE aqui:  \nhttps://dev.mysql.com/doc/refman/5.7/en/create-table.html  \n\n\n ------\n## Exemplo de Cursos x Pré-requisito.  \n### Um curso pode ter vários cursos como pré-requisito.  \n\nVeja o exemplo abaixo:\n\nPra fazer `Cálculo 1` precisa de conhecimentos em `Matemática`   \nPra fazer `Cálculo 2` precisa de conhecimentos em `Matemática` e `Cálculo 1`  \n\n\n------------------------------------------\nPensando em um modelo de dados, só ai precisamos de:\n- Uma tabela cursos para armazenar um ID + Nome (`Matemática`, `Cálculo 1`, `Cálculo 2`)\n- Uma tabela auxiliar para armazenar as dependências de cada curso. (`Cálculo 1` precisa de conhecimentos em `Matemática`)\n\n \nBora criar uma base e as tabelas, afinal... Talk is cheap, show me the code....\n```sql\nCREATE DATABASE minhabase;\nUSE minhabase;\n\nCREATE TABLE cursos (\n     cur_id     INT(8) PRIMARY KEY AUTO_INCREMENT \n    ,cur_nome   VARCHAR(50) NOT NULL\n);\n\n\nINSERT cursos (cur_nome) VALUES ('Matemática Básica');\nINSERT cursos (cur_nome) VALUES ('Cálculo 1');\nINSERT cursos (cur_nome) VALUES ('Cálculo 2');\n\nCREATE TABLE curso_req (\n     cur_id INT(8) NOT NULL\n    ,cur_id_req INT(8) NOT NULL\n    ,CONSTRAINT `fk_curso_req` FOREIGN KEY (`cur_id`) REFERENCES `cursos` (`cur_id`)\n    ,CONSTRAINT `fk_cursos_0` FOREIGN KEY (`cur_id_req`) REFERENCES `cursos` (`cur_id`)\n);\n\n```   \n\nShow, agora vamos popular alguns dados pra testar:\n\n```sql   \nINSERT curso_req (cur_id, cur_id_req) VALUES (2, 1); /* Pra fazer Cálculo 1 precisa de Matemática Básica */\nINSERT curso_req (cur_id, cur_id_req) VALUES (3, 1); /* Pra fazer Cálculo 2 precisa de Matemática Básica */\nINSERT curso_req (cur_id, cur_id_req) VALUES (3, 2); /* Pra fazer Cálculo 2 precisa de Cálculo 1 */\n\n```     \nAgora vamos testar...    \n```sql   \nSELECT * FROM cursos_req WHERE cursos_req.cur_id = 3;\n/*\ncur_id  cur_id_req  \n------  ------------\n     3             1\n     3             2\n*/\n```   \nLEGAL!!!   \nFuncionou certinho, Calculo 2: precisa de ( Mat + Calculo 1)  \nMas seria massa se desse pra colocar o nome de cada curso certo?.\n\n  \n#### JOINS\nNesse caso é só usar um `JOIN`.... Ex:   \n```sql   \nSELECT \n    cursos.cur_nome As Curso_Desejado,\n    curso_pre.cur_nome AS Pre_requisito\nFROM curso_req\nINNER JOIN cursos AS curso_pre ON (\n    curso_req.cur_id_req = curso_pre.cur_id\n)\nINNER JOIN cursos ON (  \n    curso_req.cur_id = cursos.cur_id   \n);\n/*\nCurso_Desejado    Pre_requisito        \n----------  ---------------------\nCálculo 1   Matemática Básica  \nCálculo 2   Matemática Básica  \nCálculo 2   Cálculo 1           \n*/\n```   \n\nDessa forma com apenas 1 Query, retornamos todos os cursos refernciando as F.K. (foreign key) com as P.K. (priamary key),\nNo caso ```curso_req.cur_id_req = curso_pre.cur_id```\n\n## O problema do N+1\nVamos utilizar um exemplo de código em `\u003c?php` para exemplificar o erro de N+1:\n```php\n\u003c?php\n\n// Retorna informação de um curso.\nfunction getClassFromId(int $id): array {\n    $stmt = $db-\u003eprepare(\"SELECT cur_id, cur_nome from cursos where cur_id = ?\");\n    $stmt-\u003eexecute($id);\n    return $stmt-\u003efetch(PDO::FETCH_OBJ);\n}\n\n// Retorna todos os cursos obrigatorios\nfunction getAllRequiredClassFromClassId(int $curId): array {\n    $stmt = $db-\u003eprepare(\"SELECT cur_id, cur_id_req from curso_req where cur_id = ?\");\n\t$stmt-\u003eexecute($curId);\n\treturn $stmt-\u003efetchAll(PDO::FETCH_OBJ);\n}\n\n// Vamos retornar todos os cursos obrigatorios para Cálculo 2 (Vai retornar: Matemática + Cálculo 1s).\n$getAllRequiredClass = getAllRequiredClassFromClassId(3);\nforeach($getAllRequiredClass as $requiredClass) {\n    print getClassFromId($requiredClass-\u003ecur_id)-\u003ecur_nome . \"\\n\";\n}\n```\n\nLegal, o trecho acima vai imprimir:\n```\nMatemática\nCálculo 1\n```\n\nPorem no total fizemos 3 Querys, sendo:  \n- 1 - Para pegar todos requisitos dos cursos `SELECT cur_id, cur_id_req from curso_req where cur_id = 3`,\n- 2x Pois durante o laço de repetição `foreach` batemos 2x vezes no banco:  \n```sql\nSELECT cur_id, cur_id_req from curso_req where cur_id = 1\nSELECT cur_id, cur_id_req from curso_req where cur_id = 2\n```\n\nPara evitar isso, poderiamos ter simplesmente feito apenas 1 query, que retorna todos os requisitos e informações dos cursos.\nPodemos deixar a aplicação muito mais performatica e evitando um stress para o banco desnecessario e/ou diminuir brutalmente o tempo de processamento.\n\nImagine uma rotina onde temos `200 mil registros`, e cada `loop` vai bater novamente no banco (N+1)\n\nPara mais informações a respeito do problema do `N+1`:\nhttps://pt.stackoverflow.com/questions/307264/o-que-%C3%A9-o-problema-das-queries-n1\n\n\n\n\n\n\n \nComo está bem estruturadinho, da pra fazer algumas brincadeiras, ex:   \n\n```sql   \nSELECT \n    cursos.cur_nome\n    ,COUNT(cursos_req.cur_id) AS qnt_materias_pre    \nFROM cursos\nLEFT JOIN cursos_req ON (  \n    cursos_req.cur_id = cursos.cur_id   \n)\nGROUP BY cursos.cur_id\n;\n\n/*\ncur_nome             qnt_materias_pre  \n-------------------  ------------------\nMatemática Básica                     0\nCálculo 1                             1\nCálculo 2                             2\n\n*/\n```   \n\n(Pra entender melhor o funcionamento do `INNER` join, troca ali pra (RIGHT|LEFT)  \n  \nCaso não conheça alguma das clausulas SQL no exemplo estude elas individualmente.\n\n\n\nExercicios extras:\n## Just.... DO IT:\n- (1) Crie um banco de dados com o nome de **no_trabalho**\n- (2) Crie uma tabela com o nome **pessoa** que possa registrar um **nome**, **e-mail**, e que cada registro possua um número de identificação único\n- (3) Crie uma tabela com o nome **modelo_celular** que possa registrar um **nome**, **modelo**, **descrição**, **Data de Fabricação**\n- (4) Adicione na tabela `pessoa` os campos: cep, endereco, nr, complemento, lat, lng\n- (5) Adicione o CEP: '05373-020' na tabela, e verifique se o zero está a esquerda :hehe: \n\n\n\nBons estudos.  \n \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrieldarezzo%2Finwork-sql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgabrieldarezzo%2Finwork-sql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrieldarezzo%2Finwork-sql/lists"}