• Nenhum resultado encontrado

Manipulação de dados

No documento Documentação do PostgreSQL 8.0.0 (páginas 83-87)

O capítulo anterior mostrou como criar tabelas e outras estruturas para armazenar dados. Agora está na hora de preencher as tabelas com dados. Este capítulo mostra como inserir, atualizar e excluir dados em tabelas. Também são apresentadas maneiras de efetuar mudanças automáticas nos dados quando ocorrem certos eventos: gatilhos (triggers) e regras de reescrita (rewrite rules). Para completar, o próximo capítulo explica como fazer consultas para extrair dados do banco de dados.

6.1. Inserção de dados

A tabela recém-criada não contém dados. A primeira ação a ser realizada para o banco de dados ter utilidade é inserir dados. Conceitualmente, os dados são inseridos uma linha de cada vez. É claro que é possível inserir mais de uma linha, mas não existe maneira de inserir menos de uma linha por vez. Mesmo que se conheça apenas o valor de algumas colunas, deve ser criada uma linha completa.

Para criar uma linha é utilizado o comando INSERT. Este comando requer o nome da tabela, e um valor para cada coluna da tabela. Por exemplo, considere a tabela produtos do Capítulo 5:

CREATE TABLE produtos ( cod_prod integer, nome text, preco numeric );

Um exemplo de comando para inserir uma linha é:

INSERT INTO produtos VALUES (1, 'Queijo', 9.99);

Os valores dos dados são colocados na mesma ordem que as colunas se encontram na tabela, separados por vírgula.

Geralmente os valores dos dados são literais (constantes), mas também são permitidas expressões escalares.

A sintaxe mostrada acima tem como desvantagem ser necessário conhecer a ordem das colunas da tabela. Para evitar isto, as colunas podem ser relacionadas explicitamente. Por exemplo, os dois comandos mostrados abaixo possuem o mesmo efeito do comando mostrado acima:

INSERT INTO produtos (cod_prod, nome, preco) VALUES (1, 'Queijo', 9.99);

INSERT INTO produtos (nome, preco, cod_prod) VALUES ('Queijo', 9.99, 1);

Muitos usuários consideram boa prática escrever sempre os nomes das colunas.

Se não forem conhecidos os valores de todas as colunas, as colunas com valor desconhecido podem ser omitidas. Neste caso, estas colunas são preenchidas com seu respectivo valor padrão. Por exemplo:

INSERT INTO produtos (cod_prod, nome) VALUES (1, 'Queijo');

INSERT INTO produtos VALUES (1, 'Queijo');

A segunda forma é uma extensão do PostgreSQL, que preenche as colunas a partir da esquerda com quantos valores forem fornecidos, e as demais com o valor padrão.

Para ficar mais claro, pode ser requisitado explicitamente o valor padrão da coluna individualmente, ou para toda a linha:

INSERT INTO produtos (cod_prod, nome, preco) VALUES (1, 'Queijo', DEFAULT);

INSERT INTO produtos DEFAULT VALUES;

Dica: Para realizar “cargas volumosas”, ou seja, inserir muitos dados, consulte o comando COPY. Este comando não é tão flexível quanto o comando INSERT, mas é mais eficiente.

6.2. Atualização de dados

A modificação dos dados armazenados no banco de dados é referida como atualização. Pode ser atualizada uma linha, todas as linhas, ou um subconjunto das linhas da tabela. Uma coluna pode ser atualizada separadamente; as outras colunas não são afetadas.

Para realizar uma atualização são necessárias três informações:

1. O nome da tabela e da coluna a ser atualizada;

2. O novo valor para a coluna;

3. Quais linhas serão atualizadas.

Lembre-se que foi dito no Capítulo 5 que o SQL, de uma maneira geral, não fornece um identificador único para as linhas.

Portanto, não é necessariamente possível especificar diretamente a linha a ser atualizada. Em vez disso, devem ser especificadas as condições que a linha deve atender para ser atualizada. Somente havendo uma chave primária na tabela (não importando se foi declarada ou não), é possível endereçar uma linha específica com confiança, escolhendo uma condição correspondendo à chave primária. Ferramentas gráficas de acesso a banco de dados dependem da chave primária para poderem atualizar as linhas individualmente.

Por exemplo, o comando mostrado abaixo atualiza todos os produtos com preço igual a 5, mudando estes preços para 10:

UPDATE produtos SET preco = 10 WHERE preco = 5;

Este comando pode atualizar nenhuma, uma, ou muitas linhas. Não é errado tentar uma atualização que não corresponda a nenhuma linha.

Vejamos este comando em detalhe: Primeiro aparece a palavra chave UPDATE seguida pelo nome da tabela. Como usual, o nome da tabela pode ser qualificado pelo esquema, senão é procurado no caminho. Depois aparece a palavra chave SET, seguida pelo nome da coluna, por um sinal de igual, e pelo novo valor da coluna. O novo valor da coluna pode ser qualquer expressão escalar, e não apenas uma constante. Por exemplo, se for desejado aumentar o preço de todos os produtos em 10% pode ser utilizado:

UPDATE produtos SET preco = preco * 1.10;

Como pode ser visto, a expressão para obter o novo valor pode fazer referência ao valor antigo. Também foi deixada de fora a cláusula WHERE. Quando esta cláusula é omitida, significa que todas as linhas da tabela serão atualizadas e, quando está presente, somente as linhas que atendem à condição desta cláusula serão atualizadas. Deve ser observado que o sinal de igual na cláusula SET é uma atribuição, enquanto o sinal de igual na cláusula WHERE é uma comparação, mas isto não cria uma ambigüidade. Obviamente, a condição da cláusula WHERE não é necessariamente um teste de igualdade, estão disponíveis vários outros operadores (consulte o Capítulo 9), mas a expressão deve produzir um resultado booleano.

Também pode ser atualizada mais de uma coluna pelo comando UPDATE, colocando mais de uma atribuição na cláusula SET. Por exemplo:

UPDATE minha_tabela SET a = 5, b = 3, c = 1 WHERE a > 0;

6.3. Exclusão de dados

Até aqui foi mostrado como adicionar dados a tabelas, e como modificar estes dados. Está faltando mostrar como remover os dados que não são mais necessários. Assim como só é possível adicionar dados para toda uma linha, uma linha também só pode ser removida por inteiro da tabela. Na seção anterior foi explicado que o SQL não fornece uma maneira para endereçar diretamente uma determinada linha. Portanto, a remoção das linhas só pode ser feita especificando as condições que as linhas a serem removidas devem atender. Havendo uma chave primária na tabela, então é possível especificar exatamente a linha. Mas também pode ser removido um grupo de linhas atendendo a uma determinada condição, ou podem ser removidas todas as linhas da tabela de uma só vez.

É utilizado o comando DELETE para remover linhas; a sintaxe deste comando é muito semelhante a do comando UPDATE. Por exemplo, para remover todas as linhas da tabela produtos possuindo preço igual a 10:

DELETE FROM produtos WHERE preco = 10;

Se for escrito simplesmente DELETE FROM produtos;

então todas as linhas da tabela serão excluídas! Dica de programador.

Capítulo 7. Consultas

Os capítulos anteriores explicaram como criar tabelas, como preenchê-las com dados, e como manipular estes dados.

Agora, finalmente, é mostrado como trazer estes dados para fora do banco de dados.

7.1. Visão geral

O processo de trazer, ou o comando para trazer os dados armazenados no banco de dados, é chamado de consulta. No SQL, o comando SELECT é utilizado para especificar consultas. A sintaxe geral do comando SELECT é

SELECT lista_de_seleção FROM expressão_de_tabela [especificação_da_ordenação]

As próximas seções descrevem em detalhes a lista de seleção, a expressão de tabela, e a especificação da ordenação.

O tipo mais simples de consulta possui a forma:

SELECT * FROM tabela1;

Supondo existir uma tabela chamada tabela1, este comando traz todas as linhas e todas as colunas da tabela1. A forma de trazer depende do aplicativo cliente. Por exemplo, o aplicativo psql exibe uma tabela ASCII formatada na tela, enquanto as bibliotecas cliente disponibilizam funções para extrair valores individuais do resultado da consulta. A especificação da lista de seleção * significa todas as colunas que a expressão de tabela possa fornecer. A lista de seleção também pode selecionar um subconjunto das colunas disponíveis, ou efetuar cálculos utilizando as colunas. Por exemplo, se a tabela1 possui colunas chamadas a, b e c (e talvez outras), pode ser feita a seguinte consulta:

SELECT a, b + c FROM tabela1;

(Supondo que b e c possuem um tipo de dado numérico). Consulte a Seção 7.3 para obter mais detalhes.

FROM tabela1 é um tipo particularmente simples de expressão de tabela: lê apenas uma única tabela. De uma forma geral, as expressões de tabela podem ser construções complexas contendo tabelas base, junções e subconsultas. Mas a expressão de tabela pode ser totalmente omitida, quando se deseja utilizar o comando SELECT como uma calculadora:

SELECT 3 * 4;

É mais útil quando as expressões da lista de seleção retornam resultados variáveis. Por exemplo, uma função pode ser chamada deste modo:

SELECT random();

7.2. Expressões de tabela

Uma expressão de tabela computa uma tabela. A expressão de tabela contém a cláusula FROM seguida, opcionalmente, pelas cláusulas WHERE, GROUP BY e HAVING. As expressões de tabela triviais fazem, simplesmente, referência as tão faladas tabelas em disco, chamadas de tabelas base, mas podem ser utilizadas expressões mais complexas para modificar ou combinar tabelas base de várias maneiras.

As cláusulas opcionais WHERE, GROUP BY e HAVING, da expressão de tabela, especificam um processo de transformações sucessivas realizadas na tabela produzida pela cláusula FROM. Todas estas transformações produzem uma tabela virtual que fornece as linhas passadas para a lista de seleção, para então serem computadas as linhas de saída da consulta.

7.2.1. A cláusula FROM

A Cláusula FROM deriva uma tabela a partir de uma ou mais tabelas especificadas na lista, separada por vírgulas, de referências a tabela.

FROM referência_a_tabela [, referência_a_tabela [, ...]]

Uma referência a tabela pode ser um nome de tabela (possivelmente qualificado pelo esquema) ou uma tabela derivada, como uma subconsulta, uma junção de tabelas ou, ainda, uma combinação complexa destas. Se for listada mais de uma referência a tabela na cláusula FROM, é feita uma junção cruzada (cross-join) (veja abaixo) para formar a tabela virtual intermediária que poderá, então, estar sujeita às transformações das cláusulas WHERE, GROUP BY e HAVING, gerando o resultado final de toda a expressão de tabela.

Quando uma referência a tabela especifica uma tabela ancestral em uma hierarquia de herança de tabelas, a referência a tabela não produz linhas apenas desta tabela, mas inclui as linhas de todas as tabelas descendentes, a não ser que a palavra chave ONLY preceda o nome da tabela. Entretanto, esta referência produz apenas as colunas existentes na tabela especificada — são ignoradas todas as colunas adicionadas às tabelas descendentes.

7.2.1.1. Junção de tabelas

Uma tabela juntada é uma tabela derivada de outras duas tabelas (reais ou derivadas), de acordo com as regras do tipo particular de junção. Estão disponíveis as junções internas, externas e cruzadas.

No documento Documentação do PostgreSQL 8.0.0 (páginas 83-87)