Você está na página 1de 43

SQL: Select

degas@uesc.br http://alvarodegas.cjb.net/

SQL: Select

Estrutura bsica
Select a1, a2, ... an From r1, r2, , rn Where P

Empregados lotados no departamento 5


SELECT numat, nominic, nomefim FROM WHERE Empregado ndepto = 5;

Empregados lotados no departamento 5


SELECT * FROM WHERE

Empregado ndepto = 5;

* indica seleo de todos os atributos da relao resultante

Empregados do sexo feminino lotados no departamento 5


SELECT * FROM WHERE Empregado sexo = 'F' AND ndepto = 5; OU SELECT * FROM WHERE Empregado X X.sexo = 'F' AND X.ndepto = 5;

Empregados do sexo feminino lotados no departamento 5


SELECT * FROM WHERE Empregado sexo = 'F' AND ndepto = 5; OU SELECT * FROM WHERE Empregado X X.sexo = 'F' AND X.ndepto = 5;
Pode-se usar variveis de tupla quando for necessrio ou conveniente

Nome, Matrcula e Salrio dos funcionrios


SELECT nominic, nomint, nomefim, numat, salario FROM Empregado;

Salrios dos funcionrios


SELECT salario FROM

Empregado;

Omitindo tuplas repetidas SELECT DISTINCT salario FROM Empregado;

Matrcula e salrio dos funcionrios do departamento 5 que ganham mais de R$500


SELECT numat, salario FROM Empregado AND salario > 500; WHERE ndepto=5

Matrcula e salrio dos funcionrios do que ganham mais de R$500 ou sejam do sexo feminino
SELECT numat, salario FROM Empregado WHERE salario > 500 OR sexo = 'F';

Matrcula, salrio e nome do departamento em que est lotado cada empregado


SELECT numat, salario, nomedep FROM

Empregado, Departamento

WHERE ndepto = numdep; E se o atributo ndepto se chamasse numdep?

Matrcula do empregado, nome do projeto onde trabalha e nmero de horas dedicadas ao projeto
SELECT numat, nomeproj, horas FROM WHERE

Empregado, TrabalhaEm, Projeto numat=numemp AND nproj=numproj;

E se fosse apenas para funcionrios do sexo feminino?

Select INTO

Uma consulta pode incluir dados em uma tabela

Incluir na tabela mat_sal as matriculas e os salarios dos funcionrios Select numat, sal

Into mat_sal (matricula, salario) From funcionarios, departamentos Where ndepto=numdep;

Select INTO

destino podem ser Incluir na tabela mat_sal as matriculas omitidos se o select selecionar dados para salarios dos funcionrios todos eles, na ordem Select numat, em sal que esto na tabela!

Uma consulta pode incluir dados em uma Os atributos da tabela tabela e os

Into mat_sal (matricula, salario) From funcionarios, departamentos Where ndepto=numdep;

Conectores lgicos e Operadores de Comparao

Conectores lgicos

AND, OR e NOT =, <> ou !=, >, >=, <, <=

Operadores de comparao

Conectores lgicos e Operadores de Comparao

Comparadores especiais

LIKE

Metacaracteres: para efeitos de expresses regulares, em SQL o % substitui uma sequencia de caracteres e o _ substitui um caracter. like Santo% aceita qualquer nome comeado assim

Santos, Santo Estvo, Santo Andr, etc.

like Dom Pedro _ aceita qualquer caractere (logo no pode formar Dom Pedro II)

BETWEEN

Nome e sobrenome dos funcionrios da famlia Silva


Select nominic, nomefim from empregado where nomefim='Silva'; E se fossem os funcionrios cujo nome comea com a letra A? Select nominic, nomefim from empregado where nominic like 'A%';

(pitoresco) funcionrios cuja segunda letra do nome seja a Select nominic, nomefim from empregado where nominic like '_a%';

Matrcula e salrio de funcionrios que ganham entre 450 e 600 reais


select numat, salario from empregado where salario between 450 and 600; Para ser um intervalo aberto no podemos usar between select numat, salario from empregado where salario > 450 and salario < 600;

Nome dos funcionrios do Departamento de Pesquisa


SELECT nominic, nomint, nomefim, salario FROM Empregado WHERE EXISTS ( SELECT * FROM Departamento WHERE ndepto=numdep AND nomedep='Pesquisa' );

Nome dos funcionrios do Departamento de Pesquisa


SELECT nominic, nomint, nomefim, salario FROM Empregado WHERE EXISTS ( SELECT * FROM Departamento WHERE ndepto=numdep AND Exists pra a busca e retorna TRUE se nomedep='Pesquisa' algum elemento surge na seleo. ); Segue at o fim
caso contrrio.

Nome dos funcionrios do Departamento de Pesquisa


SELECT nominic, nomint, nomefim, salario FROM Empregado WHERE EXISTS ( SELECT * FROM Departamento WHERE ndepto=numdep AND nomedep='Pesquisa' ); SELECT nominic, nomint, nomefim, salario FROM Empregado, Departamento WHERE ndepto=numdep AND nomedep='Pesquisa'; E se fosse apenas para funcionrios do sexo feminino?

Nome dos funcionrios do Departamento de Pesquisa

Ainda poderia ser (veremos pertinncia adiante)

SELECT nominic, nomint, nomefim, salario FROM Empregado WHERE ndepto in ( SELECT numdep FROM Departamento WHERE ndepto=numdep AND nomedep='Pesquisa' );

Matrcula e nome de empregados trabalhando em projetos do departamento onde esto lotados


SELECT numat, nominic, nomefim FROM Empregado WHERE EXISTS ( SELECT * FROM TrabalhaEm, Projeto WHERE numat=numemp AND nproj=numproj AND numdep=ndepto ); SELECT DISTINCT numat, nominic, nomefim FROM Empregado, TrabalhaEm, Projeto WHERE numat=numemp AND nproj=numproj AND numdep=ndepto;

Operando com Conjuntos

Pertinncia: IN Mostrar o nmero de todos os departamentos que ficam em Ilhus ou Itabuna

Select numdep from localdepto where locdep IN ('Ilheus', 'Itabuna');

E se for o nome do departamento?

Operando com Conjuntos

Pertinncia: IN Mostrar o nmero de todos os departamentos que ficam em Ilhus ou Itabuna

Select numdep from localdepto where locdep IN ('Ilheus', 'Itabuna');

E se for o nome do departamento?

Select nomedep, locdep from localdepto, departamento where locdep in ('Ilheus', 'Itabuna') and departamento.numdep = localdepto.numdep;

Operando com Conjuntos

Pertinncia: IN Mostrar o nmero de todos os departamentos que ficam em Ilhus ou Itabuna

Select numdep from localdepto where locdep IN ('Ilheus', 'Itabuna');

E se for o nome do departamento?

Select nomedep from localdepto L, departamento D where locdep in ('Ilheus', 'Itabuna') and D.numdep = L.numdep;

Empregados que no tem dependentes


Pode-se usar IN para verificar a pertinncia em conjuntos formados a partir de outras consultas (subquery)
SELECT nominic, nomefim FROM Empregado WHERE NOT EXISTS ( SELECT * FROM Dependente WHERE numat = numemp ); SELECT nominic, nomefim FROM Empregado WHERE numat NOT IN ( SELECT numat FROM Dependente WHERE numat = numemp );

Nome e Salrio dos funcionrios que ganha mais que algum colega do departamento 5
SOME: alguma tupla satisfaz? select nominic, nomefim, salario

from empregado where salario > SOME (select salario from empregado where ndepto=5);

Nome e Salrio dos funcionrios que ganha mais que todos os colegas do departamento 5
ALL: toda tupla satisfaz? select nominic, nomefim, salario

from empregado where salario > ALL (select salario from empregado where ndepto=5);

E se fosse o departamento de Pesquisa?

Ordenao: Order by

Liste o nome e o salrio dos funcionrios em ordem crescente de salrio

Select nominic, nomefim, salario From empregado Order by salario;

Por default a ordem crescente, mas isso pode ser mudado (clusula DESC)

Select nominic, nomefim, salario From empregado Order by salario DESC;

Ordenao: Order by - limitando

Liste o nome e o salrio dos 5 funcionrios mais mal remunerados em ordem crescente de salrio

Select nominic, nomefim, salario From empregado Order by salario Limit 5;

Testar limitando a 2

Agregao

Agregao

SQL contm as funes de agregao

AVG, MIN, MAX, SUM e COUNT

Mostrar a mdia dos salrios do sexo masculino

select avg(salario) from empregado Where sexo='M';

Agregao

Qual o maior salrio? Qual o Menor? Qual a soma de todos os salrios? Quantos funcionrios existem?

select <max/min/sum>(salario) from empregado; Select count(*) From empregado;

Agrupamento: Group By

Mostre a mdia dos salrios de cada departamento

select ndepto, avg(salario) from empregado group by ndepto;

Mostrando o nome do departamento

select nomedep, avg(salario) from empregado, departamento Where ndepto = numdep group by nomedep <order by nomedep>;

Condicionando grupos: Having

HAVING como um WHERE, mas aplica-se s funes de agrupamento Mostre a mdia de salrio de cada departamento cuja mdia seja maior que 650

select nomedep, avg(salario) from empregado, departamento Where ndepto = numdep group by nomedep Having avg(salario) > 650;

Mdia dos salrios e Nmero de funcionrios de cada departamento


select nomedep, avg(salario), count(numat) from empregado, departamento where ndepto = numdep group by nomedep;

Pode-se definir ALIAS para as colunas da relao resultante

select nomedep DEPTO, avg(salario) MEDIA, count(numat) QUANTIDADE from empregado, departamento where ndepto = numdep group by nomedep;

Mdia dos salrios e Nmero de funcionrios de cada departamento que possua mais de dois funcionrios
select nomedep, avg(salario), count(numat) from empregado, departamento where ndepto = numdep group by nomedep Having count(numat) > 2;

Recursos adicionais

Teste de nulidade

is null ou is not null

Selecionar todos os empregados que no possuem superior Select numat, nominic, nomefim From empregado Where nsuper is null;

Vises

Relaes que so formadas a partir de consultas Create view <view_name> as <select ...>; Uma viso (chefes_depto) que liste o nome do departamento, a matrcula e o nome do seu chefe Create view chefes_depto as select nomedep, numat, nominic, nomefim From departamento, empregado Where numat = nchefe; Select * from chefes_depto;

Vises
Pode-se usar agregaes e aliases para as colunas Bem como ordenar Uma viso que mostre quantas horas somadas os funcionrios de cada departamento dedicam a cada projeto (somando-se as horas de seus funcionrios) Create view horas_depto as Select nomedep departamento, sum(horas) hs From departamento d, trabalhaem t, projeto p Where d.numdep = p.numdep and t.nproj = p.numproj and t.numemp in (select numat From empregado e Where e.ndepto = d.numdep) Group by nomedep Order by hs desc;

SQL: Select

"Conservador quem acredita que nada deve ser feito pela primeira vez." Alfred Wiggam

Você também pode gostar