You are on page 1of 105

Structured Query Language

(SQL)
Baseado nos slides do professor Patrick Brito
Histórico
 SQL - criada no laboratório 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 construção,consulta e
atualização de base de dados relacional;
 SQL - Structure Query Language
 Versões -ANSI SQL-86,SQL-89 SQL-92 e SQL3 (em
proposta)
 Extensões propostas pelas principais empresas de SGBDS
(compatível com SQL92);
– PL/SQL (Oracle)
– Transact-SQL (Microsoft)
Componentes da Linguagem
 A linguagem é composta de duas partes principais:
– DML- linguagem de manipulação de dados (consultas e
atualizações)
» baseada na álgebra relacional.
» Além dos comandos para inserção, exclusão e alteração de
dados.
– DDL - Linguagem de definição de dados (criação,alteração e
exclusão de tabelas, índices,visões,... )
– prover autorização de acesso sobre tabelas aos usuários
– implementação de regras de integridade
– controle de transação
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 informação é representada na
forma de tabelas.
 Cada tabela possui um número definido de colunas
(atributos) que detalham a informação sendo representada:
– Aluno (matrícula, nome, endereço,curso);
– Diciplina (código, título, créditos);
Aluno endereço nome matrícula curso
1
2
4
João
Marcos
Maria
Antônio
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 idéias identificados
pelo modelo conceitual.
 São compostas por um conjunto finito bem definido de atributos.
 Cada atributo possui:
 um nome,
 um tipo de dado,
 um tamanho (opcional),
 uma característica de nulidade e, possivelmente,
 regras
 Em BD convencionais os tipos de dados são restritos a tipos pré-definidos
primitivo (int,varchar,float, real) e algumas extensões : date, time, Blob,
decimal(n,s)
1
2
3
4
João
Marcos
Maria
Antônio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
BDW
BDW
PAW
Rede
 Uma tabela é populada com linhas (extensão da tabela)
todas elas de um mesmo tipo, considerando um tipo o
conjunto ordenado de seus atributos
Aluno endereço nome matrícula 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 definição de tabelas em banco de dados é realizada
utilizando-se comandos da Linguagem de Definição de
Dados (DDL) que é parte da linguagem SQL:
– Create table nometabela (…)
– Alter table nometabela …
– Drop table nometabela
Tabelas
Ex resumindo : Criação de tabelas
1
2
3
4
João
Marcos
Maria
Antônio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
BDW
BDW
PAW
Rede
Aluno endereço nome matrícula 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
padrão !!!!
Tipos de dados são
o primeiro nível de
caracterização de
validade do dado
É a identificação da tabela no
sistema. Deve seguir um padrão
Atenção !!! Definição
incompleta, + regras???
Tipos de dados (Oracle)
 Numérico:
– number(p,s) - precisão de 1<= p <=38
– float
 caracter
– char(n)
– varchar2(n)
– long
 Data
– date - data e hora
»formato padrão: 'YYYY-MM-DD'
»TO_DATE('04-OCT-00','DD-MON-YY');
Tipos de dados
 BLOB, CLOB
Padrões
 Nomes
– nomes concisos mas representativos.
 Nome de tabela
– Nunca usar preposicao, mas, se preciso, formar nomes compostos.
Associações n-árias podem ter seus nomes atribuídos à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.
– Não usar “_” para unir nomes composto.
– Único em uma mesma tabela, ou visão.
Lista de classes para atributos
 nm - nome . Ex:nmaluno,nmcandidato,…
 nr - número. Ex: nrnotafiscal,nrtelefone,…
 in - indicador. Ex:inbomcliente,insaude,…
 dt - data. EX: dtfechamento, dtcompra,…
 id - identificador. Ex: idremessa, idpessoa,…
 ds - descrição. Ex: dsendereco, dstempo,…
 cd - código. 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 primária (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
– São as grandes candidatas para buscas de informações
em tabelas.
»Qual a média do aluno de matrícula 1?
»Qual o nome do cliente cujo código é 123?
»Quais os itens da nota cujo cnpj é 12345555567 e o
número é 512?
Chave primária (Oracle)
1
2
3
4
João
Marcos
Maria
Antônio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
BDW
BDW
PAW
Rede
Aluno endereço nome matrícula 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
não haverá dois
alunos com mesmo
nrmatricula !!!
Chave primária (padrão)
1
2
3
4
João
Marcos
Maria
Antônio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
BDW
BDW
PAW
Rede
Aluno endereço nome matrícula 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))
Obrigatório 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 matrícula 1 ?
curso
Chave estrangeira
descrição
BDW Banco de dados
Web
PAW Projeto aplic
Web
REW Princípios de
Rede
Chave-estrangeira
Chave primária
Curso
1
2
3
4
João
Marcos
Maria
Antônio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
BDW
BDW
PAW
REW
Aluno endereço nome matrícula 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
não haverá aluno
associado a curso que
não esteja cadastrado na
tabela curso
Create table curso
(cdcurso char(3) primary key,
dscurso varchar2(60) )
Associação é feita
com a chave primária
da tabela referenciada.
Ambas (primária e
estrangeira) são de
mesmo tipo de dado!!!
Chaves primárias compostas
curso
descrição
BDW Banco de dados
Web PAW Projeto aplic
Web
REW Princípios de
Rede
Curso
1
2
3
4
João
Marcos
Maria
Antônio
Rua 1,102
Rua 2,603
Rua 2,303
Rua 3,404
Aluno
endereço nome matrícula nascim.
13/12/1983
13/11/1980
05/04/1970
05/01/1978
curso
BDW 1
PAW 1
REW 3
Participação
curso
matrícula
BDW 2
PAW 3
PK composta
Chave primária composta
curso
BDW 1
PAW 1
REW 3
Participação
curso
matrícula
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
Participação
curso
matrícula
BDW 2
PAW 3
Nota curso
curso
BDW 1
BDW 1
REW 3
matrícula
BDW 2
REW 3
nota
7,0
8,0
8,5
6,5
9,5
prova
P1
P2
P1
P1
P2
A chave primária é
composta das colunas
(curso,matricula,prova),
onde
(curso,matricula) é chave
estrangeira para
participação 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
matrícula
BDW 2
REW 3
nota
7,0
8,0
8,5
6,5
9,5
prova
P1
P2
P1
P1
P2
Regras de exclusão 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
relação ao filho)
 excluir - em cascata os dependentes
 não alterar - impedir a exclusão 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’, ’São 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 domínio
 Restringem os valores admissíveis em uma coluna.
Detalham a definição de valores especificada pelo tipo de
dado
 Podem exprimir qualquer expressão booleana válida em
SQL.
 Pode-se comparar valores em colunas diferentes da mesma
tabela, mas não entre tabelas distintas.
– exs:
» sexo = {‘M’,’F’}
» dias_semana = {“seg”,”terc”,…,”dom”}
» notas >= 0 e <=10
» tipos de pessoa= {“J”,”F”,”O”}
Regras de domínio
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
matrícula
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 válidos
para a coluna notas!
Alteração de tabelas
 Alterar qq informação 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 restrições:
– 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 são
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 usuário com autorização: owner,
grupo sysadmin.
– drop table nometabela
Tabelas - criação
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 - restrições
 Tipos de restrições : primária, unicidade, estrangeira e domínio
Chave primária:
CONSTRAINT nomerestrição
primary key
(nomecoluna [,nomecol2[...,nomecoln]])
Unicidade:
CONSTRAINT nomerestrição
UNIQUE
(nomecoluna [,nomecol2[...,nomecoln]])
Tabelas - restrições (cont.)
CONSTRAINT nomerestrição
FOREIGN key
(nomecoluna [,nomecol2[...,nomecoln]])
REFERENCES Tabela-Referenciada
(refcol1[,refcol2[,..[,refcoln]]])
on delete [cascade | noaction]
Domínio:
CONSTRAINT nomerestrição
CHECK (expressão booleana)
Estrangeira:
Resumindo
 A criação do modelo lógico relacional é realizada através
da linguagem DDL, subconjunto da SQL;
 Os comandos ddl a serem utilizados são: create, alter e
drop;
 Uma tabela é definida com:
– colunas;
– chave primárias;
– chaves estrangeiras, se for o caso;
– restrições de domínio;
– definição de sua alocação física
Modificação da base
 Inserção
– insert into tabela (col1,col2,col3,col4,col5)
values (‘cccc’,1233,’ 2002-12-05’,12.4,45)
– inserção linha a linha;
– a lista de colunas pode ser eliminada se todos os dados
forem fornecidos na ordem de definição 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;
– numéricos sem aspas;
Modificação da base
– colunas não 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
Modificação da base
 Alteração da base
– update tabela
»set col1=val1,col2=val2
»where condição
– todas as linhas que qualificam para o predicado têm
seus valores alterados nas colunas referenciadas;
»update empregado
 set vlsalario=vlsalario*1.2
 where cddept=“d1”
Modificação da base
– O predicado pode incluir junção 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
Modificação da base
 Excluindo linhas da base
– delete tabela where condição
– todas as linhas que atenderem a condição especificada
são 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
Através de comandos
da DML o usuário surfa
nos dados!!!
Estrutura básica para Consultas
 Linguagem dividida em três partes:
– projeção dos resultados: Select
– lista de tabelas : From
– restrição à linhas: where
 Apenas obrigatório : Select e From
 Estrutura básica:
– 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
X…X r
n
) )
where P
Representação de execução
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
Cláusula Select (Projeção)
 Lista de colunas, separadas por vírgulas, a serem
apresentadas no resultado final;
»ex: select R1.atrib1,R1.atrib2,R2.atrib3
 As colunas têm 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 …..
Cláusula select
 O resultado de uma consulta é uma relação
– não elimina duplicados para melhorar desempenho;
– para obter resultados sem duplicatas:
»select distinct nome from vendedor
Cláusula Select
 Pode incluir:
– expressões aritméticas
»Select R.a*4/35 from ...
– literais
» Select cddepósito, ‘saldo total=’, valor_saldo
» from estoque
– funções:
»Select datepart(month,dtnascimento) from ...
 Pode-se alterar os nomes das colunas:
– select R1.a as nome,R1.b as ender from ...
Cláusula select
 Concatenação de strings:
select ‘cddeposito=’ || cddeposito as deposito
fromdeposito
Deposito
Cddeposito=10
Cddeposito=20
Cddeposito=5
Cddeposito=45
Cláusula Select
 Listar todos dados sobre Empregados : (*)
Select *
from empregado
Emp Matr Nome Salário Coddept
E1
10 Carlos 200,00 D1
EMP
NomeDept
Coddept
D1 Sistemas
Dept
E2
11 Maria 2000,00 D1
Cláusula Where - (Seleção)
 Elimina linhas de uma tabela através de predicados
expressos sobre valores de suas colunas;
– a tabela tem que estar presente na cláusula From;
– Utilizam-se de operadores:
» relacionais : >,<,=,<=,>=,!=
» sobre conjunto: in, exists, [not]
»between
– conectores lógicos: and, or
Cláusula Where
 Listar matricula e nome dos empregados que ganham mais que
1.000
– Select nrmatr, nmfuncionario
from empregado
where vlsalario > 1.000
 Expressões mais complexas com operadores lógicos: and, or
– select nrmatr, nmfuncionario
from empregado where salario > 1000 and cddept = ‘D2’
Cláusula where
 Outras expressões:
– select nrmatr, nmfuncionario
from empregado
where salario between 1000 and 5000
– select nrmatr, nmfuncionario
from empregado
where salario not > 1500
Cláusula where
 Com strings:
– comparações :
»like ‘%XYZ’ => abcXYZ; 1vRXYZ;AXYZ
»like ‘_XYZ’ => aXYZ; AXYZ; 1XYZ
»like [0:9][0:9] => 34;00;99
– sensível a maiúscula e minúscula
 Validação de nulos:
– coluna is null ou coluna is not null
– select nrmatr, nmfuncionario
from empregado
where cdchefe is null
Cláusula where
 pertinência 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 saída
 A princípio o resultado de uma consulta é uma tabela com
linhas sem uma ordem estabelecida;
 Pode-se especificar uma ordem determinada a partir da
cláusula 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
Cláusula 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 padrão SQL2 especifica uma série de formatos para
campos de tipo data e tempo, tais como:
– 04/10/2000, 04-Out-2000, 20:00:00...
– Sua representação externa, em consultas, deve seguir o formato
especificado no SGBD como strings;
– Operações entre datas usam os mesmos operadores
relacionais(matemáticos) ou funções pré-definidas;
Funções (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(início,tamanho,coluna)
– trim(coluna)
Funções
 consultando datas:
– select * from aluno where dtnascimento = “13/12/1980”
– select * from aluno where year(dtmatricula) = 1980
União,Interseção,Diferença
 Listar os funcionários, professores e administrativos, de
nível médio;
 Listar os professores que ocupam cargo administrativos;
 Listar os funcionários administrativos que não são
professores;
União, Interseção, Diferença
 Listar os funcionários, professores e administrativos, de
nível médio;
– União sem duplicidade
select nrmatric,nmprof from professor
where dstitulo=‘adjunto’
Union
select nrmatric,nmfunc from administrativo
where dsfunção=‘supervisor’
União, Interseção, Diferença
– União com duplicidade
»select nrmatric,nmprof from professor
where dstitulo=‘adjunto’
Union all
select nrmatric,nmfunc from administrativo
where dsfunção=‘supervisor’
Interseção
 Listar os professores que ocupam cargo administrativos;
– Intersecão sem duplicatas
»select nrmatric,nmprof from professor
intersect
select nrmatric,nmfunc from administrativo
– Intersecão com duplicatas
»select nrmatric,nmprof from professor
intersect all
select nrmatric,nmfunc from administrativo
Diferença
 Listar os funcionários administrativos que não são
professores;
– MINUS ou EXCEPT
select nrmatric,nmfunc from administrativo
minus
select nrmatric,nmprof from professor
Mais de uma tabela
 Listam-se as tabelas na cláusula From;
– Select nrmatric, dnome
from empregado, departamento;
 Representa uma dentre as seguintes operações binárias da
álgebra relacional:
– Produto cartesiano, Junção(equal e theta), diferença e
interseção;
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 distinção;
Produto Cartesiano e Junção
 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
Junção (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 cláusula exists
que veremos a seguir.
Um caso interessante
 Quais os nomes dos colegas (trabalham no mesmo
departamento) da Vânia
– 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 cláusula where pode também apresentar restrições
baseadas nas comparações com relações. Usamos neste
caso Sub-Consultas.
 Resultado de uma sub-consulta:
– um valor escalar - neste caso pode-se usar operadores escalares de
comparação: =, >, <;
– uma relação com um só atributo - usa-se operadores de conjuntos:
IN, ALL, ANY;
– uma relação com vários atributos - EXISTS / NOT EXISTS
Comparadores de conjuntos
 Exists - verifica se a relação produzida na sub-consulta não
é vazia;
 ALL - garante que a comparação é válida para todos as
tuplas da sub-consulta;
 ANY - garante que a comparação é válida 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 existência, ou não, de
um conjunto.
– Select *
from empregado
where exists ( select * from projeto where
nrmatric=nrchefeproj)
Consultas aninhadas - in
 Com sub-consultas pode-se verificar a pertinência de um
valor no conjunto definido por uma consulta mais externa:
– informar os empregados que são chefes de projetos:
select nrmatric
from empregado
where nrmatric in (select nrchefeproj from projeto)
Consultas aninhadas - all
 Verifica-se de cada tupla atende a comparação 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 - Diferença
 Minus
Listar nome dos departamentos que não 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)
Divisão
 Divisão
A operação de divisão define uma relação composta de elementos
que estão relacionados a todos os elementos do dividendo.
EX: divisão (aloca,projeto)->matr
PROJ
cdproj dsproj dtInicio
Aloca
cdproj nrMatr qtcargahor
Divisão
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
divisão inteira
Divisão
 Proposta: Listar os empregados onde não exista projetos em que
ele não 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)
Divisão
 Listar nome dos empregados que trabalham em todos
os projetos de São 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 não exista projeto de SP que não esteja alocado a
ele com carga > 40.
Divisão
 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 não
ocorra junção com uma das tabelas;
 A linha (tupla) resultante é composta pelos valores das
tuplas “juntadas” e valores nulos para as colunas da linha
que não é juntada;
 Outer join <> de Produto Cartesiano
 Left Outer Join/Right Outer Join/Full Outer Join(não no
Sql server e Oracle)
Left/Right Outer Join
 Retorna as linhas que satisfazem a junção 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 não 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 não vendeu, total-venda é nulo
Left outer join
nome Total-vendido
joão
10
Maria null
Carlos 5
nome Dept
joão
V
Maria
V
Carlos V
Vendedor
Total-vendido
joão
10
Carlos 5
Emp
Venda
Outer Join
 Select
coalesce(pf.nome,pj.razaosocial,est.nome),venda.total-
venda
from ((pessoa_física 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 junções de igualdade quando os atributos têm o
mesmo nome;
 O resultado contém apenas uma das colunas;
 exemplo:
– select e.nome,v.total-venda
»from empregado natural left outer join venda v
»Neste caso, a chave primária de empregado
(matrícula) é definida como chave estrangeira em
venda com o mesmo nome (matricula)
Grupos
 SQL possibilita o tratamento de grupamentos em uma
consulta;
 A cláusula group by lista os atributos que definirão 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
Márcia
joão
Cláudia
Vládia
Márcia
Group by cddept
 Tabela resultante possui uma linha por grupo
d1
30
d2
25
d3
25
d4
35
Grupos
 Listar número 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
Márcia d4 5
joão d3 20
Cláudia d1 10
Vládia d3 5
Bianca d4 30
Márcia d2 20
Pedro d1 10
Mário d2 5
d3 20
d4 30
d2 20
4
Restrições em Grupos
 Listar número 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
Funções de agregação
 SUM,AVG,MIN,MAX,COUNT(*)
– produz o resultado da aplicação de funções de
agregação sobre valores de uma coluna da relação:
»SUM - um somatório dos valores em um grupo;
»AVG - a média de valores em um grupo;
»MIN - o menor valor do grupo;
»MAX - o maior valor do grupo;
»COUNT(*) - número de tuplas no grupo
Funções de agregação
 Exs:
– select avg(nrhoras)
from participação 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
 Expressão de sub-consulta na cláusula 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 mês
– 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
 semântica - 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
não 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
Visões do BD
Vendas p/
vendedor
Vendedor Notas Fiscais
Itens Nota
fiscal
Visão externa
Visão conceitual
relacional
Vend.dat
Vend.ind
Visão Interna
Visões
 Views são definidas através de comandos SELECT , que
explicitam a visão desejada
 Podem ser usadas para :
– Implementar nas aplicações as visões lógicas da informação
– Minimizar modificações nas aplicações decorrentes de alterações
na base, através de “views básicas”
– Prover segurança de acesso e atualização
– Homogeneizar o acesso a base de dados
– Facilitar documentação das aplicações
Visões
 Provendo segurança
– select nome, departamento from professor
 Provendo visões lógicas da informação
– 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 independência de consultas às aplicações
select * from vendedor
Views -criação
 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