2008.1 SQL - Consultas 2008.1 Manipulando Dados CONSULTA SELECT INCLUSÃO INSERT ALTERAÇÃO UPDATE EXCLUSÃO DELETE 2008.1 Consultas SQL • Realização de consultas em tabelas SELECT atributo1, atributo2, ... FROM tabela 1, tabela 2, ... WHERE condição 2008.1 Consultas SQL Select Especifica as colunas e expressões resultado da consulta. exibidas no From Especifica as tabelas que contêm os dados exibidos nos resultado da consulta. Where Especifica as condições usadas para filtrar registros no resultado da consulta. Order by Classifica os resultados da consulta com base nos dados de uma ou mais colunas. Group By Agrupa as linhas da consulta com base nos valores de uma das colunas. Having Especifica as condições usadas para filtrar agrupamentos de dados no resultado da consulta. Só deve ser usado com GROUP BY. 2008.1 Consultas SQL • Exibir todos os dados de todos os clientes. SELECT * FROM cliente • Exibir todos os dados de todos os funcionários. SELECT * FROM funcionário • Exibir todos os dados de todos os produtos. SELECT * FROM produto 2008.1 Selecionando Colunas • Exibir código, nome e telefone de todos os clientes. SELECT código, nome, fone FROM cliente • Exibir código, nome, estado civil e data de nascimento de todos os funcionários. SELECT código, nome, estcivil, datanasc FROM funcionário • Exibir código, nome, preço de custo e preço de venda de todos os produtos. SELECT código, nome, custo, venda FROM produto 2008.1 Eliminando Duplicação na Seleção • Sintaxe: SELECT DISTINCT <lista de colunas> FROM <tabela> • Exibir o código de todos os clientes que já fizeram pedido na empresa. SELECT DISTINCT cliente FROM pedido • Exibir todos os bairros com os respectivos códigos da cidade dos funcionários da empresa. SELECT DISTINCT bairro, cidade FROM funcionário • Exibir o código de todos os tipos de produtos existentes na empresa. SELECT DISTINCT cod FROM produto 2008.1 Exibir colunas calculadas • Sintaxe: SELECT <lista <tabela> de colunas,expressão> FROM • Exibir código, quantidade em estoque, preço de venda e valor total (quantidade X preço de venda) para cada produto. SELECT código, quantest, venda, ‘ValorTotal’ = quantest*venda FROM produto • Exibir código, nome, salário e o salário com 32% de aumento para todos os funcionários. SELECT código, nome, salário, ‘Novosalário’=salário*1.32 FROM funcionário 2008.1 Exibir colunas calculadas • SUM – função que soma valores de um atributo SELECT SUM(salario) FROM clientes • AVG – função que calcula a média dos valores de um atributo SELECT AVG(salario) FROM clientes • MAX – função que exibe o maior valor de um atributo SELECT MAX(salario) FROM clientes 2008.1 Exibir colunas calculadas • MIN – função que exibe o menor valor de um atributo SELECT MIN(salario) FROM clientes • AS – usado para dar nome a uma coluna resultante do uso de uma função agregada (COUNT, SUM, AVG, MAX, MIN, etc) SELECT AVG(salario) AS media_salarial FROM clientes 2008.1 Exibir colunas calculadas • Exibir a soma de todos os salários da empresa. SELECT SUM(salário) FROM funcionário • Exibir a média dos salários da empresa. SELECT AVG(salário) FROM funcionário • Exibir o preço médio de venda dos produtos do tipo 1 SELECT AVG(venda) FROM produto WHERE tipo=1 2008.1 Exibir colunas calculadas • Exibir o preço do produto mais caro vendido na empresa. SELECT MAX(venda) Preço FROM produto • Exibir a data de nascimento do homem mais novo da empresa. SELECT MIN(datanasc) FROM funcionário WHERE sexo=‘M’ • Exibir o maior salário pago a uma funcionária. SELECT MAX(salário) FROM funcionário WHERE sexo=‘F’ • Exibir o menor preço de custo dos produtos do tipo 1. SELECT MIN(custo) FROM produto WHERE tipo = 1 2008.1 Contando os Registros • Exibir quantos clientes têm cadastro na empresa. SELECT COUNT(*) FROM cliente • Exibir quantos funcionário têm e_mail. SELECT COUNT(e_mail) FROM funcionário • Exibir a quantas cidades a empresa atende. SELECT COUNT(DISTINCT cidade) FROM cliente • Exibir quantos vendedores já atenderam pedido. SELECT COUNT(DISTINCT vendedor) FROM pedido 2008.1 Cláusula From • Selecionar dados de uma única tabela SELECT nome FROM clientes • Para cruzar dados que estão em tabelas diferentes, é preciso listar as tabelas na cláusula FROM e usar o mesmo princípio da operação produto cartesiano da álgebra relacional para selecionar apenas as linhas com códigos correspondentes SELECT nome, cod_f, data FROM locacoes, clientes WHERE locacoes.cod_c = clientes.cod_c 2008.1 Cláusula From • Para atributos que possuem o mesmo nome em mais de uma tabela, é preciso incluir o nome da tabela antes do nome do atributo SELECT clientes.cod_c FROM locacoes, clientes WHERE locacoes.cod_c = clientes.cod_c • É possível definir apelidos para as tabelas e usá-los em vez dos nomes das tabelas SELECT C.cod_c FROM locacoes L, clientes C WHERE L.cod_c = C.cod_c 2008.1 Cláusula Where • Os operadores <, <=, >, >=, =, <> podem ser usados para testar valores de atributos SELECT * FROM clientes WHERE salario > 100 SELECT * FROM fitas WHERE titulo = ‘Matrix’ • Os operadores lógicos AND, NOT, OR podem ser usados para combinar condições SELECT * FROM clientes WHERE salario > 100 AND sexo = ‘F’ 2008.1 Cláusula Where • BETWEEN – usado para verificar se o valor de um atributo está em um intervalo de valores dados dos clientes com salário entre 500 e 1500 SELECT * FROM clientes WHERE salario BETWEEN 500 AND 1500 • IN – usado para verificar se o valor de um atributo está em um conjunto de valores dados dos clientes com salário igual a 500 OU 1500 SELECT * FROM clientes WHERE salario IN (500,1500) 2008.1 Operando strings • Exibir código e nome de todos os funcionários que tenham o nome começando por “M” SELECT código, nome FROM funcionário WHERE nome LIKE ‘M%’ • Exibir código e nome de todos os funcionários que tenham o nome terminando por “Silva” SELECT código, nome FROM funcionário WHERE nome LIKE ‘%Silva’ 2008.1 Cláusula Where • Exibir código e nome de todos os funcionários que tenham “Costa” em qualquer parte do nome. SELECT código, nome FROM funcionário WHERE nome LIKE ‘%Costa%’ • Exibir código e nome de todos os funcionários que tenham o nome começando por “Mar” seguido de um caractere qualquer e terminando por “a” SELECT código, nome FROM funcionário WHERE nome LIKE 'Mar_a%' 2008.1 Ordenando os resultados • Sintaxe: SELECT <lista de colunas> FROM <tabela> ORDER BY <coluna> [ASC] [DESC] • Exibir código, nome e telefone de todos os clientes, ordenados pelo nome do cliente em ordem ascendente. SELECT código, nome, fone FROM cliente ORDER BY nome • Exibir código, nome, estado civil e data de nascimento de todos os funcionários, ordenados pela data de nascimento em ordem descendente. SELECT código, nome, estcivil, datanasc FROM funcionário ORDER BY datanasc DESC 2008.1 Ordenando os resultados • Exibir código, nome e tipo de todos os produtos existentes na empresa, ordenados pelo tipo em ordem ascendente e pelo nome do produto em ordem descendente. SELECT código, nome, tipo FROM produto ORDER BY nome DESC 2008.1 Agrupando Informações • Sintaxe: SELECT <lista de colunas> FROM <tabela> GROUP BY <coluna> HAVING <condição> • Exibir a quantidade de homens e mulheres da empresa. SELECT sexo, COUNT(*) Quantidade FROM funcionário GROUP BY sexo • Exibir a quantidade de funcionários e o total e salários de cada setor da empresa. SELECT setor, COUNT(*) Funcionários, SUM(salário)Total FROM funcionário GROUP BY setor 2008.1 Consultas com várias tabelas • Exibir o código de cada pedido e o nome do cliente que realizou cada um deles. SELECT pedido.código, cliente.nome FROM pedido, cliente WHERE cliente.código = pedido.cliente 2008.1 Consultas com várias tabelas • Exibir o nome do setor, nome do funcionário, salário e função exercida por cada funcionário, ordenados pelo nome do setor SELECT s.nome, f.nome , f.salario, fu.funcao FROM setor s, funcionario f, funcao fu WHERE s.sigla = f.setor and f.função = fu.código ORDER BY f.nome 2008.1 Sub-Consultas • Uma sub-consulta é uma consulta cujo resultado é utilizado por uma outra consulta mais externa, de forma encadeada e contida no mesmo comando SELECT. • A consulta mais externa depende da avaliação da sub-consulta. 2008.1 Sub-Consultas • Quando há necessidade de cruzar informações de duas ou mais tabelas, além do produto cartesiano, pode-se usar as sub-consultas • Ou seja, uma consulta mais interna retorna parâmetros para a execução de uma consulta mais externa Nome de todos os clientes que realizaram locações SELECT nome FROM clientes WHERE cod_c IN (SELECT cod_c FROM locacoes) 2008.1 Sub-Consultas • Exibir o código, o nome e a quantidade em estoque do produto que tem a maior quantidade em estoque da empresa. SELECT código, nome, quantest FROM produto WHERE quantest = (SELECT MAX (quantest) FROM produto) 2008.1 Sub-Consultas • Exibir o código, o nome e o telefone dos clientes estrangeiros. – Usando sub-consulta SELECT código,nome,fone FROM cliente WHERE cidade IN (SELECT código FROM cidade WHERE país <> ‘BRA’) • Usando Junção SELECT c.código,c.nome,c.fone FROM cliente c, cidade ci WHERE ci.código = c.cidade and ci.país <> ‘BRA’ 2008.1 Sub-Consultas • Exibir o código, o nome e o preço de venda de todos os produtos que não sejam do tipo “Bebidas” ou “Condimentos”. – Usando sub-consulta SELECT código, nome, venda FROM produto WHERE código not IN (SELECT código FROM tipo WHERE nome IN (‘Bebidas’,’Condimentos’)) – Usando Junção SELECT p.código,p.nome,p.venda FROM produto p tipo t WHERE p.tipo=t.código and t.nome not IN (‘Bebidas’,’Condimentos’)