Você está na página 1de 105

Structured Query Language

(SQL)
Baseado nos slides do professor Patrick Brito
Histrico
SQL - criada no laboratrio IBM de San Jos (atualmente
Almaden).
Inicialmente chamada Sequel.
parte do projeto SystemR, primeiro SGBD relacional.
Outras linguagens de consulta:
Quel
QBE
datalog
Linguagem SQL
A SQL uma linguagem de construo,consulta e
atualizao de base de dados relacional;
SQL - Structure Query Language
Verses -ANSI SQL-86,SQL-89 SQL-92 e SQL3 (em
proposta)
Extenses propostas pelas principais empresas de SGBDS
(compatvel com SQL92);
PL/SQL (Oracle)
Transact-SQL (Microsoft)
Componentes da Linguagem
A linguagem composta de duas partes principais:
DML- linguagem de manipulao de dados (consultas e
atualizaes)
baseada na lgebra relacional.
Alm dos comandos para insero, excluso e alterao de
dados.
DDL - Linguagem de definio de dados (criao,alterao e
excluso de tabelas, ndices,vises,... )
prover autorizao de acesso sobre tabelas aos usurios
implementao de regras de integridade
controle de transao
Principais comandos
DDL:
Create tipoobjeto nome_ objeto
Alter tipoobjeto nome_objeto
drop tipoobjeto nome_objeto
onde objeto: tabela, ndice,view, stored-procedure,
DML:
Select
Insert
Update
Delete
Tabelas
No modelo relacional toda informao representada na
forma de tabelas.
Cada tabela possui um nmero definido de colunas
(atributos) que detalham a informao sendo representada:
Aluno (matrcula, nome, endereo,curso);
Diciplina (cdigo, ttulo, crditos);
Aluno endereo nome matrcula curso
1
2
4
Joo
Marcos
Maria
Antnio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
BDW
BDW
PAW
Rede
3
Tabelas
Tabelas implementam no banco de dados as principais idias identificados
pelo modelo conceitual.
So compostas por um conjunto finito bem definido de atributos.
Cada atributo possui:
um nome,
um tipo de dado,
um tamanho (opcional),
uma caracterstica de nulidade e, possivelmente,
regras
Em BD convencionais os tipos de dados so restritos a tipos pr-definidos
primitivo (int,varchar,float, real) e algumas extenses : date, time, Blob,
decimal(n,s)
1
2
3
4
Joo
Marcos
Maria
Antnio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
BDW
BDW
PAW
Rede
Uma tabela populada com linhas (extenso da tabela)
todas elas de um mesmo tipo, considerando um tipo o
conjunto ordenado de seus atributos
Aluno endereo nome matrcula curso
Linhas ou
tuplas
Tabelas
O nome de uma tabela composto de duas partes:
nomedobd.nometabela
nomedobd pode ser omitido, se o BD estiver em uso
A definio de tabelas em banco de dados realizada
utilizando-se comandos da Linguagem de Definio de
Dados (DDL) que parte da linguagem SQL:
Create table nometabela ()
Alter table nometabela
Drop table nometabela
Tabelas
Ex resumindo : Criao de tabelas
1
2
3
4
Joo
Marcos
Maria
Antnio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
BDW
BDW
PAW
Rede
Aluno endereo nome matrcula curso nascim.
13/12/1983
13/11/1980
05/04/1970
05/01/1978
Create table aluno
(nrmatricula int(4),
nmaluno varchar2(60) ,
dsendereco varchar2(120) ,
dtnascimento date)
Nome de
atributos
deve seguir
padro !!!!
Tipos de dados so
o primeiro nvel de
caracterizao de
validade do dado
a identificao da tabela no
sistema. Deve seguir um padro
Ateno !!! Definio
incompleta, + regras???
Tipos de dados (Oracle)
Numrico:
number(p,s) - preciso de 1<= p <=38
float
caracter
char(n)
varchar2(n)
long
Data
date - data e hora
formato padro: 'YYYY-MM-DD'
TO_DATE('04-OCT-00','DD-MON-YY');
Tipos de dados
BLOB, CLOB
Padres
Nomes
nomes concisos mas representativos.
Nome de tabela
Nunca usar preposicao, mas, se preciso, formar nomes compostos.
Associaes n-rias podem ter seus nomes atribudos s respetivas
tabelas:
aluno, detalhe_venda, estoque, fornecimento,
at 128 caracteres, incluindo owner;
Nome de colunas
iniciar com dois caracteres definidores da classe do atributo.
Demais caracteres descrevem seu significado.
No usar _ para unir nomes composto.
nico em uma mesma tabela, ou viso.
Lista de classes para atributos
nm - nome . Ex:nmaluno,nmcandidato,
nr - nmero. Ex: nrnotafiscal,nrtelefone,
in - indicador. Ex:inbomcliente,insaude,
dt - data. EX: dtfechamento, dtcompra,
id - identificador. Ex: idremessa, idpessoa,
ds - descrio. Ex: dsendereco, dstempo,
cd - cdigo. Ex: cdproduto, cdcliente,...
vl - valor. Ex: vlcompra,vlitem,
pc - percentual. Ex: pcvendames, pccrescimento,
im,tx - imagem, texto. Ex: imfoto,txcontrato
qt - quantidade. Ex: qthoras
Chave primria (PK)
Conjunto de colunas que identificam, unicamente, cada
uma das linhas nas tabelas.
Cdmatricula - tabela aluno
cdcliente - tabela cliente
nrcnpj, nrnotafiscal - tabela nota-fiscal
cdmatricula,nrdisciplina, cdturma - tabela nota
So as grandes candidatas para buscas de informaes
em tabelas.
Qual a mdia do aluno de matrcula 1?
Qual o nome do cliente cujo cdigo 123?
Quais os itens da nota cujo cnpj 12345555567 e o
nmero 512?
Chave primria (Oracle)
1
2
3
4
Joo
Marcos
Maria
Antnio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
BDW
BDW
PAW
Rede
Aluno endereo nome matrcula curso nascim.
13/12/1983
13/11/1980
05/04/1970
05/01/1978
Create table aluno
(nrmatricula int primary key,
nmaluno varchar(60) ,
dsendereco varchar(120) ,
cdcurso char(3),
dtnascimento date)
O SGBD garante que
no haver dois
alunos com mesmo
nrmatricula !!!
Chave primria (padro)
1
2
3
4
Joo
Marcos
Maria
Antnio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
BDW
BDW
PAW
Rede
Aluno endereo nome matrcula curso nascim.
13/12/1983
13/11/1980
05/04/1970
05/01/1978
Create table aluno
(nrmatricula int,
nmaluno varchar2(60) ,
dsendereco varchar2(120) ,
cdcurso char(3),
dtnascimento date,
[constraint aluno_pk]
primary key (nrmatricula))
Obrigatrio quando
CP composta !!!!
Chave estrangeira
Implementa o relacionamento entre tabelas.
Baseado em valor.
Exs:
Venda
cdcliente -> cliente
nritem - > item
aluno
cdcurso -> curso
professor
cddepartamento - > departamento
A partir desses relacionamentos, pode-se perguntar:
Qual o departamento do professor de matrcula 1 ?
curso
Chave estrangeira
descrio
BDW Banco de dados
Web
PAW Projeto aplic
Web
REW Princpios de
Rede
Chave-estrangeira
Chave primria
Curso
1
2
3
4
Joo
Marcos
Maria
Antnio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
BDW
BDW
PAW
REW
Aluno endereo nome matrcula curso nascim.
13/12/1983
13/11/1980
05/04/1970
05/01/1978
Chave estrangeira
estabelece o
relacionamento
entre as tabelas
Implementando chave estrangeira
Create table aluno
(nrmatricula int primary key,
nmaluno varchar2(60) ,
dsendereco varchar2(120) ,
cdcurso char(3),
dtnascimento smalldatetime,
[constraint aluno_curso_fk]
foreign key (cdcurso) references curso (cdcurso))
O SGBD garante que
no haver aluno
associado a curso que
no esteja cadastrado na
tabela curso
Create table curso
(cdcurso char(3) primary key,
dscurso varchar2(60) )
Associao feita
com a chave primria
da tabela referenciada.
Ambas (primria e
estrangeira) so de
mesmo tipo de dado!!!
Chaves primrias compostas
curso
descrio
BDW Banco de dados
Web PAW Projeto aplic
Web
REW Princpios de
Rede
Curso
1
2
3
4
Joo
Marcos
Maria
Antnio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
Aluno
endereo nome matrcula nascim.
13/12/1983
13/11/1980
05/04/1970
05/01/1978
curso
BDW 1
PAW 1
REW 3
Participao
curso
matrcula
BDW 2
PAW 3
PK composta
Chave primria composta
curso
BDW 1
PAW 1
REW 3
Participao
curso
matrcula
BDW 2
PAW 3
Create table participacao_curso
(nrmatricula int,
cdcurso char(3),
primary key (nrmatricula,cdcurso),
foreign key(cdcurso) references curso (cdcurso),
foreign key (nrmatricula) references aluno (nrmatricula))
Chaves estrangeiras compostas
curso
BDW 1
PAW 1
REW 3
Participao
curso
matrcula
BDW 2
PAW 3
Nota curso
curso
BDW 1
BDW 1
REW 3
matrcula
BDW 2
REW 3
nota
7,0
8,0
8,5
6,5
9,5
prova
P1
P2
P1
P1
P2
A chave primria
composta das colunas
(curso,matricula,prova),
onde
(curso,matricula) chave
estrangeira para
participao em curso.
Chaves estrangeiras compostas
Create table nota_curso
(nrmatricula int,
cdcurso char(3),
cdprova char(2),
nota float,
primary key (nrmatricula,cdcurso,cdprova),
foreign key (nrmatricula ,cdcurso)
references participacao_curso (nrmatricula , cdcurso))
Nota curso
curso
BDW 1
BDW 1
REW 3
matrcula
BDW 2
REW 3
nota
7,0
8,0
8,5
6,5
9,5
prova
P1
P2
P1
P1
P2
Regras de excluso com FKs
Material
1 ton areia
2
cimentoton
0001
10/01/2001
1 10
nrNota
data
material qtd
0002
11/01/20012
15
0003
11/01/20011
20
Nota-
Fiscal
Excluir cimento
O que fazer com as notas com material cimento ?

Create table nota_fiscal


(nrnota ...,
.,
constraint nota_material_fk
foreign key (nrmaterial)
references material (nr) on
delete/update cascade)
Regras de Integridade (com
relao ao filho)
excluir - em cascata os dependentes
no alterar - impedir a excluso do material
associar o valor nulo aos dependentes
associar um valor default aos dependentes
excluir o pai e nada fazer aos dependentes
Exemplo: esquema RH
CREATE TABLE Departamento (
nrDepartamento NUMBER(3) CONSTRAINT Dept_PK PRIMARY KEY,
nmDepartamento VARCHAR2(100),
Local VARCHAR2 (100),
CONSTRAINT Dnome_UK UNIQUE (nmDepartamento, Local),
CONSTRAINT Loc_check1 CHECK (Local IN (Rio, So Paulo, Curitiba')));
Esquema RH (cont.)
CREATE TABLE Empregado (
nrEmpregado NUMBER(5)
CONSTRAINT Emp_pk PRIMARY KEY,
nmEmpregado VARCHAR2(100) NOT NULL,
cdcargo VARCHAR2(10),
nrGerente NUMBER(5) CONSTRAINT ger_fk REFERENCES Empregado,
dtadmissao DATE,
Salario NUMBER(7,2),
Comissao NUMBER(5,2),
nrDepartamento NUMBER(3) NOT NULL
CONSTRAINT dept_fk REFERENCES Departamento ON DELETE CASCADE);
Regras de domnio
Restringem os valores admissveis em uma coluna.
Detalham a definio de valores especificada pelo tipo de
dado
Podem exprimir qualquer expresso booleana vlida em
SQL.
Pode-se comparar valores em colunas diferentes da mesma
tabela, mas no entre tabelas distintas.
exs:
sexo = {M,F}
dias_semana = {seg,terc,,dom}
notas >= 0 e <=10
tipos de pessoa= {J,F,O}
Regras de domnio
Create table nota_curso
(nrmatricula int,
cdcurso char(3),
cdprova char(2),
nota decimal(3,1) constraint nota_val_ck check (nota >=0 and
nota<=10),
constraint nota_curso_pk primary key
(nrmatricula,cdcurso,cdprova),
constraint nota_part_curso_fk foreign key
(nrmatricula ,cdcurso) references participacao_curso (nrmatricula ,
cdcurso))
Nota curso
curso
BDW 1
BDW 1
REW 3
matrcula
BDW 2
REW 3
nota
7,0
8,0
8,5
6,5
9,5
prova
P1
P2
P1
P1
P2
Determina o intervalo
de valores vlidos
para a coluna notas!
Alterao de tabelas
Alterar qq informao em colunas:
alter table nota_curso alter nota numeric (4,2) null
Adicionar ou excluir colunas:
alter table nota_curso add dtexame smalldatetime
alter table nota_curso drop dtexame;
Adicionar ou excluir restries:
alter table nota_curso drop constraint nota_curso_pk
alter table nota_curso add constraint nota_curso_pk
primary key (nrmatricula,cdcurso,dtexame)
Excluindo tabelas
Elimina a tabela. Se a tabela contiver dados, esses so
perdidos.
Caso haja um chave estrangeira apontando para a tabela,
tem-se que, primeiramente, eliminar a chave estrangeira
(alter table .. Drop )
S pode ser realizado por usurio com autorizao: owner,
grupo sysadmin.
drop table nometabela
Tabelas - criao
Create table tablename
(atributo1 tipo {null,not null} [default exp],
atributo2 tipo {null,not null} [default exp],
. . . .,
constraint nomeconst_pk primary key(atributo1,...),
constraint nomeconst_fk foreign key (atributo_n,...)
references nometabela_referenciada (atributo,...))
Tabelas - restries
Tipos de restries : primria, unicidade, estrangeira e domnio
Chave primria:
CONSTRAINT nomerestrio
primary key
(nomecoluna [,nomecol2[...,nomecoln]])
Unicidade:
CONSTRAINT nomerestrio
UNIQUE
(nomecoluna [,nomecol2[...,nomecoln]])
Tabelas - restries (cont.)
CONSTRAINT nomerestrio
FOREIGN key
(nomecoluna [,nomecol2[...,nomecoln]])
REFERENCES Tabela-Referenciada
(refcol1[,refcol2[,..[,refcoln]]])
on delete [cascade | noaction]
Domnio:
CONSTRAINT nomerestrio
CHECK (expresso booleana)
Estrangeira:
Resumindo
A criao do modelo lgico relacional realizada atravs
da linguagem DDL, subconjunto da SQL;
Os comandos ddl a serem utilizados so: create, alter e
drop;
Uma tabela definida com:
colunas;
chave primrias;
chaves estrangeiras, se for o caso;
restries de domnio;
definio de sua alocao fsica
Modificao da base
Insero
insert into tabela (col1,col2,col3,col4,col5)
values (cccc,1233, 2002-12-05,12.4,45)
insero linha a linha;
a lista de colunas pode ser eliminada se todos os dados
forem fornecidos na ordem de definio da tabela:
insert into tabela values
(cccc,1233, 2002-12-05,12.4,45)
dados de tipo carecter entre aspas;
dados de tipo data, como os caracteres;
numricos sem aspas;
Modificao da base
colunas no fornecidas assumem: nulo ou valor
default:
create table tab1
(col1 char(5) primary key,
col2 int null,
col3 date ,
col4 decimal(3) constraint col4_def default 5,
col5 real)
insert into tab1 (col1,col3,col5)
values (cccc,1233, 2002-12-05,12.4,45)
inserindo a partir de uma consulta (n linhas)
insert into tab1
select a,b,c,d,e from tab2 , tab3
where a.tab2 = b.tab3
Modificao da base
Alterao da base
update tabela
set col1=val1,col2=val2
where condio
todas as linhas que qualificam para o predicado tm
seus valores alterados nas colunas referenciadas;
update empregado
set vlsalario=vlsalario*1.2
where cddept=d1
Modificao da base
O predicado pode incluir juno com outras tabelas,
desde que s se atualize colunas de uma das tabelas
update empregado
set vlsalario=vlsalario*1.2
from empregado e,departamento d
where e.nrmatric = d.nrchefe
Modificao da base
Excluindo linhas da base
delete tabela where condio
todas as linhas que atenderem a condio especificada
so excluidas da tabela.
Ex:
delete curso where cdcurso=d1;
delete curso c
where not exists (select * from participacao_curso
where c.cdcurso=p.cdcurso)
Linguagem SQL
DDL DML
Atravs de comandos
da DML o usurio surfa
nos dados!!!
Estrutura bsica para Consultas
Linguagem dividida em trs partes:
projeo dos resultados: Select
lista de tabelas : From
restrio linhas: where
Apenas obrigatrio : Select e From
Estrutura bsica:
Select A
1
,A
2
,A
3
Fromr
1
, r
2
, r
3
,, r
n


(A1,A2,A3)
(
p
(r
1
X r
2
X r
3
XX r
n
) )
where P
Representao de execuo
R
a b
1
2
3
m
n
o
4 p
Select R.b
From R
where a>3
From R
Where a> 3
4 p
Select R.b
p
Define tabelas a serem acessadas
Restringe linhas
Define colunas

X
Clusula Select (Projeo)
Lista de colunas, separadas por vrgulas, a serem
apresentadas no resultado final;
ex: select R1.atrib1,R1.atrib2,R2.atrib3
As colunas tm nomes diferentes
Se h mais de uma coluna na lista de select com o
mesmo nome, deve-se preceder o seu nome com o
nome da tabela original;
ex: select f.nome,d.nome
from funcionario f, departamento d
where ..
Clusula select
O resultado de uma consulta uma relao
no elimina duplicados para melhorar desempenho;
para obter resultados sem duplicatas:
select distinct nome from vendedor
Clusula Select
Pode incluir:
expresses aritmticas
Select R.a*4/35 from ...
literais
Select cddepsito, saldo total=, valor_saldo
from estoque
funes:
Select datepart(month,dtnascimento) from ...
Pode-se alterar os nomes das colunas:
select R1.a as nome,R1.b as ender from ...
Clusula select
Concatenao de strings:
select cddeposito= || cddeposito as deposito
fromdeposito
Deposito
Cddeposito=10
Cddeposito=20
Cddeposito=5
Cddeposito=45
Clusula Select
Listar todos dados sobre Empregados : (*)
Select *
from empregado
Emp Matr Nome Salrio Coddept
E1
10 Carlos 200,00 D1
EMP
NomeDept
Coddept
D1 Sistemas
Dept
E2
11 Maria 2000,00 D1
Clusula Where - (Seleo)
Elimina linhas de uma tabela atravs de predicados
expressos sobre valores de suas colunas;
a tabela tem que estar presente na clusula From;
Utilizam-se de operadores:
relacionais : >,<,=,<=,>=,!=
sobre conjunto: in, exists, [not]
between
conectores lgicos: and, or
Clusula Where
Listar matricula e nome dos empregados que ganham mais que
1.000
Select nrmatr, nmfuncionario
from empregado
where vlsalario > 1.000
Expresses mais complexas com operadores lgicos: and, or
select nrmatr, nmfuncionario
from empregado where salario > 1000 and cddept = D2
Clusula where
Outras expresses:
select nrmatr, nmfuncionario
from empregado
where salario between 1000 and 5000
select nrmatr, nmfuncionario
from empregado
where salario not > 1500
Clusula where
Com strings:
comparaes :
like %XYZ => abcXYZ; 1vRXYZ;AXYZ
like _XYZ => aXYZ; AXYZ; 1XYZ
like [0:9][0:9] => 34;00;99
sensvel a maiscula e minscula
Validao de nulos:
coluna is null ou coluna is not null
select nrmatr, nmfuncionario
from empregado
where cdchefe is null
Clusula where
pertinncia em conjunto in:
coluna in (val1,val2,val2);
coluna in (select * from....); (obs:nesse caso a
consulta limitada a retornar uma tabela com
apenas 1 coluna e 1 linha)
Ordenando a sada
A princpio o resultado de uma consulta uma tabela com
linhas sem uma ordem estabelecida;
Pode-se especificar uma ordem determinada a partir da
clusula order by seguida dos atributos pelos quais se deseja
ordenar;
ascendente o default
select * from empregado order by cddept
descendente
select * from empregado order by cddept desc
select * from empregado order by cddept desc, salario asc
Clusula Where
Exs:
select * from empregado
where nome like Carlos%
select * from empregado where coddepto like D_
select * from empregado where salario > 1000 and coddept =
D2
select * from empregado where name like %Andre%
Datas e Tempo
O padro SQL2 especifica uma srie de formatos para
campos de tipo data e tempo, tais como:
04/10/2000, 04-Out-2000, 20:00:00...
Sua representao externa, em consultas, deve seguir o formato
especificado no SGBD como strings;
Operaes entre datas usam os mesmos operadores
relacionais(matemticos) ou funes pr-definidas;
Funes (Oracle):
Para tratamento de data:
to_date(13/12/2001,dd/mm/yyyy)
sysdate() - retornar a data atual;
month(data); year(data); day(data)
Tratamento de strings
substring(incio,tamanho,coluna)
trim(coluna)
Funes
consultando datas:
select * from aluno where dtnascimento = 13/12/1980
select * from aluno where year(dtmatricula) = 1980
Unio,Interseo,Diferena
Listar os funcionrios, professores e administrativos, de
nvel mdio;
Listar os professores que ocupam cargo administrativos;
Listar os funcionrios administrativos que no so
professores;
Unio, Interseo, Diferena
Listar os funcionrios, professores e administrativos, de
nvel mdio;
Unio sem duplicidade
select nrmatric,nmprof from professor
where dstitulo=adjunto
Union
select nrmatric,nmfunc from administrativo
where dsfuno=supervisor
Unio, Interseo, Diferena
Unio com duplicidade
select nrmatric,nmprof from professor
where dstitulo=adjunto
Union all
select nrmatric,nmfunc from administrativo
where dsfuno=supervisor
Interseo
Listar os professores que ocupam cargo administrativos;
Interseco sem duplicatas
select nrmatric,nmprof from professor
intersect
select nrmatric,nmfunc from administrativo
Interseco com duplicatas
select nrmatric,nmprof from professor
intersect all
select nrmatric,nmfunc from administrativo
Diferena
Listar os funcionrios administrativos que no so
professores;
MINUS ou EXCEPT
select nrmatric,nmfunc from administrativo
minus
select nrmatric,nmprof from professor
Mais de uma tabela
Listam-se as tabelas na clusula From;
Select nrmatric, dnome
from empregado, departamento;
Representa uma dentre as seguintes operaes binrias da
lgebra relacional:
Produto cartesiano, Juno(equal e theta), diferena e
interseo;
Consultas com mais de uma tabela
A lista de atributos a serem projetados composta de
atributos das tabelas listadas no From;
select emp.matricula,dept.dnome,lc.lnome
from empregado emp, departamento dept, local lc
Caso haja o mesmo nome em diferentes tabelas o
prefixo (nome da tabela) faz a distino;
Produto Cartesiano e Juno
Produto Cartesiano
Select nmempregado
from empregado, departamento
Join e Intersection
Listar nome dos departamentos e seus respectivos
empregados
Select emp.nmempregado,dept.nmdepartamento
from empregado emp, departamento dept
Where dep.cddept = emp.cddept
Produto Cartesiano
1
2
a
b
c
R S
d
1
1
RxS
a
b
c
d
1
1
2
2
a
b
c
d
2
2
Juno (cont.)
Listar nome dos departamentos que possuam pelo menos
um empregado que ganhe mais de 100000
Select distinct nmdepartamento
from empregado emp, departamento dep
Where dep.dn = emp.dept and
vlsalario > 100000
obs: esta consulta pode ser melhor resolvida com a clusula exists
que veremos a seguir.
Um caso interessante
Quais os nomes dos colegas (trabalham no mesmo
departamento) da Vnia
Select t1.nome
from empregado t1, empregado t2
where t1.cddept=t2.cddept and
t1.mnemp <> t2.nmemp and
t2.nmemp like VANIA%
Consultas aninhadas
A clusula where pode tambm apresentar restries
baseadas nas comparaes com relaes. Usamos neste
caso Sub-Consultas.
Resultado de uma sub-consulta:
um valor escalar - neste caso pode-se usar operadores escalares de
comparao: =, >, <;
uma relao com um s atributo - usa-se operadores de conjuntos:
IN, ALL, ANY;
uma relao com vrios atributos - EXISTS / NOT EXISTS
Comparadores de conjuntos
Exists - verifica se a relao produzida na sub-consulta no
vazia;
ALL - garante que a comparao vlida para todos as
tuplas da sub-consulta;
ANY - garante que a comparao vlida para pelo menos
uma tupla do conjunto gerado pela sub-consulta (tb.
Implementado como some);
Obs: todos podem ser negados com NOT;
Consultas aninhadas - exists
Pode-se selecionar tuplas baseado na existncia, ou no, de
um conjunto.
Select *
from empregado
where exists ( select * from projeto where
nrmatric=nrchefeproj)
Consultas aninhadas - in
Com sub-consultas pode-se verificar a pertinncia de um
valor no conjunto definido por uma consulta mais externa:
informar os empregados que so chefes de projetos:
select nrmatric
from empregado
where nrmatric in (select nrchefeproj from projeto)
Consultas aninhadas - all
Verifica-se de cada tupla atende a comparao com todos os
valores da sub-consulta:
select nrmatric
from empregado e1
where e1.vlsalario > all ( select e2.vlsalario
from empregado e2
where e1.cddept=e2.cddept
and e1.nrmatric != e2.nrmatric)
Sub-Consulta - Diferena
Minus
Listar nome dos departamentos que no possuam
empregados que ganhem mais de 100000
Select nmdept
from dept d
Where not exists (Select * from emp e
Where e.cddepto = d.cddepto
and vlsalario > 100000)
Diviso
Diviso
A operao de diviso define uma relao composta de elementos
que esto relacionados a todos os elementos do dividendo.
EX: diviso (aloca,projeto)->matr
PROJ
cdproj dsproj dtInicio
Aloca
cdproj nrMatr qtcargahor
Diviso
M1 P1
M2 P2
M1 P3
M2 P1
M3 P3
M2 P3
dividido por
p1
p2
p3
=
M1 P1
M1 P3
M2 P1
M2 P2
M2 P3
M3 P3
M2
Apenas M2 gera uma
diviso inteira
Diviso
Proposta: Listar os empregados onde no exista projetos em que
ele no trabalhe:
Select nmemp from empregado e
Where not exists (Select * fromproj p
Where not exists
(Select * fromaloca A
Where e.nrmatr = a.nrmatr
and p.cdproj = a.cdproj)
OU
Select nmproj fromempregado
Where nrmatr in
(Select nrmatr from aloca group by nrmatr
having count(*) = (Select Count(*) fromproj)
Diviso
Listar nome dos empregados que trabalham em todos
os projetos de So Paulo com carga horaria em cada
um maior que 40.
Select nmemp from empregado e
Where not exists
(Select * from proj p
Where local = SP
and not exists
(Select * from aloca A
Where qtcargahora > 40
and e.nrmatr = a.nrmatr
and p.cdproj = a.cdproj))
L-se: nome dos empregados onde no exista projeto de SP que no esteja alocado a
ele com carga > 40.
Diviso
Pode ser expresso como:
A / B = not exists (B - A) , em SQL
Select nmemp from empregado e
Where not exists
(Select cdproj from proj p
Where local = SP
minus
Select A.cdproj from aloca A
Where qtcargahora > 40
and e.nrmatr = a.nrmatr)
Outer Join
Retorna as linhas das tabelas participantes mesmo que no
ocorra juno com uma das tabelas;
A linha (tupla) resultante composta pelos valores das
tuplas juntadas e valores nulos para as colunas da linha
que no juntada;
Outer join <> de Produto Cartesiano
Left Outer Join/Right Outer Join/Full Outer Join(no no
Sql server e Oracle)
Left/Right Outer Join
Retorna as linhas que satisfazem a juno e as linhas de
uma das tabelas(esquerda ou direita) com seu valores (a
esquerda ou a direita) associados com nulos nas colunas da
tabela no juntada.
SELECT e.nome,v.total-venda
FROM Emp e left outer join Venda V
on e.matricula = v.matrFunc
recupera o nome do vendedor e o total da venda para
todos os vendedores.
Se vendedor no vendeu, total-venda nulo
Left outer join
nome Total-vendido
joo
10
Maria null
Carlos 5
nome Dept
joo
V
Maria
V
Carlos V
Vendedor
Total-vendido
joo
10
Carlos 5
Emp
Venda
Outer Join
Select
coalesce(pf.nome,pj.razaosocial,est.nome),venda.total-
venda
from ((pessoa_fsica pf right outer join venda
on venda.idcliente = pf.cpf) left outer join
pessoa_juridica pj
on venda.idcliente= pj.cnpj) left outer join
estrangeiro
on venda.idcliente=est.carteira_est
where venda.dept=D1
Natural outer join
Usado em junes de igualdade quando os atributos tm o
mesmo nome;
O resultado contm apenas uma das colunas;
exemplo:
select e.nome,v.total-venda
from empregado natural left outer join venda v
Neste caso, a chave primria de empregado
(matrcula) definida como chave estrangeira em
venda com o mesmo nome (matricula)
Grupos
SQL possibilita o tratamento de grupamentos em uma
consulta;
A clusula group by lista os atributos que definiro os
grupamentos;
Cada grupo gera uma linha na tabela resultado;
select cddept,sum(vlsalario)
from empregrado
group by cddept;
Gerando grupos
Carlos d1 10
d4 5
d3 20
d1 10
d3 5
Bianca d4 30
d2 20
Pedro d1 10
Mrcia
joo
Cludia
Vldia
Mrcia
Group by cddept
Tabela resultante possui uma linha por grupo
d1
30
d2
25
d3
25
d4
35
Grupos
Listar nmero de Empregados que ganham mais que 10 de
cada Departamento, ordenado por departamento em ordem
ascendente.
Select cddepto,Count(*)
from empregado
where vlsalario > 10
group by cddepto
d2 1
d3 1
d4 1
Carlos d1 10
Mrcia d4 5
joo d3 20
Cludia d1 10
Vldia d3 5
Bianca d4 30
Mrcia d2 20
Pedro d1 10
Mrio d2 5
d3 20
d4 30
d2 20
4
Restries em Grupos
Listar nmero de Empregados que ganham mais que
100.000 por Departamento que tenham lotados mais de 20
empregados.
Select cddepto,count(*)
from empregado
where vlsalario > 100.000
group by cddepto
having count(*) > 20
4
Funes de agregao
SUM,AVG,MIN,MAX,COUNT(*)
produz o resultado da aplicao de funes de
agregao sobre valores de uma coluna da relao:
SUM - um somatrio dos valores em um grupo;
AVG - a mdia de valores em um grupo;
MIN - o menor valor do grupo;
MAX - o maior valor do grupo;
COUNT(*) - nmero de tuplas no grupo
Funes de agregao
Exs:
select avg(nrhoras)
from participao group by nrparticipacao;
select min(vlsalario)
from empregado group by cddept;
select count(*)
from empregado group by cddept;
select max(vlsalario)
from empregado e1, departamento d1
where e1.nrmatric=d1.nrmatricchefe
Tabelas aninhadas
Expresso de sub-consulta na clusula From;
A sub-consulta deve receber um nome;
Select item,count(*)
from (Select material as item
From Venda v
where v.cdcliente=10) i
group by item
Tabelas aninhadas
Select nome_filial, media-saldo
from (select nome-filial, avg(saldo)
from conta
group by nome-filial) as result
(nome_filial,media-saldo)
where media-saldo > 1200
Tabelas aninhadas
Informar o maior valor de vendas no ms
select max (total_venda)
from (select cd_dept,sum (totalvendido)
from venda
group by cd_dept)) as venda_vendedor
(cod_dept,total_venda)
where cod_dept in ( D1,D2, D3,D4)
Case
Case
when pred1 then result
1
when pred2 then result
2
.
when predn then result
n
else result
o
end
semntica - retorna o result
i
associado ao primeiro pred
i
verdadeiro!!
CASE - exemplo
Select case grade < 4 then D
case grade between 4 and 6 then C
case grade between 6 and 8 then B
else A
end
from notas
Coalesce
Para o caso de outer joins em que apenas uma tupla entre
as juntadas deve ocorrer;
Coalesce(A
1
, A
2
,, A
n
) - retorna o primeiro A
i
no nulo na
lista. Caso todos sejam nulos retorna null;
Equivale a um case onde testa-se por nulo cada uma das
colunas;
Coalesce
Select coalesce(salario,0.0)+coalesce(comissao,0.0)
from vendedor
Select nome, coalesce(totalvenda,0.0)
from empregado natural left outer join venda
Modelo ANSI-SPARC
Esquema
externo
Esquema
externo
Esquema
externo
Esquema
conceitual
Esquema
Interno
Vises do BD
Vendas p/
vendedor
Vendedor Notas Fiscais
Itens Nota
fiscal
Viso externa
Viso conceitual
relacional
Vend.dat
Vend.ind
Viso Interna
Vises
Views so definidas atravs de comandos SELECT , que
explicitam a viso desejada
Podem ser usadas para :
Implementar nas aplicaes as vises lgicas da informao
Minimizar modificaes nas aplicaes decorrentes de alteraes
na base, atravs de views bsicas
Prover segurana de acesso e atualizao
Homogeneizar o acesso a base de dados
Facilitar documentao das aplicaes
Vises
Provendo segurana
select nome, departamento from professor
Provendo vises lgicas da informao
select v. nome, nf.nr_nota, nfi.cdproduto
from vendedor v,
nota_fiscal nf,
item_nota nfi
where v.cd_vend = nf.cd_vend and nf.nr_nota =
nfi.nr_nota
Fornecendo independncia de consultas s aplicaes
select * from vendedor
Views -criao
Create view nomeview [(viewcol1,viewcol2,...)] as
select statement
[with check option]
create view Vendas_v01 (nome_vend,num_nota,cod_prod)
as
select v. nome, nf.nr_nota, nfi.cdproduto
from Vendedor v,
Nota_fiscal nf,
Item_nota nfi
where v.cd_vend = nf.cd_vend and nf.nr_nota = nfi.nr_nota
select nome_vend, cod_prod
from vendas_v01
where nr_nota > 1000
Structured Query Language
(SQL)
Baseado nos slides do professor Patrick Brito