27/05/2012
Banco de Dados I SQL – Parte 2 e 3 Ludmila de Almeida Pedrosa ludmila.apedrosa@gmail.com
Manipulando Dados - DML CONSULTA
SELECT
INCLUSÃO
INSERT
ALTERAÇÃO
UPDATE
EXCLUSÃO
DELETE
1
27/05/2012
SQL - Consultas • Sintaxe para consultar dados em tabela - ANSI 89: SELECT atributo1, atributo2, ... FROM tabela 1, tabela 2, ... [WHERE condição] • Onde: – SELECT: Especifica as colunas e expressões exibidas no resultado da consulta. – FROM: Especifica as tabelas que contêm os dados exibidos no resultado da consulta. – WHERE: Especifica as condições usadas para filtrar registros no resultado da consulta, sendo uma cláusula opcional.
SQL - Consultas • Todos os exemplos usarão o seguinte Modelo:
2
27/05/2012
SQL - Consultas • Para selecionar todos os dados (atributos): Usar * • Exibir todos os dados de todos os clientes: SELECT * FROM Cliente • Exibir todos os dados de todos os funcionários: SELECT * FROM Funcionario • Exibir todos os dados de todos os produtos: SELECT * FROM Produto
SQL - Consultas • Exibir código, nome e telefone de todos os clientes: SELECT codigo, nome, fone FROM Cliente • Exibir código, nome, estado civil e data de nascimento de todos os funcionários: SELECT codigo, nome, estcivil, datanasc FROM Funcionario • Exibir código, nome, preço de custo e preço de venda de todos os produtos : SELECT codigo, nome, custo, venda FROM Produto
3
27/05/2012
SQL – Eliminar Duplicação • Sintaxe: SELECT DISTINCT <lista de colunas> FROM <tabela>
SQL – Eliminar Duplicação • Exemplo1 - Exibir o código de todos os clientes que já fizeram pedido à empresa, sem repetições: SELECT DISTINCT cliente FROM Pedido • Exemplo2 - Exibir todos os bairros com os respectivos códigos da cidade dos funcionários da empresa, sem repetições: SELECT DISTINCT bairro, cidade FROM Funcionário
4
27/05/2012
SQL – Exibir Colunas Calculadas • Sintaxe: SELECT <lista de colunas, expressão> FROM <tabela>
SQL – Exibir Colunas Calculadas • Exemplo1 - Exibir código, nome, quantidade em estoque, preço de venda e valor total (quantidade x preço de venda) para cada produto: SELECT Codigo, Nome, Quantest, Venda, ‘Total’= quantest*venda FROM Produto
• Resultado da Consulta: Código
Nome
Quantest
Venda
Total
1
Toalhas Artex
50
250,00
12.500,00
2
Iogurte Nestle
200
3,20
640,00
3
Abajur List
12
364,00
4.368,00
4
TV Plasma
12
3,65
43,85
5
Liquidificador
150
92,00
13.800,00
6
Computador Positivo
1
1.980,00
1.980,00
5
27/05/2012
SQL – Exibir Colunas Calculadas • Exemplo2 - Exibir código, nome, salário e o salário com 32% de aumento para todos os funcionários: SELECT Codigo, Nome, Salario, Salario*1.32 AS Novo_Salario FROM Funcionario
• Resultado da Consulta: Codigo
Nome
Salario
Novo_Salario
1
João da Silva
300,00
396,00
2
Maria de Souza
300,00
396,00
3
Luiza Costa
950,00
1.254,00
4
Francisco da Silva
390,00
514,80
5
Carla Tavares
290,00
382,80
SQL – Exibir Colunas Calculadas • Funções do SQL Server: – SUM: soma valores de um atributo – AVG: calcula a média dos valores de um atributo – MAX: exibe o maior valor de um atributo – MIN: exibe o menor valor de um atributo – COUNT: contar registros
6
27/05/2012
SQL – Exibir Colunas Calculadas • Exemplo1 – Exibir a soma dos salários dos funcionários da empresa: SELECT SUM(salario) AS Soma_Salarios FROM Funcionario • Exemplo2 – Exibir a média salarial dos funcionários da empresa: SELECT AVG(salario) AS Media_Salarios FROM Funcionario
SQL – Exibir Colunas Calculadas • Exemplo3 – Exibir o menor salário entre os funcionários: SELECT MAX(salario) AS Maior_Salario FROM Funcionario • Exemplo4 – Exibir o maior salário entre os funcionários: SELECT MIN(salario) AS Menor_Salario FROM Funcionario
7
27/05/2012
SQL – Exibir Colunas Calculadas • Exemplo5 – Exibir quantos clientes têm cadastro na empresa: SELECT COUNT(*) AS Qtde_Clientes FROM Cliente • Exemplo6 – Exibir quantos funcionário têm e_mail: SELECT COUNT(e_mail) AS Qtde_Email FROM Funcionário • Observação: para contar registros diferentes deve-se usar COUNT combinado com o DISTINCT.
SQL – Exibir Colunas Calculadas • Exemplo7 – Exibir a quantas cidades a empresa atende os clientes: SELECT COUNT(DISTINCT cidade) AS Qtde_Cidade FROM Cliente • Exemplo8 – Exibir quantos vendedores já atenderam a pedidos: SELECT COUNT(DISTINCT vendedor) AS Qtde_Vendedor FROM Pedido
8
27/05/2012
SQL – Cláusula From • Para cruzar dados que estão em tabelas diferentes: Estilo
Construção
ANSI 89
SELECT <campos> FROM TabelaA, TabelaB WHERE TabelaA.Coluna = TabelaB.Coluna
ANSI 92
SELECT <campos> FROM TabelaA INNER JOIN TabelaB ON TabelaA.Coluna = TabelaB.Coluna
SQL – Cláusula From • Exemplo 1 – Exibir o nome do cliente e a data que ele realizou um pedido, para todos os pedidos da base: SELECT C.nome, P.dataPedido FROM Cliente C, Pedido P WHERE C.codigo = P.cliente ou SELECT C.nome, P.dataPedido FROM Cliente C INNER JOIN Pedido P ON C.codigo = P.cliente •
Observações: – Para atributos que possuem o mesmo nome, em mais de uma tabela, é obrigatório incluir o nome da tabela (ou apelido) antes do nome do atributo. – Caso contrário não é obrigatório, mas é recomendado.
9
27/05/2012
SQL – Cláusula From • Exemplo 2 – Exibir o nome do funcionário, o seu salário, o nome do setor onde trabalha e o nome da função exercida para todos os funcionários: SELECT F.nome, F.salario, S.nome AS Setor, FU.nome AS funcao FROM Funcionario F, Setor S , Funcao FU WHERE F.setor = S.sigla AND F.funcao = FU.codigo ou SELECT F.nome, F.salario, S.nome AS Setor, FU.nome AS funcao FROM Funcionario F INNER JOIN Setor S ON F.setor = S.sigla INNER JOIN Funcao FU ON F.funcao = FU.codigo
SQL – Parte 2
Fim Próxima aula: Exercícios
10
27/05/2012
SQL – Cláusula Where • Usando operadores na cláusula WHERE: – Os operadores relacionais <, <=, >, >=, =, <> podem ser usados para testar valores de atributos. – Os operadores lógicos AND, NOT, OR podem ser usados para combinar condições.
SQL – Cláusula Where • Exemplo1 – Exibir o nome e o salário dos funcionários que ganham mais do que R$ 500,00: SELECT nome, salario FROM Funcionario WHERE salario > 500.00 • Exemplo 2 – Exibir o nome e o salário dos funcionários que ganham mais do que R$ 200,00 e são homens: SELECT nome, salario FROM Funcionario WHERE salario > 200.00 AND sexo = ‘M’
11
27/05/2012
SQL – Cláusula Where • Exemplo3 – Exibir o nome dos produtos, cujo preço de custo seja menor ou igual a R$ 100,00: SELECT nome FROM Produto WHERE custo <= 100.00 • Exemplo4 – Exibir o nome e o cargo dos clientes pessoa física: SELECT nome, cargo FROM Cliente WHERE tipo = ‘PF’
SQL – Cláusula Where • Exemplo5 – Exibir o preço médio de venda dos produtos do tipo 1: SELECT AVG(venda) AS Media FROM Produto WHERE tipo = 1 • Exemplo6 – Exibir a data de nascimento da funcionária mais nova da empresa: SELECT MAX(dataNasc) AS Mais_Nova FROM Funcionario WHERE sexo = ‘F’
12
27/05/2012
SQL – Cláusula Where • Usando operadores na cláusula WHERE: – Operador BETWEEN: usado para verificar se o valor de um atributo está em um intervalo de valores. – Operador IN: usado para verificar se o valor de um atributo está em um conjunto de valores. – Operador LIKE: usado para operações de comparação de strings.
SQL – Cláusula Where • Exemplo1 – Exibir o nome e o salário dos funcionários que ganham entre R$ 500,00 e R$ 1.500,00: SELECT nome, salario FROM Funcionario WHERE salario BETWEEN 500 AND 1500 • Exemplo 2 – Exibir o nome e o salário dos funcionários que ganham R$ 500,00 ou R$ 1.500,00: SELECT nome, salario FROM Funcionario WHERE salario IN (500, 1500)
13
27/05/2012
SQL – Cláusula Where • Exemplo3 – Exibir código e nome de todos os funcionários que tenham o nome começando por “M”: SELECT codigo, nome FROM Funcionario WHERE nome LIKE ‘M%’ • Resultado da Consulta: Código
Nome
2
Maria de Souza
SQL – Cláusula Where • Exemplo4 – Exibir código e nome de todos os funcionários que tenham o nome terminando por “Silva”: SELECT código, nome FROM Funcionario WHERE nome LIKE ‘%Silva’ • Resultado da Consulta: Código
Nome
1
João da Silva
4
Francisco da Silva
14
27/05/2012
SQL – Cláusula Where • Exemplo5 – Exibir código e nome de todos os funcionários que tenham “Costa” em qualquer parte do nome:
SELECT codigo, nome FROM Funcionario WHERE nome LIKE ‘%Costa%’ • Exemplo 6 – 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 codigo, nome FROM Funcionario WHERE nome LIKE 'Mar_a%'
SQL – Ordenando Resultados • Sintaxe: SELECT <lista de colunas> FROM <tabela(s)> ORDER BY <coluna> [ASC] [DESC] • Observação: – O default é a ordenação ascendente (ASC).
15
27/05/2012
SQL – Ordenando Resultados • Exemplo1 – Exibir código, nome e telefone de todos os clientes, ordenados ascendentemente pelo nome do cliente:
SELECT codigo, nome, fone FROM Cliente ORDER BY nome • Resultado da Consulta: Codigo
Nome
Fone
2
João Paulo Correia
3245-8999
6
JR Representações
5841-9871
3
Larissa Maia
3227-9622
5
LT Comércio
3256-9981
4
Marcos Andrade
3338-2100
1
Maria Helena Ferreira
3225-6987
SQL – Ordenando Resultados • Exemplo2 – Exibir código, nome, estado civil e data de nascimento de todos os funcionários, descendentemente pela data de nascimento:
ordenados
SELECT codigo, nome, estCivil, dataNasc FROM Funcionario ORDER BY dataNasc DESC
• Resultado da Consulta: Código
Nome
EstCivil
DataNasc
3
Luiza Costa
C
1980-04-04
1
João da Costa
C
1978-02-05
4
Francisco da Silva
C
1970-06-03
2
Maria de Souza
C
1970-01-01
5
Carla Tavares
C
1969-01-08
16
27/05/2012
SQL – Ordenando Resultados • Exemplo3 – 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 P.codigo, T.nome AS Tipo, P.nome AS Produto FROM Produto P, Tipo T WHERE P.tipo = T.codigo ORDER BY T.nome ASC, P.nome DESC
•
Resultado da Consulta: Código
Tipo
Produto
2
Alimentação
Pizza Sadia
1
Cama
Toalhas Artex
3
Decoração
Abajur Alist
4
Eletro
TV Plasma
5
Eletro
Liquidificador
6
Eletro
Computador Positivo
2
Lacticínios
Iorgute Nestlé
SQL – Agrupando Informações • Sintaxe: SELECT <lista de colunas> FROM <tabela(s)> GROUP BY <coluna(s)> [HAVING <condição>] • Observação: – A cláusula HAVING é opcional.
17
27/05/2012
SQL – Agrupando Informações • Exemplo1 – Exibir a quantidade de homens e mulheres da empresa: SELECT Sexo, COUNT(*) AS Quantidade FROM Funcionario GROUP BY sexo • Resultado da Consulta: Sexo
Quantidade
F
3
M
2
SQL – Agrupando Informações • Exemplo2 – Para cada cliente da empresa (nome), apresentar a quantidade de pedidos realizados: SELECT C.nome, COUNT(*) AS Qtde_Pedidos FROM Cliente C, Pedido P WHERE P.cliente = C.codigo GROUP BY C.nome
• Resultado da Consulta: Nome
Qtde_Pedidos
João Paulo Correia
2
JR Representações
15
Larissa Maia
3
LT Comércio
1
Marcos Andrade
2
Maria Helena Ferreira
8
18
27/05/2012
SQL – Agrupando Informações • Exemplo3 – Para cada cliente da empresa (nome), apresentar a quantidade de pedidos realizados. Exibir os resultados, apenas se a quantidade de pedidos for superior a cinco pedidos: SELECT C.nome, COUNT(*) AS Qtde_Pedidos FROM Cliente C, Pedido P WHERE P.cliente = C.codigo GROUP BY C.nome HAVING COUNT(*) > 5
• Resultado da Consulta: Nome
Qtde_Pedidos
JR Representações
15
Maria Helena Ferreira
8
SQL – Agrupando Informações • Exemplo4 – Para cada setor da empresa (sigla e nome), apresentar a quantidade de funcionários e o somatório dos seus salários: SELECT F.Setor, F.Nome, COUNT(*) AS Qtde_Func, SUM(salário) AS Total FROM Funcionario F, Setor S WHERE F.setor = S.sigla GROUP BY F.Setor, F.Nome
• Resultado da Consulta: Setor
Nome
Qtde_Func
ADM
Administração
1
Total (salário) 950,00
COV
Compra e Venda
2
590,00
MKT
Marketing
1
300,00
SEG
Segurança
1
390,00
19
27/05/2012
SQL – Agrupando Informações • Exemplo5 – Para cada setor da empresa (sigla e nome), apresentar a quantidade de funcionários e o somatório dos seus salários. Exibir os resultados, apenas se a soma dos salários for maior do que R$ 500,00: SELECT F.Setor, F.Nome, COUNT(*) AS Qtde_Func, SUM(salário) AS Total FROM Funcionario F, Setor S WHERE F.setor = S.sigla GROUP BY F.Setor, F.Nome HAVING SUM(salario) > 500
• Resultado da Consulta: Setor
Nome
Qtde_Func
ADM
Administração
1
Total (salário) 950,00
COV
Compra e Venda
2
590,00
SQL – Sub-Consultas • O que é? – Uma sub-consulta é uma consulta SQL cujo resultado é utilizado por outra consulta mais externa, de forma encadeada e contida no mesmo comando SELECT. – Uma sub-consulta deve ser delimitada parênteses e é avaliada apenas uma vez.
entre
– A consulta mais externa (principal) depende da avaliação e resultado da sub-consulta. – Portanto em consultas encadeadas, as consultas internas (sub-consultas) são realizada antes.
20
27/05/2012
SQL – Sub-Consultas • Retorno de uma sub-consulta: – Uma sub-consulta de valor único retorna apenas um valor (registro). – Uma sub-consulta de valores múltiplos retorna uma lista de valores. Neste caso, deve-se utilizar as clausulas IN ou NOT IN.
SQL – Agrupando Informações • Exemplo1 – Exibir o nome e data de nascimento do funcionário(a) mais novo da empresa: SELECT nome, dataNasc Retorna apenas um valor/registro. FROM Funcionario WHERE dataNasc = (SELECT MAX(dataNasc) FROM Funcionario)
• Resultado da Consulta: Nome
DataNasc
Luiza Costa
04/04/1980
21
27/05/2012
SQL – Agrupando Informações • Exemplo2 – Exibir o código, o nome e a quantidade em estoque do produto que tem a menor quantidade em estoque da empresa: SELECT codigo, nome, quantest Retorna apenas um valor/registro. FROM Produto WHERE quantest = (SELECT MIN(quantest) FROM Produto) • Resultado da Consulta: Código
Nome
Quantest
3
Abajur Alist
12
4
TV Plasma
12
SQL – Agrupando Informações • Exemplo3 – Exibir o código e o nome dos funcionários que nunca realizaram uma venda: SELECT codigo, nome Retorna vários registros. FROM Funcionario WHERE codigo NOT IN (SELECT vendedor FROM Pedido)
22
27/05/2012
SQL - Consultas SELECT Especifica as colunas e expressões exibidas no resultado da consulta. FROM
Especifica as tabelas que contêm os dados exibidos no resultado da consulta.
WHERE
Especifica as condições usadas para filtrar registros no resultado da consulta.
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.
ORDER BY
Classifica os resultados da consulta com base nos dados de uma ou mais colunas.
SQL – Parte 3
Fim Próxima aula: Exercícios
23