Você está na página 1de 74

2008.

SQL Avanado Revisando SQL...

renatafviegas@gmail.com

Renata Viegas

2008.2

Objetivos
Revisando a sintaxe SQL
SELECT, UPDATE, INSERT, DELETE

Manipulando expresses
Funes matemticas, etc

Condies de Pesquisa Funes de Agregao e Agrupamento Juno de tabelas Subconsultas e tabelas temporrias

2008.2

Structured Query Language (SQL)

Linguagem no procedural que requer do usurio qual dado necessrio sem especificar como obt-lo Poupa tempo de programao, mas exige treino para se dominar Suporte cliente-servidor Controle de Acesso

2008.2

Structured Query Language (SQL)

Integridade dos Dados Independncia de fabricante: est incorporada em quase todos os SGBDs em seu padro ANSI, com extenses proprietrias de cada fabricante

2008.2

SELECT Consultando Dados

Sintaxe Bsica

SELECT lista_de_colunas FROM lista_de_tabelas WHERE condies

2008.2

SELECT Consultando Dados

Clusulas Adicionais
INTO: especifica uma nova tabela que conter o resultado da consulta ORDER BY: classifica o resultado da consulta GROUP BY: agrupa as linhas das consultas com base nos valores de uma ou mais colunas HAVING: especifica as condies usadas para filtrar agrupamento de dados no resultado da consulta. S deve ser usado com o GROUP BY

2008.2

Consultas Simples

Exemplo 1: exibir todos os dados de todos os clientes SELECT * FROM cliente

Exemplo 2: exibir cdigo, nome e telefone de todos os clientes SELECT codigo, nome, fone FROM cliente

2008.2

Consultas Simples

Exemplo 3: exibir cdigo, nome e telefone dos 20 primeiros clientes cadastrados na empresa
SELECT TOP 20 codigo,nome,fone FROM cliente

SELECT TOP n [percent] <lista_de_colunas> FROM <tabela>

2008.2

Consultas Simples

Exemplo 4: exibir cdigo, nome e preo de venda dos 10% primeiros produtos cadastrados SELECT TOP 10 PERCENT codigo, nome,preco FROM produto

2008.2

Consultas Simples

Exemplo 5: exibir cdigo, nome, telefone e uma coluna contendo classificado para todos os clientes
SELECT codigo,nome,fone, classificado FROM cliente

2008.2

Consultas Simples

Exemplo 6: exibir cdigo, nome e uma coluna contendo classificado com o cabealho Classificao para todos os clientes

SELECT codigo,nome, classificado Classificao FROM cliente

2008.2

Consultas Simples

Exemplo 7: exibir nmero, descrio e preo de um produto, renomeando a coluna nmero para cdigo

SELECT numero as Codigo, descricao, preco FROM produto

2008.2

Manipulando Expresses
Um comando SELECT tambm pode retornar como coluna de resultado um valor calculado. Exemplo 8: Exibir cdigo, quantidade em estoque, preo da venda e valor total (quantidade * preo da venda) para cada produto
SELECT codigo, quantEst AS Quantidade, preco, quantEst*preco Valor Total FROM produto

2008.2

Funes Matemticas

Alm de operadores aritmticos, podemos usar funes matemticas (consulte a referncia do SGBD)
ROUND (valor, n): arredonda o valor para n casas decimais POWER (valor, p): retorna o valor elevado potncia p

2008.2

Funes Matemticas

Exemplo 9: exiba cdigo, preo e valor arredondado do preo de cada produto para 1 casa decimal
SELECT codigo,preco, ROUND (preco,1) FROM produto

2008.2

Funes Matemticas

Exemplo 10: exiba o preo do produto elevado a potncia de 3


SELECT POWER(preco,3) FROM produto

2008.2

Funes de Caracteres

Aplicao: muito teis para manipular dados do tipo caractere


SUBSTRING(expr, inicio, tam): Extrai uma parte de uma string desde inicio e com tam caracteres LOWER(expr): converte para minsculo

2008.2

Funes de Caracteres

Exemplo 11: exiba os 10 primeiros caracteres do ttulo de um livro em minsculo e seu preo da tabela livros
SELECT LOWER(SUBSTRING(titulo,1, 10)) Titulo, preco FROM livros

2008.2

Funes de Data e Hora


Aplicao: em colunas do tipo datetime, que armazenam data e hora
DatePart(parte,data): retorna a parte especificada da data
Argumento Parte

yy
qq

O ano
o trimestre

hh
mi

horas
minutos

mm
dd

o ms
dia do ms

ss
ms

segundos
milisegundos

2008.2

Funes de Data e Hora

Exemplo 12: Exiba o nome e ms de aniversrio de todos os funcionrios


SELECT nome, DatePart (mm,dataNasc) FROM funcionarios

2008.2

Funes de Data e Hora

GetDate(): retorna a data e hora atuais


Exemplo 13: exiba a data de aniversrio e o dia atual para todos os funcionrios

SELECT dtNasc, GetDate() Dia de Hoje FROM funcionarios

2008.2

Funes de Converso
Aplicao: converso de um tipo de dado em outro

CONVERT (tipo de dado, valor)


Exemplo 14: Exiba o preo de um produto convertido para string apenas no select
SELECT Convert( char(10), preco) FROM produto

2008.2

Funes de Converso

Com valores datetime, convert pode ter um parmetro a mais que especifica o formato da data a ser usado

Padro brasileiro: 3 (dd/mm/aa) e 103 (dd/mm/aaaa) Padro americano: 1 (mm/dd/aa) e 101 (mm/dd/aaaa)

2008.2

Funes de Converso

Exemplo 15: Exiba a data de hoje no formato brasileiro


SELECT Convert( char(10), GetDate(), 103)

2008.2

EXERCCIOS
Quer enriquecer suas expresses SQL? Pesquise as seguintes funes no SQL Server
Funes de Caracteres
Upper(), Ltrim(), Rtrim(), Space(), Str()

Funes de Data e Hora


DateAdd(), DateDiff(), DateName()

Traga na prxima aula instrues demonstrando o uso destas funes !!

SELECT

2008.2

Eliminando Duplicao de Linhas

Sintaxe: SELECT DISTINCT <colunas> FROM <tabelas> Exemplo 16: Exibir cdigo de todos os clientes que j fizeram pedido na empresa

SELECT DISTINCT cod_cliente FROM clientes

2008.2

Ordenando Resultados
Sintaxe: SELECT <colunas> FROM <tabelas> ORDER BY <coluna> [ASC] [DESC] Exemplo 17: Exibir cdigo, nome e telefone de todos os clientes, ordenado pelo nome do cliente de forma ascendente

SELECT cod_cliente, nome, tel FROM clientes ORDER BY nome

2008.2

Ordenando Resultados

Exemplo 18: Exibir nome, cidade e sexo de todos os clientes ordenado por cidade em ordem ascendente e sexo em ordem descendente

SELECT nome, cidade, sexo FROM clientes ORDER BY cidade, sexo DESC

2008.2

Filtrando os Dados
Sintaxe: SELECT <colunas> FROM <tabelas> WHERE <coluna operador expresso> Exemplo 19: Exibir todos os dados dos funcionrios que nasceram a partir de 1950

SELECT *, Convert(varchar, dtNas, 103) FROM funcionarios WHERE dtNasc > 31/12/1949
Qual outra maneira de fazer esta consulta usando funes de data na clusula Where ??

2008.2

Filtrando Dados Usando Intervalo


Sintaxe: SELECT <colunas> FROM <tabelas> WHERE <coluna BETWEEN expresso>

Exemplo 20: Exibir todos os dados de produtos cujo estoque esteja entre 10 e 30 unidades, ordenados pelo nome do produto

SELECT * FROM produtos WHERE estoque_atual BETWEEN 10 AND 30 ORDER BY nome

2008.2

Filtrando Dados Usando Intervalo Exemplo 21: Exibir todos os dados de funcionrios que nasceram na dcada de 60, ordenados pela data de nascimento em ordem descendente, e pelo nome do funcionrio em ordem ascendente.

SELECT * FROM funcionarios WHERE dataNasc BETWEEN 01/01/1960 AND 31/12/1969 ORDER BY dataNasc DESC,nome

2008.2

Filtrando Dados Usando Listas Sintaxe: SELECT <colunas> FROM <tabelas> WHERE <coluna IN lista> Exemplo 22: Exibir todos os dados dos funcionrios que residam em Manara ou Bessa, ordenados pelo nome

SELECT * FROM funcionarios WHERE bairro IN (Manaira, Bessa) ORDER BY nome

2008.2

Filtrando Dados Usando Listas

Exemplo 23: Exibir todos os produtos que no sejam do tipo 2 ou 4, ordenados pelo tipo em ordem descendente

SELECT * FROM produtos WHERE tipo NOT IN (2,4) ORDER BY tipo DESC

2008.2

Filtrando Dados com Valores Nulos

Sintaxe: SELECT <colunas> FROM <tabelas> WHERE <coluna> IS [NOT] NULL

Significado
Valores no formatados ou desconhecidos

2008.2

Filtrando Dados com Valores Nulos

Exemplo 24: Exibir os dados dos funcionrios que no tenham e-mail

SELECT * FROM funcionarios WHERE email IS NULL


Exemplo 25: Exibir dados dos funcionrios cujo nmero do telefone seja conhecido

SELECT * FROM funcionarios WHERE telefone IS NOT NULL

2008.2

Filtrando Dados com Valores Nulos

Voc acha que as linhas com valores NULL sero retornadas de acordo com o SELECT abaixo ??

SELECT * FROM funcionarios WHERE estado <> PB


NO !!!

2008.2

Filtrando Dados usando Strings

Sintaxe: SELECT <colunas> FROM <tabelas> WHERE <coluna> LIKE <string>

Significado:

Casamento de Padro: uma string contendo caracteres que podem ser combinados com parte de outra string % (porcentagem): seqncia de caracteres _ (sublinhado): Combina com um nico caractere

2008.2

Filtrando Dados usando Strings Outras combinaes:


[] (colchetes): combina uma faixa de caracteres ^ (circunflexo): significa negao

Como encontrar todos os nomes que comeam com A ou B?


Usar LIKE [AB]%

Como encontrar todos os nomes que comeam com as letras de A at E?


Usar LIKE [A-E]%

E todos os nomes que no iniciam com V?


Usar LIKE [^V]%

2008.2

Funes Agregadas
COUNT(): conta o nmero de valores de uma coluna SUM(): soma os valores de uma coluna de dados numricos AVG(): calcula a mdia de uma coluna de dados numricos MAX(): determina o maior valor de uma coluna MIN() : determina o menor valor de uma coluna

2008.2

Funes Agregadas
Obs.: A clusula DISTINCT pode ser usada como parte do argumento para eliminar linhas repetidas antes da aplicao da funo Exemplo 26: Exibir a quantidade de produtos vendidos com preo maior que R$ 10,00

SELECT COUNT (DISTINCT cod_p) FROM produtos WHERE preco > 10

2008.2

Para Pesquisar!! Clusula COMPUTE Sintaxe: SELECT <colunas> FROM <tabelas> ORDER BY <coluna> COMPUTE <lista de funes de agregao> BY <lista de colunas>

Para que serve?


Gerar totalizadores que aparecem como colunas adicionais resumo no final do conjunto resultado

O que devo fazer ??


Trazer 3 exemplos prticos desta clusula

2008.2

SQL Avanado Continuao

Renata Viegas

2008.2

Clusula COMPUTE
Sintaxe: SELECT <colunas> FROM <tabelas> ORDER BY <coluna> COMPUTE <lista de funes de agregao> BY <lista de colunas> Para que serve?
Gerar totalizadores que aparecem como colunas adicionais resumo no final do conjunto resultado

O que devo fazer ??


Trazer 3 exemplos prticos desta clusula

2008.2

Clusula COMPUTE

Gera totalizadores que aparecem como colunas adicionais resumo no final do conjunto resultado Quando utilizada com a clusula BY, ela gera sub-totais no conjunto resultado No padro SQL

2008.2

Clusula COMPUTE

SELECT <colunas> FROM <tabelas> ORDER BY <coluna> COMPUTE <lista de funes de agregao> BY <lista de colunas>

2008.2

Clusula COMPUTE
Exemplo: Mostrar uma soma sumarizada dos preos de custo e venda

SELECT p.codP, p.nome, p.tipo, p.preco_custo, p.preco_venda FROM produto p, pedido pe WHERE p.codP = pe.cod_produto ORDER BY codP COMPUTE SUM(preco_venda), SUM(preco_custo)

2008.2

Clusula COMPUTE
Exemplo com BY: Mostra uma soma sumarizada dos preos de custo e venda para cada tipo de produto

SELECT p.codP, p.nome, p.tipo, p.preco_custo, p.preco_venda FROM produto p, pedido pe WHERE p.codP = pe.cod_produto ORDER BY codP COMPUTE SUM(preco_venda), SUM(preco_custo) BY codP

2008.2

Agrupando Informaes GROUP BY

Sintaxe SELECT <colunas> FROM <tabelas> WHERE <condio> GROUP BY <coluna> HAVING <condio>

2008.2

Agrupando Informaes GROUP BY

GROUP BY: organiza as linhas de resultado em grupos de acordo com os valores das expresses informadas
Uso com funes agregadas

HAVING: (opcional) seleciona os grupos de acordo com os resultados


S pode ser usado junto com o GROUP BY

2008.2

Agrupando Informaes GROUP BY

Exemplo: Exibir a quantidade de homens e mulheres na empresa


SELECT sexo, count (*) FROM funcionrio GROUP BY sexo

2008.2

Agrupando Informaes GROUP BY

Exemplo: Exibir a quantidade de funcionrios e o total de salrios de cada setor da empresa


SELECT setor, COUNT(*) TotFunc, SUM(salario) TotSal FROM funcionrio GROUP BY setor

2008.2

Agrupando Informaes GROUP BY

Exemplo: Exibir a quantidade de pedidos de cada data

SELECT data_pedido, COUNT(*) quantidade FROM pedido GROUP BY data_pedido

2008.2

Agrupando Informaes GROUP BY

Exemplo: Exibir os cdigos dos pedidos que tem mais do que 4 produtos SELECT cod_pedido, COUNT(produto) FROM itens GROUP BY cod_pedido HAVING COUNT(produto)>4

2008.2

Agrupando Informaes GROUP BY

Exemplo: Exibir o valor total de cada pedido (valor total = quantidade*preo-desconto), onde a soma seja maior que R$1.000,00

SELECT cod_pedido, SUM((quant*preco)-desc) FROM itens GROUP BY cod_pedido HAVING SUM((quant*preco)-desc) > 1000

2008.2

Agrupando Informaes GROUP BY

Exemplo: Exibir a mdia de idade dos funcionrios de cada sexo, em cada setor da empresa. Exibir apenas os setores onde essa mdia de idade seja superior a 40 anos

SELECT setor, sexo, AVG(idade) FROM funcionario GROUP BY setor, sexo HAVING AVG(idade) > 40

2008.2

Sub-Consultas
Uma sub-consulta uma consulta SELECT aninhada dentro de outro comando SQL

Uma sub-consulta deve ser delimitada parnteses e avaliada apenas uma vez

entre

O resultado de uma sub-consulta retorna um conjunto de linhas para a consulta principal


A consulta mais externa depende da sub-consulta

2008.2

Sub-Consultas

Retorno de uma sub-consulta


Uma sub-consulta de valor nico retorna apenas um valor e pode ser usada no lugar de qualquer expresso utilizando operadores (=, <, >, <>) 1 coluna 1 valor
WHERE A=(SELECT b...) /*Verdade se A=B*/

2008.2

Sub-Consultas

Exemplo: Exibir o nome e o valor da gratificao das funes que tm a menor gratificao da empresa SELECT nome, gratificacao FROM funcao WHERE gratificacao = (SELECT MIN(gratificacao) FROM funcao)

2008.2

Sub-Consultas
Exemplo: Exibir o cdigo, o nome e a quantidade em estoque do produto que tem a maior quantidade em, estoque da empresa

SELECT codigo, nome, quantEst FROM produto WHERE quantEst = (SELECT MAX(quantEst) FROM produto)

2008.2

Sub-Consultas

Retorno de uma sub-consulta


Uma sub-consulta de valor nico retorna mltiplas linhas e pode ser usada apenas em um WHERE utilizando clusulas especiais 1 coluna muitos valores

2008.2

Sub-Consultas

Uma sub-consulta pode retornar tambm uma lista de valores, que pode ser usada em comparaes com o operador IN

2008.2

Sub-Consultas

Exemplo: Exibir cdigo e nome de todos os clientes estrangeiros SELECT codigo, nome FROM cliente WHERE codPais IN (SELECT codigo FROM pais WHERE codigo <>BRA)
SELECT c.codigo, c.nome FROM cliente c, pais p WHERE c.codPais = p.codigo AND c.codPais <>BRA

2008.2

Sub-Consultas: Lista de Valores Especiais > ALL : maior que todos < ALL : menor que todos <> ALL : diferente de todos (igual a NOT IN) = ANY : igual a algum dos elementos da lista (o mesmo que IN) > ANY : maior que algum dos elementos da lista < ANY: menor que algum dos elementos da lista <> ANY : diferente de algum dos elementos da lista

2008.2

Sub-Consultas
Exemplo: exibir nome, tipo e preo de venda dos produtos que no sejam dos tipos 3, 4 ou 5, e que tenham preo de venda maior que pelo menos o preo de um destes produtos

SELECT nome, tipo, preco_venda FROM produto WHERE tipo NOT IN (3,4,5) AND preco_venda > ANY (SELECT preco_venda FROM produto WHERE tipo IN (3,4,5))

2008.2

Unio de Conjuntos
Clusula UNION
Utilizada para combinar resultado de dois comandos do tipo SELECT Os dois comandos podem at trazer dados de tabelas diferentes, desde que com o mesmo nmero de colunas e tipos de dados compatveis para cada coluna correspondente de um com o outro Na unio de conjuntos, os elementos repetidos so eliminados (como se utilizasse a clusula DISTINCT)

2008.2

Unio de Conjuntos
Exemplo: Exiba todas as cidades e estados onde existem autores ou editoras, ordenados pelo estado SELECT cidade, estado FROM autor UNION SELECT cidade, estado FROM editoras ORDER BY estado

2008.2

Consulta com Criao de Tabela

Sintaxe: SELECT <colunas> INTO <nova_tabela> FROM <tabela>

2008.2

Consulta com Criao de Tabela

Exemplo: Criar uma nova tabela que contenha o cdigo do pedido, nome e telefone do cliente que fez cada um deles.

SELECT p.codPedido Pedido, c.nomeCliente Cliente, C.fone Fone INTO Pedidos FROM compras p, cliente c WHERE p.codCli = c.CodCli

2008.2

Consulta com Criao de Tabela

A nova tabela chamada Pedidos ser criada no banco de dados (criao fsica), contendo o cdigo do pedido, o nome e telefone do cliente que fez cada um deles Para criar uma tabela temporria, necessrio colocar o caractere # iniciando o nome da tabela
#Pedidos Tabela Local ##Pedidos Tabela Golbal

2008.2

Tabelas Temporrias

Tabelas Temporrias Locais: Criadas com o prefixo #, e possuem visibilidade restrita para a conexo responsvel pela sua criao Tabelas Temporrias Globais: Criadas com o prefixo ##, e so visveis para todas as conexes

2008.2

Tabelas Temporrias

Os dois tipos de tabelas (locais e globais) s existem enquanto a conexo responsvel pela sua criao estiver ativa
So eliminadas automaticamente conexo desfeita quando a

2008.2

Tabelas Temporrias

Exemplo: Criar uma tabela com CREATE TABLE e inserir dados na mesma

CREATE TABLE #temp ( codCli int, nome varchar(50) )

INSERT INTO #temp VALUES (1, Ana) SELECT * FROM #temp

2008.2

Tabelas Temporrias

Exemplo: selecione a quantidade de pedidos agrupados pela data para uma nova tabela temporria global SELECT data Data, COUNT(*) Quant INTO ##temp FROM pedidos GROUP BY data

2008.2

Tabelas Temporrias

Cuidado com a duplicao do nome da tabela temporria durante a criao! Se acontecer, teremos uma situao de erro S utilize tabelas temporrias quando necessrio!
Utilizao exige gravao em disco baixa performance

Você também pode gostar