Escolar Documentos
Profissional Documentos
Cultura Documentos
Sumrio
1. INTRODUO 3
1.1. SOBRE SQL 3
1.2. VISO GERAL DE UM BANCO DE DADOS RELACIONAL 3
1.3. COLUNAS E LINHAS 4
1.4. ENTIDADES E CHAVE PRIMRIA 4
1.5. CHAVE PRIMRIA COMPOSTA 5
2. A LINGUAGEM SQL 6
2.1. CRIANDO UMA TABELA 6
2.2. IDENTIFICADORES E ATRIBUTOS 7
2.3. TIPOS DE DADOS 7
2.3.1. DADOS CARACTERES STRINGS 7
2.3.2. DADOS NUMRICOS 7
2.3.3. DADOS DATA E HORA 8
2.4. INCLUINDO DADOS 8
3. QUERIES: OBTENDO OS DADOS DESEJADOS 9
3.1. CLUSULAS SELECT E FROM 9
3.2. CLUSULA WHERE 10
3.2.1. PREDICADOS RELACIONAIS 11
3.2.2. OUTROS PREDICADOS RELACIONAIS 11
3.2.3. VINCULANDO VRIOS PREDICADOS: AND E OR 13
4. QUERIES: MANIPULANDO DADOS 14
4.1. OPERADORES ARITMTICOS 14
4.2. FUNES 15
4.2.1. FUNES AGREGADAS 15
4.2.2. FUNES NO AGREGADAS 15
4.2.3. FUNES DE SEQNCIAS DE CARACTERES 16
4.2.4. FUNES DE DATA E HORA 16
5. ORGANIZANDO O RESULTADO 17
5.1. CLUSULA GROUP BY 17
5.2. CLUSULA HAVING 17
5.3. CLUSULA ORDER BY 18
6. JUNES: QUERIES QUE ENVOLVEM MAIS DE UMA TABELA 19
6.1. EQUIJUNES 20
6.2. JUNES EXTERNAS 21
6.3. AUTO-JUNES 21
6.4. OUTROS TIPOS DE JUNES 23
7. QUERIES EM OUTRAS DECLARAES 23
7.1. DECLARAO UNION 23
7.2. UTILIZANDO QUERIES PARA INCLUIR DADOS 23
1.Introduo
Em outras palavras, temos que procurar por uma coluna (ou grupo de colunas) que apresente um contedo
diferente em cada linha dados que so duplicados em duas linhas. Esta caracterstica ento servir para
identificar a linha da mesma forma que usamos um nome para identificar uma pessoa.
Volte tabela HSPEDE (fig. 1.1). Observe que nem todos os atributos, ou colunas, so igualmente
suficientes para identificar as linhas. Por exemplo, no basta saber apenas o sexo de um hspede que voc
queira identificar se este atributo compartilhado por metade dos seus hspedes. Da mesma forma, se
soubermos o biotipo de um hspede teremos um grupo mais reduzido mas no conseguiremos localizar um
hspede em particular.
O problema que as colunas SEXO e BIOTIPO contm valores duplicados. Quando duas linhas contm o
mesmo atributo, este atributo no pode ser usado para distinguir as linhas entre si.
Concluindo, a nica coluna que pode servir de atributo identificador a coluna NOME. Como no contm
valores duplicados, as informaes nela contidas so por si s suficientes para distinguir a linha de um
hspede na tabela.
Descrevemos, na realidade, uma diferena entre os dois tipos de colunas. O primeiro tipo est baseado em
um atributo que identifique univocamente ou defina uma linha. O segundo tipo baseia-se em atributos
descritivos que fornecem informaes, mas no so suficientes para identificar uma linha ou entidade.
A coluna (ou grupo de colunas) baseada em um atributo identificador de uma linha chamada de Chave ou
Chave Primria. A chave de uma tabela lhe permite identificar as linhas individualmente, definindo
tambm as entidades s quais a tabela se refere. Um banco de dados relacional todas as tabelas tem que ter
uma chave primria que identifique cada linha.
Nenhuma das colunas por si s poder funcionar como chave primria, pois todas elas possuem valores
duplicados, inclusive NOME: Alexandre Gomes e Jane Fyundai estiveram hospedados duas vezes e por
isso aparecem duas vezes na lista. Para estabelecermos uma chave para esta tabela, teremos que usar duas
ou mais colunas conjuntamente. Este tipo de chave, envolvendo duas ou mais colunas, denomina-se chave
composta ou chave primria composta.
No exemplo (Fig. 1.2) as colunas que melhor se candidatam a formar chave composta so NOME e
CHEGADA. O NOME e a CHEGADA combinados lhe permite distinguir uma linha da outra, ou seja, no
h linhas com os valores de NOME e CHEGADA iguais.
Como estamos incluindo dados em todas as colunas da tabela LISTA_DE_HOSPEDES, poderamos omitir
a lista dos nomes das colunas aps o nome da tabela. Esta lista s indispensvel caso estejamos incluindo
dados em apenas algumas colunas e no em todas; temos ento que indicar os nomes das colunas que
recebero dados. Nomeamos todas as colunas neste exemplo simplesmente para facilitar anlise da
declarao.
Observe que os dados referentes s colunas NOME, QUARTO e TECNICO esto entre apstrofes (). Isto
se deve ao fato de que os dados das trs colunas so do tipo VARCHAR. Dados CHAR ou VARCHAR
usados em declaraes SQL devem aparecer entre apstrofes.
Incidentemente, podemos usar um asterisco (*) em vez de nomes de colunas na clusula SELECT. O
asterisco representa os valores de todas as colunas. Usar o asterisco o mesmo que nomear todas as
colunas de uma tabela ou mais tabelas, na sua ordem original. Portanto, ao invs de digitar todos os nomes
de colunas como fizemos no exemplo anterior, poderamos ter obtido o mesmo resultado codificando a
query assim:
SELECT *
FROM LISTA_DE_HOSPEDES;
Podemos selecionar de apenas algumas colunas e omitir outras. A query a seguir obtm os dados somente
da coluna NOME:
SELECT NOME
FROM LISTA_DE_HOSPEDES;
Podemos evitar que dados sejam exibidos duplicados, usando a palavra-chave DISTINCT imediatamente
aps a palavra SELECT na clusula SELECT para suprimir as linhas duplicadas do resultado. No
exemplo abaixo a palavra-chave DISTINCT foi acrescentada na query anterior:
SELECT DISTINCT NOME
FROM LISTA_DE_HOSPEDES;
NOME TCNICO
MARCELO FREITAS BRUNA
BIANCA OLIVEIRA BRUNA
ALEXANDRE GOMES BRUNA
No obrigatrio citar na clusula WHERE somente colunas que apaream na clusula SELECT. A query
anterior funcionaria da mesma forma se eliminssemos a coluna TECNICO da clusula SELECT.
SELECT NOME
FROM LISTA_DE_HOSPEDES
WHERE TECNICO = BRUNA;
NOME
MARCELO FREITAS
BIANCA OLIVEIRA
ALEXANDRE GOMES
O operador BETWEEN especifica os dados compreendidos em uma determinada faixa. Pode ser usado
tanto com nmeros quanto com datas. Por exemplo, poderamos obter os nomes e os percentuais de
desconto de todos os hspedes que tenham recebido de 10 a 20 por cento inclusive, como se segue:
SELECT NOME, DESCONTO
FROM LISTA_DE_HOSPEDES
WHERE DESCONTO BETWEEN .10 AND .20;
NOME DESCTO
JANE FYUNDAI 0.20
MARCELO FREITAS 0.10
MAURCIO DE SOUZA 0.15
STELLA SHIELDS 0.15
ALEXANDRE GOMES 0.20
Podemos solicitar tambm os nomes e as datas de sada de todos os hspedes que saram do Spa entre 19 e
24 de agosto:
NOME SAIDA
JOSE AUGUSTO 19-08-1997
BIANCA OLIVEIRA 20-08-1997
ALEXANDRE GOMES 23-08-1997
O operador IS NULL nos permite selecionar as linhas em que o valor de um determinado campo seja
desconhecido. Por exemplo, as linhas de vrios hspedes ficaram com a SAIDA em branco. Podemos
selecionar os nomes destes hspedes utilizando o operador IS NULL.
SELECT NOME, SAIDA
FROM LISTA_DE_HOSPEDES
WHERE SAIDA IS NULL;
NOME SAIDA
MARCELO FREITAS
JANE FYUNDAI
STELLA SHIELDS
O operador LIKE nos permite utilizar caracteres mscara para comparar dados em uma condio de
pesquisa. Em vez de os dados terem que ser idnticos, podemos especificar que sejam apenas semelhantes
em algum aspecto.
Podemos usar os dois caracteres mscara abaixo com o operador LIKE:
_ (sublinhado) Vale por qualquer caractere nico
* (asterisco) Vale por qualquer seqncia de caracteres
No contexto de um LIKE, o caractere de sublinhado ( _ ) funciona analogamente ao ponto de interrogao
(?) do MS-DOS, que serve de caractere mscara em nomes de arquivos, e o smbolo de percentual (%)
funciona analogamente ao asterisco (*).
O exemplo de query abaixo usa o operador LIKE e um caractere mscara para selecionar todos os nomes
que comecem com a seqncia de caracteres MA%;
SELECT NOME
FROM LISTA_DE_HOSPEDES
WHERE NOME LIKE MA%;
NOME
MARCELO FREITAS
MAURICIO DE SOUZA
A prxima query seleciona todos os nomes que tenham a letra J na primeira posio e N na quarta, no
importando quais sejam os outros caracteres.
SELECT NOME
FROM LISTA_DE_HOSPEDES
WHERE NOME LIKE J__N;
NOME
JANE FYUNDAI
Mais um exemplo:
SELECT NOME
FROM LISTA_DE_HOSPEDES
WHERE NOME LIKE _AR_E%;
NOME
MARCELO FREITAS
O ltimo operador a ser discutido neste tpico o IN, que nos permite selecionar dados que se encaixem
em um conjunto ou uma lista de valores. Os valores podem ser indicados explicitamente em uma
declarao, como nos exemplos a seguir.
A query abaixo seleciona o nome, o tcnico e o quarto de cada hspede cujo o tcnico esteja presente na
lista BRUNA, JULIO:
SELECT NOME, TECNICO, QUARTO
FROM LISTA_DE_HOSPEDES
WHERE TECNICO IN (BRUNA, JULIO);
Todos os operadores relacionais tambm podem ser utilizados com o NOT. Na query abaixo, selecionamos
o nome, o tcnico e o quarto dos hspedes cujo o tcnico no esteja includo na lista:
SELECT NOME, TECNICO, QUARTO
FROM LISTA_DE_HOSPEDES
WHERE TECNICO NOT IN (BRUNA, JULIO);
Podemos acrescentar inmeras condies clusula WHERE usando os operadores AND e OR. A prxima
query acrescenta vrios componentes:
SELECT NOME, QUARTO, TECNICO, CHEGADA, SAIDA
FROM LISTA_DE_HOSPEDES
WHERE SAIDA IS NULL
AND TECNICO = ROBERTO
AND QUARTO > 16
AND CHEGADA < 20-08-97;
NOME DESCTO
MARCELO FREITAS 0.15
Embora as regras variem de implementao para implementao, algumas permitem ainda o uso de
operadores aritmticos com dados do tipo data e hora. Em SQL Base, por exemplo, a query abaixo pode ser
usada para determinar por quantos dias ficaram no Spa os hspedes que j foram embora. Este nmero
obtido subtraindo-se a data de chegada de sada. Outras implementaes permitem queries semelhantes,
mas no idnticas.
SELECT NOME, SAIDA - CHEGADA
FROM LISTA_DE_HOSPEDES
WHERE NOME = MARCELO FREITAS
4.2. Funes
As funes constituem mais uma forma de usar queries para manipular os dados das tabelas. Uma funo
retorna o valor resultante de uma determinada operao realizada sobre o seu argumento (ou argumentos).
Uma funo, como o seu argumento, representa um valor e portanto uma expresso.
5.Organizando o Resultado
TCNICO NOME
BRUNA MARCELO FREITAS
BRUNA BIANCA OLIVEIRA
BRUNA ALEXANDRE GOMES
JLIO JANE FYUNDAI
JLIO JOS AUGUSTO
RICARDO ALEXANDRE GOMES
RICARDO MAURCIO DE SOUZA
SERENA JANE FYUNDAI
SERENA STELLA SHIELDS
Se houvesse linhas em que a coluna TECNICO estivesse em branco, ou seja, com um valor nulo para
TECNICO, tambm seriam agrupadas. E as linhas so agrupadas da mesma maneira para cada coluna
formadora de grupos subseqente, embora isto no esteja aparente no exemplo dados pois s contm duas
colunas.
Obs.: As funes agregadas AVG, SUM, MAX, MIN e COUNT no podem ser usadas em clusulas
GROUP BY pois geram um nico valor e por isso no podem agrupar linhas.
A clusula GROUP BY tambm pode ser usada em queries contendo uma clusula WHERE. Neste caso, a
GROUP BY codificada depois da clusula WHERE. Por exemplo, a query abaixo exibe os nomes dos
hspedes que chegaram depois do dia 15 de agosto por tcnico:
SELECT TECNICO, NOME
FROM LISTA_DE_HOSPEDES
WHERE CHEGADA > 15-08-97
GROUP BY TECNICO, NOME;
Uma nova tabela, HOSPEDES_PS, ser usada nos exemplos deste tpico. Criamos uma tabela com a
declarao CREATE TABLE abaixo. Esta tabela se destina a registrar as pesagens peridicas dos hspedes
do Visual Spa.
CREATE TABLE HOSPEDE_PS (HOSPEDE VARCHAR(25) NOT FULL, PESO
DECIMAL(4,1), QUANDO DATE);
Chamamos a coluna DATE de QUANDO porque DATE uma palavra reservada. As palavras
reservadas no podem ser usadas como nomes de colunas ou outros identificadores, a no ser que entre
aspas.
Aps a incluso dos dados, a tabela HOSPEDE_PS tem a seguinte aparncia:
SELECT * FROM HOSPEDE_PS
Passemos para um outro exemplo. Esta query solicita o nmero de hspedes orientados por cada tcnico
que trabalhou com mais de dois hspedes:
SELECT HOSPEDE, COUNT(NOME)
FROM HOSPEDE_PS
GROUP BY HOSPEDE
HAVING CONT(NOME) > 2;
NOME
STELLA SHIELDS
MAURCIO DE SOUZA
MARCELO FREITAS
JOS AUGUSTO
JANE FYUNDAI
JANE FYUNDAI
BIANCA OLIVEIRA
ALEXANDRE GOMES
ALEXANDRE GOMES
As classificaes so, por default, efetuadas em ordem crescente, a no ser que seja indicada a palavra-
chave DESC aps o nome da coluna. Porm, podemos tambm explicitar a ordem crescente para uma
determinada coluna, usando-se a palavra-chave ASC aps o nome da coluna na clusula ORDER BY.
NOME ALTURA
BIANCA OLIVEIRA 1,65
A prxima query obtm seu tcnico da tabela LISTA_DE_HOSPEDES:
SELECT NOME, TECNICO
FROM LISTA_DE_HOSPEDES
WHERE NOME = BIANCA OLIVEIRA;
NOME TECNICO
BIANCA OLIVEIRA BRUNA
Podemos, no entanto, obter as mesmas informaes de uma s vez atravs de uma query chamada juno.
Uma juno uma query que obtm dados de mais de uma tabela ao mesmo tempo, baseando-se na
condio de juno indicada na clusula WHERE. Temos abaixo uma juno que fornece a altura e o
tcnico de todos os hspedes:
SELECT HOSPEDES.NOME, ALTURA, TECNICO
6.1. Equijunes
A ltima query que analisamos um exemplo de equijuno uma juno baseada em uma condio de
igualdade. Outros tipos de predicados relacionais podem constituir outros tipos de condio de juno, dos
quais veremos alguns exemplos. Porm de antemo sabemos que o tipo mais comum o de igualdade a
equijuno.
Para que possamos dar um exemplo um pouco diferente, criaremos uma nova tabela, QUARTOS, que ir
conter detalhes das acomodaes do Visual Spa. A declarao utilizada para cri-la a seguinte:
CREATE TABLE QUARTOS (QUARTO VARCHAR(3), NOME VARCHAR(15),
TAXA FLOAT, DESCRICAO LONG VARCHAR);
A tabela em questo preenchida com dados, excetuando-se a coluna de tipo LONG, tem a seguinte
aparncia:
SELECT QUARTO, NOME, TAXA
FROM QUARTOS;
6.3. Auto-Junes
Por muitas vezes, precisamos fazer uma juno de uma tabela com ela mesma. Esta uma forma de
tratarmos uma nica tabela como se fosse na verdade duas tabelas, a fim de possibilitar certos tipos de
queries.
Suponhamos que quisssemos selecionar todos os hspedes que tenham obtido o mesmo percentual de
desconto que Maurcio de Souza. Todas as informaes que desejamos esto na tabela
LISTA_DE_HOSPEDES, que tem a seguinte aparncia:
SELECT * FROM LISTA_DE_HOSPEDES;
Entretanto, neste ponto chegamos a um impasse. Queremos dizer WHERE DESCONTO = (o desconto de
Maurcio de Souza), mas no vemos como.
Observe como seria fcil resolver este problema se, ao invs de lida com apenas uma tabela, estivssemos
lidando com duas, a fim de obter o desconto de Maurcio de Souza de uma e as informaes sobre os
outros hspedes da outra. Ento, usando as letras A e B para distinguir duas tabelas na realidade idnticas,
teramos a seguinte query:
NOME DESCTO
MAURCIO DE SOUZA 0.15
STELLA SHIELDS 0.15
Como voc pode comprovar atravs do resultado, esta a forma que temos para resolver este tipo de query
chamada auto-juno.
Os nomes de tabelas temporrios, denominados nomes correlatos ou ttulos (labels), so os elementos-
chaves que permitem que a juno ocorra a partir de uma nica tabela. Os nomes correlatos so definidos
na lista do FROM, na qual estabelecemos que a tabela em questo passa a ser conhecida por estes nomes. A
partir da, todos os nomes de colunas que quisermos usar tero como prefixo estes nomes correlatos.
NOME
JOS AUGUSTO
MAURCIO DE SOUZA
BIANCA OLIVEIRA
JANE FYUNDAI
STELLA SHIELDS
ROGRIO NUNES
As declaraes SELECT em uma UNION podem conter funes e clusulas WHERE e GROUP BY, e
uma clusula ORDER BY tambm pode ser acrescentada UNION como um todo.
No h limites para o nmero de queries cujos os resultados podem ser unidos atravs de uma UNION.
Suponhamos que quisssemos criar uma tabela HOSPEDES_HOMENS, idntica HOSPEDES, exceo
de que, ao invs de listar o sexo, o biotipo e a altura de todos os hspedes, antigos e atuais,
HOSPEDES_HOMENS contm apenas os dados dos hspedes do sexo masculino (e, portanto, no listar
o sexo). A tabela criada pela declarao abaixo:
CREATE TABLE HOSPEDES_HOMENS (NOME VARCHAR(25), BIOTIPO VARCHAR(1),
ALTURA INTEGER);
Agora temos que incluir dados. Os dados que desejamos j esto cadastrados na tabela HOSPEDES e
podem ser extrados e includos atravs de uma declarao INSERT contendo uma query.
INSERT INTO HOSPEDES_HOMENS
SELECT NOME, BIOTIPO, ALTURA
FROM HOSPEDES
WHERE SEXO = M;
O nome da tabela ou viso a ser atualizada indicado na primeira linha do exemplo. Na segunda linha
aparece o nome da coluna a ser atualizada e o tipo de alterao, e na terceira a condio de pesquisa. Como
nas queries, se no houver condies de pesquisa, a operao ser executada em todas as linhas.
Suponhamos que Andr tambm queira trocar o quarto 9, o qual teve que dividir com Jane Fyundai, pelo 7,
que espera poder ocupar sozinha; e digamos que tambm consiga obter mais 2% de desconto, alm dos 20
originais.
Podemos usar a declarao UPDATE para realizar as duas alteraes de uma s vez. A segunda condio
de pesquisa, especificando a data de chegada, necessria pois existem dois quartos ocupados pelo Andr
em LISTA_DE_HOSPEDES, e s queremos alterar um deles.
UPDATE LISTA_DE_HOSPEDES
SET QUARTO = 7, DESCONTO = DESCONTO + 0.02
WHERE NOME = ALEXANDRE
AND CHEGADA = 17-08-97;
Como podemos observar no exemplo, possvel alterar mais de uma coluna ao mesmo tempo e usar
expresses aritmticas para indicar o valor novo.
Para eliminar todas as linhas de uma tabela, no especifique uma condio de pesquisa.
Com esta declarao recuperamos de volta as linhas que havamos excludo, e os dados alterados voltaram
a ser exatamente o que eram antes da alterao. Se tivssemos eliminado as tabelas por inteiro, elas tambm
seriam recuperadas.
Em SQL Base, temos cinco opes de clusulas ou continuaes para complementar a declarao,
dependendo da operao desejada:
Sempre que quisermos consultar a faixa aceitvel de peso de uma pessoa na tabela QUADRO_DE_PESOS,
teremos que fornecer ao sistema os valores das trs colunas ALTURA, SEXO e BIOTIPO.
A query a seguir executa esta consulta. Seleciona o nome, o tcnico e a faixa aceitvel de peso de todos os
hspedes. NOME e TECNICO vm da LISTA_DE_HOSPEDES; a altura, o sexo e o biotipo so obtidos
da tabela HOSPEDES e so usados para localizar a respectiva faixa no QUADRO_DE_PESOS:
SELECT A.NOME, TECNICO, PS_MIN, PS_MAX
FROM LISTA_DE_HOSPEDES A, HOSPEDES B, QUADRO_DE_PESOS C
WHERE A.NOME = B.NOME
AND B.SEXO = C.SEXO
AND B.ALTURA = C.ALTURA
AND B.BIOTIPO = C.BIOTIPO;
Podemos reduzir significamente o tempo de execuo da query criando um ndice concatenado abrangendo
as colunas ALTURA, SEXO e BIOTIPO:
CREATE INDEX PESO_IND
ON QUADRO_DE_PESOS (ALTURA, SEXO, BIOTIPO);
O ndice concatenado reduz o tempo de execuo da query em 38% em um PC/AT.
10.Programando em SQL
No incio desta apostila, vimos como usar a linguagem SQL de modo interativo, ou seja, como executar as
declaraes SQL diretamente do teclado. Agora, focalizaremos o tpico programao em SQL
declaraes SQL embutidas em programas escritos em outra linguagem, como por exemplo, C ou COBOL.
Clique na opo "Abrir banco de dados existentes", selecione o arquivo Northwind e clique em "OK".
Caso o arquivo no esteja na relacionado na lista de arquivos, selecione a opo "Mais arquivos..." e em
seguida o boto OK. O arquivo encontra-se na seguinte pasta "C:\Arquivos de Programas\Microsoft
Office\Exemplos".
Aps o arquivo aberto aparecer a seguinte tela:
Esta janela possui toda estrutura do arquivo Nortwind, esta estrutura dividida pelas seguintes guias:
Tabela / Consulta / Formulrio / Relatrios / Macros / Mdulos, a guia tabela possui todas as tabelas do
Northwind, que utilizaremos nos nossos exerccios.
Clique na guia Consulta, exclua todas as consultas existentes nesta caixa ( Shift+Delete).
A caixa dever ficar com a seguinte aparncia:
Antes de iniciarmos os nossos exerccios, precisaremos alterar para a janela MODO SQL.
Siga as seguintes instrues:
Clique no Menu Exibir, opo Modo SQL.
Esta janela ser utilizada para criarmos nossas consultas atravs da SQL. Para executar cada consulta
clique no boto "Executar" na barra de ferramentas.
Obs1.: Para cada consulta criada utilizaremos um arquivo, ou seja, gravaremos a consulta atual e
abriremos uma nova.
Obs2.: Caso necessrio consulte os anexos de tabelas para resoluo dos exerccios.