Consultas Sobre as Tabelas
Selecionando Colunas Específicas de uma Tabela
SELECT <lista_de_colunas> FROM <nome_tabela>;
Problema:
Listar todos os produtos com as respectivas descrições, unidades e valores unitários.
select desc_prod,unid_prod,val_unit from produto;
Problema:
Listar os nomes dos clientes, as cidade e os estados onde eles estão localizados.
select nome_cli,cidade,uf from cliente
Selecionando todas as Colunas de uma Tabela
Problema:
Listar o conteúdo de todas as tabelas da base de dados dos exemplos.
select * from cliente;
select * from produto;
select * from vendedor;
select * from pedido;
select * from item_pedido;
Selecionando Apenas Alguns Registros da Tabela
SELECT <lista_de_colunas>
FROM <nome_tabela>
WHERE <condição_de_seleção>;
Onde a cláusula WHERE tem a seguinte forma:
WHERE <nome_da_coluna> <operador> <valor>
Operadores Relacionais:
Obs:
Quando a coluna é do tipo caracter, o <valor> deve estar entre aspas simples .
Exemplo: 'parafuso'
Na linguagem SQL existe diferença entre caracteres maiúsculos e minúsculos (case sensitive);
logo, 'PARAFUSO' é diferente de 'parafuso'.
Problema:
Listar o número do pedido, o código do produto e a quantidade pedida dos
itens de um pedido, onde a quantidade pedida seja igual a 2.
select no_ped,cd_prod,qtd_ped
from item_pedido
where qtd_ped = 500;
lista o nome dos clientes que moram em jaboatão
select nome_cli
from cliente
where cidade = 'jaboatao'
Operadores Lógicos
Problema:
Quais são os produtos que têm unidade igual a 'kg' e valor unitário maior do
que R$ 20?
Obs:
A prioridade do operador AND é maior do que a prioridade do operador OR;
Problema:
Mostrar todos os pedidos que não tenham prazo de entrega superior a 10 dias.
select num_ped
from pedido
where not (prazo_entr > 5);
Operadores BETWEEN e NOT BETWEEN
WHERE <nome_coluna> BETWEEN <valor1> AND <valor2>
WHERE <nome_coluna> NOT BETWEEN <valor1> AND <valor2>
Este operador possibilita a seleção de uma faixa de valores sem a necessidade do uso dos operadores >=, <= e AND.
<valor1> e <valor2> têm que ter o mesmo tipo de dado que <nome_coluna>.
Problema:
Liste o código e a descrição dos produtos que tenham o valor unitário na faixa
de R$ 10 a R$ 20.
select cod_prod, desc_prod
from produto
where val_unit between 10 and 20
Operadores LIKE e NOT LIKE
WHERE <nome_coluna> LIKE <valor>
WHERE <nome_coluna> NOT LIKE <valor>
Aplicáveis apenas a colunas dos tipos CHAR e VARCHAR. Funcionam de modo análogo aos operadores = e <>, porém o poder dos operadores LIKE e NOT LIKE está na utilização dos símbolos % e _, que podem fazer o papel de “coringa”:
% substitui uma palavra
_ substitui um caracter qualquer
Problema
Listar todos os produtos que tenham a sua descrisão começando por c.
select *
from produto
where desc_prod like 'c%'
Listar o código e a descrição de todos os produtos que tenham a sua unidade não começando por k .
select cod_prod,desc_prod
from produto
where unid_prod not like 'k__';
Operadores IN e NOT IN
WHERE <nome_coluna> IN <lista_de_valores>
WHERE <nome_coluna> NOT IN (<lista_de_valores>)
Seleciona as linhas cujo o valor da coluna <nome_coluna> pertença ao conjunto <lista_de_valores>.
Problema:
Listar todos os vendedores cujas as faixas de comissão sejam 'a' ou 'b'.
select cod_vend,nome_vend
from vendedor
where faixa_comissao in ('7','9');
Operadores IS NULL e IS NOT NULL
WHERE <nome_coluna> IS NULL
WHERE <nome_coluna> IS NOT NULL
A utilização do valor nulo (NULL) é problemática, pois as diversas implementações da linguagem SQL podem adotar qualquer representação para o valor nulo.
problema
Mostrar os clientes que não tenham endereço cadastrado.
select nome_cli
from cliente
where endereco is null;
Ordenando os Dados Selecionandos
SELECT <lista_de_colunas>
FROM <nome_tabela>
WHERE <condição_de_seleção>
ORDER BY {<nome_coluna>|<num_col> [ASC|DESC]}
problemas
Mostrar em ordem alfabética a lista de vendedores e seus respectivos salários
fixos
select nome_vend,salario_fixo
from vendedor
order by nome_vend;
Listar os nomes, as cidades e os estados de todos os clientes, ordenados por
estado descendente e cidade de forma ascendente.
select nome_cli,cidade,uf
from cliente
order by uf desc,cidade asc
Mostrar a descrição e o valor unitário de todos os produtos que tenham
unidade 'kg' em ordem ascendente de valor unitário.
select desc_prod, val_unit
from produto
where unid_prod = 'kg'
order by val_unit;
Realizando Cálculos sobre a Informação Selecionada
Podemos criar dinamicamente um campo que não pertença à tabela original através de operações executadas sobre os campos projetados.
Problema:
Exibir o novo salário fixo dos vendedores da faixa de comissão ‘C’, calculado com base no reajuste de 75% sobre o salário atual acrescido de R$ 120,00 de bonificação. Ordene a relação resultante pelo nome do vendedor.
select nome_vend, ((salario_fixo*1.75)+120)
from vendedor
where faixa_comissao = '5'
order by nome_vend;
Máximos (MAX) e Mínimos (MIN)
Problema:
Mostrar o menor e o maior salário entre os vendedores.
select MIN(salario_fixo),MAX (salario_fixo)
from vendedor;
Totalizando Colunas (SUM)
Problema:
Mostrar a quantidade total pedida para o produto cimento, de código 1.
select SUM(qtd_ped)
from item_pedido
where cd_prod=1;
Calculando Médias (AVG)
Problema:
Qual é a média dos salários fixos dos vendedores?
select AVG(salario_fixo)
from vendedor;
Contando as Linhas (COUNT)
Problema:
Quantos vendedores ganham acima de R$ 1.500,00 de salário fixo?
select COUNT(*)
from vendedor
where salario_fixo>1500;
A Palavra-Chave DISTINCT
Várias linhas de uma tabela podem conter os mesmos valores para as suas colunas (duplicidade), com exceção da chave primária. Quando desejarmos eliminar a duplicidade, podemos inserir a palavra-chave DISTINCT após a palavra-chave SELECT.
Problema:
Em que cidades as nossa empresa possui clientes?
select DISTINCT cidade
from cliente;
Agrupando a Informação Selecionada (GROUP BY)
Existem ocasiões em que desejamos aplicar uma função de agregação não somente a um conjunto de tuplas, mas também organizar a informação em determinadas categorias. Isto é possível através do uso da cláusula GROUP BY.
Problema:
Listar o número de itens existente em cada pedido.
select no_ped, count(*)
from item_pedido
group by no_ped;
Nas consultas utilizando GROUP BY, Inicialmente as linha são agrupadas através do(s) atributo(s) fornecido(s) na cláusula GROUP BY; neste caso, no_ped. Em um segundo passo, é aplicada a operação COUNT(*) para cada grupo de linhas que tenha o mesmo número de pedido. Após a operação de contagem de cada grupo, o resultado da consulta é apresentado.
Normalmente, a cláusula GROUP BY é utilizada em conjunto com as
operações COUNT e AVG.
A Cláusula HAVING
Às vezes temos que definir condições e aplicá-las aos grupos ao invés de fazê-lo a cada linha separadamente. Por exemplo, suponha que desejemos listar todos os pedidos que possuam mais de um item. Esta condição não se aplica a uma única linha separadamente, mas a cada grupo definido pela cláusula GROUP BY. Para exprimir tal consulta, usamos a cláusula HAVING. A condição da cláusula HAVING é aplicada após a formação dos grupos; logo, podemos usar funções de agregação na construção das condições da cláusula HAVING.
Problema:
Listar os pedidios que possuam mais de um item.
select no_ped,count(*) as total_itens
from item_pedido
group by no_ped
having count(*)>=1;
Obs.: você deve esta se perguntando o que significa (as total_itens). Quando usamos a palavra-chave as estamos nomeando a coluna de um resultado que não existe na tabela.
Recuperando Dados de Várias Tabelas (JOINS)
Algumas consultas necessitam acessar simultaneamente várias tabelas, o que leva à realização de junções (JOINS) entre as tabelas para poder extrair as informações necessárias para a consulta formulada.
6.6.1 Qualificadores de Nomes
Um qualificador de nome consiste do nome da tabela, seguido de um ponto, seguido por um nome de uma coluna da tabela. Por exemplo, o qualificador da coluna DESC_PROD da tabela PRODUTO será PRODUTO.DESC_PROD.
Os qualificadores de nome são utilizados em uma consulta para efetivar a junção (JOIN) entre as tabelas.
Problema:
Faça uma junção da tabela de clientes com a de pedidos, exibindo o nome do
cliente, o código do cliente e o número do pedido.
select cod_cli,nome_cli,pedido.num_ped
falta a imagem
Neste exemplo foi executado um produto cartesiano das tabelas CLIENTE e PEDIDO, seguido de uma projeção das colunas exibidas. Neste caso, poucas informações úteis podem ser extraídas da relação resultante. Devemos então aplicar critérios de seleção à junção para podermos obter algum resultado concreto.
Problema:
A que clientes estão associados os pedidos existentes? Listar pelos nomes dos
clientes.
select nome_cli,pedido.cd_cli,pedido.num_ped
from cliente,pedido
where cliente.cod_cli=pedido.cd_cli;
from cliente,pedido;
A equação apresentada na cláusula WHERE é chamada de EQUAÇÃO DE JUNÇÃO.
Podemos utilizar os operadores LIKE, NOT LIKE, IN, NOT IN, NULL, NOT NULL, os operadores relacionais e operadores AND, OR e NOT, na cláusula WHERE de uma junção de tabelas.
Problema:
Quais são os clientes que têm pedidos com prazos de entrega superiores a 3 dias e que estão localizados nos estados de São Paulo ou do Pernambuco?
select nome_cli,uf,pedido.num_ped,pedido.prazo_entr
from cliente,pedido
where cliente.cod_cli=pedido.cd_cli and
uf in ('pe','sp') and prazo_entr>3;
Problema:
Mostrar os pedidos dos clientes e seus respectivos prazos de entrega,
ordenados do maior para o menor.
select pedido.num_ped, cliente.nome_cli, pedido.prazo_entr
from pedido, cliente
where pedido.cd_cli = cod_cli
order by pedido.prazo_entr DESC;