Beruflich Dokumente
Kultur Dokumente
Viso Geral
A linguagem SQL inclui diversos aspectos
DML (Data Manipulation Language)
Permite aos usurios formular consultas, inserir, excluir e modificar tuplas
Sobre os exemplos
Todos os exemplos usaro a seguinte base Marinheiros(id-marin: integer, nome-marin: string, avaliao: integer, idade: real) Barcos(id-barco: integer, nome-barco: string, cor: string) Reservas(id-marin: integer, idbarco: integer, dia: date)
id_marin
id_marin nome-marin avaliao idade
id-barco dia 101 102 103 104 102 103 104 101 102 103 10/10/96 10/10/98 10/08/98 10/07/98 11/10/98 11/06/98 11/12/98 09/05/98 09/05/98 09/08/98
22 22 22 22 31 31 31 64 64 74
22 29 31 32 58 64 71 74 85 95
7 1 8 8 10 7 10 9 3 3
nome-barco cor Interlagos Interlagos Clipper Marinha azul Vermelho Verde Vermelho
Instncia M3 de Marinheiros
Instncia B1 de Barcos
Exemplo
C15: Encontre os nomes e as idades de todos os marinheiros SELECT DISTINCT M.nome-marin, M.idade FROM Marinheiros M
Exemplo
C11: Encontre todos os marinheiros com uma avaliao acima de 7 SELECT M.id-marin, M.nome-marin, M.avaliao, M.idade FROM Marinheiros as M WHERE M.avaliao > 7
possvel usar SELECT *
Ateno
SQL e lgebra
SELECT WHERE projeo selees
Lista-seleo
uma lista de (expresses envolvendo) nomes de coluna das tabelas nomeadas na lista-from Os nomes das colunas podem ser prefixados por uma varivel de intervalo
Distinct
Palavra reservada opcional Indica que a tabela computada como resposta no deve conter duplicatas
Exemplo
C1: Encontre os nomes de marinheiros que reservaram o barco 103.
SELECT M.nome-marin FROM Marinheiros M, Reservas R WHERE M.id-marin=R.id-marin AND R.id-barco = 103
Exemplo
id_marin nome-marin avaliao idade
id_marin
22 31 58
7 8 10
45 55,5 35
22 58
Exemplos
C17: Compute incrementos das avaliaes de pessoas que manobraram dois barcos diferentes no mesmo dia
SELECT M.nome-marin, M.avaliacao+1 AS avaliao FROM Marinheiros M, Reservas R1, Reservas R2 WHERE M.id-marin = R1.id-marin AND M.id-marin = R2.id-marin AND R1.dia = R2.dia AND R1.id-barco <> R2.id-barco
Exemplos
Cada item em uma qualificao pode ser to genrico quanto expresso1 = expresso2
SELECT M1.nome-marin AS nome1, M2.nome-marin AS nome2 FROM Marinheiros M1, Marinheiros M2 WHERE 2*M1.avaliao = M2.avaliao-1
String
Para comparaes de strings pode-se usar
=, <, >, etc.
Ordem das strings determinada alfabeticamente
Like
Smbolo curinga % (zero ou mais caracteres arbitrrios) e _ (exatamente um caractere arbitrrio)
Exemplo
C18: Encontre as idades dos marinheiros cujos nomes comeam e terminam com B e tm no mnimo trs caracteres
SELECT M.idade FROM Marinheiros M WHERE M.nome-marin LIKE B_%B
Exemplo
C5: Encontre os nomes dos marinheiros que reservaram um barco vermelho ou um barco verde
SELECT M.nome-marin FROM Marinheiros M, Reservas R, Barcos B WHERE M.id-marin=R.id-marin AND R.id-barco = B.id-barco AND (B.cor=vermelho OR B.cor=verde)
Exemplo
C6: Encontre os nomes dos marinheiros que reservaram um barco vermelho e um barco verde
SELECT M.nome-marin FROM Marinheiros M, Reservas R1, Barcos B1, Reservas R2, Barcos B2 WHERE M.id-marin = R1.id-marin AND R1.id-barco = B1.id-barco AND M.id-marin = R2.id-marin AND R2.id-barco = B2.id-barco B1.cor=vermelho AND B2.cor = verde
Exemplo
Exemplo
C5
SELECT M.nome-marin FROM Marinheiros M, Reservas R, Barcos B WHERE M.id-marin=R.id-marin AND R.id-barco = B.id-barco AND B.cor = vermelho UNION SELECT M2.nome-marin FROM Marinheiros M2, Barcos B2, Reservas R2 WHERE M2.id-marin=R2.id-marin AND R2.id-barcos=B2.id-barco AND B2.cor=verde
Exemplo
C6
SELECT M.nome-marin FROM Marinheiros M, Reservas R, Barcos B WHERE M.id-marin=R.id-marin AND R.id-barco = B.id-barco AND B.cor = vermelho INTERSECT SELECT M2.nome-marin FROM Marinheiros M2, Barcos B2, Reservas R2 WHERE M2.id-marin=R2.id-marin AND R2.id-barcos=B2.id-barco AND B2.cor=verde
Exemplo
A soluo proposta para a consulta C6 usando INTERSECT contm um erro Qual esse erro?
Exemplo
C19: Encontre os id-marins de todos os marinheiros que reservaram barcos vermelhos, mas no barcos verdes
SELECT R.id-marin FROM Reservas R, Barcos B WHERE R.id-barco= B.id-barco AND B.cor =vermelho EXCEPT SELECT R2.id-marin FROM Barcos B2, Reservas R2 WHERE R2.id-barco = B2.id-barco AND B2.cor=verde
Exemplo
Observao
A consulta C19 baseia-se na integridade referencial, ou seja, no h reservas para marinheiros no existentes
Exemplo
C20: Encontre todos os id-marins de marinheiros que tm uma avaliao 10 ou reservaram o barco 104
SELECT M.id-marin FROM Marinheiros M WHERE M.avaliao = 10 UNION SELECT R.id-marin FROM Reservas R WHERE R.id-barco = 104
Observaes
UNION, INTERSECT E EXCEPT eliminam duplicatas Para reter as duplicatas use
UNION ALL
O nmero de cpias de uma linha no resultado m+n, onde m e n so os nmeros de vezes que a linha aparece nas duas partes da unio
INTERSECT ALL
O nmero de cpias de uma linha no resultado min(m,n)
EXCEPT ALL
O nmero de cpias de uma linha no resultado m n onde m corresponde primeira relao
Referncias
R. Ramakrishnan e J. Gehrke, Database Management Systems, 3a Edio, McGraw-Hill, 2003.