{"id":18357745,"url":"https://github.com/andreadcsousa/alura_postgresql-dml-ddl_sql","last_synced_at":"2025-04-10T02:32:57.708Z","repository":{"id":168043341,"uuid":"615033709","full_name":"andreadcsousa/alura_postgresql-dml-ddl_sql","owner":"andreadcsousa","description":"Este projeto faz parte do plano de estudos elaborado pela Alura para o programa de formação Desenvolve (3ª edição), trilha de dados, em parceria com a Boticário.","archived":false,"fork":false,"pushed_at":"2023-03-16T20:18:36.000Z","size":466,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-15T17:52:08.218Z","etag":null,"topics":["alura","aprendendo","boticario","dados","ddl","desenvolve-2023","desenvolve-3-edicao","dml","postgresql","sql"],"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/andreadcsousa.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-03-16T20:18:30.000Z","updated_at":"2023-03-16T23:16:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"fb68f975-d822-45ad-a24c-1c830ef5366a","html_url":"https://github.com/andreadcsousa/alura_postgresql-dml-ddl_sql","commit_stats":null,"previous_names":["andreadcsousa/alura_postgresql-dml-ddl_sql"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreadcsousa%2Falura_postgresql-dml-ddl_sql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreadcsousa%2Falura_postgresql-dml-ddl_sql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreadcsousa%2Falura_postgresql-dml-ddl_sql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreadcsousa%2Falura_postgresql-dml-ddl_sql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andreadcsousa","download_url":"https://codeload.github.com/andreadcsousa/alura_postgresql-dml-ddl_sql/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248144299,"owners_count":21054904,"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":["alura","aprendendo","boticario","dados","ddl","desenvolve-2023","desenvolve-3-edicao","dml","postgresql","sql"],"created_at":"2024-11-05T22:15:19.675Z","updated_at":"2025-04-10T02:32:57.700Z","avatar_url":"https://github.com/andreadcsousa.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# PostgreSQL: comandos DML e DDL\n\nAprendendo mais sobre a modelagem de um banco relacional; diferença entre DDL e DML; entendendo o que é o schema no banco; usando importação para popular o banco; trabalhando com transações com Commit e Rollback;\nutilizando sequências e tipos personalizados do banco.\n\n1. [Modelagem de Dados](#1-modelagem-de-dados)\n2. [Estrutura do banco](#2-estrutura-do-banco)\n3. [Inclusão de Dados](#3-inclusão-de-dados)\n4. [Alteração de Dados](#4-alteração-de-dados)\n5. [Particularidades PostgreSQL](#5-particularidades-postgresql)\n\nSaiba mais sobre o curso [aqui](https://cursos.alura.com.br/course/pgsql-comandos-dml-ddl) ou acompanhe minhas anotações abaixo. ⬇️\n\n## 1. Modelagem de Dados\n\n### **Schemas**\n\nO `SCHEMA` no banco de dados funciona como o setor de uma empresa. Pode-se dividir os setores em financeiro, acadêmico, operacional e, também, pode-se fazer o mesmo com os esquemas.\n\n![Dividindo setores com esquemas](Imagens/schemas.jpg)\n\nA sintaxe para criar um esquema é a seguinte:\n\n```sql\nCREATE SCHEMA academico;\n```\n\n***Qual o propósito dos schemas no PostgreSQL?***\n\n    Organizar (e separar) de forma lógica nossas tabelas\n\n\u003e Uma analogia ao mundo da programação seriam os módulos, pacotes ou namespaces. Uma analogia ao mundo dos Sistemas Operacionais seriam as pastas. Schemas servem para organizar e separar nossas tabelas.\n\n### **Análise de requisitos**\n\nA análise de requisitos precede a criação do banco de dados, pois é nela que se faz a modelagem de dados. Existem ferramentas para auxiliar nessa tarefa e elas são chamadas de CASE. Saiba mais sobre o que essas ferramentas fazem [aqui](Para%20saber%20mais/Aula%201%20-%20Atividade%207%20Para%20saber%20mais_%20CASE.pdf).\n\n## 2. Estrutura do banco\n\n### **Criando um banco**\n\nO ponto de partida para a criação do banco é a criação do banco propriamente dito. Nele serão criados os esquemas, as tabelas e os registros serão inseridos.\n\n    DATABASE \u003e SCHEMA \u003e TABLE \u003e COLUMN\n\nA sintaxe básica para criar um banco de dados é a seguinte:\n\n```sql\nCREATE DATABASE alura;\n```\n\n### **Definições em tabelas**\n\nAs definições são características (restrições ou constraints) que se adiciona na criação das tabelas para que os campos recebam configurações de uso. A exemplo da chave primária que habilita um campo a ser relacionado com outra tabela ou o not null que impede a inclusão e dados nulos, ou seja, todos os dados devem ser inseridos.\n\n***Algumas definições:***\n\n- `IF NOT EXISTS` utilizada na criação da tabela para checar se já ela existe\n- `DEFAULT` cria um valor padrão para determinado campo\n- `CHECK` verifica se um campo é equivalente ao que se pede ou não\n- `UNIQUE` especifica que os registros não podem ser repetidos nos campos\n\n```sql\nCREATE TEMPORARY TABLE a (\n\tcoluna1 VARCHAR(255) NOT NULL CHECK(coluna1 \u003c\u003e ''),\n\tcoluna2 VARCHAR(255) NOT NULL,\n\tUNIQUE (coluna1, coluna2)\n);\n\n-- retorna erro, pois a tabela impede inserção de valores nulos\nINSERT INTO a VALUES (NULL);\n\n-- retorna erro, pois verifica se o valores inseridos são diferentes de uma string vazia\nINSERT INTO a VALUES ('');\n\n-- insere valores únicos na tabela que não poderá ser repetidos\nINSERT INTO a VALUES ('a', 'b');\n-- retorna erro na inserção, pois os valores são iguais\nINSERT INTO a VALUES ('a', 'b');\n-- não retorna erro na inserção, pois um dos valores já não é igual ao da primeira inserção\nINSERT INTO a VALUES ('a', 'c');\n```\n\nPara saber mais sobre diferença entre definições de tabelas e colunas, acesse o [esse](Para%20saber%20mais/Aula%202%20-%20Atividade%204%20Para%20saber%20mais_%20Table%20vs%20Column%20Constraints.pdf) arquivo.\n\n### **Alterando informações**\n\nAlém de criar, é possível alterar informações das tabelas, colunas e registros de um banco. A linguagem SQL é dividida em tipos de acordo com a funcionalidade dos comandos.\n\n    DDL é a linguagem de definição de dados e utiliza os comandos CREATE, ALTER, DROP.\n    DML é a linguagem de manipulação de dados e utiliza os comandos INSERT, UPDATE, DELETE.\n\n![Diferença entre DDL e DML](Imagens/ddl-vs-dml.jpg)\n\n***Alterando o nome da tabela e das colunas:***\n\n```sql\nALTER TABLE a RENAME TO teste;\n\nSELECT * FROM teste;\n\nALTER TABLE teste RENAME coluna1 TO primeira_coluna;\nALTER TABLE teste RENAME coluna2 TO segunda_coluna;\n```\n\n***Outros subconjuntos da linguagem SQL:***\n\n![Subconjuntos da linguagem SQL](Imagens/SQL.png)\n\nAcesse [aqui](https://www.devmedia.com.br/guia/guia-completo-de-sql/38314) para conhecer outros subconjuntos da linguagem SQL e qual o propósito de cada um.\n\n## 3. Inclusão de Dados\n\nNo PostgreSQL, para incluir de registros nas tabelas, utiliza-se as simples. Para nomear ou renomear uma coluna da tabela, utiliza-se aspas duplas.\n\n    Aspas simples delimitam valores.\n    Aspas duplas definem nomes de colunas.\n\n```sql\nCREATE TABLE teste (\"Primeira Coluna\", segunda_coluna);\nINSERT INTO teste VALUES ('a', '1987-03-16');\nSELECT primeira_coluna AS \"Primeira Coluna\" FROM teste;\n```\n\nAssim como as strings, alguns valores numéricos também possuem regras. Valores decimais recebem ponto, não vírgula, pois estão no padrão americano e para não confundir com a vírgula da separação de valores.\n\n    Vírgula não delimita números decimais.\n    Vírgula separa os campos e registros desses campos.\n    Ponto delimita números decimais, seja flutuante ou real.\n\n```sql\nINSERT INTO teste VALUES (1.57, 63.5);  -- altura, peso\nINSERT INTO teste VALUES (8.6);         -- nota, média\nINSERT INTO teste VALUES (199,90);      -- preço\n```\n\n### **INSERT SELECT**\n\nUma consulta pode ser utilizada para inserir dados em uma tabela. Ao passo que os registros que se quer adicionar em uma tabela já existam, não é necessário inseri-los manualmente, pode apenas inserir a partir de uma consulta.\n\n```sql\nCREATE TEMPORARY TABLE cursos_programacao (\n\tid_curso INTEGER PRIMARY KEY,\n\tnome_curso VARCHAR(255) NOT NULL\n);\n\nINSERT INTO cursos_programacao\n\tSELECT academico.curso.id, academico.curso.nome\n\tFROM academico.curso\n\tWHERE categoria_id = 2;\n\nSELECT * FROM cursos_programacao;\n```\n\n## 4. Alteração de Dados\n\n### **UPDATE FROM**\n\nO comando `UPDATE FROM` atualiza uma tabela com dados de outra.\n\n```sql\nSELECT * FROM academico.curso;\n\n-- atualiza a tabela de cursos\nUPDATE academico.curso SET nome = 'PHP Básico' WHERE id = 4;\nUPDATE academico.curso SET nome = 'Java Básico' WHERE id = 5;\nUPDATE academico.curso SET nome = 'C++ Básico' WHERE id = 6;\n\nSELECT * FROM academico.curso ORDER BY 1;\n\nSELECT * FROM teste.cursos_programacao;\n\n-- atualiza a tabela de cursos de programação a partir dos registros da tabela de cursos\nUPDATE teste.cursos_programacao\nSET nome_curso = nome\nFROM academico.curso\nWHERE teste.cursos_programacao.id_curso = academico.curso.id;\n\nSELECT * FROM teste.cursos_programacao ORDER BY 1;\n```\n\n### **Cuidados**\n\nÉ preciso tomar muito cuidado com o comando `DELETE` para não excluir coisas importantes e/ou tudo de uma tabela. Com o comando `UPDATE` deve-se ter cuidado também para que não atualize o registro errado.\n\n***Para resolver isso existe um mantra muito popular no SQL:***\n\n    NUNCA FAÇA DELETE SEM WHERE\n    NUNCA FAÇA DELETE SEM WHERE\n    NUNCA FAÇA DELETE SEM WHERE\n\nÉ preciso dizer o que se quer excluir ou atualizar para que erros assim não aconteçam. Contudo, a etapa principal antes de realizar qualquer um desses comandos é usar o `SELECT` com o mesmo filtro para verificar antes se, de fato, está selecionando o registro certo.\n\n### **Transações**\n\n\u003e Transação é uma unidade lógica de processamento que tem por objetivo preservar a integridade e a consistência dos dados. Esse processamento pode ser executado todo ou não garantindo a atomicidade das informações.\n\n- `BEGIN` inicia a transação\n- `COMMIT` finaliza a transação de forma positiva\n- `ROLLBACK` finalizando a transação cancelando o comando\n- `END` finaliza a transação assim como o commit\n\n***Iniciando e parando uma transação:***\n\n```sql\nBEGIN\n-- os comandos select, update, delete vem aqui\nCOMMIT\nROLLBACK\nEND\n```\n\nPara conhecer um pouco mais sobre transações no PostgreSQL, leia [este](https://www.devmedia.com.br/transacoes-no-postgresql-niveis-de-isolamento/32464) artigo do Devmedia e a documentação do próprio PostgreSQL, [aqui](https://www.postgresql.org/docs/current/tutorial-transactions.html).\n\n## 5. Particularidades PostgreSQL\n\n### **Sequências**\n\n\u003e Esse objeto produz uma seqüência numérica auto-incremento, que será sempre única, independente do contexto transacional. O valor gerado permanece associado ao nome do objeto seqüência.\n\n```sql\n-- uso do serial\nCREATE TEMPORARY TABLE auto (\n\tid SERIAL PRIMARY KEY,\n\tnome VARCHAR(30) NOT NULL\n);\n\n-- uso da sequência\nCREATE SEQUENCE eu_criei;\n\nCREATE TEMPORARY TABLE auto (\n\tid INTEGER PRIMARY KEY DEFAULT NEXTVAL('id_auto'),\n\tnome VARCHAR(30) NOT NULL\n);\n\nSELECT NEXTVAL('eu_criei');\n```\n\n***Funções de uma sequência:***\n\n- `NEXTVAL` incrementa a sequência em uma unidade e retorna o valor\n- `CURRVAL` recupera o último valor geral por NEXTVAL na sessão\n- `SETVAL` altera o valor da sequência\n\n\u003e Um campo serial é um campo integer associado a uma seqüência. Assim, o nome da sequência criada pelo tipo serial é composto por `nome-da-tabela_nome-da-coluna_seq`.\n\nResumindo, o `SERIAL` executa \"por baixo dos panos\" o mesmo que a `SEQUENCE` executa manualmente.\n\nO artigo da SQL Magazine 7, da Devmedia, explica mais sobre os tipos de dados e sequência no PostgreSQL. [Confira](https://www.devmedia.com.br/artigo-sql-magazine-7-tipos-de-dados-e-sequencias-no-postgreesql/5117)!\n\n### **Tipos**\n\nSegundo a descrição na documentação, o comando `CREATE TYPE` registra um novo tipo de dados para uso no banco de dados atual. Para saber mais sobre como criar tipos confira a documentação [aqui](https://www.postgresql.org/docs/current/sql-createtype.html).\n\n\u003e O nome do tipo deve ser diferente do nome de qualquer tipo ou domínio existente no mesmo esquema. (Como as tabelas têm tipos de dados associados, o nome do tipo também deve ser diferente do nome de qualquer tabela existente no mesmo esquema.)\n\n***Os tipos podem ser criados das formas a seguir:***\n\n- CREATE TYPE name\n- CREATE TYPE name (...)\n- CREATE TYPE name AS ... (...)\n- CREATE TYPE name AS ENUM (...)\n- CREATE TYPE name AS RANGE (...)\n\n```sql\n-- criando uma tabbela com check para classificação indicativa de filme\nCREATE TEMPORARY TABLE filme (\n\tid SERIAL PRIMARY KEY,\n\tnome VARCHAR(255) NOT NULL,\n\tclassificacao VARCHAR(255) CHECK (\n        classificacao IN ('LIVRE', '12_ANOS', '14_ANOS', '16_ANOS', '18_ANOS')\n    )\n);\n\n\n-- substituindo o check por ENUM\nCREATE TEMPORARY TABLE filme (\n\tid SERIAL PRIMARY KEY,\n\tnome VARCHAR(255) NOT NULL,\n\tclassificacao ENUM (\n\t\t'LIVRE', '12_ANOS', '14_ANOS', '16_ANOS', '18_ANOS'\n\t)\n);\n\n\n-- substituindo o ENUM pela criação de tipo\nCREATE TYPE CLASSIFICACAO AS ENUM (\n\t'LIVRE', '12_ANOS', '14_ANOS', '16_ANOS', '18_ANOS'\n);\n\nCREATE TEMPORARY TABLE filme (\n\tid SERIAL PRIMARY KEY,\n\tnome VARCHAR(255) NOT NULL,\n\tclassificacao CLASSIFICACAO\n);\n\nINSERT INTO filme (nome, classificacao)\nVALUES\n\t('Um filme qualquer', 'Teste') -- acusa erro, não existe essa classificação\n\t('Um filme qualquer', '18_ANOS')\n```\n\n***Sobre o comando `ENUM` utilizado ao invés do `CHECK` nos exemplos acima:***\n\n\u003e `ENUM` são tipos de dados que compreendem um conjunto de valores estáticos e ordenados.\n\u003e Um exemplo de ENUM pode ser os dias da semana ou um conjunto de valores de status para um dado.\n\n⬆️ [Voltar ao topo](#postgresql-comandos-dml-e-ddl) ⬆️","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreadcsousa%2Falura_postgresql-dml-ddl_sql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandreadcsousa%2Falura_postgresql-dml-ddl_sql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreadcsousa%2Falura_postgresql-dml-ddl_sql/lists"}