Documente Academic
Documente Profesional
Documente Cultură
ÍNDICE
1 - Criar Tabela - 2
2 - Excluir Tabelas - 2
3 - Alterando Estrutura de Tabelas - 2
4 - Inserindo Linhas em Tabelas - 2
5 - Consultar Tabelas - 3
6 - Sub-consulta -3
7 - Insert Usando Select - 4
8 - Garantir resultados consistentes utilizando DISTINCT e ORDER BY juntos - 4
9 - Junções entre tabelas - 4
10 - Consulta União Inner Join - 4
11 - Consulta União LEFT OUTER JOIN - 4
12 - Apelido (Alias) - 5
13 - Funções de Agregação - 5
14 - Cláusula HAVIN - 5
15 - Atualizações em Tabelas - 6
16 - Excluindo Registros de Tabelas - 6
17 - Deve-se tomar cuidado com comandos na forma - 6
18 - Visões (Views) - 6
19 - Chaves Estrangeiras - 6
20 - Tipos de dado - 7
21 - Tipos numéricos - 8
22 - Arredondamento em tipo numeric - 8
23 - Tipo Serial - 8
24 - Alteração da seqüência da coluna serial - 8
25 - Auto-Incremento no Postgresql (Tipo Serial) - 9
26 - Ajustando o Tipo de Data do Sistema GBD - 9
27 - Ajustando uma Faixa de Registros com LIMIT and OFFSET - 9
28 - Funções com Cadeias de Caracteres (Strings)
29 - Correspondência com Padrão - 9
30 - Funções de formatação de Tipos de Dados - 12
31 - Exemplos de utilização da função to_char - 13
32 - Funções para data e hora - 14
33 - A função date_part - 16
34 - date_trunc - 16
35 - Data e hora correntes - 16
36 - Utilização de INTERVAL - 17
37 - Número de dias entre duas datas - 17
38 - Obtenção do dia do mês - 17
39 - Utilização das funções para data e hora corrente - 17
40 - Somar dias e horas a uma data - 17
41 - Operadores para os tipos cidr e inet - 18
42 - Funções para os tipos cidr e inet - 18
43 - Funções de informação da sessão - 19
44 - Funções para administração do sistema - 19
45 - Conversão de Tipos - 20
46 - Dicas de Desempenho - 20
2
1 - Criar Tabela
O nome dos objetos (tabelas, consultas, etc) são case-insensitives, mas para tornar sensitive podemos delimitá-los com
aspas duplas, inclusive para reconhecer acentos.
2 - Excluir Tabelas
DROP nometabela;
INSERT INTO clima VALUES ('São Francisco', 46, 50, 0.25, '1994-11-27');
INSERT INTO clima (cidade, temp_min, temp_max, prcp, data)
VALUES ('São Francisco', 43, 57, 0.0, '1994-11-29');
Também pode ser utilizado o comando COPY para carregar uma grande quantidade de dados a partir de arquivos
texto puro. Geralmente é mais rápido, porque o comando COPY é otimizado para esta finalidade, embora possua
menos flexibilidade que o comando INSERT. Para servir de exemplo:
COPY clima FROM '/home/user/clima.sql';
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;
3
5 - Consultar Tabelas
SELECT 3 * 4;
SELECT random();
SELECT now();
SELECT pi() * 3.14;
SELECT DISTINCT cidade FROM clients; //Trazer somente cidades distintas, sem repetição
SELECT * FROM clientes LIMIT 100 OFFSET 5; // Trazer 100 clientes iniciando do quinto, ou seja, 96
6 - Sub-consulta
SELECT firstname,
state,
CASE
WHEN state = 'PA' THEN 'close'
WHEN state = 'NJ' OR state = 'MD' THEN 'far'
ELSE 'very far'
END AS distance
FROM friend;
Combinando Selects
SELECT name FROM customer WHERE customer_id NOT IN ( SELECT customer_id FROM salesorder );
name
------
(0 rows)
(Customers who have no orders)
Como todas as colunas possuem nomes diferentes, o analisador encontra automaticamente a tabela que a coluna
pertence, mas é um bom estilo qualificar completamente os nomes das colunas nas consultas de junção:
SELECT clima.cidade, clima.temp_min, clima.temp_max,
clima.prcp, clima.data, cidades.localizacao
FROM clima, cidades
WHERE cidades.nome = clima.cidade;
CONSULTAS ANINHADAS
SELECT região_nome FROM região WHERE região_id =
(SELECT região_id FROM vinharia WHERE vinharia_id =
(SELECT vinharia_id FROM vinho WHERE vinho_id =
17));
SELECT *
FROM clima INNER JOIN cidades ON (clima.cidade = cidades.nome);
Existem também a junção externa direita (right outer join) e a junção externa completa (full outer join).
5
12 - Apelido (Alias)
A tabela clima teve seu nome mudado para C1 e C2, para permitir distinguir o lado esquerdo do lado direito da
junção. Estes tipos de "aliases" também podem ser utilizados em outras consultas para reduzir a digitação como, por
exemplo:
SELECT *
FROM clima w, cidades c
WHERE w.cidade = c.nome;
13 - Funções de Agregação
SELECT state, MIN(age) AS Menor, MAX(age) As Maximo, AVG(age) AS Media FROM friend GROUP BY state
ORDER BY 4 DESC;
SELECT city, state, COUNT(*) AS Contagem FROM friend GROUP BY state, city ORDER BY 1, 2;
city | state | Countagem
-----+-------+-------
Boston | MA | 1
Cedar Creek | MD | 1
Ocean City | NJ | 2
Plymouth | MA | 1
Williamsport | PA | 1
14 - Cláusula HAVIN
SELECT state, COUNT(*) AS Contagem FROM friend GROUP BY state HAVING COUNT(*) > 1 ORDER BY
state;
6
15 - Atualizações em Tabelas
UPDATE clima
SET temp_max = temp_max - 2, temp_min = temp_min - 2
WHERE data > '1994-11-28';
Funcionalidades Avançadas
18 - Visões (Views)
Supondo que a consulta combinando os registros de clima e de localização das cidades seja de particular interesse para
uma aplicação, mas que não se deseja digitar esta consulta toda vez que for necessária, então é possível criar uma
visão baseada na consulta, atribuindo um nome a esta consulta pelo qual será possível referenciá-la como se fosse uma
tabela comum.
CREATE VIEW minha_visao AS
SELECT cidade, temp_min, temp_max, prcp, data, localizacao
FROM clima, cidades
WHERE cidade = nome;
19 - Chaves Estrangeiras
Desejamos ter certeza que não serão inseridas linhas na tabela clima sem que haja um registro correspondente na
tabela cidades. Isto é chamado de manter a integridade referencial dos dados.
20 - Tipos de dado
Nome Aliases Descrição
7
21 - Tipos numéricos
Tamanho de
Nome Descrição Faixa de valores
armazenamento
smallint 2 bytes inteiro com faixa pequena -32768 a +32767
integer 4 bytes escolha usual para inteiro -2147483648 a +2147483647
-9223372036854775808 a
bigint 8 bytes inteiro com faixa larga
9223372036854775807
precisão especificada pelo usuário,
decimal variável sem limite
exato
precisão especificada pelo usuário,
numeric variável sem limite
exato
real 4 bytes precisão variável, inexato precisão de 6 dígitos decimais
double
8 bytes precisão variável, inexato precisão de 15 dígitos decimais
precision
serial 4 bytes inteiro com auto-incremento 1 a 2147483647
bigserial 8 bytes inteiro grande com auto-incremento 1 a 9223372036854775807
=> CREATE TABLE t ( c NUMERIC(6,3)); => INSERT INTO t VALUES (998.9991); => INSERT INTO t
VALUES (998.9999); => SELECT * FROM t; c --------- 998.999 999.000
23 - Tipo Serial
equivale a especificar:
SHOW DATESTYLE;
SET DATESTYLE TO ISO; YYYY-MM-DD HH:MM:SS
SET DATESTYLE TO PostgreSQL; Formato tradicionaldo PostgreSQL (
SET DATESTYLE TO US; MM/DD/YYYY
SET DATESTYLE TO NONEUROPEAN, GERMAN; DD.MM.YYYY
SET DATESTYLE TO EUROPEAN; DD/MM/YYYY
SELECT isbn, title, publication FROM editions NATURAL JOIN books AS b (book_id)
ORDER BY publication DESC LIMIT 5;
SELECT isbn, title, publication FROM editions NATURAL JOIN books AS b (book_id)
ORDER BY publication DESC LIMIT 5 OFFSET 2;
SELECT REPLACE('JACK and JUE','J','BL') AS "Changes"; Changes ---------------- BLACK and BLUE
SELECT RTRIM('BROWNINGyxXxyyx','xy') AS "RTRIM example"; RTRIM example ---------------
BROWNINGyxX
O PostgreSQL disponibiliza três abordagens distintas para correspondência com padrão: o operador LIKE tradicional
do SQL; o operador mais recente SIMILAR TO (adicionado ao SQL:1999); e as expressões regulares no estilo
POSIX. Além disso, também está disponível a função de correspondência com padrão substring, que utiliza
expressões regulares tanto no estilo SIMILAR TO quanto no estilo POSIX.
PostgreSQL 8.0
SELECT texto FROM textos WHERE texto SIMILAR TO '([a-z]+).([a-z]+).([a-z]+)'; -- ou
=> SELECT texto FROM textos WHERE texto ~ '^([a-z]+)\\.([a-z]+)\\.([a-z]+)$'; -- ou
=> SELECT texto FROM textos WHERE texto ~ '^([a-z]+)[.]([a-z]+)[.]([a-z]+)$';
Selecionar textos começando pela letra "S" maiúscula (_* equivale a %).
• PostgreSQL 8.0.0
=> SELECT texto FROM textos WHERE texto SIMILAR TO 'S%';
-- ou
=> SELECT texto FROM textos WHERE texto SIMILAR TO 'S_*';
-- ou
=> SELECT texto FROM textos WHERE texto ~ '^S';
Selecionar textos sem nenhum caractere, ou com somente espaços em branco (no Oracle texto sem nenhum caractere é
igual a nulo).
11
• PostgreSQL 8.0.0
=> SELECT texto, length(texto) FROM textos WHERE texto SIMILAR TO
'[[:space:]]*';
-- ou
=> SELECT texto, length(texto) FROM textos WHERE texto SIMILAR TO '\\s*';
-- ou
=> SELECT texto, length(texto) FROM textos WHERE texto ~ '^[[:space:]]
*$';
-- ou
=> SELECT texto, length(texto) FROM textos WHERE texto ~ '^\\s*$';
Selecionar textos contendo a letra "W" minúscula ou maiúscula, seguida por uma ou mais letras "W" minúsculas ou
maiúsculas.
• PostgreSQL 8.0.0
=> SELECT texto FROM textos WHERE texto SIMILAR TO '%[Ww]([Ww]+)%';
-- ou
=> SELECT texto FROM textos WHERE texto ~ '[Ww]([Ww]+)';
-- ou
=> SELECT texto FROM textos WHERE texto ~ '[Ww]{2,}';
Selecionar textos contendo "Inês", com letras maiúsculas ou minúsculas, com ou sem acento, em qualquer posição.
• PostgreSQL 8.0.0
=> SELECT texto FROM textos WHERE texto SIMILAR TO '%[Ii][nN][eéêEÉÊ]
[Ss]%';
-- ou
=> SELECT texto FROM textos WHERE lower(to_ascii(texto)) SIMILAR TO '%
ines%';
-- ou
=> SELECT texto FROM textos WHERE texto ~ '[Ii][nN][eéêEÉÊ][Ss]';
-- ou
=> SELECT texto FROM textos WHERE lower(to_ascii(texto)) ~ 'ines';
Selecionar textos não contendo espaços em branco (texto sem nenhum caractere não possui espaço em branco, mas no
Oracle texto sem nenhum caractere é igual a nulo).
• PostgreSQL 8.0.0
=> SELECT texto FROM textos WHERE texto NOT SIMILAR TO '%\\s%';
-- ou
=> SELECT texto FROM textos WHERE texto NOT SIMILAR TO '%[[:space:]]%';
-- ou
=> SELECT texto FROM textos WHERE texto !~ '\\s';
-- ou
=> SELECT texto FROM textos WHERE texto !~ '[[:space:]]';
Selecionar textos que podem ser endereços de hardware de placa Ethernet, formados por 48 bits, expressos como 12
dígitos hexadecimais (0-9 e A-F maiúsculas), no formato 12:34:56:78:9A:BC.
• PostgreSQL 8.0.0
=> SELECT texto
-> FROM textos
-> WHERE texto ~ '^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-
F]{2}:[0-9A-F]{2}$';
-- ou
-> WHERE texto ~ '^([0-9A-F]{2}:){5}[0-9A-F]{2}$';
decade
O campo ano dividido por 10
SELECT extract(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
Resultado: 200
dow
O dia da semana (0 - 6; Domingo é 0) (para valores timestamp apenas)
SELECT extract(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
15
Resultado: 5
Exemplos:
SELECT extract(DOW FROM TIMESTAMP '2005-08-14 20:38:40') AS Domingo; domingo --------- 0 (1 linha)
=> SELECT to_char(TIMESTAMP '2005-08-14 20:38:40','D') AS Domingo; domingo --------- 1 (1 linha)
=> SELECT extract(DOW FROM TIMESTAMP '2005-08-20 20:38:40') AS Sábado; sábado -------- 6 (1 linha)
=> SELECT to_char(TIMESTAMP '2005-08-20 20:38:40','D') AS Sábado; sábado -------- 7 (1 linha)
epoch
Para valores date e timestamp, o número de segundos desde 1970-01-01 00:00:00-00 (pode ser
negativo); para valores interval, o número total de segundos do intervalo
SELECT extract(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-
08');
Resultado: 982384720
week
O número da semana do ano onde o dia se encontra. Por definição (ISO 8601), a primeira
semana do ano contém o dia 4 de janeiro deste ano; a semana ISO-8601 começa na segunda-
feira. Em outras palavras, a primeira quinta-feira do ano está na primeira semana do ano.
(apenas para valores timestamp)
SELECT extract(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
Resultado: 7
year
O campo ano. Deve-se ter em mente que não existe o ano 0 DC e, portanto, subtrair anos AC
de DC deve ser feito com cautela.
SELECT extract(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
Resultado: 2001
33 - A função date_part é modelada segundo a função equivalente tradicional do Ingres à função extract do padrão
SQL:
date_part('campo', fonte)
Deve ser observado que, neste caso, o parâmetro campo deve ser um valor cadeia de caracteres, e não um nome. Os
nomes de campo válidos para date_part são os mesmos da função extract.
SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
Resultado: 16
34 - date_trunc
A função date_trunc é conceitualmente similar à função trunc para números.
date_trunc('campo', fonte)
SELECT CURRENT_DATE;
Resultado: 2001-12-23
SELECT CURRENT_TIMESTAMP;
Resultado: 2001-12-23 14:39:53.662522-05
SELECT CURRENT_TIMESTAMP(2);
Resultado: 2001-12-23 14:39:53.66-05
SELECT LOCALTIMESTAMP;
Resultado: 2001-12-23 14:39:53.662522
Também existe a função timeofday(), que por motivos históricos retorna uma cadeia de caracteres do tipo text, e não
um valor do tipo timestamp:
17
SELECT timeofday();
Resultado: Sat Feb 17 19:07:32.000126 2001 EST
SELECT CURRENT_TIMESTAMP;
SELECT now();
36 - Utilização de INTERVAL
SELECT INTERVAL'20 DAY' - INTERVAL'240 HOUR' AS intervalo; intervalo ----------- 10 days (1 linha) =>
SELECT INTERVAL '4 DAYS 5 HOURS 12 MINUTES'; interval ----------------- 4 days 05:12:00
SELECT cast('2004-07-16' AS date) + interval'30 days' AS data; data --------------------- 2004-08-15 00:00:00 (1 linha)
=> SELECT cast('2004-07-16 15:00:00' AS timestamp) + interval'30 days' AS data; data --------------------- 2004-08-15
15:00:00 (1 linha)
SELECT current_timestamp as agora, -> current_timestamp + interval'3 days 3 hours' AS depois;
agora | depois
-------------------------------+-------------------------------
2005-04-01 08:16:44.029386-03 | 2005-04-04 11:16:44.029386-03
18
A função pg_start_backup recebe um único parâmetro que é um rótulo arbitrário definido pelo usuário para a cópia de
segurança (habitualmente é o nome sob o qual o arquivo da cópia de segurança será armazenado). A função escreve o
arquivo rótulo da cópia de segurança no diretório de dados do agrupamento de bancos de dados e, então, retorna o
deslocamento no WAL do início da cópia de segurança como texto (o usuário não precisa prestar atenção a este valor
do resultado, mas é fornecido para o caso de ser útil).
A função pg_stop_backup remove o arquivo rótulo criado pela função pg_start_backup e, em seu lugar, cria o arquivo
de histórico de cópia de segurança na área de arquivamento do WAL. O arquivo de histórico inclui o rótulo fornecido
para a função pg_start_backup, os deslocamentos inicial e final do WAL para a cópia de segurança, e o tempo de
início e de fim da cópia de segurança. O valor retornado é o deslocamento no WAL do fim da cópia de segurança
(que, novamente, pode ser pouco interessante).
20
45 - Conversão de Tipos
46 - Dicas de Desempenho
O PostgreSQL concebe um plano de comando para cada comando recebido. A escolha do plano correto,
correspondendo à estrutura do comando e às propriedades dos dados, é absolutamente crítico para o bom desempenho.
Pode ser utilizado o comando EXPLAIN para ver o plano criado pelo sistema para qualquer comando. A leitura do
plano é uma arte que merece um tutorial extenso, o que este não é; porém, aqui são fornecidas algumas informações
básicas.
Os números apresentados atualmente pelo EXPLAIN são:
• O custo de partida estimado (O tempo gasto antes de poder começar a varrer a saída como, por exemplo, o
tempo para fazer a classificação em um nó de classificação).
• O custo total estimado (Se todas as linhas fossem buscadas, o que pode não acontecer: uma consulta contendo
a cláusula LIMIT pára antes de gastar o custo total, por exemplo).
• Número de linhas de saída estimado para este nó do plano (Novamente, somente se for executado até o fim).
• Largura média estimada (em bytes) das linhas de saída deste nó do plano.
Uma forma de ver outros planos é forçar o planejador a não considerar a estratégia que sairia vencedora, habilitando e
desabilitando sinalizadores de cada tipo de plano (Esta é uma ferramenta deselegante, mas útil.
SET enable_nestloop = off;
EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 50 AND t1.unique2 =
t2.unique2;
21
É possível verificar a precisão dos custos estimados pelo planejador utilizando o comando EXPLAIN ANALYZE. Na
verdade este comando executa a consulta, e depois mostra o tempo real acumulado dentro de cada nó do plano junto
com os custos estimados que o comando EXPLAIN simples mostraria. Por exemplo, poderia ser obtido um resultado
como este:
EXPLAIN ANALYZE SELECT * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 50 AND
t1.unique2 = t2.unique2;
Limpeza
vacuum
vacuum full
analyze
VACUUM ANALYZE;
VACUUM FULL ANALYZE;
Não é função do servidor de banco de dados formatar datas (ou o que quer
que seja) em todas as maneiras possíveis e imagináveis para todo mundo. O
PostgreSQL dispões de facilidades de sobra para formatar datas em qualquer
formato
(veja http://www.postgresql.org/idocs/index.php?functions-formatting.html):
So você não quer escrever isso tudo nas suas consultas, crie uma função
armazenada para tornar abstrato:
-Roberto
Fonte: http://br.groups.yahoo.com/group/postgresql-br/message/4747