30
#03 Banco de Dados II 2015.2 Gustavo Sávio <[email protected]> 1

Banco II - PostgreSQL - Filtros

Embed Size (px)

Citation preview

#03

Banco de Dados II

2015.2 Gustavo Sávio <[email protected]> 1

Funções da SQL

SELECT <tuplas> FROM <tabela> LIMIT <n>SELECT <tuplas> FROM <tabela> LIMIT <n> OFFSET <m>

- A clausula LIMIT limita a quantidade deregistros (n) que serão retornados na consulta.

- A clausula OFFSET pula uma quantidade deregistros (n) antes que os mesmos sejam retornadosna consulta.

2

#CLAUSULAS LIMIT E OFFSET

Funções da SQLExibir o código, nome e o telefone dos três primeirosclientes cadastrados na empresa.

SELECT codigo, nome, fone FROM cliente LIMIT 3;

Resultado:

codigo | nome | fone--------+-----------------------+-----------

1 | Maria Helena Ferreira | 3225-69872 | Joao Paulo Correia | 3245-89993 | Larissa Maia | 3227-9622

3

#CLAUSULAS LIMIT E OFFSET

Funções da SQLExibir o código, nome e o telefone dos 2 primeirosclientes cadastrados na empresa ignorando os 3primeiros.

SELECT codigo, nome, fone FROM cliente LIMIT 2 OFFSET3;

Resultado:

codigo | nome | fone--------+----------------+-----------

4 | Marcos Andrade | 3338-21005 | LT Comercio | 3256-9981

4

#CLAUSULAS LIMIT E OFFSET

Funções da SQLSELECT DISTINCT <TUPLAS> FROM <TABELA>

A clausula DISTINCT elimina as linhas duplicadas queserão retornadas na consulta.

Exibir o nome de todos os clientes que já fizerampedido na empresa.

SELECT DISTINCT c.nome FROM Pedido p INNER JOIN Cliente c ON p.cliente = c.codigo

5

#CLAUSULAS DISTINCT E DISTINCT ON

Funções da SQLResultado sem DISTINCT:

nome-----------------------Joao Paulo CorreiaLT ComercioJR RepresentacoesLarissa MaiaMaria Helena FerreiraMarcos AndradeMaria Helena FerreiraJR RepresentacoesMaria Helena FerreiraMaria Helena FerreiraJR RepresentacoesMaria Helena FerreiraMarcos AndradeMarcos AndradeJR RepresentacoesMaria Helena FerreiraJR RepresentacoesJoao Paulo CorreiaJR RepresentacoesLT ComercioLarissa MaiaLarissa MaiaMaria Helena FerreiraJR RepresentacoesMarcos Andrade

(25 rows)

6

#CLAUSULAS DISTINCT E DISTINCT ON

Resultado:

nome-----------------------Joao Paulo CorreiaMaria Helena FerreiraLarissa MaiaLT ComercioJR RepresentacoesMarcos Andrade(6 rows)

Funções da SQLA clausula DISTINCT pode ser usada como parte doargumento, para eliminar as linhas repetidas,antes da aplicação das funções de agregação.

Exibir a quantidade de clientes que fizeramcompras.

SELECT COUNT (DISTINCT c.nome) FROM Pedido AS PINNER JOIN Cliente AS c ON p.cliente = c.codigo

Resultado: 6Sem DISTINCT: 25

7

#CLAUSULAS DISTINCT E DISTINCT ON

Funções da SQL

DISTINCT ON (expressão) preserva apenas a primeiralinha de cada conjunto de linhas onde asexpressões fornecidas forem iguais.

8

#CLAUSULAS DISTINCT E DISTINCT ON

Funções da SQLSELECT DISTINCT c.nome, p.cliente, p.vendedor FROMPedido AS P INNER JOIN Cliente AS c ON p.cliente =c.codigo order by c.nome, p.cliente;

nome | cliente | vendedor-----------------------+---------+----------Joao Paulo Correia | 2 | 1Joao Paulo Correia | 2 | 3JR Representacoes | 6 | 2JR Representacoes | 6 | 3JR Representacoes | 6 | 4Larissa Maia | 3 | 2Larissa Maia | 3 | 3LT Comercio | 5 | 1Marcos Andrade | 4 | 1Marcos Andrade | 4 | 2Marcos Andrade | 4 | 3Maria Helena Ferreira | 1 | 2Maria Helena Ferreira | 1 | 3Maria Helena Ferreira | 1 | 4

(14 rows)

9

#CLAUSULAS DISTINCT E DISTINCT ON

Funções da SQLSELECT DISTINCT ON(c.nome) c.nome, p.cliente,p.vendedor FROM Pedido AS p INNER JOIN Cliente ASc ON p.cliente = c.codigo order by c.nome,p.cliente;

nome | cliente | vendedor-----------------------+---------+----------Joao Paulo Correia | 2 | 3JR Representacoes | 6 | 4Larissa Maia | 3 | 3LT Comercio | 5 | 1Marcos Andrade | 4 | 1Maria Helena Ferreira | 1 | 4

(6 rows)

10

#CLAUSULAS DISTINCT E DISTINCT ON

Funções da SQL

Sintaxe:

SELECT <lista de colunas>FROM <tabela(s)>ORDER BY <coluna> [ASC] [DESC]

– O default é a ordenação ascendente (ASC).

11

#ORDENANDO RESULTADOS

Funções da SQLExibir código, nome e telefone de todos os clientes, emordem alfabética (nome do cliente).

SELECT codigo, nome, foneFROM ClienteORDER BY nome

codigo | nome | fone--------+-----------------------+-----------

2 | Joao Paulo Correia | 3245-89996 | JR Representacoes | 5841-98713 | Larissa Maia | 3227-96225 | LT Comercio | 3256-99814 | Marcos Andrade | 3338-21001 | Maria Helena Ferreira | 3225-6987

(6 rows)

12

#ORDENANDO RESULTADOS

Funções da SQLExibir código, nome, estado civil e data de nascimento de todosos funcionários. Ordene o resultado do funcionário mais novopara o mais velho.

SELECT codigo, nome, estCivil, dataNascFROM FuncionarioORDER BY dataNasc DESC

codigo | nome | estcivil | datanasc--------+--------------------+----------+---------------------

3 | Luiza Costa | C | 1980-04-04 00:00:001 | Joao da Silva | S | 1978-02-05 00:00:004 | Francisco da Silva | D | 1970-06-03 00:00:002 | Maria de Souza | C | 1970-01-01 00:00:005 | Carla Tavares | C | 1969-01-08 00:00:00

(5 rows)

13

#ORDENANDO RESULTADOS

Funções da SQLExibir código, nome e tipo de todos os produtos existentesna empresa, ordenados pelo tipo em ordem ascendente e pelonome do produto em ordem descendente.

SELECT P.codigo, T.nome AS Tipo, P.nome AS ProdutoFROM Produto P INNER JOIN Tipo T ON P.tipo = T.codigoORDER BY T.nome ASC, P.nome DESC;

codigo | tipo | produto--------+--------------+---------------------

7 | Alimentacaoo | Pizza Sadia1 | Cama | Toalhas Artex3 | Decoracaoo | Abajur Alist4 | Eletro | TV Plasma5 | Eletro | Liquidificador6 | Eletro | Computador Positivo2 | Lacticinios | Iogurte Nestle

(7 rows)

14

#ORDENANDO RESULTADOS

SQL – Filtrando DadosSELECT <lista de colunas>

FROM <tabela(s)>WHERE <coluna> operador <valor>

Operadores:•

– Os operadores <, <=, >, >=, =, <> são usados paratestar valores de atributos.

– Os operadores lógicos AND, NOT, OR podem ser usadospara combinar condições.

#Filtrando Dados

15

SQL – Filtrando DadosObservações:•

– Ao usarmos os operadores AND, OR e NOT numa mesmaexpressão, temos a seguinte ordem de avaliação: NOT,AND e OR.

– Para mudar a ordem de precedência dos operadores,devemos usar os parênteses.

#Filtrando Dados

16

SQL – Filtrando DadosExibir o nome e a data de nascimento dosfuncionários (no formato brasileiro), que sejamdo sexo masculino e que nasceram a partir de1950.

SELECT nome, to_char(dataNasc, 'dd/mm/yyyy') ASdataNasc FROM Funcionario WHERE sexo = 'M'AND dataNasc >= '01/01/1950';

#Filtrando Dados

17

SQL – Filtrando DadosQual outra maneira de fazer esta consulta, usandofunções de data/hora, para pegar o ano da data denascimento?

SELECT nome, to_char(dataNasc, 'dd/mm/yyyy') ASdataNasc FROM Funcionario WHERE sexo = 'M'AND DATE_PART('YEAR', dataNasc) >= 1950;

#Filtrando Dados

18

SELECT <lista de colunas>FROM <tabela(s)>WHERE <coluna> BETWEEN <expressão> AND <expressão>

Exibir nome e a quantidade em estoque dosprodutos, cujo estoque esteja entre 10 e 30unidades, ordenados pelo nome do produto.

SELECT nome, quantestFROM ProdutoWHERE quantest BETWEEN 10 AND 30ORDER BY nome

#Filtrando Dados com Intervalos

19

SELECT <lista de colunas>FROM <tabela(s)>WHERE <coluna> IN <lista>

Exibir nome e bairro dos funcionários queresidam em Manaíra ou Bessa, ordenados pelobairro.

SELECT nome, bairro FROM FuncionarioWHERE bairro IN (‘Manaíra’, ‘Bessa’)ORDER BY bairro

#Filtrando Dados com Listas

20

SELECT <lista de colunas>FROM <tabela(s)>WHERE <coluna> IS [NOT] NULL

– NULL: valores nulos, ou seja, não preenchidos (ISNULL)

– NOT: opcional (p/ selecionar os valores “não nulos” - ISNOT NULL)

#Filtrando Dados com Valores Nulos

21

Exemplo: Exibir os dados dos funcionários quenão possuem email.

SELECT *FROM FuncionarioWHERE email IS NULL

Exemplo: Exibir nome e email dos funcionáriosque possuem email.

SELECT nome, emailFROM FuncionarioWHERE email IS NOT NULL

#Filtrando Dados com Valores Nulos

22

Você acha que os funcionários com email nulo sãoretornados na consulta abaixo?

SELECT nome, emailFROM FuncionarioWHERE email <> ‘[email protected]

Qual seria a solução para que a consulta acimatambém apresente estes funcionários (email =NULL)?

SELECT nome, emailFROM FuncionarioWHERE (email <> ‘[email protected]’) OR (email IS NULL)

#Filtrando Dados com Valores Nulos

23

SELECT <lista de colunas>FROM <tabela(s)>WHERE <coluna> <LIKE ou ILIKE> <string>

Combinações:

– % (porcentagem): seqüência de caracteres.– _ (sublinhado): combina com um único caractere

#Filtrando Dados com String

24

Exemplos:

– Como encontrar todos os nomes que tenham Silva emqualquer lugar?• Usar LIKE ‘%Silva%’

– Como encontrar todos os nomes que começam por“J”seguido de um caractere qualquer e depois “a”?• Usar LIKE 'J_a%';

#Filtrando Dados com String

25

SELECT <lista de colunas>FROM <tabela(s)>WHERE <coluna> SIMILAR TO <string>

Combinações:

– | denota ou.– * denota a repetição de um campo: 0 ou mais vezes.– * denota a repetição de um campo: 1 ou mais vezes.– ? denota a repetição de um campo: 0 ou uma vez.– {m} denota a repetição de um campo: exatamente m

vezes.– {m,} denota a repetição de um campo: m ou mais

vezes.

#Filtrando Dados com String

26

Combinações:

– {m, n} denota a repetição de um campo: ao menos m enão mais que n.

– () denota um grupo de itens.– [] denota uma classe de caracteres (apenas para

expressão regular POSIX)

#Filtrando Dados com String

27

POSIX Regular Expressions

– ~ verifica a igualdade entre os campos (consideramaiúsculo de minúsculo).

– ~* verifica a igualdade entre os campos (nãoconsidera maiúsculo de minúsculo).

– !~ verifica a não igualdade entre os camposconsidera maiúsculo de minúsculo).

– !~* verifica a igualdade entre os campos (nãoconsidera maiúsculo de minúsculo).

#Filtrando Dados com String

28

Exemplos:

– Como encontrar todos os nomes que começam com J ou M?• Usar SIMILAR TO ‘[J|M]%';

– Como encontrar todos os nomes que começam com J até M?• Usar SIMILAR TO '[J-M]%';

– Como encontrar todos os nomes que não começam com J eM?• Usar SIMILAR TO ‘[^JM]%’

#Filtrando Dados com String

29

Implementar as consultas da lista 02

30