SlideShare une entreprise Scribd logo
1  sur  14
Télécharger pour lire hors ligne
1




                        Introdução ao PostgreSQL




              1-Comandos DML – Data Manipulation Language
                Comandos

1.1 - Comando Select
Extraído da Documentação do PostgreSQL 8.0.0
Projeto de Tradução para o Português do Brasil (http://sourceforge.net/projects/pgdocptbr/)
The PostgreSQL Global Development Group
Copyright © 1996-2005 por The PostgreSQL Global Development Group
                 2005
Tradução de Halley Pacheco de Oliveira

SINTAXE :


SELECT [ ALL | DISTINCT [ ON ( expressão [, ...] ) ] ]
* | expressão [ AS nome_de_saída ] [, ...]
[ FROM item_do_from [, ...] ]
[ WHERE condição ]
[ GROUP BY expressão [, ...] ]
[ HAVING condição [, ...] ]
[ { UNION | INTERSECT | EXCEPT } [ ALL ] seleção ]
[ ORDER BY expressão [ ASC | DESC | USING operador ] [, ...] ]
[ LIMIT { contador | ALL } ]
[ OFFSET início ]
[ FOR UPDATE [ OF nome_da_tabela [, ...] ] ]
onde item_do_from pode ser um entre:
[ ONLY ] nome_da_tabela [ * ] [ [ AS ] aliás [ ( aliás_de_coluna [, ...] ) ] ]
( seleção ) [ AS ] aliás [ ( aliás_d
                             aliás_de_coluna [, ...] ) ]
nome_da_função ( [ argumento [, ...] ] ) [ AS ] aliás [ ( aliás_de_coluna [, ...] |
definição_de_coluna [, ...] ) ]
nome_da_função ( [ argumento [, ...] ] ) AS ( definição_de_coluna [, ...] )
item_do_from [ NATURAL ] tipo_de_junção item_do_from [ ON condição_de_junção | USING (
coluna_de_junção [, ...] ) ]


                             SQL Básico – Prof. Antonio Guardado - 052012
2


Descrição
O comando SELECT retorna linhas de uma ou mais tabelas. O processamento geral do
comando SELECT está descrito abaixo:
1. Todos os elementos da lista FROM são computados; cada elemento na lista FROM é uma
tabela real ou virtual. Quando é especificado mais de um elemento na lista FROM, é feita uma
junção cruzada entre estes elementos (Consulte a Cláusula FROM abaixo).
2. Se for especificada a cláusula WHERE, todas as linhas que não satisfazem a condição são
eliminadas da saída (Consulte a Cláusula WHERE abaixo).
3. Se for especificada a cláusula GROUP BY, a saída é dividida em grupos de linhas que
correspondem a um ou mais valores. Se a cláusula HAVING estiver presente, são eliminados
os grupos que não satisfazem à condição especificada
(Consulte a Cláusula GROUP BY e a Cláusula HAVING abaixo).
4. As linhas de saída reais são computadas utilizando as expressões de saída do comando
SELECT para cada linha selecionada (Consulte a Lista do SELECT abaixo).
5. Usando os operadores UNION, INTERSECT e EXCEPT podem ser combinadas as saídas
de vários comandos SELECT
para formar um único conjunto de resultados. O operador UNION retorna todas as linhas
presentes em um ou nos dois conjuntos de resultados. O operador INTERSECT retorna todas
as linhas presentes nos dois conjuntos de resultados.
O operador EXCEPT retorna as linhas presentes no primeiro conjunto de resultados mas não
no segundo. Em todos estes três casos as linhas duplicadas são eliminadas, a menos que
ALL seja especificado (Consulte a Cláusula UNION,
a Cláusula INTERSECT e Cláusula EXCEPT abaixo).
6. Se for especificada a cláusula ORDER BY, as linhas retornadas são classificadas segundo
a ordem especificada. Se a cláusula ORDER BY não for especificada, as linhas são
retornadas na ordem em que o sistema considerar mais rápido de produzir (Consulte a
Cláusula ORDER BY abaixo).
7. A cláusula DISTINCT remove do resultado as linhas duplicadas 1 2 . A cláusula DISTINCT
ON remove as linhas que correspondem a todas as expressões especificadas. A cláusula ALL
(o padrão) retorna todas as linhas candidatas, incluindo as duplicadas (Consulte a Cláusula
DISTINCT abaixo).
8. Se for especificada a cláusula LIMIT ou a cláusula OFFSET, o comando SELECT retorna
somente um subconjunto das linhas do resultado (Consulte a Cláusula LIMIT abaixo)
9. A cláusula FOR UPDATE faz o comando SELECT bloquear as linhas selecionadas contra
atualizações concorrentes (Consulte a Cláusula FOR UPDATE abaixo)
É necessário possuir o privilégio SELECT na tabela para poder ler seus valores. A utilização
de FOR UPDATE requer também o privilégio UPDATE.

Parâmetros
Cláusula FROM
A cláusula FROM especifica uma ou mais tabelas fonte para o comando SELECT. Se várias
fontes forem especificadas, o resultado será o produto cartesiano (junção cruzada) de todas
as fontes, mas normalmente são incluídas condições de qualificação para restringir as linhas
retornadas a um pequeno subconjunto do produto cartesiano. A cláusula FROM pode conter
os seguintes elementos:

nome_da_tabela
O nome (opcionalmente qualificado pelo esquema) de uma tabela ou de uma visão existente.
Se a cláusula ONLY for especificada, somente esta tabela será varrida. Se a cláusula ONLY
não for especificada, esta tabela e todas as suas tabelas descendentes (se existirem) serão
varridas. Pode ser anexado um * ao nome da tabela para indicar que as tabelas descendentes
devem ser varridas, mas na versão corrente este é o comportamento padrão; nas versões
anteriores a 7.1 o comportamento padrão era ONLY. O comportamento padrão pode ser
modificado mudando o valor da opção de configuração sql_inheritance.

                            SQL Básico – Prof. Antonio Guardado - 052012
3


aliás
Um nome substituto para o item da cláusula FROM contendo o aliás. O aliás é utilizado para
abreviar, ou para eliminar ambigüidade em auto-junções (onde a mesma tabela é varrida
várias vezes). Quando se fornece um aliás, o nome verdadeiro da tabela ou da função fica
totalmente escondido; se, por exemplo, for declarado FROM foo AS f, o restante do comando
SELECT deve fazer referência a este item do FROM como f, e não como foo. Se for escrito
um aliás, também pode ser escrita uma lista de aliases de coluna para fornecer nomes
substitutos para uma ou mais colunas da tabela.

seleção
Pode haver sub-SELECT na cláusula FROM. Atua como se sua saída fosse criada como uma
tabela temporária pela duração deste único comando SELECT. Deve ser observado que o
sub-SELECT deve estar entre parênteses, e que deve ser especificado um aliás para o
mesmo.

nome_da_função
Podem estar presentes na cláusula FROM chamadas de função (É especialmente útil no caso
das funções que retornam um conjunto de resultados, mas pode ser usada qualquer função).
Atua como se a sua saída fosse criada como uma tabela temporária pela duração deste único
comando SELECT. Também pode ser utilizado um aliás. Se for escrito um aliás, também pode
ser escrita uma lista de aliases de coluna para fornecer nomes substitutos para um ou mais
atributos do tipo composto retornado pela função. Se a função tiver sido definida como
retornando o tipo de dado record então deve estar presente um aliás, ou a palavra chave AS
seguida por uma lista de definições de coluna na forma ( nome_de_coluna tipo_de_dado [, ... ]
). A lista de definições de coluna deve corresponder ao número e tipo reais das colunas
retornadas pela função.

tipo_de_junção
Um entre
• [ INNER ] JOIN
• LEFT [ OUTER ] JOIN
• RIGHT [ OUTER ] JOIN
• FULL [ OUTER ] JOIN
• CROSS JOIN
Para os tipos de junção INNER e OUTER deve ser especificada uma condição de junção
designando exatamente um entre NATURAL, ON condição_de_junção ou USING
(coluna_de_junção [, ...]). Veja abaixo o significado. Para CROSS JOIN, nenhuma destas
cláusulas pode estar presente. A cláusula JOIN combina dois itens da cláusula FROM. Se for
necessário devem ser utilizados parênteses para determinar a ordem de aninhamento. Na
ausência de parênteses, a cláusula JOIN aninha da esquerda para a direita. Em todos os
casos a cláusula JOIN tem nível de precedência superior ao das vírgulas que separam os
itens da cláusula FROM.
CROSS JOIN e INNER JOIN produzem um produto cartesiano simples, o mesmo resultado
obtido listando os dois itens no nível superior da cláusula FROM, mas restrito pela condição
de junção (se houver). CROSS JOIN é equivalente a INNER JOIN ON (TRUE), ou seja,
nenhuma linha é removida pela qualificação. Estes tipos de junção são apenas uma notação
conveniente, uma vez que não fazem nada que não poderia ser feito usando simplesmente
FROM e WHERE.
LEFT OUTER JOIN retorna todas as linhas presentes no produto cartesiano qualificado (ou
seja, todas as linhas combinadas que passam pela sua condição de junção), mais uma cópia
de cada linha da tabela à esquerda para a qual não há linha na tabela à direita que passe pela
condição de junção. As linhas da tabela à esquerda são estendidas por toda a largura da
tabela de junção, inserindo valores nulos para as colunas da tabela à direita. Deve ser
observado que somente a condição da própria cláusula JOIN é considerada ao decidir quais
linhas possuem correspondência. As condições externas são aplicadas depois.
                             SQL Básico – Prof. Antonio Guardado - 052012
4


De forma inversa, RIGHT OUTER JOIN retorna todas as linhas da junção, mais uma linha
para cada linha da tabela à direita sem correspondência (estendida com nulos à esquerda). É
apenas uma notação conveniente, uma vez que pode ser convertido em LEFT OUTER JOIN
trocando as entradas à direita e à esquerda.
FULL OUTER JOIN retorna todas as linhas da junção, mais uma linha para cada linha da
tabela à esquerda sem
correspondência, (estendida com nulos à direita), mais uma linha para cada linha da tabela à
direita sem correspondência (estendida com nulos à esquerda).

ON condição_de_junção
A condição_de_junção é uma expressão que resulta em um valor do tipo boolean (semelhante
à cláusula WHERE) que especifica quais linhas da junção são consideradas correspondentes.
USING (coluna_de_junção [, ...])
A cláusula com a forma USING ( a, b, ... ) é uma abreviação de ON tabela_à_esquerda.a =
tabela_à_direita.a AND tabela_à_esquerda.b = tabela_à_direita.b .... USING também implica
que somente será incluída na saída da junção uma de cada par de colunas equivalentes, e
não as duas.
NATURAL
NATURAL é uma forma abreviada para a lista USING mencionando todas as colunas das
duas tabelas que possuem o mesmo nome.

Cláusula WHERE
A cláusula opcional WHERE possui a forma geral
WHERE condição
onde condição é uma expressão que produz um resultado do tipo boolean 5 . Todas as linhas
que não satisfazem a esta condição são eliminadas da saída. A linha satisfaz a condição se
retorna verdade quando os valores reais da linha são colocados no lugar das variáveis que os
referenciam.

Cláusula GROUP BY
A cláusula opcional GROUP BY possui a forma geral
GROUP BY expressão [, ...]
A cláusula GROUP BY condensa em uma única linha todas as linhas selecionadas que
compartilham os mesmos valores para as expressões de agrupamento. A expressão pode ser
o nome de uma coluna da entrada, ou o nome ou o número
ordinal de uma coluna da saída (lista de itens do SELECT), ou uma expressão arbitrária
formada por valores das colunas da entrada. Havendo ambigüidade, o nome na cláusula
GROUP BY será interpretado como sendo o nome da coluna da entrada, e não o nome da
coluna da saída.
As funções de agregação, caso sejam usadas, são computadas entre todas as linhas que
constituem cada grupo, produzindo um valor separado para cada grupo (enquanto sem
GROUP BY, uma agregação produz um único valor computado entre
todas as linhas selecionadas). Quando GROUP BY está presente, não é válido a lista de
expressões do SELECT fazer referência a colunas não agrupadas, exceto dentro das funções
de agregação, uma vez que haveria mais de um valor possível retornado para uma coluna não
agrupada.

Cláusula HAVING
A cláusula opcional HAVING possui a forma geral
HAVING condição
onde condição é especificada da mesma forma que na cláusula WHERE.
A cláusula HAVING elimina os grupos de linhas que não satisfazem a condição. A cláusula
HAVING é diferente da cláusula WHERE: WHERE filtra individualmente as linhas antes do
GROUP BY ser aplicado, enquanto HAVING filtra grupos de linhas criados pelo GROUP BY.

                            SQL Básico – Prof. Antonio Guardado - 052012
5


Cada coluna referenciada na condição deve referenciar sem ambigüidade uma coluna de
agrupamento, a menos que a referência apareça dentro de uma função de agregação.
A presença da cláusula HAVING torna a consulta uma consulta agrupada, mesmo que não
exista a cláusula GROUP BY. É o mesmo que acontece quando a consulta contém funções de
agregação mas não possui a cláusula GROUP BY. Todas as linhas selecionadas são
consideradas como formando um único grupo, e tanto a lista do SELECT quanto a cláusula
HAVING somente podem fazer referência a colunas da tabela dentro de funções de
agregação. Este tipo de consulta gera uma única linha se a condição da cláusula HAVING for
verdade, ou nenhuma linha se não for verdade.

Lista do SELECT
A lista do SELECT (entre as palavras chave SELECT e FROM) especifica expressões que
formam as linhas de saída do comando SELECT. As expressões podem (e geralmente fazem)
referenciar colunas computadas na cláusula FROM. Usando a cláusula AS nome_de_saída,
pode ser especificado outro nome para uma coluna da saída. Este nome é usado,
principalmente, como rótulo da coluna mostrada. Também pode ser usado para fazer
referência ao valor da coluna nas cláusulas ORDER BY e GROUP BY, mas não nas cláusulas
WHERE e HAVING; nestas, a expressão deve ser escrita.
Em vez da expressão pode ser escrito * na lista de saída, como abreviação para todas as
colunas das linhas selecionadas.
Também pode ser escrito nome_da_tabela.* como abreviação das colunas provenientes
apenas desta tabela.

Cláusula UNION
A cláusula UNION possui a forma geral
comando_de_seleção UNION [ ALL ] comando_de_seleção
onde comando_de_seleção é qualquer comando SELECT sem as cláusulas ORDER BY,
LIMIT e FOR UPDATE (as cláusulas ORDER BY e LIMIT podem ser aplicadas a uma
subexpressão se esta estiver entre parênteses. Sem os parênteses, estas cláusulas são
consideradas como aplicadas ao resultado da cláusula UNION, e não à sua expressão de
entrada à direita).
O operador UNION computa o conjunto formado pela união das linhas retornadas pelos
comandos SELECT envolvidos.
Uma linha está presente no conjunto união dos dois conjuntos de resultados se estiver
presente em pelo menos um destes dois conjuntos de resultados. Os dois comandos SELECT
que representam os operandos diretos do operador UNION devem produzir o mesmo número
de colunas, e as colunas correspondentes devem possuir tipos de dado compatíveis.
O resultado do operador UNION não contém nenhuma linha duplicada, a menos que a opção
ALL seja especificada. ALL não permite a eliminação das duplicatas; portanto, UNION ALL
geralmente é significativamente mais rápido do que UNION; deve ser utilizado ALL se
possível.
Havendo vários operadores UNION no mesmo comando SELECT, estes são avaliados da
esquerda para a direita, a menos que os parênteses indiquem o contrário.
Atualmente não pode ser especificado FOR UPDATE nem para o resultado do operador
UNION nem para qualquer entrada do operador UNION.

Cláusula INTERSECT
A cláusula INTERSECT possui a forma geral
comando_de_seleção INTERSECT [ ALL ] comando_de_seleção
onde comando_de_seleção é qualquer comando SELECT sem as cláusulas ORDER BY,
LIMIT e FOR UPDATE.
O operador INTERSECT computa o conjunto formado pela interseção das linhas retornadas
pelos comandos SELECT envolvidos. Uma linha está na interseção dos dois conjuntos de
resultados se estiver presente nos dois conjuntos de resultados.

                            SQL Básico – Prof. Antonio Guardado - 052012
6


O resultado do operador INTERSECT não contém nenhuma linha duplicada, a menos que a
opção ALL seja especificada.
Usando ALL, uma linha contendo m duplicatas na tabela à esquerda e n duplicatas na tabela à
direita, aparece min(m,n) vezes no conjunto de resultados.
Havendo vários operadores INTERSECT no mesmo comando SELECT, estes são avaliados
da esquerda para a direita, a menos que os parênteses indiquem outra ordem. O operador
INTERSECT tem nível de precedência superior ao do operador UNION, ou seja, A UNION B
INTERSECT C é lido como A UNION (B INTERSECT C).
Atualmente a cláusula FOR UPDATE não pode ser especificada para o resultado do operador
INTERSECT, nem em qualquer entrada do operador INTERSECT.

Cláusula EXCEPT
A cláusula EXCEPT possui a forma geral
comando_de_seleção EXCEPT [ ALL ] comando_de_seleção
onde comando_de_seleção é qualquer comando SELECT sem as cláusulas ORDER BY,
LIMIT e FOR UPDATE.
O operador EXCEPT computa o conjunto de linhas presentes no resultado do comando
SELECT à esquerda, mas que não estão presentes no resultado do comando à direita.
O resultado do operador EXCEPT não contém nenhuma linha duplicada, a menos que a
cláusula ALL seja especificada. Usando ALL, uma linha que possua m duplicatas na tabela à
esquerda e n duplicatas na tabela à direita aparece max(m-n,0) vezes no conjunto de
resultados.
Havendo vários operadores EXCEPT no mesmo comando SELECT, estes são processados
da esquerda para a direita, a menos que os parênteses especifiquem outra ordem. O operador
EXCEPT possui o mesmo nível de precedência do operador UNION.
Atualmente a cláusula FOR UPDATE não pode ser especificada para o resultado do operador
EXCEPT, nem em nenhuma entrada do operador EXCEPT.

Cláusula ORDER BY
A cláusula opcional ORDER BY possui a forma geral
ORDER BY expressão [ ASC | DESC | USING operador ] [, ...]
onde expressão pode ser o nome ou o número ordinal de uma coluna da saída (item da lista
do SELECT), ou pode ser uma expressão arbitrária formada por valores das colunas da
entrada.
A cláusula ORDER BY faz as linhas do resultado serem classificadas de acordo com as
expressões especificadas. Se duas linhas são iguais de acordo com a expressão mais à
esquerda, estas são comparadas de acordo com a próxima expressão, e assim por diante. Se
forem iguais de acordo com todas as expressões especificadas, são retornadas em uma
ordem
dependente da implementação.
O número ordinal se refere à posição ordinal (esquerda para a direita) da coluna do resultado.
Esta funcionalidade torna possível definir uma ordenação baseada em uma coluna que não
possui um nome único. Isto nunca é absolutamente necessário, porque sempre é possível
atribuir um nome à coluna do resultado usando a cláusula AS.
Também é possível utilizar expressões arbitrárias na cláusula ORDER BY, incluindo colunas
que não aparecem na lista de resultado do SELECT. Portanto, o seguinte comando é válido:
SELECT nome FROM distribuidores ORDER BY codigo; A limitação desta funcionalidade é
que a cláusula ORDER BY aplicada ao resultado de UNION, INTERSECT ou EXCEPT pode
especificar apenas nomes de coluna ou números, mas não expressões.
Se a expressão no ORDER BY for simplesmente um nome correspondendo tanto ao nome de
uma coluna do resultado quanto ao nome de uma coluna da entrada, o ORDER BY interpreta
como sendo o nome da coluna do resultado. Esta é a escolha oposta à feita pelo GROUP BY
na mesma situação. Esta incoerência existe para ficar compatível com o padrão SQL.
Pode ser adicionada, opcionalmente, a palavra chave ASC (ascendente) ou DESC
(descendente) após cada expressão na cláusula ORDER BY. Se nenhuma das duas for
                             SQL Básico – Prof. Antonio Guardado - 052012
7


especificada, ASC é assumido por padrão. Como alternativa, pode ser especificado o nome de
um operador de ordenação específico na cláusula USING. Geralmente ASC é equivalente a
USING <
e geralmente DESC é equivalente a USING > (Mas o criador de um tipo de dado definido pelo
usuário pode definir exatamente qual é a ordem de classificação padrão, podendo
corresponder a operadores com outros nomes).
O valor nulo é classificado em uma posição mais alta do que qualquer outro valor. Em outras
palavras, na ordem de classificação ascendente os valores nulos ficam no final, e na ordem de
classificação descendente os valores nulos ficam no início.
Dados na forma de cadeias de caracteres são classificados de acordo com a ordem de
classificação estabelecida quando o agrupamento de bancos de dados foi inicializado.

Cláusula DISTINCT
Se for especificada a cláusula DISTINCT, todas as linhas duplicadas são removidas do
conjunto de resultados (é mantida
uma linha para cada grupo de duplicatas). A cláusula ALL especifica o oposto: todas as linhas
são mantidas; este é o padrão.
DISTINCT ON ( expressão [, ...] ) preserva apenas a primeira linha de cada conjunto de linhas
onde as expressões fornecidas forem iguais. As expressões em DISTINCT ON são
interpretadas usando as mesmas regras da cláusula ORDER BY (veja acima). Deve ser
observado que a “primeira linha” de cada conjunto é imprevisível, a menos que seja utilizado
ORDER BY para garantir que a linha desejada apareça na frente. Por exemplo, SELECT
DISTINCT ON (local) local, data, condição FROM tbl_condicao_climatica ORDER BY local,
data DESC; mostra o relatório de condição climática mais recente para cada local, mas se não
tivesse sido usado ORDER BY para obrigar a ordem descendente dos valores da data para
cada local, teria sido obtido um relatório com datas imprevisíveis para cada local.
As expressões em DISTINCT ON devem corresponder às expressões mais à esquerda no
ORDER BY. A cláusula ORDER BY normalmente contém expressões adicionais para
determinar a precedência desejada das linhas dentro de cada grupo
DISTINCT ON.

Cláusula LIMIT
A cláusula LIMIT consiste em duas subcláusulas independentes:
LIMIT { contador | ALL }
OFFSET início
onde contador especifica o número máximo de linhas a serem retornadas, enquanto início
especifica o número de linhas a serem puladas antes de começar a retornar as linhas. Quando
as duas são especificadas, as início primeiras linhas são puladas antes de começar a contar
as contador linhas a serem retornadas. Ao se usar a cláusula LIMIT é uma boa idéia usar
também a cláusula ORDER BY para colocar as linhas do resultado dentro de uma ordem
única. Caso contrário será retornado um subconjunto imprevisível de linhas da consulta —
pode-se estar querendo receber da décima a vigésima linha, mas da décima a vigésima em
que ordem? Não é possível saber qual será a ordem, a não ser que ORDER BY seja
especificado.
O planejador de comandos leva LIMIT em consideração ao gerar o plano da consulta, por isso
é muito provável serem obtidos planos diferentes (produzindo linhas em ordens diferentes)
dependendo do que for especificado para LIMIT e OFFSET. Portanto, utilizar valores
diferentes para LIMIT/OFFSET para selecionar subconjuntos diferentes do resultado da
consulta produz resultados inconsistentes, a não ser que seja exigida uma ordem previsível
para os resultados utilizando ORDER BY. Isto não está errado; isto é uma conseqüência direta
do fato do SQL não prometer retornar os resultados de uma consulta em nenhuma ordem
específica, a não ser que ORDER BY seja utilizado para impor esta ordem.




                             SQL Básico – Prof. Antonio Guardado - 052012
8


1.2 – Funções Internas com o Comando Select

  1.2.1 – Funções de Strings

 Concatenação de Strings - dois || (pipes)

SQL> SELECT 'ae' || 'io' || 'u' AS vogais ;

 Quantidade de Caracteres de String

SQL> SELECT CHAR_LENGTH ('Postgresql'); - -Retorna 10
SQL> SELECT LENGTH ('Database'); - - Retorna 8

 Converter para minúsculas
SQL> SELECT LOWER ('POSTGRESQL');

 Converter para maiúsculas
SQL> SELECT UPPER ('postgresql');

 Posição de caractere
SQL> SELECT POSITION ('@' IN 'guardado@gmail.com'); -- Retorna 8
SQL> SELECT STRPOS ('Postgresql' ,’sql'); - - Retorna 8

 Substring
SUBSTRING(string [FROM inteiro] [FOR inteiro])
SQL> SELECT SUBSTRING ('PostgreSQL' FROM 8 FOR 10); - - Retorna SQL
SUBSTRING(string FROM padrão);
SQL> SELECT SUBSTRING ('PostgreSQL' FROM '.......'); - - Retorna Postgre
SQL> SELECT SUBSTRING ('PostgreSQL' FROM '...$'); - -Retorna SQL
Primeiros ....... e últimos ...$
Ou
SUBSTR ( 'string', inicio, quantidade);
SQL> SELECT SUBSTR ('PostgreSQL', 4, 3); - - Retorna gre

 Substituir todos os caracteres semelhantes
     TRANSLATE (string, velho, novo);
SQL> SELECT TRANSLATE ('Brasil', 'il', 'ão'); - - Retorna Brasão
SQL> SELECT TRANSLATE ('Brasileiro...leiro', 'eiro', 'eira');

 Remover Espaços de Strings
SQL> SELECT TRIM(' SQL - PADRÃO ');

 Repetir uma string n vezes
SQL> SELECT REPEAT('SQL-', 3); - - Retorna SQL-SQL-SQL

  Sobrescrever Substring em string
SQL> SELECT REPLACE ('Postgresql', 'sql', 'SQL'); - - Retorna PostgreSQL
  Iniciais Maiúsculas
INITCAP(text) - INITCAP ('olá mundo') - - Olá Mundo
  Remover Espaços em Branco
TRIM ([leading | trailing | both] [characters] from string)- remove caracteres da direita e da
esquerda. TRIM (both 'b' from 'babacatebbbb'); - - abacate
RTRIM (string text, chars text) - Remove os caracteres chars da direita (default é espaço)
RTRIM('removarrrr', 'r') - - remova
                               SQL Básico – Prof. Antonio Guardado - 052012
9


LTRIM - (string text, chars text) - Remove os caracteres chars da esquerda
LTRIM('abssssremova', 'abs') - - remova

   Like e %
SELECT * FROM FRIENDS WHERE LASTNAME LIKE 'M%';
O ILIKE é case INsensitive e o LIKE case sensitive.
~~ equivale ao LIKE
~~* equivale equivale ao ILIKE
!~~ equivale ao NOT LIKE
!~~* equivale equivale ao NOT ILIKE
... LIKE '[4-6]_6%' -- Pegar o primeiro sendo de 4 a 6,
-- o segundo qualquer dígito,
-- o terceiro sendo 6 e os demais quaisquer
% similar a *
_ similar a ? (de arquivos no DOS)

1.2.2 – Funções de Data/Hora

  Operações com datas:
timestamp '2001-09-28 01:00' + interval '23 hours' -> timestamp '2001-09-29 00:00'
date '2001-09-28' + interval '1 hour' -> timestamp '2001-09-28 01:00'
date '01/01/2006' – date '31/01/2006'
time '01:00' + interval '3 hours'time -> '04:00'
interval '2 hours' - time '05:00' -> time '03:00:00'

 Função age (retorna Interval) - Diferença entre datas
age(timestamp)interval (Subtrai de hoje)
age(timestamp '1957-06-13') -> 43 years 8 mons 3 days
age(timestamp, timestamp)interval Subtrai os argumentos
age('2001-04-10', timestamp '1957-06-13') -> 43 years 9 mons 27 days

 Função extract (retorna double)
Extrai parte da data: ano, mês, dia, hora, minuto, segundo.
SQL> SELECT EXTRACT(YEAR FROM AGE('2001-04-10', TIMESTAMP '1957-06-13'))
SQL> SELECT EXTRACT(MONTH FROM AGE('2001-04-10', TIMESTAMP '1957-06-13'))
SQL> SELECT EXTRACT(DAY FROM AGE('2001-04-10', TIMESTAMP '1957-06-13'))

 Data e Hora atuais (retornam data ou hora)
SQL> SELECT CURRENT_DATE;
SQL> SELECT CURRENT_TIME;
SQL> SELECT CURRENT_TIME(0);
SQL> SELECT CURRENT_TIMESTAMP;
SQL> SELECT CURRENT_TIMESTAMP(0);

 Obtendo o dia do mês:
SQL> SELECT DATE_PART('DAY', CURRENT_TIMESTAMP) AS Dia;

 Somar dias e horas a uma data:
SQL> SELECT CAST('06/04/2006' AS DATE) + INTERVAL '27 DAYS' AS Data;

 Função now (retorna timestamp with zone)
NOW() - Data e hora corrente (timestamp with zone);
Não usar em campos somente timestamp.


                             SQL Básico – Prof. Antonio Guardado - 052012
10


 Função date_part (retorna double)
SQL> SELECT DATE_PART('day', TIMESTAMP '2001-02-16 20:38:40');
Resultado: 16 (day é uma string, diferente de extract)

 Função date_trunc (retorna timestamp)
SQL> SELECT DATE_TRUNC('year', TIMESTAMP '2001-02-16 20:38:40');
Retorna 2001-02-16 00:00:00

 Convertendo (CAST)
SQL> SELECT TO_DATE('1983-07-18', 'YYYY-MM-DD')
SQL> SELECT TO_DATE('19830718', 'YYYYMMDD')

 Função timeofday (retorna texto)
SQL> SELECT TIMEOFDAY() -> Fri Feb 24 10:07:32.000126 2006 BRT

  Interval
INTERVAl [ (p) ]
TO_CHAR(INTERVAl '15h 2m 12s', 'HH24:MI:SS')
DATE '2001-09-28' + INTERVAL '1 hour'
INTERVAL '1 day' + INTERVAL '1 hour'
INTERVAL '1 day' - INTERVAL '1 hour'
900 * INTERVAL '1 second'
INTERVAL trabalha com as unidades: SECOND, MINUTE, HOUR, DAY, WEEK, MONTH,
YEAR, DECADE,
CENTURY, MILLENIUM ou abreviaturas ou plurais destas unidades.
Se informado sem unidades '13 10:38:14' será devidamente interpretado '13 days 10 hours
38 minutes 14 seconds'.
CURRENTE_DATE - INTERVAL '1' day;
TO_TIMESTAMP('2006-01-05 17:56:03', 'YYYY-MM-DD HH24:MI:SS')

1.2.3 - Formatação de Tipos de Dados

 TO_CHAR - Esta função deve ser evitada, pois será descontinuada.
 TO_DATE
DATE TO_DATE(text, text); Recebe dois parâmetros text e retorna date.
Um dos parâmetros é a data e o outro o formato.
SQL> SELECT TO_DATE('29032006','DDMMYYYY'); - Retorna 2006-03-29

  TO_TIMESTAMP
tmt TO_TIMESTAMP(text,text) - Recebe dois text e retorna timestamp with zone
SQL> SELECT TO_TIMESTAMP('29032006 14:23:05','DDMMYYYY HH:MI:SS'); - Retorna
2006-03-29 14:23:05+00

 TO_NUMBER
numeric TO_NUMBER(text,text)
SQL> SELECT TO_NUMBER('12,454.8-', '99G999D9S'); Retorna -12454.8
SQL> SELECT TO_NUMBER('12,454.8-', '99G999D9'); Retorna 12454.8
SQL> SELECT TO_NUMBER('12,454.8-', '99999D9'); Retorna 12454

1.2.4 - Conversão Explícita de Tipos (CAST)

  CAST ( expressão AS tipo ) AS apelido; -- Sintaxe SQL ANSI
Outra forma:
Tipo ( expressão );

                            SQL Básico – Prof. Antonio Guardado - 052012
11


Exemplo:
SQL> SELECT DATE '10/05/2002' - DATE '10/05/2001'; -- Retorna a quantidade de dias
- -entre as duas datas
Para este tipo de conversão devemos:
Usar float8 ao invés de double precision;
Usar entre aspas alguns tipos como interval, time e timestamp
Obs.: aplicações portáveis devem evitar esta forma de conversão e em seu lugar usar o
CAST explicitamente.
A função CAST() é utilizada para converter explicitamente tipos de dados em outros.
SQL> SELECT CAST(2 AS double precision) ^ CAST(3 AS double precision) AS "exp";
SQL> SELECT ~ CAST('20' AS int8) AS "negativo"; - Retorna -21

SQL> SELECT ROUND(CAST (4 AS numeric), 4); - Retorna 4.0000
SQL> SELECT SUBSTR(CAST (1234 AS text), 3);
SQL> SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL);

1.2.5- Funções Diversas

SQL>   SELECT CURRENT_DATABASE();
SQL>   SELECT CURRENT_SCHEMA();
SQL>   SELECT CURRENT_SCHEMA(BOOLEAN);
SQL>   SELECT CURRENT_USER;
SQL>   SELECT SESSION_USER;
SQL>   SELECT VERSION();
SQL>   SELECT CURRENT_SETTING('DATESTYLE');

SELECT HAS_TABLE_PRIVILEGE('usuario','tabela','privilegio');
SQL> SELECT HAS_TABLE_PRIVILEGE('postgres','nulos','insert'); - - Retorna: t
SQL> SELECT HAS_DATABASE_PRIVILEGE('postgres','testes','create'); - - Retorna: t
SQL> SELECT HAS_SCHEMA_PRIVILEGE('postgres','public','create'); - - Retorna: t
SQL> SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

1.3 – Exemplos de SELECT com dados

1) Mostrar todos os dados dos equipamentos
SQL> SELECT * FROM equipamento ;

2) Mostrar o modelo e fabricante dos equipamentos
SQL> SELECT modelo_eqpto, fabricante_eqpto
FROM equipamento ;

3) Mostrar todos os dados dos softwares do fabricante 'Microsoft'
SQL> SELECT * FROM software
WHERE fabric_soft ilike '%microsoft' ;

4) Mostrar todos os dados dos equipamentos fornecidos hoje
SQL> SELECT *
FROM equipamento
WHERE dt_fornec_eqpto = current_date ;


                            SQL Básico – Prof. Antonio Guardado - 052012
12


5) Mostrar todos os dados dos equipamentos fornecidos neste mês
SQL> SELECT *
FROM equipamento
WHERE extract ( month from dt_fornec_eqpto) = extract ( month from current_date );


6) Mostrar todos os dados dos equipamentos do tipo Periféricos
SQL> SELECT e.* , p.*
FROM equipamento e,periferico p
WHERE e.num_patrimonio=p.num_patr_perif ;

SQL> SELECT
e.num_patrimonio,e.num_serie,e.cod_forn_eqpto,e.modelo_eqpto,e.fabricante_eqpto,
e.num_nota_fisc_eqpto,e.dt_fornec_eqpto,e.val_gar_eqpto,e.situacao,
p.tipo_perif,p.desc_perif,p.caracteristicas
FROM equipamento e,periferico p
WHERE e.num_patrimonio=p.num_patr_perif ;


7) Mostrar todos os dados dos equipamentos do tipo Computador
SQL> SELECT e.* , c.*
FROM equipamento e,computador c
WHERE e.num_patrimonio=c.num_patr_comp;

SQL> SELECT
e.num_patrimonio,e.num_serie,e.cod_forn_eqpto,e.modelo_eqpto,e.fabricante_eqpto,
e.num_nota_fisc_eqpto,e.dt_fornec_eqpto,e.val_gar_eqpto,e.situacao,
c.processador_comp,c.memoria_comp,c.capac_armaz_comp,c.velocidade_ghz
FROM equipamento e,computador c
WHERE e.num_patrimonio=c.num_patr_comp;

8) Mostrar todos os dados dos equipamentos do tipo Rede ordenados pelo
   patrimônio
SQL> SELECT e.*, r.*
FROM equipamento e,rede r
WHERE e.num_patrimonio=r.num_patr_rede
ORDER BY e.num_patrimonio ;

SQL> SELECT
e.num_patrimonio,e.num_serie,e.cod_forn_eqpto,e.modelo_eqpto,e.fabricante_eqpto,
e.num_nota_fisc_eqpto,e.dt_fornec_eqpto,e.val_gar_eqpto,e.situacao,
r.tipo_eqpto_rede,r.qtde_portas,r.velocidade_mbps
FROM equipamento e,rede r
WHERE e.num_patrimonio=r.num_patr_rede
ORDER BY e.num_patrimonio ;




                         SQL Básico – Prof. Antonio Guardado - 052012
13


9) Montar uma lista dos softwares instalados em cada equipamento do tipo
   Computador no seguinte formato : Número Patrimônio – Tipo Software –
   Número Licença – Data Instalação ordenado pela instalação mais recente
SQL> SELECT i.num_patr_eqpto,s.tipo_soft,i.num_lic_inst,i.dt_inicio_inst
FROM software s,instalacao i
WHERE s.cod_soft=i.num_cod_soft
ORDER BY i.dt_inicio_inst DESC;

10) Mostrar o Número de patrimônio , Número de Série, Número de Licença e
   marca dos equipamentos que têm softwares do tipo 'Office' instalados.
SQL> SELECT i.num_patr_eqpto,e.num_serie,i.num_lic_inst,e.fabricante_eqpto
FROM equipamento e,instalacao i,software s
WHERE e.num_patrimonio=i.num_patr_eqpto
AND i.num_cod_soft=s.cod_soft
AND s.tipo_soft='office'
ORDER BY 2 DESC, 1;

11) Montar uma lista de fornecimento dos equipamentos com 12 meses de
garantia no formato : Número Patrimônio – Modelo – Data Fornecimento – Nome
Fornecedor
SQL> SELECT e.num_patrimonio,e.modelo_eqpto,e.dt_fornec_eqpto,f.nome_forn
FROM equipamento e,fornecedor f
WHERE e.cod_forn_eqpto=f.cod_forn
AND e.temp_gar_eqpto= 12
ORDER BY 3 DESC, 1;

12) Montar uma lista de fornecimento dos softwares do tipo 'Sistema Operacional'
   com mais de 10 licenças no formato : Número Patrimônio – Modelo – Data
   Fornecimento – Nome Fornecedor
SQL> SELECT i.num_patr_eqpto,e.modelo_eqpto,s.dt_fornec_soft,f.nome_forn
FROM equipamento e,fornecedor f,software s,instalacao i
WHERE s.cod_forn_soft=f.cod_forn
AND s.cod_soft=i.num_cod_soft
AND e.num_patrimonio=i.num_patr_eqpto
AND s.tipo_soft ilike '%sistema operacional%'
AND s.qtde_licenca_soft >=10
ORDER BY 4;

13) Mostrar os periféricos alocados nos equipamentos no formato : Número
   Patrimônio Eqpto – Modelo Eqpto – Número Patrimônio Periférico – Tipo
   Periférico – Data Início e Término alocação
SQL> SELECT
a.num_patr_comp_aloc,e.modelo_eqpto,p.num_patr_perif,p.tipo_perif,a.dt_ini_aloc,
a.dt_ter_aloc
FROM equipamento e,periferico p,alocacao a
WHERE e.num_patrimonio=a.num_patr_comp_aloc
AND p.num_patr_perif=a.num_patr_perif_aloc
ORDER BY 2;
                          SQL Básico – Prof. Antonio Guardado - 052012
14



14) Montar uma lista de todos os computadores com mais de 1GB de memória
   RAM que possuem softwares do tipo 'Ferramenta CASE' instalados no
   formato : Número Patrimônio – Processador – Memória RAM – Descrição
   Software- Versão- Número Licença – Data Instalação

SQL> SELECT
c.num_patr_comp,c.processador_comp,c.memoria_comp,s.desc_soft,s.versao_soft,i.n
um_lic_inst,i.dt_inicio_inst
FROM computador c,software s,instalacao i
WHERE c.num_patr_comp=i.num_patr_eqpto
AND s.cod_soft=i.num_cod_soft
AND c.memoria_comp>1
AND s.tipo_soft ilike '%ferramenta case%'
ORDER BY 1;

15) Mostrar todos os dados dos computadores com menos de 100 GB de
   capacidade de armazenamento que não têm instalado qualquer software da
   'Microsoft' .
SQL> SELECT
e.num_patrimonio,e.num_serie,e.cod_forn_eqpto,e.modelo_eqpto,e.fabricante_eqpto,
e.num_nota_fisc_eqpto,e.dt_fornec_eqpto,e.temp_gar_eqpto,e.situacao,
c.processador_comp,c.memoria_comp,c.capac_armaz_comp,c.velocidade_ghz
FROM equipamento e,computador c,instalacao i,software s
WHERE e.num_patrimonio=c.num_patr_comp
AND e.num_patrimonio=i.num_patr_eqpto
AND s.cod_soft=i.num_cod_soft
AND c.capac_armaz_comp < 100
AND s.fabric_soft!='microsoft';

16) Montar uma lista de todos os equipamentos de rede do tipo 'HUB' com mais
de 12 portas cujo tempo de garantia é de 12 meses e foram fornecidos há mais
de uma ano no formato : Número Patrimônio – Qtde Portas – Data Fornecimento
– Nome Fornecedor – Número Nota fiscal
SQL> SELECT e.num_patrimonio, r.qtde_portas, e.dt_fornec_eqpto, f.nome_forn,
e.num_nota_fisc_eqpto
FROM equipamento e, rede r, fornecedor f
WHERE f.cod_forn      = e.cod_forn_eqpto
AND e.num_patrimonio = r.num_patr_rede
AND r.tipo_eqpto_rede = 'HUB'
AND r.qtde_portas > 12
AND e.temp_gar_eqpto = 12
AND e.dt_fornec_eqpto < (CURRENT_DATE - INTERVAL '1 YEAR')
ORDER BY 1;




                         SQL Básico – Prof. Antonio Guardado - 052012

Contenu connexe

Tendances (10)

Sql linguagem
Sql linguagemSql linguagem
Sql linguagem
 
Funções de grupo, agrupamentos e pesquisa em
Funções de grupo, agrupamentos e pesquisa emFunções de grupo, agrupamentos e pesquisa em
Funções de grupo, agrupamentos e pesquisa em
 
Formulas excel
Formulas excelFormulas excel
Formulas excel
 
Formulas excel
Formulas excelFormulas excel
Formulas excel
 
Apostila formulas excel
Apostila formulas excelApostila formulas excel
Apostila formulas excel
 
Apostila excel-avancado-senac
Apostila excel-avancado-senacApostila excel-avancado-senac
Apostila excel-avancado-senac
 
apostila-de-sql
apostila-de-sqlapostila-de-sql
apostila-de-sql
 
Apostila de sql
Apostila de sqlApostila de sql
Apostila de sql
 
Formulas excel
Formulas excelFormulas excel
Formulas excel
 
Apostila Excel
Apostila ExcelApostila Excel
Apostila Excel
 

Similaire à Sql basico postgresql_v12

Similaire à Sql basico postgresql_v12 (16)

Consultas SQL
Consultas SQLConsultas SQL
Consultas SQL
 
Um pouco sobre sql
Um pouco sobre sqlUm pouco sobre sql
Um pouco sobre sql
 
Aula 300309
Aula 300309Aula 300309
Aula 300309
 
Apostila de sql
Apostila de sqlApostila de sql
Apostila de sql
 
MySQL Query Optimization
MySQL Query OptimizationMySQL Query Optimization
MySQL Query Optimization
 
Aula03 - BDII - Comsulta Básica, Consultas com Funções e Agregação.pdf
Aula03 - BDII - Comsulta Básica, Consultas com Funções e Agregação.pdfAula03 - BDII - Comsulta Básica, Consultas com Funções e Agregação.pdf
Aula03 - BDII - Comsulta Básica, Consultas com Funções e Agregação.pdf
 
Aula1
Aula1Aula1
Aula1
 
Aula 12 banco de dados
Aula 12   banco de dadosAula 12   banco de dados
Aula 12 banco de dados
 
Dicas oracle sql
Dicas oracle sqlDicas oracle sql
Dicas oracle sql
 
Sql junções
Sql junçõesSql junções
Sql junções
 
Excel Intermediário
Excel IntermediárioExcel Intermediário
Excel Intermediário
 
BD I - Aula 08 A - Algebra Relacional
BD I - Aula 08 A - Algebra RelacionalBD I - Aula 08 A - Algebra Relacional
BD I - Aula 08 A - Algebra Relacional
 
Apostila excel avançado
Apostila excel avançadoApostila excel avançado
Apostila excel avançado
 
TOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQLTOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQL
 
Junções e subconsultas
Junções e subconsultasJunções e subconsultas
Junções e subconsultas
 
Base de Dados Consultas Aninhadas.pptx
Base de Dados Consultas Aninhadas.pptxBase de Dados Consultas Aninhadas.pptx
Base de Dados Consultas Aninhadas.pptx
 

Sql basico postgresql_v12

  • 1. 1 Introdução ao PostgreSQL 1-Comandos DML – Data Manipulation Language Comandos 1.1 - Comando Select Extraído da Documentação do PostgreSQL 8.0.0 Projeto de Tradução para o Português do Brasil (http://sourceforge.net/projects/pgdocptbr/) The PostgreSQL Global Development Group Copyright © 1996-2005 por The PostgreSQL Global Development Group 2005 Tradução de Halley Pacheco de Oliveira SINTAXE : SELECT [ ALL | DISTINCT [ ON ( expressão [, ...] ) ] ] * | expressão [ AS nome_de_saída ] [, ...] [ FROM item_do_from [, ...] ] [ WHERE condição ] [ GROUP BY expressão [, ...] ] [ HAVING condição [, ...] ] [ { UNION | INTERSECT | EXCEPT } [ ALL ] seleção ] [ ORDER BY expressão [ ASC | DESC | USING operador ] [, ...] ] [ LIMIT { contador | ALL } ] [ OFFSET início ] [ FOR UPDATE [ OF nome_da_tabela [, ...] ] ] onde item_do_from pode ser um entre: [ ONLY ] nome_da_tabela [ * ] [ [ AS ] aliás [ ( aliás_de_coluna [, ...] ) ] ] ( seleção ) [ AS ] aliás [ ( aliás_d aliás_de_coluna [, ...] ) ] nome_da_função ( [ argumento [, ...] ] ) [ AS ] aliás [ ( aliás_de_coluna [, ...] | definição_de_coluna [, ...] ) ] nome_da_função ( [ argumento [, ...] ] ) AS ( definição_de_coluna [, ...] ) item_do_from [ NATURAL ] tipo_de_junção item_do_from [ ON condição_de_junção | USING ( coluna_de_junção [, ...] ) ] SQL Básico – Prof. Antonio Guardado - 052012
  • 2. 2 Descrição O comando SELECT retorna linhas de uma ou mais tabelas. O processamento geral do comando SELECT está descrito abaixo: 1. Todos os elementos da lista FROM são computados; cada elemento na lista FROM é uma tabela real ou virtual. Quando é especificado mais de um elemento na lista FROM, é feita uma junção cruzada entre estes elementos (Consulte a Cláusula FROM abaixo). 2. Se for especificada a cláusula WHERE, todas as linhas que não satisfazem a condição são eliminadas da saída (Consulte a Cláusula WHERE abaixo). 3. Se for especificada a cláusula GROUP BY, a saída é dividida em grupos de linhas que correspondem a um ou mais valores. Se a cláusula HAVING estiver presente, são eliminados os grupos que não satisfazem à condição especificada (Consulte a Cláusula GROUP BY e a Cláusula HAVING abaixo). 4. As linhas de saída reais são computadas utilizando as expressões de saída do comando SELECT para cada linha selecionada (Consulte a Lista do SELECT abaixo). 5. Usando os operadores UNION, INTERSECT e EXCEPT podem ser combinadas as saídas de vários comandos SELECT para formar um único conjunto de resultados. O operador UNION retorna todas as linhas presentes em um ou nos dois conjuntos de resultados. O operador INTERSECT retorna todas as linhas presentes nos dois conjuntos de resultados. O operador EXCEPT retorna as linhas presentes no primeiro conjunto de resultados mas não no segundo. Em todos estes três casos as linhas duplicadas são eliminadas, a menos que ALL seja especificado (Consulte a Cláusula UNION, a Cláusula INTERSECT e Cláusula EXCEPT abaixo). 6. Se for especificada a cláusula ORDER BY, as linhas retornadas são classificadas segundo a ordem especificada. Se a cláusula ORDER BY não for especificada, as linhas são retornadas na ordem em que o sistema considerar mais rápido de produzir (Consulte a Cláusula ORDER BY abaixo). 7. A cláusula DISTINCT remove do resultado as linhas duplicadas 1 2 . A cláusula DISTINCT ON remove as linhas que correspondem a todas as expressões especificadas. A cláusula ALL (o padrão) retorna todas as linhas candidatas, incluindo as duplicadas (Consulte a Cláusula DISTINCT abaixo). 8. Se for especificada a cláusula LIMIT ou a cláusula OFFSET, o comando SELECT retorna somente um subconjunto das linhas do resultado (Consulte a Cláusula LIMIT abaixo) 9. A cláusula FOR UPDATE faz o comando SELECT bloquear as linhas selecionadas contra atualizações concorrentes (Consulte a Cláusula FOR UPDATE abaixo) É necessário possuir o privilégio SELECT na tabela para poder ler seus valores. A utilização de FOR UPDATE requer também o privilégio UPDATE. Parâmetros Cláusula FROM A cláusula FROM especifica uma ou mais tabelas fonte para o comando SELECT. Se várias fontes forem especificadas, o resultado será o produto cartesiano (junção cruzada) de todas as fontes, mas normalmente são incluídas condições de qualificação para restringir as linhas retornadas a um pequeno subconjunto do produto cartesiano. A cláusula FROM pode conter os seguintes elementos: nome_da_tabela O nome (opcionalmente qualificado pelo esquema) de uma tabela ou de uma visão existente. Se a cláusula ONLY for especificada, somente esta tabela será varrida. Se a cláusula ONLY não for especificada, esta tabela e todas as suas tabelas descendentes (se existirem) serão varridas. Pode ser anexado um * ao nome da tabela para indicar que as tabelas descendentes devem ser varridas, mas na versão corrente este é o comportamento padrão; nas versões anteriores a 7.1 o comportamento padrão era ONLY. O comportamento padrão pode ser modificado mudando o valor da opção de configuração sql_inheritance. SQL Básico – Prof. Antonio Guardado - 052012
  • 3. 3 aliás Um nome substituto para o item da cláusula FROM contendo o aliás. O aliás é utilizado para abreviar, ou para eliminar ambigüidade em auto-junções (onde a mesma tabela é varrida várias vezes). Quando se fornece um aliás, o nome verdadeiro da tabela ou da função fica totalmente escondido; se, por exemplo, for declarado FROM foo AS f, o restante do comando SELECT deve fazer referência a este item do FROM como f, e não como foo. Se for escrito um aliás, também pode ser escrita uma lista de aliases de coluna para fornecer nomes substitutos para uma ou mais colunas da tabela. seleção Pode haver sub-SELECT na cláusula FROM. Atua como se sua saída fosse criada como uma tabela temporária pela duração deste único comando SELECT. Deve ser observado que o sub-SELECT deve estar entre parênteses, e que deve ser especificado um aliás para o mesmo. nome_da_função Podem estar presentes na cláusula FROM chamadas de função (É especialmente útil no caso das funções que retornam um conjunto de resultados, mas pode ser usada qualquer função). Atua como se a sua saída fosse criada como uma tabela temporária pela duração deste único comando SELECT. Também pode ser utilizado um aliás. Se for escrito um aliás, também pode ser escrita uma lista de aliases de coluna para fornecer nomes substitutos para um ou mais atributos do tipo composto retornado pela função. Se a função tiver sido definida como retornando o tipo de dado record então deve estar presente um aliás, ou a palavra chave AS seguida por uma lista de definições de coluna na forma ( nome_de_coluna tipo_de_dado [, ... ] ). A lista de definições de coluna deve corresponder ao número e tipo reais das colunas retornadas pela função. tipo_de_junção Um entre • [ INNER ] JOIN • LEFT [ OUTER ] JOIN • RIGHT [ OUTER ] JOIN • FULL [ OUTER ] JOIN • CROSS JOIN Para os tipos de junção INNER e OUTER deve ser especificada uma condição de junção designando exatamente um entre NATURAL, ON condição_de_junção ou USING (coluna_de_junção [, ...]). Veja abaixo o significado. Para CROSS JOIN, nenhuma destas cláusulas pode estar presente. A cláusula JOIN combina dois itens da cláusula FROM. Se for necessário devem ser utilizados parênteses para determinar a ordem de aninhamento. Na ausência de parênteses, a cláusula JOIN aninha da esquerda para a direita. Em todos os casos a cláusula JOIN tem nível de precedência superior ao das vírgulas que separam os itens da cláusula FROM. CROSS JOIN e INNER JOIN produzem um produto cartesiano simples, o mesmo resultado obtido listando os dois itens no nível superior da cláusula FROM, mas restrito pela condição de junção (se houver). CROSS JOIN é equivalente a INNER JOIN ON (TRUE), ou seja, nenhuma linha é removida pela qualificação. Estes tipos de junção são apenas uma notação conveniente, uma vez que não fazem nada que não poderia ser feito usando simplesmente FROM e WHERE. LEFT OUTER JOIN retorna todas as linhas presentes no produto cartesiano qualificado (ou seja, todas as linhas combinadas que passam pela sua condição de junção), mais uma cópia de cada linha da tabela à esquerda para a qual não há linha na tabela à direita que passe pela condição de junção. As linhas da tabela à esquerda são estendidas por toda a largura da tabela de junção, inserindo valores nulos para as colunas da tabela à direita. Deve ser observado que somente a condição da própria cláusula JOIN é considerada ao decidir quais linhas possuem correspondência. As condições externas são aplicadas depois. SQL Básico – Prof. Antonio Guardado - 052012
  • 4. 4 De forma inversa, RIGHT OUTER JOIN retorna todas as linhas da junção, mais uma linha para cada linha da tabela à direita sem correspondência (estendida com nulos à esquerda). É apenas uma notação conveniente, uma vez que pode ser convertido em LEFT OUTER JOIN trocando as entradas à direita e à esquerda. FULL OUTER JOIN retorna todas as linhas da junção, mais uma linha para cada linha da tabela à esquerda sem correspondência, (estendida com nulos à direita), mais uma linha para cada linha da tabela à direita sem correspondência (estendida com nulos à esquerda). ON condição_de_junção A condição_de_junção é uma expressão que resulta em um valor do tipo boolean (semelhante à cláusula WHERE) que especifica quais linhas da junção são consideradas correspondentes. USING (coluna_de_junção [, ...]) A cláusula com a forma USING ( a, b, ... ) é uma abreviação de ON tabela_à_esquerda.a = tabela_à_direita.a AND tabela_à_esquerda.b = tabela_à_direita.b .... USING também implica que somente será incluída na saída da junção uma de cada par de colunas equivalentes, e não as duas. NATURAL NATURAL é uma forma abreviada para a lista USING mencionando todas as colunas das duas tabelas que possuem o mesmo nome. Cláusula WHERE A cláusula opcional WHERE possui a forma geral WHERE condição onde condição é uma expressão que produz um resultado do tipo boolean 5 . Todas as linhas que não satisfazem a esta condição são eliminadas da saída. A linha satisfaz a condição se retorna verdade quando os valores reais da linha são colocados no lugar das variáveis que os referenciam. Cláusula GROUP BY A cláusula opcional GROUP BY possui a forma geral GROUP BY expressão [, ...] A cláusula GROUP BY condensa em uma única linha todas as linhas selecionadas que compartilham os mesmos valores para as expressões de agrupamento. A expressão pode ser o nome de uma coluna da entrada, ou o nome ou o número ordinal de uma coluna da saída (lista de itens do SELECT), ou uma expressão arbitrária formada por valores das colunas da entrada. Havendo ambigüidade, o nome na cláusula GROUP BY será interpretado como sendo o nome da coluna da entrada, e não o nome da coluna da saída. As funções de agregação, caso sejam usadas, são computadas entre todas as linhas que constituem cada grupo, produzindo um valor separado para cada grupo (enquanto sem GROUP BY, uma agregação produz um único valor computado entre todas as linhas selecionadas). Quando GROUP BY está presente, não é válido a lista de expressões do SELECT fazer referência a colunas não agrupadas, exceto dentro das funções de agregação, uma vez que haveria mais de um valor possível retornado para uma coluna não agrupada. Cláusula HAVING A cláusula opcional HAVING possui a forma geral HAVING condição onde condição é especificada da mesma forma que na cláusula WHERE. A cláusula HAVING elimina os grupos de linhas que não satisfazem a condição. A cláusula HAVING é diferente da cláusula WHERE: WHERE filtra individualmente as linhas antes do GROUP BY ser aplicado, enquanto HAVING filtra grupos de linhas criados pelo GROUP BY. SQL Básico – Prof. Antonio Guardado - 052012
  • 5. 5 Cada coluna referenciada na condição deve referenciar sem ambigüidade uma coluna de agrupamento, a menos que a referência apareça dentro de uma função de agregação. A presença da cláusula HAVING torna a consulta uma consulta agrupada, mesmo que não exista a cláusula GROUP BY. É o mesmo que acontece quando a consulta contém funções de agregação mas não possui a cláusula GROUP BY. Todas as linhas selecionadas são consideradas como formando um único grupo, e tanto a lista do SELECT quanto a cláusula HAVING somente podem fazer referência a colunas da tabela dentro de funções de agregação. Este tipo de consulta gera uma única linha se a condição da cláusula HAVING for verdade, ou nenhuma linha se não for verdade. Lista do SELECT A lista do SELECT (entre as palavras chave SELECT e FROM) especifica expressões que formam as linhas de saída do comando SELECT. As expressões podem (e geralmente fazem) referenciar colunas computadas na cláusula FROM. Usando a cláusula AS nome_de_saída, pode ser especificado outro nome para uma coluna da saída. Este nome é usado, principalmente, como rótulo da coluna mostrada. Também pode ser usado para fazer referência ao valor da coluna nas cláusulas ORDER BY e GROUP BY, mas não nas cláusulas WHERE e HAVING; nestas, a expressão deve ser escrita. Em vez da expressão pode ser escrito * na lista de saída, como abreviação para todas as colunas das linhas selecionadas. Também pode ser escrito nome_da_tabela.* como abreviação das colunas provenientes apenas desta tabela. Cláusula UNION A cláusula UNION possui a forma geral comando_de_seleção UNION [ ALL ] comando_de_seleção onde comando_de_seleção é qualquer comando SELECT sem as cláusulas ORDER BY, LIMIT e FOR UPDATE (as cláusulas ORDER BY e LIMIT podem ser aplicadas a uma subexpressão se esta estiver entre parênteses. Sem os parênteses, estas cláusulas são consideradas como aplicadas ao resultado da cláusula UNION, e não à sua expressão de entrada à direita). O operador UNION computa o conjunto formado pela união das linhas retornadas pelos comandos SELECT envolvidos. Uma linha está presente no conjunto união dos dois conjuntos de resultados se estiver presente em pelo menos um destes dois conjuntos de resultados. Os dois comandos SELECT que representam os operandos diretos do operador UNION devem produzir o mesmo número de colunas, e as colunas correspondentes devem possuir tipos de dado compatíveis. O resultado do operador UNION não contém nenhuma linha duplicada, a menos que a opção ALL seja especificada. ALL não permite a eliminação das duplicatas; portanto, UNION ALL geralmente é significativamente mais rápido do que UNION; deve ser utilizado ALL se possível. Havendo vários operadores UNION no mesmo comando SELECT, estes são avaliados da esquerda para a direita, a menos que os parênteses indiquem o contrário. Atualmente não pode ser especificado FOR UPDATE nem para o resultado do operador UNION nem para qualquer entrada do operador UNION. Cláusula INTERSECT A cláusula INTERSECT possui a forma geral comando_de_seleção INTERSECT [ ALL ] comando_de_seleção onde comando_de_seleção é qualquer comando SELECT sem as cláusulas ORDER BY, LIMIT e FOR UPDATE. O operador INTERSECT computa o conjunto formado pela interseção das linhas retornadas pelos comandos SELECT envolvidos. Uma linha está na interseção dos dois conjuntos de resultados se estiver presente nos dois conjuntos de resultados. SQL Básico – Prof. Antonio Guardado - 052012
  • 6. 6 O resultado do operador INTERSECT não contém nenhuma linha duplicada, a menos que a opção ALL seja especificada. Usando ALL, uma linha contendo m duplicatas na tabela à esquerda e n duplicatas na tabela à direita, aparece min(m,n) vezes no conjunto de resultados. Havendo vários operadores INTERSECT no mesmo comando SELECT, estes são avaliados da esquerda para a direita, a menos que os parênteses indiquem outra ordem. O operador INTERSECT tem nível de precedência superior ao do operador UNION, ou seja, A UNION B INTERSECT C é lido como A UNION (B INTERSECT C). Atualmente a cláusula FOR UPDATE não pode ser especificada para o resultado do operador INTERSECT, nem em qualquer entrada do operador INTERSECT. Cláusula EXCEPT A cláusula EXCEPT possui a forma geral comando_de_seleção EXCEPT [ ALL ] comando_de_seleção onde comando_de_seleção é qualquer comando SELECT sem as cláusulas ORDER BY, LIMIT e FOR UPDATE. O operador EXCEPT computa o conjunto de linhas presentes no resultado do comando SELECT à esquerda, mas que não estão presentes no resultado do comando à direita. O resultado do operador EXCEPT não contém nenhuma linha duplicada, a menos que a cláusula ALL seja especificada. Usando ALL, uma linha que possua m duplicatas na tabela à esquerda e n duplicatas na tabela à direita aparece max(m-n,0) vezes no conjunto de resultados. Havendo vários operadores EXCEPT no mesmo comando SELECT, estes são processados da esquerda para a direita, a menos que os parênteses especifiquem outra ordem. O operador EXCEPT possui o mesmo nível de precedência do operador UNION. Atualmente a cláusula FOR UPDATE não pode ser especificada para o resultado do operador EXCEPT, nem em nenhuma entrada do operador EXCEPT. Cláusula ORDER BY A cláusula opcional ORDER BY possui a forma geral ORDER BY expressão [ ASC | DESC | USING operador ] [, ...] onde expressão pode ser o nome ou o número ordinal de uma coluna da saída (item da lista do SELECT), ou pode ser uma expressão arbitrária formada por valores das colunas da entrada. A cláusula ORDER BY faz as linhas do resultado serem classificadas de acordo com as expressões especificadas. Se duas linhas são iguais de acordo com a expressão mais à esquerda, estas são comparadas de acordo com a próxima expressão, e assim por diante. Se forem iguais de acordo com todas as expressões especificadas, são retornadas em uma ordem dependente da implementação. O número ordinal se refere à posição ordinal (esquerda para a direita) da coluna do resultado. Esta funcionalidade torna possível definir uma ordenação baseada em uma coluna que não possui um nome único. Isto nunca é absolutamente necessário, porque sempre é possível atribuir um nome à coluna do resultado usando a cláusula AS. Também é possível utilizar expressões arbitrárias na cláusula ORDER BY, incluindo colunas que não aparecem na lista de resultado do SELECT. Portanto, o seguinte comando é válido: SELECT nome FROM distribuidores ORDER BY codigo; A limitação desta funcionalidade é que a cláusula ORDER BY aplicada ao resultado de UNION, INTERSECT ou EXCEPT pode especificar apenas nomes de coluna ou números, mas não expressões. Se a expressão no ORDER BY for simplesmente um nome correspondendo tanto ao nome de uma coluna do resultado quanto ao nome de uma coluna da entrada, o ORDER BY interpreta como sendo o nome da coluna do resultado. Esta é a escolha oposta à feita pelo GROUP BY na mesma situação. Esta incoerência existe para ficar compatível com o padrão SQL. Pode ser adicionada, opcionalmente, a palavra chave ASC (ascendente) ou DESC (descendente) após cada expressão na cláusula ORDER BY. Se nenhuma das duas for SQL Básico – Prof. Antonio Guardado - 052012
  • 7. 7 especificada, ASC é assumido por padrão. Como alternativa, pode ser especificado o nome de um operador de ordenação específico na cláusula USING. Geralmente ASC é equivalente a USING < e geralmente DESC é equivalente a USING > (Mas o criador de um tipo de dado definido pelo usuário pode definir exatamente qual é a ordem de classificação padrão, podendo corresponder a operadores com outros nomes). O valor nulo é classificado em uma posição mais alta do que qualquer outro valor. Em outras palavras, na ordem de classificação ascendente os valores nulos ficam no final, e na ordem de classificação descendente os valores nulos ficam no início. Dados na forma de cadeias de caracteres são classificados de acordo com a ordem de classificação estabelecida quando o agrupamento de bancos de dados foi inicializado. Cláusula DISTINCT Se for especificada a cláusula DISTINCT, todas as linhas duplicadas são removidas do conjunto de resultados (é mantida uma linha para cada grupo de duplicatas). A cláusula ALL especifica o oposto: todas as linhas são mantidas; este é o padrão. DISTINCT ON ( expressão [, ...] ) preserva apenas a primeira linha de cada conjunto de linhas onde as expressões fornecidas forem iguais. As expressões em DISTINCT ON são interpretadas usando as mesmas regras da cláusula ORDER BY (veja acima). Deve ser observado que a “primeira linha” de cada conjunto é imprevisível, a menos que seja utilizado ORDER BY para garantir que a linha desejada apareça na frente. Por exemplo, SELECT DISTINCT ON (local) local, data, condição FROM tbl_condicao_climatica ORDER BY local, data DESC; mostra o relatório de condição climática mais recente para cada local, mas se não tivesse sido usado ORDER BY para obrigar a ordem descendente dos valores da data para cada local, teria sido obtido um relatório com datas imprevisíveis para cada local. As expressões em DISTINCT ON devem corresponder às expressões mais à esquerda no ORDER BY. A cláusula ORDER BY normalmente contém expressões adicionais para determinar a precedência desejada das linhas dentro de cada grupo DISTINCT ON. Cláusula LIMIT A cláusula LIMIT consiste em duas subcláusulas independentes: LIMIT { contador | ALL } OFFSET início onde contador especifica o número máximo de linhas a serem retornadas, enquanto início especifica o número de linhas a serem puladas antes de começar a retornar as linhas. Quando as duas são especificadas, as início primeiras linhas são puladas antes de começar a contar as contador linhas a serem retornadas. Ao se usar a cláusula LIMIT é uma boa idéia usar também a cláusula ORDER BY para colocar as linhas do resultado dentro de uma ordem única. Caso contrário será retornado um subconjunto imprevisível de linhas da consulta — pode-se estar querendo receber da décima a vigésima linha, mas da décima a vigésima em que ordem? Não é possível saber qual será a ordem, a não ser que ORDER BY seja especificado. O planejador de comandos leva LIMIT em consideração ao gerar o plano da consulta, por isso é muito provável serem obtidos planos diferentes (produzindo linhas em ordens diferentes) dependendo do que for especificado para LIMIT e OFFSET. Portanto, utilizar valores diferentes para LIMIT/OFFSET para selecionar subconjuntos diferentes do resultado da consulta produz resultados inconsistentes, a não ser que seja exigida uma ordem previsível para os resultados utilizando ORDER BY. Isto não está errado; isto é uma conseqüência direta do fato do SQL não prometer retornar os resultados de uma consulta em nenhuma ordem específica, a não ser que ORDER BY seja utilizado para impor esta ordem. SQL Básico – Prof. Antonio Guardado - 052012
  • 8. 8 1.2 – Funções Internas com o Comando Select 1.2.1 – Funções de Strings Concatenação de Strings - dois || (pipes) SQL> SELECT 'ae' || 'io' || 'u' AS vogais ; Quantidade de Caracteres de String SQL> SELECT CHAR_LENGTH ('Postgresql'); - -Retorna 10 SQL> SELECT LENGTH ('Database'); - - Retorna 8 Converter para minúsculas SQL> SELECT LOWER ('POSTGRESQL'); Converter para maiúsculas SQL> SELECT UPPER ('postgresql'); Posição de caractere SQL> SELECT POSITION ('@' IN 'guardado@gmail.com'); -- Retorna 8 SQL> SELECT STRPOS ('Postgresql' ,’sql'); - - Retorna 8 Substring SUBSTRING(string [FROM inteiro] [FOR inteiro]) SQL> SELECT SUBSTRING ('PostgreSQL' FROM 8 FOR 10); - - Retorna SQL SUBSTRING(string FROM padrão); SQL> SELECT SUBSTRING ('PostgreSQL' FROM '.......'); - - Retorna Postgre SQL> SELECT SUBSTRING ('PostgreSQL' FROM '...$'); - -Retorna SQL Primeiros ....... e últimos ...$ Ou SUBSTR ( 'string', inicio, quantidade); SQL> SELECT SUBSTR ('PostgreSQL', 4, 3); - - Retorna gre Substituir todos os caracteres semelhantes TRANSLATE (string, velho, novo); SQL> SELECT TRANSLATE ('Brasil', 'il', 'ão'); - - Retorna Brasão SQL> SELECT TRANSLATE ('Brasileiro...leiro', 'eiro', 'eira'); Remover Espaços de Strings SQL> SELECT TRIM(' SQL - PADRÃO '); Repetir uma string n vezes SQL> SELECT REPEAT('SQL-', 3); - - Retorna SQL-SQL-SQL Sobrescrever Substring em string SQL> SELECT REPLACE ('Postgresql', 'sql', 'SQL'); - - Retorna PostgreSQL Iniciais Maiúsculas INITCAP(text) - INITCAP ('olá mundo') - - Olá Mundo Remover Espaços em Branco TRIM ([leading | trailing | both] [characters] from string)- remove caracteres da direita e da esquerda. TRIM (both 'b' from 'babacatebbbb'); - - abacate RTRIM (string text, chars text) - Remove os caracteres chars da direita (default é espaço) RTRIM('removarrrr', 'r') - - remova SQL Básico – Prof. Antonio Guardado - 052012
  • 9. 9 LTRIM - (string text, chars text) - Remove os caracteres chars da esquerda LTRIM('abssssremova', 'abs') - - remova Like e % SELECT * FROM FRIENDS WHERE LASTNAME LIKE 'M%'; O ILIKE é case INsensitive e o LIKE case sensitive. ~~ equivale ao LIKE ~~* equivale equivale ao ILIKE !~~ equivale ao NOT LIKE !~~* equivale equivale ao NOT ILIKE ... LIKE '[4-6]_6%' -- Pegar o primeiro sendo de 4 a 6, -- o segundo qualquer dígito, -- o terceiro sendo 6 e os demais quaisquer % similar a * _ similar a ? (de arquivos no DOS) 1.2.2 – Funções de Data/Hora Operações com datas: timestamp '2001-09-28 01:00' + interval '23 hours' -> timestamp '2001-09-29 00:00' date '2001-09-28' + interval '1 hour' -> timestamp '2001-09-28 01:00' date '01/01/2006' – date '31/01/2006' time '01:00' + interval '3 hours'time -> '04:00' interval '2 hours' - time '05:00' -> time '03:00:00' Função age (retorna Interval) - Diferença entre datas age(timestamp)interval (Subtrai de hoje) age(timestamp '1957-06-13') -> 43 years 8 mons 3 days age(timestamp, timestamp)interval Subtrai os argumentos age('2001-04-10', timestamp '1957-06-13') -> 43 years 9 mons 27 days Função extract (retorna double) Extrai parte da data: ano, mês, dia, hora, minuto, segundo. SQL> SELECT EXTRACT(YEAR FROM AGE('2001-04-10', TIMESTAMP '1957-06-13')) SQL> SELECT EXTRACT(MONTH FROM AGE('2001-04-10', TIMESTAMP '1957-06-13')) SQL> SELECT EXTRACT(DAY FROM AGE('2001-04-10', TIMESTAMP '1957-06-13')) Data e Hora atuais (retornam data ou hora) SQL> SELECT CURRENT_DATE; SQL> SELECT CURRENT_TIME; SQL> SELECT CURRENT_TIME(0); SQL> SELECT CURRENT_TIMESTAMP; SQL> SELECT CURRENT_TIMESTAMP(0); Obtendo o dia do mês: SQL> SELECT DATE_PART('DAY', CURRENT_TIMESTAMP) AS Dia; Somar dias e horas a uma data: SQL> SELECT CAST('06/04/2006' AS DATE) + INTERVAL '27 DAYS' AS Data; Função now (retorna timestamp with zone) NOW() - Data e hora corrente (timestamp with zone); Não usar em campos somente timestamp. SQL Básico – Prof. Antonio Guardado - 052012
  • 10. 10 Função date_part (retorna double) SQL> SELECT DATE_PART('day', TIMESTAMP '2001-02-16 20:38:40'); Resultado: 16 (day é uma string, diferente de extract) Função date_trunc (retorna timestamp) SQL> SELECT DATE_TRUNC('year', TIMESTAMP '2001-02-16 20:38:40'); Retorna 2001-02-16 00:00:00 Convertendo (CAST) SQL> SELECT TO_DATE('1983-07-18', 'YYYY-MM-DD') SQL> SELECT TO_DATE('19830718', 'YYYYMMDD') Função timeofday (retorna texto) SQL> SELECT TIMEOFDAY() -> Fri Feb 24 10:07:32.000126 2006 BRT Interval INTERVAl [ (p) ] TO_CHAR(INTERVAl '15h 2m 12s', 'HH24:MI:SS') DATE '2001-09-28' + INTERVAL '1 hour' INTERVAL '1 day' + INTERVAL '1 hour' INTERVAL '1 day' - INTERVAL '1 hour' 900 * INTERVAL '1 second' INTERVAL trabalha com as unidades: SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, YEAR, DECADE, CENTURY, MILLENIUM ou abreviaturas ou plurais destas unidades. Se informado sem unidades '13 10:38:14' será devidamente interpretado '13 days 10 hours 38 minutes 14 seconds'. CURRENTE_DATE - INTERVAL '1' day; TO_TIMESTAMP('2006-01-05 17:56:03', 'YYYY-MM-DD HH24:MI:SS') 1.2.3 - Formatação de Tipos de Dados TO_CHAR - Esta função deve ser evitada, pois será descontinuada. TO_DATE DATE TO_DATE(text, text); Recebe dois parâmetros text e retorna date. Um dos parâmetros é a data e o outro o formato. SQL> SELECT TO_DATE('29032006','DDMMYYYY'); - Retorna 2006-03-29 TO_TIMESTAMP tmt TO_TIMESTAMP(text,text) - Recebe dois text e retorna timestamp with zone SQL> SELECT TO_TIMESTAMP('29032006 14:23:05','DDMMYYYY HH:MI:SS'); - Retorna 2006-03-29 14:23:05+00 TO_NUMBER numeric TO_NUMBER(text,text) SQL> SELECT TO_NUMBER('12,454.8-', '99G999D9S'); Retorna -12454.8 SQL> SELECT TO_NUMBER('12,454.8-', '99G999D9'); Retorna 12454.8 SQL> SELECT TO_NUMBER('12,454.8-', '99999D9'); Retorna 12454 1.2.4 - Conversão Explícita de Tipos (CAST) CAST ( expressão AS tipo ) AS apelido; -- Sintaxe SQL ANSI Outra forma: Tipo ( expressão ); SQL Básico – Prof. Antonio Guardado - 052012
  • 11. 11 Exemplo: SQL> SELECT DATE '10/05/2002' - DATE '10/05/2001'; -- Retorna a quantidade de dias - -entre as duas datas Para este tipo de conversão devemos: Usar float8 ao invés de double precision; Usar entre aspas alguns tipos como interval, time e timestamp Obs.: aplicações portáveis devem evitar esta forma de conversão e em seu lugar usar o CAST explicitamente. A função CAST() é utilizada para converter explicitamente tipos de dados em outros. SQL> SELECT CAST(2 AS double precision) ^ CAST(3 AS double precision) AS "exp"; SQL> SELECT ~ CAST('20' AS int8) AS "negativo"; - Retorna -21 SQL> SELECT ROUND(CAST (4 AS numeric), 4); - Retorna 4.0000 SQL> SELECT SUBSTR(CAST (1234 AS text), 3); SQL> SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL); 1.2.5- Funções Diversas SQL> SELECT CURRENT_DATABASE(); SQL> SELECT CURRENT_SCHEMA(); SQL> SELECT CURRENT_SCHEMA(BOOLEAN); SQL> SELECT CURRENT_USER; SQL> SELECT SESSION_USER; SQL> SELECT VERSION(); SQL> SELECT CURRENT_SETTING('DATESTYLE'); SELECT HAS_TABLE_PRIVILEGE('usuario','tabela','privilegio'); SQL> SELECT HAS_TABLE_PRIVILEGE('postgres','nulos','insert'); - - Retorna: t SQL> SELECT HAS_DATABASE_PRIVILEGE('postgres','testes','create'); - - Retorna: t SQL> SELECT HAS_SCHEMA_PRIVILEGE('postgres','public','create'); - - Retorna: t SQL> SELECT relname FROM pg_class WHERE pg_table_is_visible(oid); 1.3 – Exemplos de SELECT com dados 1) Mostrar todos os dados dos equipamentos SQL> SELECT * FROM equipamento ; 2) Mostrar o modelo e fabricante dos equipamentos SQL> SELECT modelo_eqpto, fabricante_eqpto FROM equipamento ; 3) Mostrar todos os dados dos softwares do fabricante 'Microsoft' SQL> SELECT * FROM software WHERE fabric_soft ilike '%microsoft' ; 4) Mostrar todos os dados dos equipamentos fornecidos hoje SQL> SELECT * FROM equipamento WHERE dt_fornec_eqpto = current_date ; SQL Básico – Prof. Antonio Guardado - 052012
  • 12. 12 5) Mostrar todos os dados dos equipamentos fornecidos neste mês SQL> SELECT * FROM equipamento WHERE extract ( month from dt_fornec_eqpto) = extract ( month from current_date ); 6) Mostrar todos os dados dos equipamentos do tipo Periféricos SQL> SELECT e.* , p.* FROM equipamento e,periferico p WHERE e.num_patrimonio=p.num_patr_perif ; SQL> SELECT e.num_patrimonio,e.num_serie,e.cod_forn_eqpto,e.modelo_eqpto,e.fabricante_eqpto, e.num_nota_fisc_eqpto,e.dt_fornec_eqpto,e.val_gar_eqpto,e.situacao, p.tipo_perif,p.desc_perif,p.caracteristicas FROM equipamento e,periferico p WHERE e.num_patrimonio=p.num_patr_perif ; 7) Mostrar todos os dados dos equipamentos do tipo Computador SQL> SELECT e.* , c.* FROM equipamento e,computador c WHERE e.num_patrimonio=c.num_patr_comp; SQL> SELECT e.num_patrimonio,e.num_serie,e.cod_forn_eqpto,e.modelo_eqpto,e.fabricante_eqpto, e.num_nota_fisc_eqpto,e.dt_fornec_eqpto,e.val_gar_eqpto,e.situacao, c.processador_comp,c.memoria_comp,c.capac_armaz_comp,c.velocidade_ghz FROM equipamento e,computador c WHERE e.num_patrimonio=c.num_patr_comp; 8) Mostrar todos os dados dos equipamentos do tipo Rede ordenados pelo patrimônio SQL> SELECT e.*, r.* FROM equipamento e,rede r WHERE e.num_patrimonio=r.num_patr_rede ORDER BY e.num_patrimonio ; SQL> SELECT e.num_patrimonio,e.num_serie,e.cod_forn_eqpto,e.modelo_eqpto,e.fabricante_eqpto, e.num_nota_fisc_eqpto,e.dt_fornec_eqpto,e.val_gar_eqpto,e.situacao, r.tipo_eqpto_rede,r.qtde_portas,r.velocidade_mbps FROM equipamento e,rede r WHERE e.num_patrimonio=r.num_patr_rede ORDER BY e.num_patrimonio ; SQL Básico – Prof. Antonio Guardado - 052012
  • 13. 13 9) Montar uma lista dos softwares instalados em cada equipamento do tipo Computador no seguinte formato : Número Patrimônio – Tipo Software – Número Licença – Data Instalação ordenado pela instalação mais recente SQL> SELECT i.num_patr_eqpto,s.tipo_soft,i.num_lic_inst,i.dt_inicio_inst FROM software s,instalacao i WHERE s.cod_soft=i.num_cod_soft ORDER BY i.dt_inicio_inst DESC; 10) Mostrar o Número de patrimônio , Número de Série, Número de Licença e marca dos equipamentos que têm softwares do tipo 'Office' instalados. SQL> SELECT i.num_patr_eqpto,e.num_serie,i.num_lic_inst,e.fabricante_eqpto FROM equipamento e,instalacao i,software s WHERE e.num_patrimonio=i.num_patr_eqpto AND i.num_cod_soft=s.cod_soft AND s.tipo_soft='office' ORDER BY 2 DESC, 1; 11) Montar uma lista de fornecimento dos equipamentos com 12 meses de garantia no formato : Número Patrimônio – Modelo – Data Fornecimento – Nome Fornecedor SQL> SELECT e.num_patrimonio,e.modelo_eqpto,e.dt_fornec_eqpto,f.nome_forn FROM equipamento e,fornecedor f WHERE e.cod_forn_eqpto=f.cod_forn AND e.temp_gar_eqpto= 12 ORDER BY 3 DESC, 1; 12) Montar uma lista de fornecimento dos softwares do tipo 'Sistema Operacional' com mais de 10 licenças no formato : Número Patrimônio – Modelo – Data Fornecimento – Nome Fornecedor SQL> SELECT i.num_patr_eqpto,e.modelo_eqpto,s.dt_fornec_soft,f.nome_forn FROM equipamento e,fornecedor f,software s,instalacao i WHERE s.cod_forn_soft=f.cod_forn AND s.cod_soft=i.num_cod_soft AND e.num_patrimonio=i.num_patr_eqpto AND s.tipo_soft ilike '%sistema operacional%' AND s.qtde_licenca_soft >=10 ORDER BY 4; 13) Mostrar os periféricos alocados nos equipamentos no formato : Número Patrimônio Eqpto – Modelo Eqpto – Número Patrimônio Periférico – Tipo Periférico – Data Início e Término alocação SQL> SELECT a.num_patr_comp_aloc,e.modelo_eqpto,p.num_patr_perif,p.tipo_perif,a.dt_ini_aloc, a.dt_ter_aloc FROM equipamento e,periferico p,alocacao a WHERE e.num_patrimonio=a.num_patr_comp_aloc AND p.num_patr_perif=a.num_patr_perif_aloc ORDER BY 2; SQL Básico – Prof. Antonio Guardado - 052012
  • 14. 14 14) Montar uma lista de todos os computadores com mais de 1GB de memória RAM que possuem softwares do tipo 'Ferramenta CASE' instalados no formato : Número Patrimônio – Processador – Memória RAM – Descrição Software- Versão- Número Licença – Data Instalação SQL> SELECT c.num_patr_comp,c.processador_comp,c.memoria_comp,s.desc_soft,s.versao_soft,i.n um_lic_inst,i.dt_inicio_inst FROM computador c,software s,instalacao i WHERE c.num_patr_comp=i.num_patr_eqpto AND s.cod_soft=i.num_cod_soft AND c.memoria_comp>1 AND s.tipo_soft ilike '%ferramenta case%' ORDER BY 1; 15) Mostrar todos os dados dos computadores com menos de 100 GB de capacidade de armazenamento que não têm instalado qualquer software da 'Microsoft' . SQL> SELECT e.num_patrimonio,e.num_serie,e.cod_forn_eqpto,e.modelo_eqpto,e.fabricante_eqpto, e.num_nota_fisc_eqpto,e.dt_fornec_eqpto,e.temp_gar_eqpto,e.situacao, c.processador_comp,c.memoria_comp,c.capac_armaz_comp,c.velocidade_ghz FROM equipamento e,computador c,instalacao i,software s WHERE e.num_patrimonio=c.num_patr_comp AND e.num_patrimonio=i.num_patr_eqpto AND s.cod_soft=i.num_cod_soft AND c.capac_armaz_comp < 100 AND s.fabric_soft!='microsoft'; 16) Montar uma lista de todos os equipamentos de rede do tipo 'HUB' com mais de 12 portas cujo tempo de garantia é de 12 meses e foram fornecidos há mais de uma ano no formato : Número Patrimônio – Qtde Portas – Data Fornecimento – Nome Fornecedor – Número Nota fiscal SQL> SELECT e.num_patrimonio, r.qtde_portas, e.dt_fornec_eqpto, f.nome_forn, e.num_nota_fisc_eqpto FROM equipamento e, rede r, fornecedor f WHERE f.cod_forn = e.cod_forn_eqpto AND e.num_patrimonio = r.num_patr_rede AND r.tipo_eqpto_rede = 'HUB' AND r.qtde_portas > 12 AND e.temp_gar_eqpto = 12 AND e.dt_fornec_eqpto < (CURRENT_DATE - INTERVAL '1 YEAR') ORDER BY 1; SQL Básico – Prof. Antonio Guardado - 052012