BANCO DE DADOS APLICADO AO
DESENVOLVIMENTO DE
SOFTWARE
BDD
DML – CONSULTANDO DADOS EM
TABELAS
Estrutura Básica
SELECT => PROJEÇÃO
FROM => TABELA OU PRODUTO CARTESIANO DELAS
WHERE => SELEÇÃO
Coluna1[,Coluna2 [,...] ] (Condição(Tabela1 [X Tabela2 [X ... ] ]))
SELECT Coluna1[,Coluna2 [, ... ] ]
FROM Tabela1,[Tabela2 [, ... ] ]
WHERE Condição
DML – CONSULTANDO DADOS EM
TABELAS
Estrutura Genérica
SELECT [DISTINCT | ALL] { * | [Tabela.]Coluna1 [AS
Alias1]
[ [Tabela.]Coluna2 [AS Alias2] [, ...]]}
FROM Tabela1 [, Tabela2 [, ... ] ]
[WHERE {Condição Simples | Condição de Sub-consulta}
]
[ORDER BY Coluna1 [ASC | DESC] [,Coluna2 [ASC |
DESC] [, ... ]]]
[GROUP BY Coluna1 [,Coluna2 [, ... ]] [HAVING
Condição ] ]
[ {UNION | IMTERSECT | EXCEPT} SELECT ... ]
DML – CONSULTANDO DADOS EM
TABELAS
SELECT/FROM - Projeta os dados da(s) tabela(s), de
acordo com os critérios especificados.
A projeção do resultado é em uma estrutura tipo
tabela
Basta informar o que se quer, sem se preocupar como
fazer isto (SQL Não é procedural).
Na cláusula SELECT, pode-se utilizar operadores
aritméticos e funções de agregações, para projetar
cálculos.
DML – CONSULTANDO DADOS EM TABELAS
Exemplos:
/* Projetar todas as informações dos autores */
SELECT CodAutor, Nome, Nascimento
FROM AUTOR ;
OU
SELECT *
FROM AUTOR ;
/* Projetar a média dos valores dos livros */
SELECT AVG (Valor)
FROM LIVRO;
/*Projetar todos os livros(títulos) e seus valores com 10% de desconto*/
SELECT Titulo, Valor - (Valor * 0.1)
FROM LIVRO;
/* Projetar a quantidade de autores cadastrados */
SELECT COUNT (*) AS QUANTIDADE, „ud‟ AS UNIDADE
FROM AUTOR;
DML – CONSULTANDO DADOS EM
TABELAS
Em SQL a eliminação de linhas duplicadas não é feita
automaticamente, devendo a mesma ser especificada
explicitamente.
ALL é o padrão quando não especificado DISTINCT.
Exemplos:
/* Projetar todas as cidades das editoras sem duplicatas */
SELECT ALL Cidade
/* Projetar todas as cidades
FROM EDITORA;
das editoras repetidamente*/
OU
SELECT Cidade SELECT DISTINCT Cidade
FROM EDITORA; FROM EDITORA;
DML – CONSULTANDO DADOS EM
TABELAS
Uma coluna pode ser especificada pelo nome da sua tabela
(Tabela.Coluna), bem como, ser renomeada durante a
consulta
(Coluna AS ColunaRenomeada)
/* Projetar todos os nomes e respectivos nascimentos
da tabela autor.
NOTE: mesmo especificando Tabela.Coluna, FROM é
obrigatório */
SELECT AUTOR.Nome, AUTOR.Nascimento
FROM AUTOR;
/* Projetar todos os títulos dos livros e seus valores em
dobro */
SELECT Titulo, Valor * 2 as Dobro
FROM LIVRO;
DML – CONSULTANDO DADOS EM
TABELAS
WHERE - Especifica quais linhas da(s) tabela(s) listada(s)
na cláusula FROM são afetadas pela condição.
Se esta não for especificada, a consulta retornará todas as
linhas da tabela.
Operadores Utilizados
A condição de WHERE pode ser de três tipos:
Comparação
Ligação entre tabelas (Join)
Sub-Consulta (Sub-Queries)
DML – CONSULTANDO DADOS EM
TABELAS
Comparação
Expressão Operador Relacional Expressão
A condição é verdadeira quando a 1a expressão atende ao operador
relacional sobre a 2a expressão.
/* Projetar livros publicados após 30 de maio de 1993 */
SELECT *
FROM LIVRO
WHERE Publicacao > „5/30/93‟;
Expressão [NOT] BETWEEN Expressão AND Expressão
A condição é verdadeira quando a 1a expressão é um valor
compreendido entre a 2a e 3a expressões (inclusive).
/* Projetar livros com valor de 10.00 a 100.00 */
SELECT *
FROM LIVRO
WHERE Valor BETWEEN 10.00 AND 100.00;
DML – CONSULTANDO DADOS EM
TABELAS
Comparação
Expressão [NOT] IN (Valores)
A condição é verdadeira se o valor da
expressão é igual a um dos valores entre
parênteses
/* Projetar as Editoras com sede em São
Paulo ou Rio de Janeiro*/
SELECT *
FROM EITORA
WHERE Cidade IN („São Paulo‟, „Rio de
Janeiro‟);
DML – CONSULTANDO DADOS EM TABELAS
Comparação
Coluna [NOT] LIKE ‘Cadeia de Caracteres’
A condição é satisfeita quando o valor da coluna é igual ao valor da
cadeia de caracteres.
Caracteres especiais para construção da cadeia de caracteres:
“%” ou “*” ® Usado para representar zero ou mais caracteres.
“_” ou “?” ® Usado para representar um caractere.
/*Projetar todos os autores cujo nome tenha 10 caracteres e inicie com R*/
SELECT *
FROM AUTOR
WHERE Titulo LIKE „R?????????‟;
/*Projetar todos os livros que tenham
Banco de Dados no seu título*/
SELECT *
FROM LIVRO
WHERE Titulo LIKE „%Banco de Dados%‟;
DML – CONSULTANDO DADOS EM
TABELAS
Comparação
Coluna IS [NOT] NULL
A condição é satisfeita quando o valor da coluna for NULL
/*Projetar todos os livros que estão sem preço definido */
SELECT *
FROM LIVRO
WHERE Valor IS NULL
Pode-se misturas os vários tipos de comparação
/*Projetar todos os livros que iniciam com R, estão com preço definido
e foram publicados depois de 1/1/1995*/
SELECT *
FROM LIVRO
WHERE Titulo LIKE „R%‟ and
Valor IS NOT NULL and
Publicacao > „1/1/1995‟
DML – CONSULTANDO DADOS EM
TABELAS
Ligação entre tabelas (Join)
Diz-se que tabelas estão relacionadas se tiverem
campos comuns (ch.primária e ch. estrangeira).
O efeito do JOIN é a criação de uma tabela
temporária em que cada par de linhas, que
satisfação a condição de ligação, são ligados para
formar uma única linha.
A ligação é sempre estabelecida à frente da
cláusula WHERE usando o operador relacional
da igualdade (=).
FROM estabelece o produto cartesiano entre as
tabelas listadas
WHERE filtra as linhas úteis segundo a condição
especificada
DML – CONSULTANDO DADOS EM
TABELAS
Ligação entre tabelas (Join) – cont.
Pode-se misturar as cláusulas de comparação, vistas
anteriormente,juntamente com AND, OR e NOT para
formar equações de ligações mais complexas
Para se ligar várias tabelas, usa-se o operador lógico
AND.
É preciso ter muito cuidado com os JOINS, pois exigem
alto custo de execução (implicam diretamente na performance).
DML – CONSULTANDO DADOS EM
TABELAS
Ligação entre tabelas (Join) - exemplos
/* Projetar todos os livros (título) e seus autores (nome)
nomeando a tabela para facilitar a digitação*/:
SELECT AU.Nome, LI.Titulo
FROM AUTOR AU, LIVRO LI
WHERE AU.CodAutor = LI.CodAutor;
/* Projetar todos os autores (nome), seus livros (título) e
editoras (razão), onde a razão da editora seja Campos ou
Makron */:
SELECT AUTOR.Nome, LIVRO.Titulo, EDITORA.Razao
FROM AUTOR, LIVRO, EDITORA
WHERE AUTOR.CodAutor = LIVRO.CodAutor AND
LIVRO.CodEditora = EDITORA.CodEditora AND
EDITORA.Razao IN („Campos‟, „Makron‟);
DML – CONSULTANDO DADOS EM
TABELAS
Sub-Consulta (Sub-Queries)
As sub-consultas podem retornar um valor simples, ou um
conjunto
de valores.
Sub-consultas que retornam um valor simples
Usadas para fazer comparação elemento-elemento
WHERE expressão {= | | > | >= |
(SELECT AVG (Valor)
FROM LIVRO) ;
DML – CONSULTANDO DADOS EM
TABELAS
Sub-consultas que retornam um conjunto de valores
Usadas para fazer comparação elemento-conjunto
Podem ser definidas através das cláusulas IN, ANY, ALL e
EXISTS.
WHERE expressão [NOT] IN (Sub-Consulta)
Estabelece uma relação de pertinência (Î) entre elementos e
conjuntos (tabelas). Sua avaliação retorna um valor
booleano.
/*Projetar autores (nome) que possuem livros sem valor*/
SELECT Nome
FROM AUTOR
WHERE CodAutor NOT IN
(SELECT CodAutor
FROM LIVRO
WHERE Valor > 0);
DML – CONSULTANDO DADOS EM
TABELAS
Sub-consultas que retornam um conjunto de valores
WHERE expressão { = | | > | >= | ANY
(SELECT CodAutor (SELECT Nascimento
FROM LIVRO FROM AUTORES)
WHERE Valor = 0);
DML – CONSULTANDO DADOS EM
TABELAS
Sub-consultas que retornam um conjunto de valores
WHERE expressão { = | | > | >= | ALL ® tem mesmo efeito que NOT IN
/*Projetar os livros (título) que têm valor maior que todos os livros da
editora
Makron */
SELECT Titulo
FROM LIVRO
WHERE Valor > ALL
(SELECT Valor
FROM LIVRO Li, Editora Ed
WHERE Li.CodEditora = Ed.CodEditora AND Ed.Razao =
„Makron‟);
DML – CONSULTANDO DADOS EM
TABELAS
Sub-consultas que retornam um conjunto de valores
WHERE expressão [NOT] EXISTE (Sub-consulta)
Verifica a existência de dados numa lista de valores da
subconsulta
Retorna VERDADE ou FALSIDADE, conforme a sub-consulta
retorne
ou não linhas de resultado
/*Projete todos os autores que têm livros
publicados nas editoras Makron ou Campos*/
SELECT Au.Nome
FROM AUTOR Au
WHERE EXISTS
(SELECT *
FROM LIVRO Li, EDITORA Ed
WHERE Li.CodAutor=Au.CodAutor AND
Li.CodEditora=Ed.CodEditora AND
Ed.Razao IN („Makron‟, „Campos‟));
DML – CONSULTANDO DADOS EM
TABELAS
ORDER BY - Ordenar os resultados pelos valores de uma ou
mais colunas.
As linhas são ordenadas pela primeira coluna após ORDER BY.
Quando as linhas de uma coluna possuem valores iguais, estas serão
classificadas pelo valor da segunda coluna após ORDER BY e assim
por diante.
Tipos de Ordenação:
ASC => Ascendente
DESC => Decrescente
Exemplo:
/* Projetar o nome e o nascimento dos autores em ordem decrescente do
nascimento. Para datas iguais, considerar a ordem alfabética do nome do
autor*/
SELECT Nome, Nascimento
FROM AUTOR
ORDER BY Nascimento DESC, Nome ASC;
DML – CONSULTANDO DADOS EM
TABELAS
GROUP BY - agrupa os resultados por valores idênticos.
Utiliza-da com as funções de agregação, mas pode ser usada sem
estas.
OBS: Os campos do GROUP BY devem aparecer no SELECT!
Exemplos:
/* Projetar a média dos valores dos livros por editora */
SELECT EDITORA.Razao, AVG (LIVRO.Valor)
FROM LIVRO, EDITORA
WHERE LIVRO.CodEditora=EDITORA.CodEditora
GROUP BY EDITORA.Razao ;
/* Projetar todas as editoras (razão) que publicaram livros */
SELECT EDITORA.Razao
FROM LIVRO, EDITORA
WHERE LIVRO.CodEditora=EDITORA.CodEditora
GROUP BY Editora.Razao;
DML – CONSULTANDO DADOS EM
TABELAS
HAVING - Utilizada para filtrar o resultado dos grupos
Só é atendida depois do Agrupamento !
Só existe se associada à cláusula GROUP BY (mas o oposto não)
Vem depois do GROUP BY e antes do ORDER BY
A condição só pode envolver os campos/funções do SELECT
Exemplos:
/* Projetar as editoras (código), cujo o preço médio dos livros é > 60*/
SELECT CodEditora, AGV(Valor) AS MediaValor
FROM LIVRO
GROUP BY CodEditora
HAVING MediaValor > 60;
/* Projetar os autores (nome) que publicaram mais de 3 livros*/
SELECT AUTOR.Nome, COUNT(DISTINCT LIVRO.Titulo)
FROM LIVRO, AUTOR
WHERE AUTOR.CodAutor = LIVRO.CodAutor
GROUP BY AUTOR.Nome
HAVING COUNT(DISTINCT LIVRO.Titulo) > 3;
DML – CONSULTANDO DADOS EM
TABELAS
Operações sobre Conjuntos
Aplicáveis apenas em tabelas compatíveis
UNION (È) - Faz a união, eliminando linhas
repetidas.
Acrescenta-se ALL para manter as linhas
repetidas
INTERSECT (Ç) - Retorna apenas as linhas
que pertencem às duas tabelas
EXCEPT (–) - Retorna apenas as linhas que
pertencem à primeira tabela, com exceção das
que aparecem na segunda.
DML – CONSULTANDO DADOS EM
TABELAS
Considere:
MEDICO (CodMedico, Nome, CRM) e
PACIENTE (CodPaciente, Nome);
DEPOSITANTE (CPF, Nome, Agencia, Conta) e
DEVEDOR (CPF, Nome, Agencia, Conta).
UNION /* Projetar todos os clientes da agência A1
com empréstimo ou depósito */
/* Projetar o nome de todas (SELECT *
as pessoas cadastradas FROM DEPOSITANTE
no hospital */ WHERE Agencia = „A1‟)
(SELECT Nome UNION ALL
FROM MEDICO) (SELECT *
UNION FROM DEVEDOR
(SELECT Nome WHERE Agencia = „A1‟);
FROM PACIENTE);