Projeto de Banco de Dados Laboratório de Banco de Dados Prof. Luiz Antônio Vivacqua C. Meyer (luiz.vcm@gmail.com)
Sintaxe Geral SELECT [ALL/DISTINCT] coluna1, coluna2,..., colunan FROM nome_tabela1, nome_tabela2,..., nome_tabelan [WHERE predicado] [GROUP BY coluna1, coluna2,..., colunax] [HAVING predicado] [ORDER BY coluna1[asc/desc], coluna2[asc/desc],..., colunay[asc/desc]]; Prof. Luiz Prof. A. Luiz Vivacqua C. Meyer
Peça Fornecimento Fornecedor Prof. Luiz Prof. A. Luiz Vivacqua C. Meyer
Recuperação Simples: Obter a identificação de todas as peças fornecidas. Select id_peca from fornecimento;
Recuperação Simples sem ocorrência de duplicatas. Obter o código dos fornecedores que fornecem peça Select Distinct id_peca From fornecimento; Recuperação simples de toda a tabela. Obter todas as informações dos fornecedores Select * From Fornecedor; Prof. Luiz Prof. A. Luiz Vivacqua C. Meyer
Recuperação qualificada: Obter a identificacao dos fornecedores de SP com status > 20. Select id, nome From fornecedor Where Cidade = sp and status > 20; Obs: A condição ou predicado que segue WHERE pode incluir os operadores comparativos =, >, <, >=, <=, <> e os operadores lógicos AND, OR, NOT. Recuperação com Ordenação: Obter a identificação e o status de fornecedores de SP, na ordem decrescente de status. Select id, Status From fornecedor Where cidade = sp Order by status desc;
CONSULTA COM JUNÇÃO : RECUPERA DADOS DE MAIS DE UMA TABELA. Obter o nome dos fornecedores que fornecem peças. Select distinct nome From Fornecedor, Fornecimento Where Fornecedor.id=id_forn; Junção com condição adicional: Obter o nome do fornecedor que fornece a peça P2. Select distinct nome From Fornecedor, Fornecimento Where Fornecedor.id=id_forn and id_peca= p2 ;
Junção de três tabelas: Obter o nome das peças que são fornecidas por fornecedores do RJ Select Distinct Peca.nome From fornecedor S, peca P, fornecimento SP Where S.id = id_forn and P.id = id_peca and S.cidade= rj ; Inner Join Obter o nome dos fornecedores que fornecem peças. Select distinct nome From Fornecedor INNER JOIN Fornecimento ON fornecedor.id = id_forn;
LEFT JOIN Obter o nome dos fornecedores e a qtde fornecida de peças inclusive dos que não fazem fornecimento Select nome, qtde From Fornecedor LEFT JOIN Fornecimento ON fornecedor.id = id_forn; RIGHT JOIN O inverso do Left join Obter o nome das peças e o nome dos fornecedores na mesma cidade inclusive os fornecedores em outras cidades select P.nome, F.nome from peca P RIGHT JOIN fornecedor F ON P.cidade=F.cidade
Full Join Left Join + Right Join Select P.nome, F.nome, P.cidade, F.cidade from peca P FULL JOIN fornecedor F ON P.cidade=F.cidade
Funções embutidas COUNT retorna o número de linhas na tabela. SUM retorna a soma dos valores na coluna que tem que ser numérica. AVG retorna a média de valores na coluna que tem que ser numérica. MAX retorna o maior valor na coluna. MIN retorna o menor valor na coluna. Obter o número total de fornecedores. Select count(*) From fornecedor;
Obter o número de fornecedores que fornecem peças Select count(distinct id_forn) From fornecimento; Obter o número de fornecimentos para a peça P2. Select count(*) From Fornecimento Where id_peca = p2
Obter a quantidade total de peças P2 fornecidas. Select SUM(Qtde) From fornecimento Where id_peca = p2 ; Uso do Group By A cláusula group by pode ser usada em conjunto com funções de forma de agrupar o resultado segundo uma ou mais colunas.
Obter a quantidade total de cada peça fornecida. Select id_peca, SUM(Qtde) From fornecimento Group by id_peca; Uso do having A cláusula having funciona para os Grupos assim como o Where para linhas.
Obter a identificação da peça e a soma das quantidades fornecidas de todas as peças fornecidas com qtde > 500. Select id_peca, SUM(Qtde) From fornecimento Group by id_peca Having SUM(Qtde) > 500;
Recuperação com Like _ vale para qq caracter % vale para qq sequência de n caracteres onde n pode ser 0. Negação Not Like Obter a identificação e a cor das peças cujos nomes começam com a letra R. Select id, cor From Peca Where nome like r%';
Obter a identificação, peso e cor das peças cujos nomes começam com a letra r, tem b na terceira letra e terminam com e. Select id, peso, cor From Peca Where nome like r_b%e'; Recuperação com NULL Usado para testar a presença ou ausência de valores nulos. Obter a identificação dos fornecedores com status igual a nulo. Select id From fornecedor Where status IS NULL;
Recuperação com Subconsulta Subconsulta é uma expressão SELECT FROM WHERE aninhada dentro de uma cláusula WHERE ou HAVING. É executada uma vez antes da execução da consulta externa Obter os nomes dos fornecedores que fornecem a peça P2. Select distinct nome From fornecedor Where id IN (Select id_forn From fornecimento Where id_peca = p2 );
Subconsulta com vários níveis de aninhamentos. Obter os nomes dos fornecedores que forneçam pelo menos uma peça verde. Select distinct nome From fornecedor Where id IN (Select id_forn From fornecimento Where id_peca IN (Select id From Peca where cor = 'verde'));
Subconsulta c/ operador diferente de IN Obter a identificação e o nome dos fornecedores localizados na mesma cidade que o fornecedor S1 Select id, nome From fornecedor Where cidade = (Select cidade From fornecedor Where id = s1 );
Função numa subconsulta Obter o nome e a cidade dos fornecedores cujo status seja inferior ao maior status existente. Select nome, cidade From fornecedor Where status < (Select MAX(status) From fornecedor);
Subconsulta correlacionada: Uma subconsulta correlacionada referencia uma ou mais colunas na instrução SQL externa. Usado quando se precisa de uma resposta para uma pergunta que depende de um valor em cada linha contida em uma consulta externa É executada uma vez para cada linha na consulta externa O operador EXISTS verifica a existência de linhas retornadas por uma Subconsulta. Embora possa ser usado em subconsultas não correlacionadas, geralmente é usado neste tipo de subconsulta.
Obter o nome dos fornecedores que fizeram fornecimento Select id, nome from fornecedor T1 Where EXISTS (select 1 from fornecimento T2 where T2.id_forn = T1.id); Obs: Como EXISTS apenas verifica A existência de linhas retornadas pela subconsulta, uma subconsulta não precisa retornar uma coluna, ela pode retornar um valor literal, melhorando o desempenho
Forma negativa: Obter o nome dos fornecedores que não fizeram fornecimento select nome from fornecedor T1 where NOT EXISTS (select 1 FROM fornecimento T2 where T1.id = T2.id_forn)
Dicas: Normalmente, EXISTS oferece um desempenho melhor do que IN em subconsultas. Quando uma lista de valores contem um valor nulo, NOT EXISTS retorna verdadeiro, mas NOT IN retorna falso Exemplo: Insert into fornecimento values(13, null, p1,300) Select nome from fornecedor T1 where NOT EXISTS (select 1 FROM fornecimento T2 where T1.id = T2.id_forn) Select nome from fornecedor where id NOT IN (select id_forn FROM fornecimento)
select nome from fornecedor where cidade NOT IN('sp'); select nome from fornecedor where cidade NOT IN('sp, null);
Operadores de conjunto SQL - CONSULTAS Combinam os resultados das consultas que devem ter o mesmo número de colunas com o mesmo tipo de dados. Union É o operador de união da teoria de conjuntos tradicionais. O resultado é a união dos resultados da cada consulta. As duplicidades são sempre eliminadas. Obter a identificação das peças que pesam mais de 15 ou que são fornecidas por S2. Select id From Peca Where peso > 15 UNION Select id_peca From fornecimento Where id_forn = S2 ;
Consulta com Intersect É o operador de interseção de conjuntos. O resultado é a interseção dos resultados da cada consulta. Obter as cidades onde existam fornecedores e peças. Select cidade From fornecedor INTERSECT Select cidade From Peca;
Consulta com EXCEPT É o operador de subtração de conjuntos. O resultado apresenta as linhas da primeira consulta que não estão na segunda consulta. Obter as cidades onde existam fornecedores e que não existam peças. Select cidade From fornecedor EXCEPT Select cidade From Peca;
Usando a expressão CASE Similar ao IF...THEN...ELSE de outras linguagens CASE WHEN CONDIÇÃO THEN RESULTADO [WHEN...] [ELSE RESULT] END CONDIÇÃO é uma expressão que retorna um boleano Se a cláusula ELSE for omitida e nenhuma condição for verdade o resultado é NULO.
EXEMPLOS: Select Id,status, Case Status WHEN 10 Then 'OTIMO' WHEN 20 Then 'BOM' WHEN 30 Then 'REGULAR' ELSE 'RUIM' End From Fornecedor; Expressão CASE pesquisada Select Id, status, Case WHEN status=10 THEN ÓTIMO WHEN status=20 THEN BOM WHEN status=30 THEN REGULAR ELSE RUIM End From Fornecedor;