Você está na página 1de 30

Comandos SQL SELECT Parte 2

Operador LIKE Subconsultas Funes Agregadas

Comparao de substrings

O operador LIKE permite a comparao com partes de uma string Recuperar os empregados que moram no endereo iniciado pelo nmero 9.
SELECT FROM WHERE

* Empregado ender LIKE '9%'

Operador LIKE
Cujo quinto caracter seja F SELECT * FROM Empregado WHERE ender LIKE '____F%

SELECT * FROM Empregado WHERE ender LIKE '%Houston%'


731 Fondren,Houston,TX 638 Voss,Houston,TX 450 Stone, Houston,TX ...

Consultas aninhadas

Algumas consultas requerem a existncia de valores do BD que devem ser recuperados para depois serem usados na condio de comparao. Estas consultas so escritas atravs de consultas aninhadas, ou seja, uma consulta completa especificada na clusula WHERE de uma consulta mais externa.

Subconsultas

IN, EXISTS, ALL, ANY


Subconsultas

correlacionadas Subconsultas em clusulas FROM


Uma subconsulta pode aparecer na clusula FROM, agindo tal qual sua sada tivesse sido criada como uma tabela temporria pela durao do comando SELECT. Observe que a subconsulta deve estar entre parnteses, e que um alis deve ser fornecido para esta subconsulta.

O operador IN

Compara um valor v a um conjunto de valores V e calcula verdadeiro se v um dos elementos de V. Caso contrrio, calcula falso. Deve comparar elementos compatveis

Relacione o nome do cliente que fez a milsima locao (idloc=1000).


SELECT nomecli FROM Cliente WHERE idcli in ( SELECT idcli FROM Locacao WHERE idct =1000 );

Nomes dos empregados que no tm dependentes


nominic, nomefim (Empreg) - nominic, nomefim (Empreg
numat=numemp

Depen)

SELECT nominic, nomefim FROM Empregado WHERE numat not IN ( SELECT numemp FROM Dependente);

Conjuntos explcitos
SELECT DISTINCT numemp FROM TrabalhaEm WHERE nproj IN (1,2,3);

EXISTS

Usada para saber se o resultado da consulta aninhada correlata vazia Se EXISTS retornar verdadeiro - no vazia Se EXISTS retornar falso - vazia

Subconsultas - EXISTS

EXISTS R se R no vazio Relacione os nomes dos clientes que esto em atraso na devoluo das fitas que locaram. SELECT nomecli FROM Cliente WHERE EXISTS ( SELECT * FROM Locacao WHERE idcli=Cliente.idcli (correlao entre as tabelas) AND dtdevolprev < SYS_DATE() AND dtdevolreal IS NULL );

Nomes dos empregados que tm pelo menos um dependente


nominic, nomefim (Empreg
numat=numemp

Depen)

SELECT nominic, nomefim FROM Empregado e WHERE EXISTS ( SELECT * FROM Dependente d WHERE e.numat=d.numemp);

Nomes dos empregados que no tm dependentes


nominic, nomefim (Empreg) - nominic, nomefim (Empreg
numat=numemp

Depen)

SELECT nominic, nomefim FROM Empregado e WHERE NOT EXISTS ( SELECT * FROM Dependente d WHERE e.numat= d.numemp);

Subconsultas ALL

s > ALL R

se s maior do que todos os elementos em R

Encontrar nomes dos clientes com data de admisso mxima SELECT nomecli
FROM WHERE ); Cliente dtadm >= ALL ( SELECT dtadm (correspondncia FROM Cliente
nos elementos)

s<>ALL R equivale a s NOT IN R

Nome dos empregados cujo salrio maior do que o salrio de todos os empregados do departamento 5
SELECT nominic, nomint, nomefim FROM Empregado WHERE salario > ALL ( SELECT salario FROM Empregado WHERE ndepto = 5 );

E o maior salrio da empresa ???

Subconsultas ANY

s > ANY R

se s maior que algum correspondente em R

Encontrar nomes dos empregados cuja data de nascimento posterior a algum empregado do departamento 5
SELECT nominic, nomint, nomefim FROM Empregado WHERE dtnasc > ANY ( SELECT dtnasc FROM Empregado WHERE ndepto = 5 ); s=ANY R equivale a s IN R

Operador de comparao Between


SELECT nominic,salario,ndepto FROM Empregado WHERE ( SALARIO BETWEEN 30000 AND 40000) and ndepto = 5;

Funes Agregadas

SQL possui as seguintes funes agregadas: SUM, COUNT, MIN, MAX e AVG COUNT Conta o nmero de tuplas resultante da consulta. SUM, MIN, MAX e AVG aplicadas sobre um conjunto de valores

Considerando todos os empregados, selecionar a soma de todos os salrios, o maior e menor salrios e a mdia dos salrios
SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario) FROM Empregado;

Mdia dos salrios dos empregados do Departamento de Pesquisa


SELECT AVG(e.salario) FROM Empregado e, Departamento d WHERE e.ndepto = d.numdep and d.nomedep = 'pesquisa'

Nmero de empregados da empresa


SELECT COUNT(*) FROM Empregado;

Nmero de empregados do Departamento de Pesquisa


SELECT COUNT(*) FROM Empregado, Departamento WHERE numdep = ndepto and nomedep = 'pesquisa';

Nmero de diferentes salrios da empresa


SELECT

FROM

COUNT(DISTINCT salario) Empregado;

Agrupamento

Em alguns casos necessitamos aplicar a funo agregada em subgrupos de linhas.

Condensa em uma nica linha todas as linhas selecionadas que compartilham os mesmos valores para as colunas agrupadas.
Consulta: Selecionar a mdia salarial e o nmero de empregados para cada departamento
SELECT ndepto, COUNT(*), AVG(salario) FROM Empregado GROUP BY ndepto;

Para cada projeto o seu nmero, o seu nome e a quantidade de empregados que trabalham no projeto
SELECT numproj, nomeproj, COUNT(*) FROM TrabalhaEm, Projeto WHERE nproj = numproj GROUP BY numproj, nomeproj;

Empregados que possuem mais de 2 dependentes


SELECT * FROM Empregado e WHERE (SELECT COUNT(*) FROM Dependente d WHERE e.numat = d.numemp) > 2;

Para cada projeto com mais de 2 empregados, buscar o nmero do projeto, o nome do projeto e o nmero de empregados que trabalham nele

SELECT numproj, nomeproj, COUNT(*) FROM Projeto, TrabalhaEm WHERE numproj = nproj GROUP BY numproj, nomeproj HAVING COUNT(*) > 2;

WHERE filtra individualmente as linhas antes da aplicao do GROUP BY . HAVING filtra os grupos de linhas criados pelo GROUP BY.

Nome dos empregados em ordem alfabtica


SELECT nominic, nomint, nomefim FROM Empregado ORDER BY nominic, nomint, nomefim Ou ORDER BY 1, 2, 3

Nmero do projeto em ordem decrescente e o nmero de cada empregado que trabalha no projeto em ordem crescente

SELECT nproj, numemp FROM TrabalhaEm ORDER BY nproj DESC, numemp ASC

Sintaxe do comando SELECT


SELECT <lista de campos> FROM <lista de tabelas> [WHERE <condio>] [GROUP BY <campos que definem o grupo> [HAVING <condio sobre a funo de grupo>] ] [ORDER BY <campos do resultado da consulta>]