Vous êtes sur la page 1sur 115

Banco de Dados I

Linguagem SQL
4.1 Introduo
O modelo relacional encontra-se padronizado pela
indstria de informtica. Ele chamado de padro
SQL (Structured Query Language).
O padro SQL define precisamente uma interface
SQL para a definio de tabelas, para as operaes
sobre as mesmas (seleo, projeo, juno, e
outras) e para a definio de regras de integridade
de bancos de dados.
A interface SQL , portanto, implementada em
todos os sistemas de bancos de dados relacionais
existentes.
Por qu a indstria tem interesse em padronizar os
sistemas de bancos de dados? A razo muito
simples: a existncia de padres facilita a
interoperabilidade (comunicao entre mquinas,
entre programas).
4.1 Introduo
Como vimos, um SGBD possui duas linguagens:
DDL: Linguagem de Definio de Dados. Usada para
definir os esquemas, atributos, vises, regras de
integridade, ndices, etc.
DML: Linguagem de Manipulao de Dados. Usada
para se ter acesso aos dados armazenados no BD.

Exemplo de linguagens de consulta: QUEL, QBE e


SQL
4.1 Introduo
SQL (Structured Query Language): desenvolvida
pela IBM (70) como parte do sistema System R. A
SQL foi inicialmente chamada de SEQUEL

a linguagem de consulta padro para os


SGBDR's

J existem padres propostos: ANSI-SQL(SQL-


89), SQL-92 e padres mais recentes: SQL:1999 e
SQL:2003.
4.1 Introduo
A linguagem SQL tem diversas partes:
Linguagem de Definio de Dados (DDL): fornece
comandos para definies de esquemas de relao,
criao/remoo de tabelas, criao de ndices e
modificao de esquemas.
Linguagem de Manipulao de Dados (DML):
inclui uma linguagem de consulta baseada na
lgebra relacional e clculo relacional de tupla.
Compreende comandos para inserir, consultar,
remover e modificar tuplas num BD.
4.1 Introduo
Linguagem de Manipulao de Dados Embutida:
designada para acessar o BD dentro de linguagens
de programao de uso geral como Cobol, C,
Pascal, CSP,, Delphi, Fortran, SQL-J entre outros.

Definio de Vises: a SQL DDL inclui comandos


para definio de vises.

Autorizao: a SQL DDL inclui comandos para


especificao de direitos de acesso s
relaes/vises.
4.1 Introduo
Integridade: a linguagem Sequel o System R inclui
comandos para verificao de restries de integridade
complexas. O padro ANSI(86) limitou estas
restries. Porm, novos padres tipo SQL-99
incorporam vrias formas de expressar restries de
integridade (Assertivas e Triggers).

Controle de Transao: algumas implementaes de


SQL permitem fazer tratamento de controle de
concorrncia e tolerncia falhas (locks explcitos,
commit, rollback).
4.1 Introduo
Introduo
Tipos em SQL:1999
Numricos exatos:
INTEGER (INT) e SMALLINT para representar inteiros
NUMERIC(p,s): tem uma preciso e uma escala(nmero de dgitos na
parte fracionria). A escala no pode ser maior que a preciso. Muito
usado para representar dinheiro
DECIMAL: tambm tem preciso e escala. A preciso fornecida pela
implementao (SGBD).
Numricos aproximados:
REAL: ponto flutuante de preciso simples
DOUBLE: ponto flutuante com preciso dupla
FLOAT(p): permite especificar a preciso que se quer. Usado para
tranportar (portability) aplicaes
Introduo
Tipos em SQL:1999
Character
CHARACTER(x) (CHAR): representa um string de tamanho x. Se x
for omitido ento equivalente a CHAR(1). Se um string a ser
armazenado menor do que x, ento o restante preenchido com
brancos.
CHARACTER VARYING(x) (VARCHAR): representa um string de
tamanho x. Armazena exatamente o tamanho do string (tam <= x)
sem preencher o resto com brancos. Neste caso x obrigatrio.
CHARACTER LARGE OBJECT (CLOB): armazena strings longos.
Usado para armazenar documentos.
OBS.: Existem os National character data types: NCHAR,
NVARCHAR, NCLOB que permitem implementar internacionalizao
Introduo
Tipos em SQL:1999
Bit string e Binary Strings (BLOB)
BIT(X): permite armazenar uma quantidade x de
bits
BIT VARING(X) (VARBIT): permite armazenar uma
quantidade varivel de bits at o tamanho X
BINARY LARGE OBJECT (BLOB): para armazenar
grande quantidades de bytes como fotos, vdeo,
udio, grficos, mapas, etc.
Introduo
Tipos em SQL:1999
DATETIMES
DATE: armazena ano (4 digitos), ms (2 digitos) e
dia(2 digitos).
TIME: armazena hora(2digitos), minuto(2 digitos) e
segundo(2digitos, podendo ter fraes 0 a 61.9999)
TIMESTAMP: DATE + TIME
TIME WITH TIME ZONE: igual a time + UTC offset
TIMESTAMP WITH TIME ZONE: igual a
TIMESTAMP + UTC offset
Introduo
Tipo Boolean:
lgica de trs valores (TRUE, FALSE e UNKNOWN)
Introduo
Tipos em SQL:1999
Collection (Array)
User-defined types
References
...
Tipos de Dados Oracle
Tipo de dados

Definido pelo Interno


usurio

Escalar Conjunto de dados Relacionamento

CHAR(N), NCHAR(N) VARRAY REF


VARCHAR2(N),
NVARCHAR2(N) TABLE
NUMBER(P,S)
DATE
RAW(N)
BLOB, CLOB,
NCLOB, BFILE
LONG, LONG RAW
ROWID, UROWID
4.2 SQL - DDL
Os comandos SQL para definio de dados so:
- CREATE
- DROP
- ALTER

CREATE TABLE: especifica uma nova tabela (relao),


dando o seu nome e especificando as colunas(atributos)
(cada uma com seu nome, tipo e restries)

Sintaxe:

CREATE TABLE tabela_base (colunas tipo_base + constraints)


4.2 SQL - DDL
As definies das colunas tm o seguinte formato:
coluna tipo[NOT NULL [UNIQUE]][DEFAULT valor]
Onde:
coluna: nome do atributo que est sendo definido
tipo: domnio do atributo
NOT NULL: expressa que o atributo no pode receber valores nulos
UNIQUE: indica que o atributo tem valor nico na tabela. Qualquer
tentativa de se introduzir uma linha na tabela contendo um valor igual
ao do atributo ser rejeitada. Serve para indicar chaves secundrias
DEFAULT: indica um valor default para a coluna
4.2 SQL - DDL
Constraints (Restries de Integridade e de
domnio):
Integridade de Chave:
PRIMARY KEY(atributos_chave)
Integridade Referencial:
FOREIGN KEY (atributos) REFERENCES
tabela_base(atributos)
Restrio de Integridade:
CHECK(condio)
4.2 SQL - DDL
CREATE TABLE empregado
( matricula char(9),
nome VARCHAR(15) NOT NULL,
dataNasc DATE,
endereco VARCHAR(30),
sexo CHAR,
salario NUMERIC(10,2),
supervisor CHAR(9),
depto INT NOT NULL,
PRIMARY KEY (matricula),
CHECK (salario >= 0),
PRIMARY KEY(matricula),
FOREIGN KEY (supervisor) REFERENCES empregado(matricula),
FOREIGN KEY (depto) REFERENCES departamento(codDep)
)
4.2 SQL - DDL
CREATE TABLE departamento
( nomeDep VARCHAR(15) NOT NULL,
codDep INT,
gerente CHAR(9) NOT NULL,
dataInicioGer DATE,
PRIMARY KEY(codDep),
UNIQUE (nomeDep),
FOREIGN KEY (gerente) REFERENCES
empregado(matricula)
);
4.2 SQL DDL
Problema no exemplo anterior:
como criar as tabelas que dependem uma das outras?

Ex. Ovo ou galinha

CREATE TABLE chicken


(cID INT PRIMARY KEY,
eID INT REFERENCES egg(eID));

CREATE TABLE egg


(eID INT PRIMARY KEY,
cID INT REFERENCES chicken(cID));
4.2 SQL DDL
Soluo no Oracle:
CREATE TABLE chicken
(cID INT PRIMARY KEY, eID INT);

CREATE TABLE egg


(eID INT PRIMARY KEY, cID INT);

ALTER TABLE chicken ADD CONSTRAINT chickenREFegg


FOREIGN KEY (eID) REFERENCES egg(eID);

ALTER TABLE egg ADD CONSTRAINT eggREFchicken


FOREIGN KEY (cID) REFERENCES chicken(cID);
4.2 SQL - DDL
Exerccio: Defina as tabelas abaixo usando SQL

Fornecedor (codigo, nome, cidade),


Venda(codForn, codPeca, quantidade, data) e
Peca(codPeca, Nome, descricao)
4.2 SQL - DDL
Chave estrangeira
Como vimos, definida com a clusula FOREIGN KEY.
Alguns SGBDs permitem que se use uma notao
abreviada para chave estrangeira quando esta formada
por um nico atributo

CREATE TABLE Empregado


(
matricula CHAR(9) NOT NULL,
nome VARCHAR(15) NOT NULL,

supervisor CHAR(9) REFERENCES Empregado(matricula),
codDep INT NOT NULL REFERENCES Departamento(codigo),

);
4.2 SQL - DDL
Uma clusula FOREIGN KEY inclui regras de
remoo/atualizao:

FOREIGN KEY (coluna)


REFERENCES tabela [ON DELETE
{RESTRICT|CASCADE|SET NULL| SET DEFAULT}]
[ON UPDATE
{RESTRICT|CASCADE|SET NULL| SET DEFAULT}]
Supondo que T2 tem uma chave estrangeira
para T1, vejamos as clusulas ON DELETE e
ON UPDATE
4.2 SQL - DDL
ON DELETE:
- RESTRICT: (default) significa que uma tentativa de se
remover uma linha de T1 falhar se alguma linha em T2
combina com a chave
- CASCADE: remoo de uma linha de T1 implica em remoo
de todas as linhas de T2 que combina com a chave de T1
- SET NULL: remoo de T1 implica em colocar NULL em
todos os atributos da chave estrangeira de cada linha de T2
que combina.
- SET DEFAULT: remoo de linha em T1 implica em colocar
valores DEFAULT nos atributos da chave estrangeira de
cada linha de T2 que combina.
4.2 SQL - DDL
ON UPDATE:
- RESTRICT: (default) update de um atributo de T1 falha se
existem linhas em T2 combinando

- CASCADE: update de atributo em T1 implica que linhas que


combinam em T2 tambm sero atualizadas

- SET NULL: update de T1 implica que valores da chave estrangeira


em T2 nas linhas que combinam so postos par NULL.

- SET CASCADE: update de T1 implica que valores da chave


estrangeira de T2 nas linhas que combinam tero valores default
aplicados.
4.2 SQL - DDL
As restries de integridade podem ter um nome e
serem especificadas com a clusula CONSTRAINT.
Isto permite que possamos no futuro eliminar
(DROP) ou alterar (ALTER) o constraint.

O exemplo a seguir mostra o uso de CONSTRAINT,


DEFAULT, ON DELETE e ON UPDATE
4.2 SQL - DDL
CREATE TABLE empregado
(

depto INT NOT NULL DEFAULT 1,
CONSTRAINT empCP PRIMARY KEY(matricula),
CONSTRAINT empSuperCE FOREIGN KEY(supervisor)
REFERENCES empregado(matricula) ON DELETE
SET NULL ON UPDATE CASCADE,
CONSTRAINT deptoCE FOREIGN KEY (depto)
REFERENCES departamento(codigo) ON DELETE
SET DEFAULT ON UPDATE CASCADE
);
4.2 SQL - DDL
ALTER TABLE
permite que se altere os atributos de uma
determinada tabela ou que se adicione novos
atributos (evoluo de esquemas). Os novos
atributos tero valores nulos em todas as
linhas.
Pode-se tambm alterar as restries da tabela

Ao incluirmos uma coluna, devemos


especificar o seu tipo de dado, no podendo
esta coluna ser NOT NULL.
4.2 SQL - DDL
ALTER TABLE
Sintaxe: Para adicionar uma nova coluna a uma tabela
ALTER TABLE tabela_base
ADD [COLUMN] atributo tipo_dado
Para modificar uma coluna de uma tabela

ALTER TABLE tabela_base


ALTER [COLUMN] atributo
SET valor-default
ou DROP DEFAULT
Obs.: no Oracle a clusula opcional COLUMN no
existe!
4.2 SQL - DDL
ALTER TABLE
Para remover uma coluna de uma tabela:
ALTER TABLE tabela_base
DROP [COLUMN] atributo

- Para adicionar uma restrio a uma tabela


ALTER TABLE tabela_base
ADD restrio

- Para remover uma restrio de um tabela


ALTER TABLE tabela_base
DROP CONSTRAINT nome-contraint
4.2 SQL - DDL
Ex.:
ALTER TABLE Peca
ADD espessura INT

Podemos remover um atributo usando a sintaxe

ALTER TABLE tabela_base


DROP atributo
CASCADE: [CASCADE|RESTRICT]
remove todas as restries relativas ao atributo e
vises que contm o atributo
RESTRICT: no permite a remoo do atributo se este usado
numa viso ou como chave estrangeira numa outra tabela
4.2 SQL - DDL
Ex.:
ALTER TABLE empregado DROP endereco CASCADE;

ALTER TABLE departamento ALTER gerente DROP DEFAULT

ALTER TABLE departamento ALTER gerente


SET DEFAULT 333444555

ALTER TABLE empregado


DROP CONSTRAINT empsuperCE CASCADE;

ALTER TABLE empregado


ADD CONSTRAINT empsuperCE FOREIGN KEY
(supervisor) REFERENCES empregado(matricula)
4.2 SQL - DDL
DROP TABLE: remove uma tabela-base do BD.
Remove tanto os dados quanto a definio da
tabela

Sintaxe:
DROP TABLE <nomeTabela>

Ex.:
DROP TABLE Peca
4.2 SQL - DDL
Especificando ndices em SQL
- SQL possui comandos para criar e remover ndices em atributos
de relaes base (faz parte da SQL DDL)
- Um ndice uma estrutura de acesso fsico que especificado
em um ou mais atributos de um arquivo, permitindo um acesso
mais eficiente aos dados.
- Se os atributos usados nas condies de seleo e juno de
uma query so indexados, o tempo de execuo da query
melhorado.
- O Oracle cria automaticamente ndices em chaves primrias e
colunas com UNIQUE
4.2 SQL - DDL
Ex.: Criar um ndice no atributo nome da relao
Empregado.

CREATE INDEX nome-ndice


ON Empregado(nome)
O default ordem ascendente, se quisermos uma ordem
descendente adicionamos a palavra chave DESC depois do
nome do atributo
Para especificar a restrio de chave usamos a palavra
UNIQUE

CREATE UNIQUE INDEX matrIndex


ON Empregado(matricula)
Para elimiarmos um ndice usamos o comando DROP
Ex. DROP INDEX nome-indice
4.3 SQL - DML

Esquemas do BD Empresa:
Empregado(matricula, nome, endereco,
salario, supervisor, depto)
Departamento(coddep, nome, gerente,
dataini)
Projeto(codproj, nome, local, depart)
Alocacao(matric,codigop, horas)
4.3 SQL - DML
SQL interativo
As operaes de manipulao sem cursor so:
SELECT, INSERT, UPDATE, DELETE
O comando Select:
A forma bsica do comando Select :

SELECT <lista atributos>


FROM <lista tabelas>
WHERE <condio>
4.3 SQL - DML: Exemplos
Q1. Obtenha o salrio de Jos
SELECT salario
FROM Empregado
WHERE nome=Jos

Obs.: Podemos renomear o nome da coluna no


resultado
SELECT salario as SalarioJose
FROM Empregado
WHERE nome=Jos
4.3 SQL - DML: Exemplos
Obs2: Podemos usar colunas como expresses:
SELECT mat as matricula, salario, 0.15*salario as IR
FROM Empregado

Podemos inserir constantes na clusula select se


necessrio
SELECT nome, maraj as Maraj
FROM Empregado
WHERE salario > 10.000,00
4.3 SQL - DML: Exemplos
Q2. Selecione o nome e o endereo de todos os
empregados que trabalham no departamento de
produo

SELECT e.nome, e.endereco


FROM empregado e, departamento d
WHERE d.nome = Produo and d.coddep = e.depto
4.3 SQL - DML: Exemplos
Q.3 Para cada projeto em Fortaleza, liste o
cdigo do projeto, o departamento que controla
o projeto e o nome do gerente com endereo e
salrio
SELECT p.codproj, d.nome, e.nome,
e.endereco, e.salario
FROM Projeto p, Departamento d, Empregado e
WHERE p.depart = d.coddep and
d.gerente = e.matricula and
p.local = Fortaleza
4.3 SQL - DML: Exemplos
Q4. Para cada empregado, recupere seu nome e o
nome do seu supervisor
SELECT e.nome, s.nome
FROM Empregado e, Empregado s
WHERE e.matricula = s.supervisor
obs.: e e s so variveis tupla
Q5. Selecione a matrcula de todos os empregados

SELECT matricula
FROM Empregados
4.3 SQL - DML: Exemplos
Q6. Faa o produto cartesiano, seguido de projeo
de Empregados X Departamento retornando a
matrcula do empregado e o nome do departamento
SELECT matricula, d.nome
FROM Empregado, Departamento d

Q7. Selecione todos os atributos de todos os


empregados do departamento d5
SELECT *
FROM Empregado
WHERE depto = d5
4.3 SQL - DML: Exemplos
Q8. Selecione todos os atributos de todos os
empregados do departamento pessoal
SELECT e.*
FROM Empregado e, Departamento d
WHERE d.nome = Pessoal and d.coddep = e.depto

Q9. Recupere os salrios de cada empregado


SELECT salario
FROM empregado
4.3 SQL - DML: Exemplos
Algumas vezes surgem duplicatas como resposta
a uma query. Podemos elimin-las usando o
comando DISTINCT na clusula SELECT

Q10. Selecione os diferentes salrios pagos pela


empresa aos empregados

SELECT DISTINCT salario


FROM empregado
Operaes de conjunto
As operaes de conjunto union, intersect, e except
operam nas relaes e correspondem s operaes da
lgebra relacional: , respectivamente
Cada uma dessas operaes elimina automaticamente
duplicatas; para reter todas as duplicatas use ALL: union
all, intersect all e except all.

Suponha que uma tupla ocorre m vezes em r e n vezes em


s, ento, ela ocorre:
m + n vezes em r union all s
min(m,n) vezes em r intersect all s
max(0, m n) vezes em r except all s
4.3 SQL - DML: Exemplos
Q11. Liste todos os nomes de projetos que envolvem
o empregado Silva como trabalhador ou como
gerente do departamento que controla o projeto.
(SELECT p.nome
FROM Projeto P, Departamento d, Empregado e
WHERE d.coddep = p.depart and
d.gerente = e.matricula and
e.nome = Silva)
UNION
(SELECT p.nome
FROM Projeto p, Alocao a, Empregado e
WHERE p.codproj = a.codproj and e.matricula = a.matricula
and e.nome = Silva)
4.3 SQL - DML: Exemplos
Consultas Aninhadas: consultas que possuem
consultas completas dentro de sua clusula
WHERE.
Motivao: Algumas queries requerem que valores
do BD sejam buscados e ento usados numa
condio.

Q12: A consulta Q11 poderia ser reescrita da


seguinte forma:
4.3 SQL - DML: Exemplos
SELECT DISTINCT nome
FROM Projeto
WHERE codigop in (SELECT codigop
FROM Projeto p, Departamento d, Empregado e
WHERE p.depart = d.coddep and
d.gerente = e.matricula and
e.nome = Silva)
or
codigop in (SELECT codigop
FROM Alocao a, Empregado e, Projeto p,
WHERE p.codproj = a.codproj and
e.matricula = a.matricula and
e.nome = Silva)
4.3 SQL - DML: Exemplos
Q13. Recupere o nome de cada empregado que tem
um dependente com o mesmo nome e mesmo sexo
SELECT e.nome
FROM empregado e
WHERE e.matricula in
(SELECT matricula
FROM dependente
WHERE matricula = e.matricula
And e.nome = nome
And e.sexo = sexo)

Obs.: Veja que e.matricula, e.nome e e.sexo so atributos de


empregado da consulta externa.
4.3 SQL - DML: Exemplos
Q14. Re-escrevendo a Q13 sem usar
aninhamento

SELECT e.nome
FROM empregado e, dependente d
WHERE e.matricula = d.matricula and
e.nome = d.nome and e.sexo = d.sexo
4.3 SQL - DML: Exemplos
A construo EXISTS
usada para verificar se o resultado de uma
consulta aninhada vazia ou no. sempre usado
em conjunto com um query aninhada.
A construo exists retorna o valor true se o
argumento da subquery no vazio.
exists r r
not exists r r =
4.3 SQL - DML: Exemplos
A construo EXISTS
A consulta Q13 poderia ser:
SELECT e.nome
FROM empregado e
WHERE EXISTS (SELECT *
FROM dependente
WHERE e.matricula = matricula
and e.nome = nome and e.sexo = sexo)

Podemos usar o NOT EXISTS(Q)


4.3 SQL - DML: Exemplos
Q.15 Recupere os nomes dos empregados que no tm
dependentes
SELECT e.nome
FROM empregado e
WHERE NOT EXISTS (SELECT *
FROM dependente
WHERE e.matricula = matricula)
Podemos usar um conjunto de valores explcitos:
Q16. Selecione a matricula de todos os empregados que
trabalham nos projetos 10, 20 ou 30
SELECT DISTINCT matric
FROM alocacao
WHERE codigop in (10,20,30)
4.3 SQL - DML: Exemplos
DIVISO:
Ex.: Mostre os empregados que trabalham em todos os projetos
do empregado com mat = 800.

SELECT mat
FROM empregado e
WHERE NOT EXISTS (
( SELECT codproj FROM alocacao WHERE mat = 800)
EXCEPT
( SELECT codproj FROM alocacao a WHERE a.mat = e.mat)
)
Note que X Y = X Y
OBS.: No Oracle o operador diferena minus
4.3 SQL - DML: Exemplos
Podemos verificar valores nulos atravs de IS
NULL e IS NOT NULL:
Q17. Selecione os nomes de todos os
empregados que no tm supervisores

SELECT nome
FROM empregado
WHERE supervisor IS NULL
4.3 SQL - DML: Exemplos
Funes
SQL fornece 5 funes embutidas:
COUNT: retorna o nmero de tuplas ou valores
especificados numa query
SUM: retorna a soma os valores de uma coluna
AVG: retorna a mdia dos valores de uma coluna
MAX: retorna o maior valor de uma coluna
MIN: identifica o menor valor de uma coluna

OBS.:Estas funes s podem ser usadas numa clusula


SELECT ou numa clusula HAVING (a ser vista depois)
4.3 SQL - DML: Exemplos
Q18. Encontre o total de salrios, o maior salrio, o
menor salrio e a mdia salarial da relao
empregados
SELECT SUM(salario), MAX(salario),
MIN(salario), AVG(salario)
FROM Empregado

Q19. Encontre o maior e menor salrio do


departamento de Produo
SELECT MAX(salario), MIN(salario)
FROM Empregado e, Departamento d
WHERE e.depto = d.coddep and
d.nome = Produo
4.3 SQL - DML: Exemplos
Q.20 Obtenha o nmero de empregados da empresa
SELECT COUNT(*)
FROM Empregado

Q.21 Obter o nmero de salrios distintos do


departamento de Contabilidade
SELECT COUNT(DISTINCT salario)
FROM empregado e, departamento d
WHERE (e.depto = d.coddep and d.nome = Contabilidade)

O que aconteceria se escrevssemos COUNT(salario) ao


invs de COUNT(DISTINCT salario))?
4.3 SQL - DML: Exemplos
Q.22 Obter o nome dos empregados que tenham
2 ou mais dependentes

SELECT e.nome
FROM empregado e
WHERE (SELECT COUNT(*)
FROM Dependente d
WHERE e.matricula = d.matricula) >= 2)
4.3 SQL - DML: Exemplos
Ex.: Uso da funo max numa query dentro
de um SELECT de outra query:

SELECT mat, salario , (SELECT MAX(salario)


FROM empregado)
FROM empregado;
4.3 SQL - DML: Exemplos
Clusula GROUP BY, HAVING
Usadas para lidar com grupos.

Q23. Para cada departamento, obter o cdigo do


departamento, o nmero de empregados e a mdia
salarial

SELECT depto, COUNT(*), AVG(salario)


FROM Empregado
GROUP BY depto
as tuplas de empregados so separadas em grupos
(departamento) e as funes COUNT e AVG so
aplicadas a cada grupo separadamente.
4.3 SQL - DML: Exemplos
Q24. Para cada projeto, obter o cdigo do
projeto, seu nome e o nmero de
empregados que trabalham naquele projeto

SELECT p.codproj, p.nome, COUNT(*)


FROM Projeto p, Alocacao a
WHERE p.codproj = a.codigop
GROUP BY p.codproj, p.nome

o agrupamento e as funes so aplicadas


aps a juno.
4.3 SQL - DML: Exemplos
HAVING
usada em conjunto com GROUP BY para permitir a incluso de
condies nos grupos
Q.25. Para cada projeto que possui mais de 2 empregados
trabalhando, obter o cdigo do projeto, nome do projeto e
nmero de empregados que trabalha neste projeto

SELECT p.codproj, p.nome, COUNT(*)


FROM Projeto p, Alocacao a
WHERE p.codproj = a.codigop
GROUP BY p.codproj, p.nome
Uma queryHAVING COUNT(*)
avaliada > 2aplicando a clusula WHERE e
primeiro
depois GROUP BY HAVING
4.3 SQL - DML: Exemplos
Operadores de Comparao e Aritmticos
BETWEEN:
Sintaxe:
expresso [NOT] BETWEEN expresso AND expresso

Ex.:
y BETWEEN x AND Z equivale a x <= y <= z

Q.26 Selecione os nomes dos empregados que


ganham mais de 1000 e menos de 2000 reais
SELECT nome
FROM Empregado
WHERE salario BETWEEN 1000 AND 2000
4.3 SQL - DML: Exemplos
LIKE:
Permite comparaes de substrings. Usa dois caracteres
reservados % (substitui um nmero arbitrrio de
caracteres) e _ (substitui um nico caracter).
Q.27 Obter os nomes de empregados cujos endereos esto
em Natal, RN
SELECT nome
FROM empregado
WHERE endereco LIKE %Natal,RN%

- Existem vrias outras funes para se trabalhar com Strings:


SUBSTRING(), UPPER(), LOWER(), ...
SQL:1999 introduziu o construtor alternativo ao LIKE:
SIMILAR TO (que permite o uso de expresses regulares como as usadas
em UNIX)
4.3 SQL - DML: Exemplos
Q27. Queremos ver o efeito de dar aos empregados
que trabalham no ProdutoX um aumento de 10%

SELECT e.nome, 1.1*salario


FROM empregado e, alocacao a, projeto p
WHERE e.matricula = a.matricula and
a.codigop = p.codproj and
p.nome = ProdutoX
4.3 SQL - DML: Exemplos
Ordenao
O operador ORDER BY permite ordenar o resultado de
uma query por um ou mais atributos.
Q.29 Obter uma lista de empregados e seus respectivos
departamentos e projetos, listando ordenado pelo
nome do departamento
SELECT d.nome, e.nome, p.nome
FROM departamento d, empregado e, projeto p, alocacao a
WHERE d.coddep = e.depto AND
e.matricula = a.matricula AND
a.codigop = p.codproj
ORDER BY d.nome, e.nome
4.3 SQL - DML: Exemplos
Ordenao
A ordem default ascendente (ASC) caso
queiramos ordem decrescente usamos DESC

Ex.

ORDER BY d.nome DESC, e.nome ASC


4.3 SQL - DML: Exemplos
Quantificadores
(ou ) e comportam-se como quantificadores existencial
("ao menos um") e universal, respectivamente.

Exemplo

SELECT mat, salario


FROM empregado
WHERE salario >= all
(SELECT salario FROM empregado)
Definio de ALL
F <comp> all r t r (F <comp> t)
0
(5< all 5 ) = false
6
6
(5< all 10 ) = true

4
(5 = all 5 ) = false

4
(5 all 6 ) = true (since 5 4 and 5 6)
Definio de ANY (SOME)
F <comp> some r t r s.t. (F <comp> t)
Where <comp> can be:

0
(5< some 5 ) = true
(l-se: 5 < alguma tupla na relao)
6
0
(5< some 5 ) = false

0
(5 = some 5 ) = true

0
(5 some 5 ) = true (uma vez que 0 5)
4.3 SQL - DML: Exemplos
Quantificadores
Exemplo com agrupamento
Quais departamentos tm mais empregados?

SELECT depto
FROM empregado
GROUP BY depto
HAVING COUNT(*) >= ALL
(SELECT COUNT(*)
FROM empregado GROUP BY depto)
4.3 SQL - DML: Exemplos
Quantificadores
Exemplo com agrupamento
Quais empregados no ganham o menor salrio
pago pela empresa?

SELECT mat
FROM empregado
WHERE salario > ANY
(SELECT salario FROM empregado)
4.3 SQL - DML: Exemplos
Quantificadores
Exemplo com agrupamento
Quais empregados no ganham o menor salrio?

SELECT matricula
FROM empregado
WHERE salario > ANY
(SELECT salario FROM empregado)
Juno em SQL:1999
Vimos como fazer juno em SQL-92. O padro
SQL:1999 (e o 92) especifica vrios tipos de juno:
Clssica (tabelas separadas por vugulas como vimos)
cross-joins
natural joins
conditions joins
column name join
outer joins (left, right, ou full)
Expresses Baseadas em Juno
H vrias maneiras possveis
Podem ser usadas ou stand-alone (em lugar de um select-
from-where) ou para definir uma relao na clusula FROM.
R NATURAL JOIN S
R JOIN S ON condition
i.e., condition: R.B=S.B
R OUTER JOIN S
R CROSS JOIN S

Outerjoin pode ser modificada por:


NATURAL na frente.
ON condition no fim.
LEFT, RIGHT, ou FULL (default) antes de OUTER.
LEFT = preenche (com NULL) tuplas de R somente;
RIGHT = preenche tuplas de S somente.
Junes
Exemplos: Natural Join
Sejam as tabelas T1 e T2
T1 T2 Juno Natural de T1 com T2
C1 C2 C1 C4 C1 C2 C4
10 15 10 BB 10 15 BB
20 25 15 DD

SELECT *
FROM T1 NATURAL JOIN T2
Junes

No exemplo anterior a juno ser feita por


colunas de mesmo nome
Cuidado que nome em empregado no o
mesmo que nome em departamento.
Junes

Exemplos: Cross Join


Implementa o produto cartesiano

SELECT *
FROM T1 CROSS JOIN T2
Junes
Exemplos: Condition Join
usa a clusula ON para especificar a condio de
juno
SELECT *
FROM T1 JOIN T2
ON T1.C1 = T2.C1
equivalente a:

SELECT *
FROM T1, T2
WHERE T1.C1 = T2.C1
Junes
Exemplos: Column name Join
deixa claro quais colunas vo participar da juno
(vimos que natural join usa todas as colunas com
mesmo nome das relaes envolvidas)

SELECT *
FROM T1 JOIN T2
USING (c1, c2)
Junes
Exemplos: Outer Join
preserva no resultado valores que no casam com
Motivao: as vezes precisamos mostrar estes
valores que no casam
ex. Tabelas empregado e departamento onde o
cdigo do departamento em empregado chave
estrangeira, portanto, pode haver valores nulos.
Se quisermos uma lista de todos os empregados
com os nomes dos respectivos departamentos,
usando uma juno natural eliminaria os
empregados sem departamento (com valores
null)
Junes
Exemplos: Left Outer Join

T1 T2 Juno left outer de T1 com T2

C1 C2 C3 C4 C1 C2 C3 C4
10 15 10 BB
10 15 10 BB
20 25 Null Null
20 25 15 DD

SELECT *
FROM T1 LEFT OUTER JOIN T2
ON T1.C1 = T2.C3
Junes
Exemplos: Right Outer Join

T1 T2 Juno right outer de T1 com T2


C1 C2 C3 C4 C1 C2 C3 C4
10 15 10 BB 10 15 10 BB
20 25 15 DD Null Null 15 DD

SELECT *
FROM T1 RIGHT OUTER JOIN T2
ON T1.C1 = T2.C3
Junes
Exemplos: Full Outer Join

T1 T2 Juno full outer de T1 com T2


C1 C2 C3 C4 C1 C2 C3 C4
10 15 10 BB
10 15 10 BB
20 25 15 DD 20 25 Null Null
Null Null 15 DD

SELECT *
FROM T1 FULL OUTER JOIN T2
ON T1.C1 = T2.C3
A clusula With
Permite vises serem definidas localmente a uma
query, ao invs de globalmente como veremos
adiante.
Ex.: Mostre os funcionrios que ganham o maior
salrio

WITH max-sal(sal) as
SELECT MAX(salario)
FROM empregado
SELECT mat
FROM empregado e, max-sal m
WHERE e.salario = m.sal
Relaes derivadas
No SQL:1999
SELECT depto
FROM
(SELECT depto, AVG(salario)
FROM empregado
GROUP BY depto) resultado(depto, media)
WHERE media > 100;

No Oracle:
SELECT depto
FROM
(SELECT depto, AVG(salario) as media
FROM empregado
GROUP BY depto) Resultado
WHERE Resultado.media > 100;
4.3 SQL - DML: Exemplos
O comando INSERT
Usado para adicionar uma tupla a uma relao
Sintaxe:
INSERT INTO tabela [ (lista colunas) ] fonte
Onde fonte pode ser uma especificao de pesquisa
(SELECT) ou uma clusula VALUES da forma:
VALUES (lista de valores atmicos)

OBS.: Se o comando INSERT incluir a clusula


VALUES ento uma nica tupla inserida na relao.
Ex.
INSERT INTO Empregado(matricula, nome) VALUES(9491, Ana);
4.3 SQL - DML: Exemplos
Obs.: A insero ser rejeitada se tentarmos
omitir um atributo que no permite valores
nulos (NOT NULL)
Ex.:
INSERT INTO Empregado (nome, salario) VALUES (Flvia, 960);

Podemos inserir vrias tuplas numa relao


atravs de uma query.
4.3 SQL - DML: Exemplos
Exemplo:
CREATE TABLE DEPTO_INFO
(nome character(15),
numemp integer,
totsal real);

INSERT INTO DEPTO_INFO(nome, numemp, totsal)


SELECT d.nome, COUNT(*), SUM(salario)
FROM Departamento d, Empregado e
WHERE d.coddep = e.depto
GROUP BY d.nome
4.3 SQL - DML: Exemplos
O comando DELETE
Remove tuplas de uma relao
Sintaxe:
DELETE
FROM tabela
[WHERE condio]

Obs.: Se omitirmos a clusula WHERE, ento


o DELETE deve ser aplicado a todas as tuplas
da relao. Porm, a relao permanece no
BD como uma relao vazia.
4.3 SQL - DML: Exemplos
O comando UPDATE
Modifica o valor de atributos de uma ou mais
tuplas.
Sintaxe:
UPDATE tabela
SET lista_atributos com atribuies de valores
[WHERE condio]

Obs.: omitir a clusula WHERE implica que o


UPDATE deve ser aplicado a todas as tuplas da
relao
4.3 SQL - DML: Exemplos
O comando UPDATE
Ex. Modifique o nome do Departamento de
Computao para Departamento de Informtica

UPDATE Departamento
SET nome=Informatica
WHERE nome=Computao

OBS.: se houver mais de um atributos a serem


alterados, os separamos por vrgula (,) na
clusula SET
4.3 SQL - DML: Exemplos
O comando UPDATE
Ex. D um aumento de 10% a todos os
empregados do departamento de Pesquisa

UPDATE Empregado
SET salario=salario*1.1
WHERE depto in (SELECT coddep
FROM Departamento
WHERE nome=Pesquisa)
4.3 SQL - DML: Exemplos
O comando CASE
Permite mudar o valor de um dado, por exemplo,
poderiamo ter codificado o atributo sexo como 1 =
masculino, 2 = feminino, 0 = indefinido , e ento
ao fazermos um select queremos expressar os valores
por extenso ao invs de usar cdigo.

SELECT mat, nome,


CASE
WHEN sexo=1 THEN Masculino
WHEN sexo=2 THEN Feminino
WHEN sexo=0 THEN Indefinido
END, endereco, salario
FROM Empregado
4.4 Vises
No desejvel que todos os usurios tenham acesso ao
esquema conceitual => vises precisam ser definidas.
Viso: uma relao virtual que no faz parte do
esquema conceitual mas que visvel a um grupo de
usurios.
A viso definida por uma DDL e computada cada vez
que so realizadas consultas aos dados daquela viso.
O catlogo do SGBD o repositrio que armazena as
definies das vises.
Uma viso possui nome, uma lista de atributos e uma
query que computa a viso.
4.4 Vises
Uma viso uma tabela virtual que definida a partir de
outras tabelas, contendo sempre os dados atualizados.
Viso em SQL:
Sintaxe:

Exemplo:
CREATE VIEW nomeViso AS expresso_de_consulta

CREATE VIEW Alocacao1(nomeE, nomeP, Horas)


AS SELECT E.nome, P.nome, horas
FROM Empregado E, Projeto P, Alocacao A
WHERE
Cria uma relao E.matricula Alocacao1(
virtual = A.matriculanomeE,
and nomeP,
horas) P.codproj = A.codigop
4.4 Vises
Podemos escrever consultas na viso
definida.
Ex.: Obter o nome dos empregados que
trabalham no projeto Informatizao

SELECT nomeE
FROM Alocacao1
WHERE nomeP = Informatizacao
4.4 Vises
Ex.2: Criar uma viso que contm
informaes gerenciais sobre um
departamento, contendo o nome do depto,
total de empregados e total de salrios.

CREATE VIEW InfoDepto


AS SELECT D.nome, COUNT(*), SUM(salario)
FROM Departamento d, Empregado e
WHERE d.coddep = e.depto GROUP BY d.nome
4.4 Vises
Eliminando uma viso
Usamos o comando DROP VIEW
Sintaxe:

DROP VIEW nomeViso

Ex.:
DROP VIEW Alocacao1

DROP VIEW InfoDepto


4.4 Vises
Atualizando uma viso
Vises so teis em consultas, mas existem restries
em relao a atualizaes ( ainda pesquisa
corrente).
Para ilustrarmos alguns problemas, considere a viso
Alocacao1 e suponha que queiramos atualizar o
atributo nomeP da tupla que contm Joo de
ProdutoX para Produto Y.
Esta atualizao de viso expressa da seguinte
forma:
UPDATE Alocacao1
SET nomeP = ProdutoY
WHERE nomeE = Joo and nomeP = ProdutoX
4.4 Vises
O update anterior pode ser mapeado em vrios updates nas
relaes base. Dois possveis updates, com resultados
diferentes so:
UPDATE Alocacao
SET codigop = (SELECT codproj FROM Projeto
WHERE nome = ProdutoY)
WHERE matricula = (SELECT matricula FROM Empregado
WHERE nome = Joo)
AND codigop = (SELECT codproj FROM Projeto
ou WHERE nome = ProdutoX)

UPDATE Projeto
SET nome = ProdutoX
=> Como o SGBD vai WHERE
escolhernome
qual=UPDATE
ProdutoYcomputar?
4.4 Vises
Considere a viso alocao1 se tentarmos fazer:
INSERT INTO Alocacao1
VALUES (Jos, SIG, 10)

O que aconteceria nas tabelas empregado e


projeto?
Quais seriam os valores de matricula e codproj?
Porqu null no seria aceito?
4.4 Vises
Outro problema em update de viso: suponha a
seguinte viso

CREATE VIEW Emp2


AS SELECT mat, nome, dataNasc
FROM Empregado
WHERE depto = 1
O que aconteceria se fizssemos:

INSERT INTO Emp2 VALUES (100, Ana, 1978/10/02)


depto ter valor nulo, portanto o que acontece com
SELECT * FROM empregado WHERE depto = 1 ?
4.4 Vises
Alguns updates de vises no fazem sentido para
relao base.

Ex.:

UPDATE InfoDepto
SET totsal = 10.000
WHERE nomed = Pesquisa
4.4 Vises
Observaes:
1) Uma viso definida numa nica tabela atualizvel
se os atributos da viso contm a chave primria.

2) Vises definidas sobre mltiplas tabelas usando


juno geralmente no so atualizveis

3) Vises usando funes de agrupamento e


agregados no so atualizveis.
4.5 Valores Nulos
Interpretao de um valor nulo:
- o atributo no se aplica a tupla
- o valor do atributo para esta tupla desconhecido
- o valor conhecido, mas est ausente (no foi posto
ainda)

Problemas com valores nulos:


- problemas com junes (informaes so perdidas)
- problemas com funes tipo SUM, AVG, etc
4.5 Valores Nulos
Ex.: Sejam as tabelas Empregado e Departamento

Se fizermos a consulta: obter uma lista (nomee, nomed) de todos os


empregados, ento os empregados Breno e Mrcia seriam omitidos
=> Perda de Informao!!!! Como vimos, podemos resolver este
problema com Outer Join!!!
4.5 Valores Nulos
Lgica de Nulls
Terceiro valor booleano .
Uma consulta somente produz valores se a condio da
clusula for
( no suficiente).
4.5 Valores Nulos
Cuidado:
Se x um atributo inteiro com valor null:
x * 0 = NULL
x - x = NULL
x + 3 = NULL

Quando comparamos um valor nulo com outro valor


nulo usando um operador relacional o resultado
DESCONHECIDO!
x = 3 => DESCONHECIDO
x > 2 => DESCONHECIDO
4.5 Valores Nulos
Ex.: seja a tabela
Bar Cerveja Preo
Rubronegro Carlsberg Null

O bar Rubronegro no selecionado, mesmo se a


SELECT bar
clusula uma tautologia.
FROM Vende
WHERE preo < 2,00 OR preo >= 2,00
4.5 Valores Nulos
Lgica de trs valores:
verdade = 1; falso = 0, e desconhecido = 1/2.
Ento:
AND = min.
OR = max.
NOT(x) = 1 x.

Algumas Leis no Funcionam


Exemplo: p p
Para a lgica dos 3-valores: se p = desc., ento lado
esquerdo = max(1/2,(11/2)) = 1/2 1.

Vous aimerez peut-être aussi