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