{"id":19673572,"url":"https://github.com/nicktheodoro/introducao-postgres","last_synced_at":"2025-05-05T21:35:57.395Z","repository":{"id":189004152,"uuid":"679838385","full_name":"nicktheodoro/introducao-postgres","owner":"nicktheodoro","description":"Repositório destinado a documentar e exemplificar conceitos sobre banco de dados","archived":false,"fork":false,"pushed_at":"2023-08-23T22:56:38.000Z","size":9,"stargazers_count":14,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-30T23:51:12.810Z","etag":null,"topics":["introduction","postgres","postgresql","sql","types"],"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/nicktheodoro.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":"2023-08-17T18:25:53.000Z","updated_at":"2024-03-24T11:07:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"c54d4450-455d-41f7-8269-2260296e1c84","html_url":"https://github.com/nicktheodoro/introducao-postgres","commit_stats":null,"previous_names":["nicktheodoro/banco-de-dados","nicktheodoro/introducao-postgres"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicktheodoro%2Fintroducao-postgres","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicktheodoro%2Fintroducao-postgres/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicktheodoro%2Fintroducao-postgres/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicktheodoro%2Fintroducao-postgres/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nicktheodoro","download_url":"https://codeload.github.com/nicktheodoro/introducao-postgres/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252580700,"owners_count":21771379,"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","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":["introduction","postgres","postgresql","sql","types"],"created_at":"2024-11-11T17:15:39.810Z","updated_at":"2025-05-05T21:35:57.386Z","avatar_url":"https://github.com/nicktheodoro.png","language":null,"readme":"# Banco de dados\nRepositório destinado a documentar e exemplificar conceitos sobre banco de dados.\n\n## Tipos de Dados no PostgreSQL\n\nAqui estão diversos tipos de dados oferecidos pelo PostgreSQL:\n\n| Tipo          | Descrição                                                 |\n|---------------|-----------------------------------------------------------|\n| INTEGER       | Armazena números inteiros de precisão padrão. Adequado para a maioria dos casos de uso que envolvem valores inteiros. |\n| BIGINT        | Armazena inteiros maiores, com uma faixa de valores muito maior do que o INTEGER. Útil quando se precisa de números inteiros muito grandes. |\n| SMALLINT      | Armazena inteiros menores, ocupando menos espaço de armazenamento. Ideal quando a faixa de valores é pequena e o espaço é uma consideração importante. |\n| NUMERIC/DECIMAL | Armazena números decimais de precisão arbitrária. É a escolha certa para valores que exigem exatidão decimal, como cálculos financeiros. |\n| REAL          | Armazena números de ponto flutuante de precisão simples. Útil para aplicações onde a precisão é importante, mas a complexidade do DOUBLE PRECISION não é necessária. |\n| DOUBLE PRECISION | Armazena números de ponto flutuante de precisão dupla. Apropriado para cálculos científicos e engenharia que exigem alta precisão. |\n| SERIAL        | Um tipo de dados que automaticamente gera valores inteiros únicos crescentes, frequentemente usado para chaves primárias. |\n| BIGSERIAL     | Similar ao SERIAL, mas armazena números inteiros maiores em um intervalo maior. Útil quando são necessários valores inteiros muito grandes. |\n| CHAR(n)       | Armazena strings de tamanho fixo. Útil quando o tamanho das strings é previsível e constante. |\n| VARCHAR(n)    | Armazena strings de tamanho variável. Adequado para strings com comprimento variável. |\n| TEXT          | Armazena strings de tamanho variável mais longas. Usado quando se precisa de uma grande capacidade para armazenamento de texto. |\n| DATE          | Armazena datas. Útil para registrar informações de data específicas. |\n| TIME          | Armazena horários. Ideal para registros de tempo precisos. |\n| TIMESTAMP     | Armazena data e hora. Combinação de DATE e TIME para registro completo. |\n| INTERVAL      | Armazena intervalos de tempo. Útil para medições de tempo decorrido. |\n| BOOLEAN       | Armazena valores verdadeiro ou falso. Usado para representar estados lógicos. |\n| BYTEA         | Armazena dados binários, como imagens ou arquivos. |\n| UUID          | Armazena identificadores únicos universais. |\n| JSON          | Armazena dados JSON (formato de texto). Adequado para armazenar informações semi-estruturadas. |\n| JSONB         | Armazena dados JSON binários (otimizados para busca). Oferece busca rápida em dados JSON. |\n| INET          | Armazena endereços IP. Útil para armazenar informações de rede. |\n| CIDR          | Armazena notação CIDR para redes. |\n| POINT, LINE, LSEG, BOX | Armazenam dados geométricos. Úteis para aplicações que envolvem geolocalização e cálculos espaciais. |\n\n## Tipos de Restrições no PostgreSQL\n\nAqui estão os tipos de restrições que podem ser aplicados em tabelas no PostgreSQL:\n\n| Tipo de Restrição | Descrição                                                 |\n|-------------------|-----------------------------------------------------------|\n| PRIMARY KEY       | Garante que a coluna ou conjunto de colunas seja única e não nula, servindo como identificador único para cada registro na tabela. |\n| FOREIGN KEY       | Cria uma relação entre a coluna ou conjunto de colunas em uma tabela (chave estrangeira) e a chave primária em outra tabela (chave primária correspondente). Mantém a integridade referencial entre tabelas. |\n| UNIQUE            | Garante que os valores na coluna ou conjunto de colunas sejam únicos em toda a tabela. |\n| NOT NULL          | Garante que a coluna não possa conter valores nulos, ou seja, deve sempre conter algum valor válido. |\n| CHECK             | Define uma condição que os valores em uma coluna devem satisfazer. Usado para aplicar validações específicas aos dados. |\n| EXCLUSION         | Restrição de exclusão mútua para tabelas particionadas, evitando conflitos entre os valores de várias tabelas. |\n\n## Linguagens de Banco de Dados: DQL, DDL e DML\n\nLinguagens fundamentais para interagir com bancos de dados: DQL (Data Query Language), DDL (Data Definition Language) e DML (Data Manipulation Language). Compreender essas linguagens é essencial para uma gestão eficaz de dados em sistemas de informação.\n\n### DQL - Data Query Language\n\nA DQL é usada para recuperar informações específicas armazenadas em um banco de dados. É usada principalmente para consultas complexas e seleção de dados com base em critérios específicos.\n\nExemplo: Selecionar os nomes dos clientes que fizeram compras nos últimos 30 dias.\n\n```sql\nSELECT nome\nFROM Clientes\nWHERE data_compra \u003e= DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY);\n```\n\n### DDL - Data Definition Language\n\nA DDL é usada para criar, modificar e excluir objetos no banco de dados. Ela define a estrutura e a organização dos dados.\n\nExemplo: Criar uma tabela \"Produtos\" com colunas para ID do produto, nome e preço.\n\n```sql\nCREATE TABLE Produtos (\n    id INT PRIMARY KEY,\n    nome VARCHAR(50),\n    preco DECIMAL(10, 2)\n);\n```\n\n### DML - Data Manipulation Language\n\nA DML é usada para manipular os dados armazenados no banco de dados. Ela permite inserir, atualizar e excluir registros.\n\nExemplo 1: Inserir um novo produto na tabela \"Produtos\".\n\n```sql\nINSERT INTO Produtos (id, nome, preco)\nVALUES (1, 'Camiseta', 19.99);\n```\n\nExemplo 2: Atualizar o preço de um produto específico.\n\n```sql\nUPDATE Produtos\nSET preco = 24.99\nWHERE id = 1;\n```\n\nExemplo 3: Excluir um produto da tabela \"Produtos\".\n\n```sql\nDELETE FROM Produtos\nWHERE id = 1;\n```\n\n## Índices em Banco de Dados: Conceito, Utilidade, Vantagens e Desvantagens\n\n### O que é um Índice em Banco de Dados?\nUm índice em um banco de dados é uma estrutura que melhora a eficiência das consultas realizadas sobre as tabelas. Ele funciona como um mecanismo de busca que permite ao banco de dados localizar rapidamente as linhas de dados correspondentes a determinados valores de colunas. Isso é especialmente útil em tabelas grandes, onde as consultas podem ser muito lentas se não houver índices.\n\n### Para que serve um Índice?\nOs índices servem para acelerar a recuperação de dados de uma tabela. Em vez de percorrer cada linha da tabela para encontrar os dados que correspondem a uma consulta, o banco de dados pode usar o índice para localizar rapidamente as linhas relevantes. Isso resulta em consultas mais rápidas e menor carga no sistema.\n\n### Vantagens dos Índices:\n1. *Melhoria no Desempenho:* As consultas que envolvem colunas indexadas são mais rápidas, já que o banco de dados pode pular diretamente para as linhas relevantes em vez de percorrer toda a tabela.\n2. *Melhor Utilização de Recursos:* Com consultas mais eficientes, o banco de dados consome menos recursos, como CPU e memória.\n3. *Suporte a Restrições Únicas:* Índices únicos podem ser usados para garantir que os valores em uma coluna sejam exclusivos, evitando duplicatas.\n4. *Ordenação:* Índices podem ser usados para acelerar a ordenação dos resultados de uma consulta.\n5. *Join mais Eficiente:* Em operações de junção, índices nas colunas de junção podem melhorar significativamente o desempenho.\n\n### Desvantagens dos Índices:\n1. *Consumo de Espaço:* Índices ocupam espaço adicional no disco, o que pode ser significativo em tabelas muito grandes.\n2. *Custo de Manutenção:* À medida que os dados são inseridos, atualizados ou excluídos, os índices precisam ser atualizados para refletir essas mudanças, o que pode aumentar o tempo de escrita.\n3. *Desempenho de Inserção/Atualização:* A inserção e atualização de dados podem ser mais lentas devido à necessidade de atualizar os índices.\n4. *Índices Inadequados:* Criar índices desnecessários ou inapropriados pode levar a um pior desempenho em vez de melhorá-lo.\n\n### Exemplo usando PostgreSQL:\nSuponha que temos uma tabela chamada \"produtos\" com as colunas \"id\", \"nome\", \"preço\" e \"categoria\". Para melhorar a consulta de produtos por nome, criaríamos um índice na coluna \"nome\":\n\n```Sql\nCREATE INDEX idx_nome ON produtos (nome);\n```\n\nIsso permitirá que consultas como a seguinte sejam executadas de maneira mais eficiente:\n\n```Sql\nSELECT * FROM produtos WHERE nome = 'Camiseta';\n```\n\nLembre-se de que a criação de índices deve ser cuidadosamente planejada, considerando as consultas mais frequentes e o equilíbrio entre o desempenho de leitura e escrita. Índices excessivos podem prejudicar o desempenho geral do banco de dados.\n\n\n## **Views no PostgreSQL**  \n\n### **O que é uma View?**  \nUma *view* no PostgreSQL é uma tabela virtual baseada em uma consulta SQL. Ela não armazena os dados fisicamente, mas exibe os resultados da consulta sempre que é acessada. Funciona como uma forma de simplificar consultas complexas, abstraindo a lógica dos dados e melhorando a organização da informação.  \n\n### **Para que serve?**  \n- Facilita o acesso a dados complexos, permitindo que usuários utilizem consultas pré-definidas.  \n- Melhora a segurança ao restringir o acesso a certas colunas ou linhas.  \n- Promove a reutilização de consultas sem necessidade de repetir código.  \n- Auxilia na manutenção e na organização de sistemas com regras de negócios complexas.  \n\n### **Vantagens das Views**  \n:white_check_mark: **Simplicidade**: Reduz a complexidade de consultas SQL repetitivas.  \n:white_check_mark: **Segurança**: Pode ocultar informações sensíveis restringindo o acesso a certos dados.  \n:white_check_mark: **Modularidade**: Permite mudanças na estrutura do banco sem impactar diretamente os usuários.  \n:white_check_mark: **Facilidade de manutenção**: Centraliza a lógica de consultas, tornando mais fácil modificar e corrigir regras de negócios.  \n\n### **Desvantagens das Views**  \n:x: **Desempenho**: Como não armazenam dados, consultas complexas podem ser mais lentas, pois são executadas toda vez que a *view* é chamada.  \n:x: **Restrições de Atualização**: Algumas *views* não podem ser modificadas diretamente, especialmente se envolverem agregações ou *joins*.  \n:x: **Dependência de Estrutura**: Alterações nas tabelas subjacentes podem invalidar a *view*, exigindo manutenção adicional.  \n\n### **Exemplo Prático**  \nSuponha que temos uma tabela de pedidos e queremos criar uma *view* para mostrar apenas os pedidos entregues:  \n\n```sql\nCREATE VIEW pedidos_entregues AS\nSELECT id_pedido, cliente_id, data_pedido, valor_total\nFROM pedidos\nWHERE status = 'Entregue';\n```\n\nAgora, para acessar os pedidos entregues, basta utilizar:  \n\n```sql\nSELECT * FROM pedidos_entregues;\n```\n\nIsso simplifica o acesso aos dados sem precisar repetir a condição `WHERE status = 'Entregue'` em várias consultas.  \n\nCaso queira excluir essa *view*, basta rodar:  \n\n```sql\nDROP VIEW pedidos_entregues;\n```  \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnicktheodoro%2Fintroducao-postgres","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnicktheodoro%2Fintroducao-postgres","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnicktheodoro%2Fintroducao-postgres/lists"}