Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila SQL
1. Introdução
Existem inúmeras versões de SQL. A versão original foi desenvolvida no
Laboratório de Pesquisa da IBM San Jose. Essa linguagem originalmente
chamada de Sequel, foi implementada como parte do projeto System R no
início dos anos 70. A linguagem Sequel evoluiu desde então, e seu nome foi
mudado para SQL (Structured Query Language). Numerosos produtos agora
suportam a linguagem SQL. Embora as versões do produto SQL difiram em
diversos detalhes de linguagem, as diferenças são, sem sua maioria,
secundárias.
Em 120086, o American National Standard Institute (ANSI) publicou um padrão
SQL. A SQL estabeleceu-se claramente como a linguagem padrão do banco de
dados relacional.
A linguagem SQL tem diversas partes:
• Data definition language (DDL) - (Linguagem de definição de dados).
A SQL DDL fornece comandos para definição de esquemas de relação,
remoção de relações, criação de índices e modificação de esquemas de
relação.
• Authorization - (Autorização).
A SQL DDL inclui comandos para especificação de direitos de acesso a
relações e visões.
• Integrity - (Integridade).
A SQL, geralmente, inclui comandos para testar restrição de identidade,
restrição de integridade e restrição de domínio simples, diretamente nos
campos da tabela. Outros tipos de restrições mais complexas são
resolvidos através de triggers e storage procedures
SQL 2
Observação:
@ - Chaves primárias
(E) - Chaves estrangeiras
SQL 3
2. Criação de Tabelas
A SQL DDL permite a especificação não apenas de um conjunto de relações,
mas também de informações sobre cada relação, incluindo:
Restrições importantes:
Restrição Descrição
Primary Key Define chave primária
Foreign key Define chave estrangeira
Unique Define chaves candidatas
Null, not null Define se o campo permite ou não valores nulos
Identity Colunas preenchidas automaticamente
SQL 4
Exemplo:
3. Consulta a Tabelas
A estrutura básica de uma expressão SQL consiste de três cláusulas: SELECT,
FROM e WHERE.
EXEMPLO
Listar todos os produtos com suas descrições, unidades e valores unitários
Sintaxe SELECT *
FROM nome_tabela
Exemplo
Select *
From vendedor
Exemplo
Listar o código e o nome de cada cliente
Exemplo
1 Código do Cliente 2
2 Código do Cliente 15
Exemplo
Listar os preços dos produtos aumentados de 5%
EXEMPLO
Listar o número do pedido, o código do produto e a quantidade dos itens do
pedido com quantidade igual a 35
Exemplo
Listar o código e a descrição dos produtos que tenham o valor unitário na faixa
R$0,32 até R$2,00
Este operador procura por valores que estão dentro da faixa informada
(inclusive).
Os valores informados devem ser do mesmo tipo da coluna que se está
pesquisando.
SQL 10
Select nome
From tabela
Where nome like ‘BR%’
SQL 11
Exemplo
Listar os vendedores que têm a faixa de comissão A ou B
Select nome_vendedor
From vendedor
Where faixa_comissao in (‘A’, ‘B’)
Select nome_vendedor
From vendedor
Where faixa_comissao = ‘A’OR faixa_comissao =‘B’
Exemplo
Exemplo
Listar os produtos que tenham unidade igual a ‘M’ e valor unitário igual a R$
1,05
Select descricao_produto
From produto
Where unidade = ‘M’ and valor_unitario = $1.05
Exemplo
Quais os tipos de unidades de produtos na tabela de produtos?
Exemplo
Existem casos nos quais duplicações precisam ser eliminadas antes de uma
função agregada ser computada. Se desejamos eliminar duplicações, usamos
a palavra-chave DISTINCT na expressão agregada.
Às vezes é útil definir uma condição que se aplique a grupos em vez de tuplas.
Por exemplo, podemos estar interessados em saber quais os pedidos possuem
mais que 3 produtos. Esta condição não se aplica a tuplas simples. Pelo
contrário, aplica-se a cada grupo construído pela cláusula GROUP BY
(agrupamento por pedido). Para expressar tal consulta usamos a cláusula
HAVING. A cláusula HAVING habilita a aplicação de condições a grupos. Os
predicados na cláusula HAVING são aplicados depois da formação dos grupos,
para que funções agregadas possam ser usadas.
Resumindo as funções agregadas produzem um único valor baseado em uma
determinada coluna, a cláusula GROUP BY permite organizar em grupos estes
dados sumarizados e a cláusula HAVING aplica restrições aos grupos gerados.
Exemplos
MAX, MIN
Listar o menor e o maior salário de vendedor
SUM
Mostrar a quantidade total pedida para o produto de código ‘78’
AVG
Qual a média dos salários fixos dos vendedores?
COUNT
Quantos vendedores ganham acima de R$ 2.500,00 de salário fixo
Exemplos
Listar os pedidos que têm mais do que três produtos e que foram solicitados
em quantidade maior que 100
Sintaxe 2
SELECT nome_tabela1.nome_atributo1, ....
FROM nome_tabela1, nome_tabela2 ...
WHERE nome_tabela.nome_atributo1 operador_junção
nome_tabela2.nome_atributo2
SQL 18
Sintaxe 1 Sintaxe 2
Condição de junção na cláusula WHERE com os
INNER JOIN
operadores descritos acima
CROSS JOIN Comando SELECT sem a cláusula WHERE
LEFT OUTER JOIN Operador *= na equação de junção
RIGHT OUTER JOIN Operador =* na equação de junção
FULL OUTER JOIN Não tem comando compatível
Formato 1
Select nome_cliente, pedido.cod_cliente, num_pedido
From cliente inner join pedido on cliente.cod_cliente = pedido.cod_cliente
Formato 2
Select nome_cliente, pedido.cod_cliente, num_pedido
From cliente
Where cliente.cod_cliente = pedido.cod_cliente
SQL 19
Formato 1
Select nome_produto, num_pedido
From produto P left outer join item_pedido I on
P.cod_produto = I.cod_produto
Formato 2
Select nome_produto, num_pedido
From produto P item_pedido I
Where P.cod_produto *= I.cod_produto
Listar os clientes (por ordem de nome) que têm prazo de entrega maior eu 15
dias para o produto ‘QUEIJO’ e que sejam do Rio de Janeiro
Formato 1
Select nome_cliente
From cliente C inner join pedido P
on C.cod_cliente = P. cod_cliente
Inner join item_pedido I
On P.num_pedido = I.num_pedido
Inner join produto PR
On I.cod_produto = Pr.cod_produto
Where prazo_entrega > 15 and
Descricao = ‘QUEIJO’ and
UF = ‘RJ’
Order by C.nome_cliente
Formato 2
Select nome_cliente
SQL 20
Formato 1
Select X.nome_cliente , R.nome_cliente
From cliente X join cliente R on X.cidade = R.cidade
Where X_cod_cliente < R.cod_cliente
Formato 2
Select X.nome_cliente , R.nome_cliente
From cliente X, cliente R
Where X.cidade = R.cidade and X_cod_cliente < R.cod_cliente
Exemplo
Que produtos participam em qualquer pedido cuja quantidade seja 10?
Select descricao
From produto
Where cod_produto in
(select cod_produto
from item_pedido
where quantidade = 10
Exemplos
Exemplo
Quais os vendedores que só venderam produtos por grama (‘G’)
Select nome_vendedor
From vendedor
Where salario_fixo <
(select avg(salario_fixo)
from vendedor)
Os operadores de comparação permitidos são os seguintes: =, <>, >, >=, <=, <,
!>, !<.
As sub-consultas deste tipo sem a utilização de ANY ou ALL, devem retornar
um único valor e, não podem incluir as cláusulas GROUP BY e HAVING.
A lista de atributos neste tipo de sub-consulta pode incluir somente um único
nome de coluna ou uma expressão.
A utilização de ANY e ALL permite a comparação de um único valor (da
consulta externa) com um conjunto de elementos (gerados pela sub-consulta).
SQL 24
⇒ Atualizações - UPDATE
Em certas situações, podemos desejar mudar um valor em uma tupla sem
mudar todos os valores na tupla. Para isto, a instrução UPDATE pode ser
usada. Como era o caso para INSERT e DELETE podemos escolher as tuplas
a serem atualizadas usando uma consulta.
4.1 Inserindo Linhas na Tabela
Exemplo
Adicionar o produto ‘parafuso’ à tabela produto
Insert produto
Values (108, ‘parafuso’,’KG’, 1.25)
Exemplo
Insira na tabela de vendedores o vendedor Ednilson, com código 315
• DEFAULT
Insere um valor default para uma coluna determinada
Sintaxe parcial VALUES (DEFAULT/ valor constante,...)
SQL 26
Exemplo
Insert vendedor
Values (315, Ednilson, DEFAULT, ‘A’)
• DEFAULT VALUES
Insere um valor default para todas a colunas da tabela
Sintaxe INSERT nome_tabela DEFAULT VALUES
Exemplo
Exemplo
Cadastrar como cliente os vendedores que emitiram mais de 50 pedidos.
Usando uma cláusula SELECT diversas linhas de uma ou mais tabelas são
inseridas na tabela especificada na cláusula INSERT.
A tabela usada no INSERT e o resultado do SELECT devem ser compatíveis
em número de colunas, ordem das colunas e tipos de dados. No SQL Server os
tipos de dados são compatíveis quando são os mesmos ou podem ser
convertidos automaticamente.
Se um atributo é omitido na cláusula INSERT ele deve: possuir um valor default
ou permitir nulo.
Exemplo
Apagar todos os vendedores com faixa de comissão nula
Exemplo
Remover da tabela de pedidos os pedidos que contenham produtos que
custem menos de R$0,20
Versão ANSI
Delete from pedido
Where num_pedido in
(select num_pedido
from produto P, item_pedido I
where P.cod_produto = I.cod_produto and
valor_unitario < $0,20)
Exemplo
Alterar o valor unitário do produto ‘parafuso’ para R$ 1.62
Update produto
Set valor_unitario = 1.62
Where descricao = ‘parafuso’
Exemplo
Acrescentar 2,5% ao preço unitário dos produtos que estejam abaixo da média
dos preços, para aqueles comprados a Quilo
Update produto
Set valor_unitario = valor_unitario * 1.025
Where valor_unitario <
(select avg(valor_unitario)
from produto
where unidade = ‘KG’)
As diretrizes abaixo descrevem que tipo de dado deve ou não ser indexado:
Colunas que devem ser indexadas
• Chave primária
• Colunas frequentemente utilizadas em junção (chave estrangeira)
• Colunas frequentemente pesquisadas em faixas de valores
• Colunas frequentemente recuperadas de forma classificada
Sintaxe
Exemplo
Criar índice para a tabela ciente baseada no código do cliente, não podendo
haver duplicidade de informação armazenada
6. Utilizando Visões
Uma visão é uma tabela virtual criada a partir de uma ou mais tabelas do banco
de dados. Uma visão pode selecionar apenas algumas colunas ou, apenas
algumas linhas da tabela original e pode também possuir campos que são
calculados ou derivados de outras informações.
Visões podem ser utilizadas como um dispositivo de segurança do banco de
dados (o usuário enxerga apenas as informações que lhe são permitidas).
Podem também ser utilizadas com a finalidade de simplificar a visualização dos
dados ou para simplificar a definição das consultas.
Na criação de uma visão não podem ser usados os comandos: SELECT INTO,
ORDER BY, COMPUTE, COMPUTE BY ou UNION.
Depois de criada a visão será utilizada como se fosse uma tabela, nos
comandos SELECT, INSERT, UPDATE ou DELETE.
Uma visão é definida na SQL usando o comando CREATE VIEW. Para definir
uma visão, precisamos dar à visão um nome e definir a consulta que a
processa. Uma visão pode também ser definida a partir de outra visão.
A forma do comando CREATE VIEW é :
Sintaxe CREATE VIEW [PROPRIETARIO.] nome_visão
[(nome_atributo1 [, nome_atributo2]...)
[WITH ENCRYPTION]
AS comando_select [WITH CHECK OPTION]
Exemplo
Crie uma VIEW que contenha só os produtos pedidos a metro
SQL 32
Visões não podem ser alteradas, devem ser apagadas (DROP VIEW) e
recriadas.
Uma atualização em uma visão pode afetar somente um objeto subjacente, ou
seja, se a visão é resultado da junção de duas tabelas devem-se alterar os
campos de cada tabela em comandos de atualização separados.
Colunas que contém valores calculados, funções do sistema ou, funções de
agregação não podem ser modificadas.
Uma linha não pode ser inserida através de uma visão a menos que as colunas
que não aceitem nulos, no objeto subjacente tenha valores defaults. Esta regra
é relevante para as colunas que não fazem parte da definição da visão.
SQL 33
Exercícios
Criando tabelas
1. Criar uma tabela de alunos com seus dados pessoais - chave primária:
matrícula do aluno, permitir valores nulos para o campo CIC
2. Criar uma tabela com as informações sobre disciplinas - atributos: sigla
(chave primária), descrição, carga horária, semestre no curso. Permitir
valores nulos no campo semestre no curso
3. Criar uma tabela com informações relevantes para um banco de dados
contendo informações sobre CD's
4. Criar uma tabela de funcionários para o banco de dados de uma empresa,
definir uma chave primária, não aceitar valores nulos
22.Listar as cidades onde moram os clientes (exibir cada cidade apenas uma
vez).
23.Listar dos dados dos clientes por ordem alfabética de nome.
24.Listar os dados dos clientes por ordem alfabética decrescente de cidade.
25.Listar os dados dos clientes por ordem de cidade e por ordem do nome dos
clientes.
26.Listar os códigos e a descrição dos produtos, cuja unidade igual o "Kg" por
ordem alfabética de descrição.
27.Listar os dados dos produtos por ordem decrescente de valor unitário.
28.Listar a maior quantidade que conste na tabela de item do pedido.
29.Listar o menor valor unitário da tabela de produtos.
30.Mostrar a somatória dos salários fixos pago aos vendedores.
31.Qual a medida de valor unitário para os produtos cuja unidade seja igual a
"Kg".
32.Mostrar quantos tipos de unidades diferentes existem na tabela de produtos.
33.Listar o número de produtos cuja unidade seja igual a "Lt".
34.Listar o número de clientes agrupados por cidade.
35.Listar quantos pedidos cada vendedor realizou.
36.Listar o maior e o menor valor unitário para cada tipo de unidade de produto.
37.Listar o número de clientes, agrupados por cidade para todas as cidades
que aparecem mais de 4 vezes na tabela de clientes.
Criando índices
1. Criar uma tabela de índices para a tabela cliente utilizando o campo
nome_cliente
2. Criar uma tabela de índices para a tabela vendedor utilizando o campo
nome_vendedor, não permitindo duplicidade de informações
3. Criar uma tabela de índices para a tabela pedidos utilizando o campo
prazo_entrega
SQL 38
Utilizando Visões
1. Criar uma view para os clientes que morem em Itu, utilizando todos os
campos da tabela de clientes
2. Criar uma view a partir da tabela de clientes, utilizando apenas os campos
cod_cliente e noeme_cliente
3. Criar uma view a partir da tabela de pedidos para os pedidos realizados em
fevereiro/1999
4. Criar uma view a partir da tabela de vendedores, para todos os vendedores
com faixa de comissão 'Ä' ,com todos os campos da tabela vendedor
5. Criar uma view com o nome do cliente e o nome do vendedor que atendeu
seus pedidos