Vous êtes sur la page 1sur 36

Aula 10 SQL Parte 1

Profa. Elaine Faria UFU - 2011

Viso Geral
A linguagem SQL inclui diversos aspectos
DML (Data Manipulation Language)
Permite aos usurios formular consultas, inserir, excluir e modificar tuplas

DDL (Data Definition Language)


Suporta a criao, excluso e modificao das definies de tabelas e vises

Gatilhos e Restries de Integridade


Gatilhos (triggers) so aes executadas pelo SGBD sempre que alteraes no BD satisfazem condies especificadas no gatilho

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

Daniel Bruno Lucas Alceu Raul Homero Ze Honorato Americo Bob

7 1 8 8 10 7 10 9 3 3

45 33 55,5 25,5 35 35 16 35 25,5 63,5

Instncia R2 de Reservas id_barco

nome-barco cor Interlagos Interlagos Clipper Marinha azul Vermelho Verde Vermelho

Instncia M3 de Marinheiros

101 102 103 104

Instncia B1 de Barcos

Formato de uma consulta SQL Bsica


SELECT [DISTINCT ] lista_selecao FROM lista_from WHERE qualificao
Toda consulta deve ter uma clusula SELECT e uma clusula FROM A clusula WHERE opcional Uma consulta corresponde a uma expresso da lgebra
A relao entre lgebra e SQL a base para otimizao de consultas

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

Detalhes do comandos SQL


Lista-from
uma lista de nomes de tabela Um nome de tabela pode ser seguido por uma varivel de intervalo

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

Detalhes do comandos SQL


Qualificao
uma combinao booleana de condies no formato expresso op expresso Op um dos operadores de comparao {<, <=, = , <>, >=, >} Uma expresso um nome de coluna, uma constante ou uma expresso

Distinct
Palavra reservada opcional Indica que a tabela computada como resposta no deve conter duplicatas

Detalhes do comandos SQL


A resposta a uma consulta uma relao
Multiconjunto de linhas

Estratgia de avaliao de uma consulta


Compute o produto cartesiano das tabelas da lista from Exclua as linhas no produto cartesiano que no satisfazem as condies de qualificao Exclua as colunas que no aparecem na lista-seleo Se o DISTINCT for especificado, elimine as linhas duplicadas

Detalhes dos comandos SQL


Estratgia direta de avaliao conceitual
Torna explcita as linhas que devem ser apresentadas na resposta consulta bem provvel que seja ineficiente Um SGBD avalia as consultas de uma forma diferente a fim de torn-las mais eficientes!

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

id-barco dia 101 103 10/10/96 09/08/98

22 31 58

Daniel Lucas Raul

7 8 10

45 55,5 35

22 58

Compute o resultado da consulta C1 usando essas duas instncias!

Exemplos de consultas SQL Bsicas


Consulta C1
SELECT nome-marin FROM Marinheiros M, Reservas R WHERE M.id-marin = R.id-marin AND R.id-barco = 103 OU SELECT nome-marin FROM Marinheiros, Reservas WHERE Marinheiros.id-marin = Reservas.id-marin AND id-barco = 103

Exemplos de consultas SQL Bsicas


C16: Encontre os id-marins dos marinheiros que reservaram um barco vermelho
SELECT R.id-marin FROM Barcos B, Reservas R WHERE B.id-barco = R.id-barco AND B.cor = vermelho

Exemplos de consultas SQL Bsicas


C2: Encontre os nomes dos marinheiros que reservaram um barco vermelho
SELECT M.nome-marin FROM Marinheiros M, Reservar R, Barcos B WHERE M.id-marin = R.id-marin AND R.idbarco = B.id-barco AND B.cor=vermelho

Exemplos de consultas SQL Bsicas


C3: Encontre as cores dos barcos reservados por Lubber
SELECT B.cor FROM Marinheiros M, Reservas R, Barcos B WHERE M.id-marin = R.id-marin AND R.id-barco = B.id-barco AND M.nome-marin = Lubber

Exemplos de consultas SQL Bsicas


C4: Encontre os nomes dos marinheiros que reservaram pelo menos um barco
SELECT M.nome-marin FROM Marinheiros M, Reservas R WHERE M.id-marin = R.id-marin

Expresses e Strings no Comando SELECT


A lista-seleo pode ser mais genrica do que apenas apresentar uma lista de colunas Cada item em uma lista-seleo pode ser expresso AS nome-coluna
expresso: qualquer expresso aritmtica ou de string envolvendo os nomes de colunas e constantes nome-coluna: novo nome para essa coluna na sada da consulta

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

Union Intersect e Except


SQL fornece 3 construtores de manipulao de conjuntos
Unio UNION Interseo INTERSECT Diferena EXCEPT

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

Consultas C5 e C6 podem ser melhor escritas usando UNION e INTERSECT

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

UNION, INTERSECT e EXCEPT


podem ser usados em duas tabelas quaisquer que sejam compatveis unio

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.

Vous aimerez peut-être aussi