Sei sulla pagina 1di 129

♥ José Maria Monteiro SQL FODA

♥ José Maria Monteiro SQL FODA


Autor

José Maria Monteiro


Universidade Federal do Ceará - UFC
Email: monteiro@dc.ufc.br
Short Bio:
Received the MSc degree in Computer Science from the Federal University
of Ceará (UFC), Brazil, in 2001. In 2008 he received the PhD degree from
the Pontifical Catholic University of Rio de Janeiro (PUC-Rio), Brazil,
working in the field of Self-managed and Autonomic Databases. He has
been with the Federal University of Ceará (UFC), Brazil, since 2010 as
full professor and researcher at ARIDA (Advanced Research In DAtabase)
research group. He has published more than 30 papers on inter- national
journals and conference proceedings and has coordinated several research
and development projects. His current research interests include
autonomic databases, cloud databases and big data. José Maria Monteiro
has served as the Computer Science Department’s Chair (2012-2016);

♥ José Maria Monteiro SQL FODA 3


O Canal AntenaDev
• Quem Somos????
Um canal Multiplataforma e Polimórfico cujo objetivo é compartilhar informação
e ajudar a formar a nova geração de profissionais de TIC;

♥ José Maria Monteiro SQL FODA


O Canal AntenaDev

♥ José Maria Monteiro SQL FODA


O Canal AntenaDev

♥ José Maria Monteiro SQL FODA


Sumário 1. Principais Conceitos do Modelo Relacional


2. Breve Histórico da Linguagem SQL
3. Tipos de Dados em SQL
4. Comandos DDL (CREATE TABLE, DROP TABLE, ALTER
TABLE)
5. Comandos DML para Inserção, Remoção e Atualização de
Tuplas (INSERT, UPDATE, DELETE)
6. O Comando SELECT
7. Operações sobre Strings (comando LIKE)
8. Operações sobre Conjuntos (UNION, INTERSECT, EXCEPT)
9. Ordenação do Resultado (ORDER BY)
10. Funções Agregadas (COUNT, MAX, MIN, SUM, AVG)
11. Operação de Junção
12. Agrupando Tuplas (GROUP BY)
13.-Selecionando Grupos (HAVING)
14. Checando Valores Nulos
15. Consultas Aninhadas
16. Consulta Correlacionada
17.Os Predicados IN, SOME, ANY e ALL
18. O Predicado EXISTS
19. O Predicado BETWEEN
20. Junções Avançadas (INNER e OUTER JOIN)

♥ José Maria Monteiro SQL FODA 7


Bibliografia
1. Silberschatz, A., Korth, H., Sudarshan, S. “Sistema de
Banco de Dados”. 6ª Edição, Editora Campus, 2012.
2. Elsmari, R., Navathe, Shamkant B. “Sistemas de Banco de
Dados”. 6a. Edição, Addison-Wesley, 2011.
3. Ramakrishnan, R. “Sistemas de Gerenciamento de Bancos
de Dados”, 3ª Edition, McGraw-Hill, 2008.

Computer Science Department
 College Of Computing


Computer Science Department

Yale University Georgia Institute Of Technology
Wisconsin University

♥ José Maria Monteiro SQL FODA 8


Metodologia
1. Breve Discussão Teórica
2. Exemplos e Exercícios Práticos
• Utilizando o PostgreSQL
• Por isso, instale logo! É grátis!!!

♥ José Maria Monteiro SQL FODA 9


Modelo Relacional

- Introdução -
• Proposto em 1970 por Codd
• IBM
• Consolidou-se como principal
modelo de dados para aplicações
comerciais
• Modelo de dados para Bancos de
Dados Relacionais
• SBDs relacionais

♥ José Maria Monteiro SQL FODA 10


Modelo Relacional

- Introdução -
• 1970 – 1972
Edgar Frank Codd propõe o modelo de dados relacional, que se tornou um marco
em como pensar em banco de dados. Ele desconectou a estrutura lógica do banco
de dados do método de armazenamento físico. Este sistema se tornou padrão
desde então.
• Década de 70
Dois principais protótipos de sistema relacional foram
desenvolvidos entre 1974 e 1977 e demonstram um ótimo
exemplo de como a teoria conduz a boas práticas.
Ingres: Desenvolvido pela UCB. Que no final das contas
serviu como base para Ingres, Sybase, MS SQL Server,etc.
Utilizava QUEL como linguagem de consulta.
System R: Desenvolvido pela IBM San Jose, serviu de base
para o IBM SQL/DS, IBM DB2, Oracle, todas os BDs da HP, Dr. Edgar Frank Codd, o pai
Tandem's Non-Stop SQL. Utilizava SEQUEL como linguagem do modelo relacional.

de consulta. Conheça mais o trabalho do Dr.


Codd em

O termo Sistema de Gerenciamento de Banco de Dados Relacional www.informatik.uni-trier.de/
%7Eley/db/about/codd.html
(SGBDR – RDBMS em inglês) foi definido durante este período.

♥ José Maria Monteiro Banco de Dados 11


Modelo Relacional

- Estrutura de um Banco de Dados Relacional -
• Um banco de dados relacional consiste
• Um conjunto de tabelas (ou relações)
• Relação (Tabela) Estudante
matricula nome sexo idade data_nasc endereco
• Conjunto de linhas 123 Gal F 21 01/01/1980 Rua 123
• Tuplas 124 Gil F 31 02/02/1990 Rua 124

(ou registros) 125


126


M
M
26
30
03/03/1985
04/04/1989
Rua 125
Rua 126
• Conjunto de colunas 127 Ana F 22 05/05/1981 Rua 127

• Atributos
OBS
(ou campos)
Na prática, alguns SGBDs comerciais permitem
que as tabelas tenham linhas duplicadas.
• Uma relação é definida como um conjunto de tuplas
• Elementos de um conjunto são distintos entre si
• Não existem elementos repetidos
♥ José Maria Monteiro SQL FODA 12
Modelo Relacional

- Conceitos Básicos -
• Domínio
• Conjunto de valores permitidos para um atributo
• Valores são atômicos (indivisíveis) e monovalorados
• O valor nulo significa valor desconhecido ou inexistente
• Exemplo: Domínio do atributo matrícula
• Conjunto de todos os valores válidos de matrícula
• dom(A) denota o domínio do atributo A
• Tipo de dados e formato
• Utilizados para especificar um domínio
• Exemplo: telefone
• tipo char com formato (ddd)ddd-dddd
• dom(telefone) representa o conjunto de valores atômicos
válidos para o tipo char e formato especificado

♥ José Maria Monteiro SQL FODA 13


Modelo Relacional

- Conceitos Básicos -
• Esquema de relação (ou Intenção)
• Utilizado para descrever uma relação
• Representado por R(A1:tipo, A2:tipo, …, An:tipo), onde
• R é nome de uma relação e
• A1, A2, …, An uma lista de atributos
• Tipo: tipo de dados que especifica um determinado
domínio
• O atributo Ai é um papel de D no esquema de R
• Grau de R (ou aridade)
• Número de atributos no esquema R

♥ José Maria Monteiro Banco de Dados 14


Modelo Relacional

- Conceitos Básicos -
• Instância de Relação (ou Extensão)
• Seja o esquema de relação R(A1:tipo, A2:tipo, …, An:tipo)
• Um instância de relação (ou relação) para este esquema
• r(R)={t1, t2, …, tk}
• Cada ti representa uma n-tupla de n valores
<v1, v2, …, vn>, onde cada vj ∈ dom(Aj), 0<j≤n
• r representa a extensão para R
• r contém os dados
• R descreve os dados armazenados em r
• A cardinalidade de uma instância de relação é o número de
tuplas que ela contém

♥ José Maria Monteiro SQL FODA 15


Modelo Relacional

- Conceitos Básicos -
• Relação
• Seja r uma relação com esquema R
• r(R) ⊆ dom(A1) x dom(A2) x dom(A3) x … x dom(An)
• r(R) é um subconjunto do produto cartesiano dos
domínios dos atributos que definem R
• cada tupla de r(R) relaciona valores dos vários domínios
• r é uma relação (matemática)
• r(R) representa um conjunto de tuplas

♥ José Maria Monteiro SQL FODA 16


Modelo Relacional

- Conceitos Básicos -
• Instância de Relação (ou Extensão)
• Seja o esquema de relação R(SEXO:char, EST_CIVEL:string)
• dom(SEXO)={‘M’,’F’} ?
• dom(EST_CIVIL)={‘Casado’, ‘Solteiro’, ‘Divorciado’, ‘Viúvo’}?

SEXO EST_CIVIL
M Casado
M Solteiro
M Divorciado
M Viúvo
F Casado
F Solteiro
F Divorciado
F Viúvo

♥ José Maria Monteiro SQL FODA 17


Modelo Relacional

- Conceitos Básicos -
• Esquema de um banco de dados relacional
• Conjunto de esquemas de relação mais um conjunto de restrições de
integridade IC
• S={R1, R2, …, Rn} e um conjunto de restrições de integridade IC
• Instância de um banco de dados relacional
• Seja o esquema S
• Uma instância db para o esquema S
• db={r1, r2, …, rn} , onde
• Cada ri é uma instância de relação de Ri e
• Cada ri satisfaz as restrições de integridade especificadas em IC
• Exercício
• Considere uma banco de dados relacional DBR com as relações
Empregado e Departamento
• Construa um esquema S e mostre uma possível instância para DBR

♥ José Maria Monteiro SQL FODA 18


Modelo Relacional

- Conceitos Básicos -
• Restrições do modelo relacional
• Restrição de domínio
• O valor de cada atributo A
• Tem que ser um valor atômico de dom(A)
• Restrição de Chave
• Super chave (superkey)
• Conjunto de um ou mais atributos que, tomados coletivamente, nos permite
identificar unicamente uma tupla na relação
• Pode apresentar atributos redundantes
• Empregado(matr,nome,ender,cpf)
• {matr, nome e cpf} formam uma superchave?
• {matr e nome} formam uma superchave?
• {cpf e nome} formam uma superchave?
• {matr e cpf} formam uma superchave?
• {matr} é superchave?
• {cpf} é superchave}?
• Se K é uma superchave, então o mesmo ocorre com qualquer
superconjunto de K

♥ José Maria Monteiro SQL FODA 19


Modelo Relacional

- Conceitos Básicos -
• Restrições do modelo relacional
• Restrição de Chave
• Chave (key) ou Chave candidata (candidate key)
• Super chave sem atributos redundantes
• Empregado(matr,nome,ender,cpf)
• {matr, nome e cpf} formam uma chave?
• {matr e nome} formam uma chave?
• {cpf e nome} formam uma chave?
• {matr e cpf} formam uma chave?
• {matr} é superchave? {cpf} é superchave}?
• Chave primária (primary key)
• Chave candidata escolhida como chave da relação
• Identifica tuplas em uma relação
• Garante a unicidade de uma tupla na relação
• Em geral, representamos a PK sublinhada e antes dos demais atributos
• A maioria dos SGBDs ordena fisicamente uma tabela pela sua PK.

♥ José Maria Monteiro SQL FODA 20


Modelo Relacional

- Conceitos Básicos -
• Restrições do modelo relacional
• Restrição de Chave (Mais formalmente…)
• Tuplas de uma relação têm que serem distintas entre si
• Duas tuplas em uma relação não podem ter a mesma
combinação de valores para seus atributos
• Geralmente existe um subconjunto SC de atributos em um
esquema de relação R
• Todas as tuplas de qualquer instância r(R) apresentam uma
combinação diferente de valores para os atributos de SC
• ∀ ti, tj ∈ r 0<i,j≤n, i≠j : ti[SC] ≠ tj[SC]

♥ José Maria Monteiro SQL FODA 21


Modelo Relacional

- Conceitos Básicos -
• Restrições do modelo relacional
• Restrição de Integridade de Entidade (ou Existencial)
• Especifica que nenhuma chave primária pode ter valor
nulo (null)
• Garante que a chave primária identifique tuplas em uma
relação

♥ José Maria Monteiro SQL FODA 22


Modelo Relacional

- Conceitos Básicos -
• Restrições do modelo relacional
• Restrição de Integridade Referencial
• Sejam dois esquemas de relação R e S
• Um conjunto de atributos FK de um esquema de relação
R é chave estrangeira (foreign key) em R se
• Os atributos em FK têm o mesmo domínio que a chave
primária PK de um outro esquema de relação S, e
• Um valor de FK em uma tupla t1 de r(R)
• Ou ocorre em como valor de PK para uma tupla t2 em s(S)
• t1[FK] = t2[PK]
s FK • ou é nulo t1 referencia a tupla t2
u to
tri b S
a m
Os ncia
f e re
re

♥ José Maria Monteiro SQL FODA 23


Modelo Relacional

- Conceitos Básicos -
• Restrições do modelo relacional
• Restrição de Integridade Referencial
• Exemplo: Considere o seguinte esquema de banco de
dados
• Departamento(codigo, descricao)
• Empregado(matr, nome)
Departamento Empregado

codigo descricao matr nome Como saber em que


1 RH 123 Gal departamento um
2 VENDAS 124 Gil determinado
3 ADM 125 Sá
empregado
4 TIC 126 Dé
trabalha???
127 Ana

♥ José Maria Monteiro SQL FODA 24


Modelo Relacional

- Conceitos Básicos -
• Restrições do modelo relacional
• Restrição de Integridade Referencial
• Exemplo: Considere o seguinte esquema de banco de
dados
• Departamento(codigo, descricao)
• Empregado(matr, nome, lotação)
Chave Estrangeira (Foreign Key)
Departamento Empregado

codigo descricao matr nome lotacao


1 RH 123 Gal 1
2 VENDAS 124 Gil 3
3 ADM 125 Sá 1
4 TIC 126 Dé 2
127 Ana null

♥ José Maria Monteiro SQL FODA 25


Modelo Relacional

- Conceitos Básicos -
• Restrições do modelo relacional (cont.)
• Restrição de Integridade Referencial (cont.)
• Exemplo: Considere o seguinte esquema de banco de
dados
• Departamento(codigo, descricao)
• Empregado(matr, nome, lotação)
• Se lotação referenciar codigo, então lotação é chave
estrangeira em Empregado
• Deve ser garantido que o valor de lotação ou seja nulo ou
referencie um valor existente em Departamento
• Integridade referencial
• Atualmente é garantida automaticamente pelos SGBD
existente no mercado

♥ José Maria Monteiro SQL FODA 26


Modelo Relacional

- Conceitos Básicos -
• Outras restrições do modelo relacional
• Restrição de NOT NULL (Integridade de Vazio)
• Restrição UNIQUE
• Restrição de Asserts (Asserções ou Check)
• Uma asserção é um predicado expressando uma
condição que queremos que o Banco de Dados sempre
satisfaça.
• Ex: salario >= 780,00

♥ José Maria Monteiro SQL FODA 27


Modelo Relacional

- Operações de Atualização -

Inclusão
• Insere t em r(R)
• Lista de valores
• Pode violar:
• Restrição de domínio
• Restrição de chave
• Integridade existencial
• Integridade referencial
• Tratamento
• Rejeitar a inclusão
• Solicitar novas informações

♥ José Maria Monteiro SQL FODA 28


Modelo Relacional

- Operações de Atualização -

Exclusão

• Exclui t em r(R)
• Condição sobre valores de atributos
• Pode violar:
• Integridade referencial
• Tratamento
• Rejeitar a exclusão
• Propagação em cascata
• Mudar fk em R’ que referencia R

♥ José Maria Monteiro SQL FODA 29


Modelo Relacional

- Operações de Atualização -

Modificação

• Modifica t[A1,A2,...,Ak] em r(R)


• Condição sobre valores de atributos
• Alguns SGBDs: update=delete+insert
• Violação + tratamento:
• Depende do atributo modificado
• Domínio para qualquer atributo
• PK = exclusão + inclusão
• FK = verificar integridade referencial

♥ José Maria Monteiro SQL FODA 30


SQL

- Histórico -
• Structured Query Language - SQL
• Desenvolvida pela IBM
• Structured English Query Language - Sequel
• Linguagem de consulta para o sistema R
• Primeiro protótipo de SBD relacional
• Especificar consultas de forma interativa
• ad hoc queries
• Padrão
• ANSI
• SQL 86
• SQL 89
• SQL 92
• SQL 99
• Propriedade de SBDs objeto-relacional
♥ José Maria Monteiro SQL FODA 31
SQL

- Comandos DDL -

• Tipos de Dados do Padrão SQL


• Alguns tipos de dados suportados pelo SQL 92
• char(n)
• String de caracteres de tamanho fixo n
• varchar(n)
• String de caracteres de tamanho variável (máximo n)
• integer
• smallint
• decimal(p,d)
• Numérico com p dígitos
• Dos p dígitos, d dígitos representam casas decimais após a vírgula
• real
• numérico ponto flutuante
•Alphabetic date formats ( ‘April 15, 1998’)
• date •Numeric date formats ( ‘4/15/1998’)
• data de calendário •Unseparated string formats (‘19921225')

♥ José Maria Monteiro SQL FODA 32


SQL

- Componentes da Linguagem SQL -

• Structured Query Language - SQL


• Comandos DDL:
• CREATE TABLE
• DROP TABLE
• ALTER TABLE
• Comandos DML:
• INSERT
• DELETE
• UPDATE
• SELECT

♥ José Maria Monteiro SQL FODA 33


SQL

- Comandos DDL -

• Criando tabelas
• Estrutura básica
• CREATE TABLE nome-tabela
(nome-coluna tipo-de-dados [not null],
[nome-coluna tipo-de-dados [not null] … ],
[CONSTRAINT nome-restrição]
UNIQUE nome-coluna
Especifica | PRIMARY KEY(nome-coluna {, nome-coluna})
chaves | FOREIGN KEY (nome-coluna {, nome-coluna})
candidatas
REFERENCES nome-tabela
[ON DELETE CASCADE |
SET NULL | NO ACTION ],
Definição
[ON UPDATE CASCADE],
de restrições
| CHECK (predicado)
)

♥ José Maria Monteiro SQL FODA 34


SQL

- Comandos DDL -

• CREATE TABLE
• Exemplo: Considere o seguinte esquema de banco de
dados
Departamento(codigo, dnome, ender)
Empregado(matr, enome, ender, cpf, salário, lotacao)
• Crie as tabelas Departamento e Empregado utilizando a
DDL do SQL:
CREATE TABLE
CREATE TABLE cursosql.empregado
cursosql.departamento (matr integer not null,
enome varchar(30) not null,
(codigo integer not null, ender varchar(30),
dnome varchar(30) not null, cpf integer not null,
ender varchar(30), lotação integer not null,
primary key (codigo) primary key (matr),
) unique (cpf),
foreign key (lotação) references
departamento on delete cascade)

♥ José Maria Monteiro SQL FODA 35


SQL

- Comandos DDL -

• CREATE TABLE
• Exemplo: Considere o seguinte esquema de banco de
dados
Departamento(codigo, dnome, ender)
Empregado(matr, enome, ender, cpf, salário, lotacao)

• Vamos tentar no PostgreSQL???

♥ José Maria Monteiro SQL FODA 36


SQL

- Comandos DDL -

• Removendo tabelas
• Estrutura básica
• DROP TABLE nome-tabela [CASCADE | RESTRICT]
• Remove as tuplas da tabela e sua definição do catálogo
• CASCADE remove as restrições do tipo foreign key tabelas que
referenciam a tabela removida
• DROP TABLE
• Exemplo:
• DROP TABLE cursosql.departamento
• DROP TABLE cursosql.departamento CASCADE
• DROP TABLE cursosql.empregado

• Vamos tentar no PostgreSQL???

♥ José Maria Monteiro SQL FODA 37


♥ José Maria Monteiro SQL FODA
SQL

- Comandos DDL -

• Alterando tabelas
• Estrutura básica
• ALTER TABLE nome-tabela
[ADD nome-coluna tipo de dados]
[DROP nome-coluna ]
[ADD CONSTRAINT nome-restrição]
[DROP CONSTRAINT nome-restrição]
[DROP PRIMARY KEY]
[ repetir ADD ou DROP em qualquer ordem]
• ALTER TABLE
• Exemplo:
• ALTER TABLE cursosql.empregado ADD salario numeric(7,2)
• ALTER TABLE cursosql.empregado ADD CHECK (salario>900)

• Vamos tentar no PostgreSQL???

♥ José Maria Monteiro SQL FODA 39


SQL

- Comandos DML -

• Incluindo tuplas em uma tabela


• Cláusula INSERT
• Sintaxe
INSERT [INTO] nome_tabela [(lista_de_colunas))] 

{ VALUES ( { DEFAULT | NULL | expr }[,...n] )

| subquery }

• Vamos tentar no PostgreSQL???

♥ José Maria Monteiro SQL FODA 40


SQL

- Comandos DML -

• Removendo tuplas de uma tabela


• Cláusula DELETE
• Sintaxe
DELETE FROM nome_tabela
WHERE predicado

• Vamos tentar no PostgreSQL??? 


♥ José Maria Monteiro SQL FODA 41


AQUELE OLHAR DE QUEM FEZ
DELETE SEM "WHERE"

♥ José Maria Monteiro SQL FODA


SQL

- Comandos DML -

• Atualizando tuplas de uma tabela


• Cláusula UPDATE
• Sintaxe
UPDATE nome_tabela
SET nome_coluna = {expr | NULL | (subquery) }
{, nome_coluna = {expr | NULL |
(subquery) }
WHERE predicado

• Vamos tentar no PostgreSQL???

♥ José Maria Monteiro SQL FODA 43


♥ José Maria Monteiro SQL FODA
SQL

- Comandos DDL -

• CREATE TABLE
• Desafio 1: Considere o seguinte esquema de banco de
dados
Departamento(cod_depart, nome, ender)
Empregado(matr, nome, ender, cpf,salário,lotação)
• Crie as tabelas Departamento e Empregado utilizando a
DDL do SQL com as seguintes restrições
• O salário de cada empregado deve ser maior que 2000
• Não podem existir valores de cpf repetidos
• Não se pode permitir a remoção de departamentos para os
quais ainda existam empregados lotados
• Ao alterar o código de de um departamento, alterar o valor
do atributo lotação para todos empregados do
departamento

♥ José Maria Monteiro SQL FODA 45


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados


• Estrutura básica
SELECT [ALL | DISTINCT] {* | expr [[AS] c_alias]
{, expr [[AS] c_alias] … }}
FROM nome-tabela [[AS] qualificador]
{, nome-tabela [[AS] qualificador] …}
WHERE predicado
• ALL
• Retorna todas as tuplas, inclusive repetidas (default)
• DISTINCT
• Retorna apenas tuplas não repetidas
• *
• Retorna todos os atributos da(s) tabela(s)
• expr
• Representa um atributo ou
• Expressão matemática envolvendo atributos das tabelas
• salario*1.40
♥ José Maria Monteiro SQL FODA 46
5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados (cont.)


• FROM
• Representa o produto cartesiano das tabelas referenciadas
• WHERE
• Corresponde ao predicado de seleção da álgebra relacional
• Exemplos: Considere o seguinte esquema de banco de dados
Departamento(cod_depart, nome, ender)
Empregado(matr, nome, ender, cpf,salário,lotação)
• Listar os funcionários com salário maior que 3000
• Listar funcionários com salários maior que 1000 e menor que 2000
• Listar nome dos funcionários com o nome de seu departamento de
lotação
• Listar nome dos funcionários com o nome de seu departamento de
lotação e uma simulação de seu salário com um aumento de 15%

♥ José Maria Monteiro SQL FODA 47


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Predicados com operações sobre strings


• Identificação de padrão
• %
• Casa com qualquer substring
• _
• Casa com qualquer caracter
• Operador
• like
• Exemplos
• nome like ‘inf%’
• Retorna strings que iniciam pelo substring inf
• nome like ‘%si_’
• Retorna strings que contenham ‘si’ como substring e terminem com um
caracter qualquer após ‘si’
• Listar todos empregados com sobrenome ‘brayner’
• Select nome from Empregado where nome like ‘%brayner%’
♥ José Maria Monteiro SQL FODA 48
5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consultas com o operador de união


• UNION
• União de duas relações (consultas)
• Sem repetições
• UNION ALL
• União de duas relações
• Com repetições

♥ José Maria Monteiro SQL FODA 49


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consultas com o operador de união


• Exemplo
• Considere as seguintes relações
• Empregado(matr, nome, ender, dt_nasc, cpf, salário, lotação)
• Dependente(nome_dep, data-nasc, matr_resp)

• Liste o nome e data de nascimento de todos os


funcionários e dependentes existentes na empresa

select nome,dt_nasc from Empregado


UNION
select nome_dep,data_nasc from Dependente

♥ José Maria Monteiro SQL FODA 50


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consultas com o operador de interseção


• INTERSECT
• Interseção entre duas relações (consultas)
• Sem repetições
• INTERSECT ALL
• Interseção entre duas relações
• Com repetições
• Consultas com o operador de diferença
• EXCEPT
• Diferença entre duas relações (consultas)
• Sem repetições
• EXCEPT ALL
• Diferença entre duas relações (consultas)
• Com repetições

♥ José Maria Monteiro SQL FODA 51


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Exercícios
• Listar matrícula dos empregados que não possuem dependentes
Select e.matr
From empregado e
EXCEPT
Select d.matr-resp
From dependente d

• Listar matrícula dos empregados que possuem dependentes

Select e.matr
From empregado e Select d.matr-resp
INTERSECT
Select d.matr-resp From dependente d
From dependente d

♥ José Maria Monteiro SQL FODA 52


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consultas com consultas ordenadas


ORDER BY coluna-resultado [ASC | DESC]
{, coluna-resultado [ASC | DESC] …}

• Listar empregados ordenados por salário na ordem decrescente


e por nome na ordem crescente

Select *
From empregado e
Order By salário DESC, nome Asc

♥ José Maria Monteiro SQL FODA 53


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Funções Agregadas
• Funções embutidas (built-in) aplicadas sobre uma coleção
de valores (colunas) do banco de dados
• sum
• Retorna o somatório dos valores de uma coleção
• avg
• Retorna a média dos valores de uma coleção
• max
• Retorna o maior valor de uma coleção de valores
• min
• Retorna o menor valor de uma coleção
• count
• Retorna o número de elementos de uma coleção
• Sintaxe
• nome-da-função (ALL | DISTINCT nome-coluna) | count(*)
• Não podem ser utilizados na cláusula WHERE

♥ José Maria Monteiro SQL FODA 54


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Exercícios
• Encontre o número de empregados lotados no
departamento de Informática
select count(*)
from Empregado e, Departamento d
where e.lotacao=d.cod_dep and d.nome like '_nform_tica'

• Encontre o montante da folha de pagamento da empresa


select sum(salario)
from Empregado

• Encontre o salário médio pago pela empresa

select avg(distinct salario)


from Empregado

♥ José Maria Monteiro SQL FODA 55


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL


• Aplicar funções agregadas a diferentes grupos de tuplas
• Exemplo
• Listar a quantidade de empregados por departamento
• Cláusula
• GROUP BY
• Exemplo
select lotação, count(*) as quantidade_empregados
from Empregado
group by lotação A função count é aplicada
lotacao quantidade_empregado para o conjunto de tuplas de
----------- -------------------- cada grupo
1 4
2 2

♥ José Maria Monteiro SQL FODA 56


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL (cont.)


• Todas colunas que aparecem na cláusula select têm que
aparecer na cláusula group by
• Exceto os argumentos da funções agregadas

• Exemplo de sintaxe incorreta


select lotação, matr, count(*)
group by lotação

♥ José Maria Monteiro SQL FODA 57


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL


select lotação, count(*) as quantidade_empregados
from Empregado
group by lotação A função count é aplicada
para o conjunto de tuplas de
Empregado cada grupo
matr nome cpf salário lotação
11 Bárbara 231 8000 2
21 André 451 9000 1 lotação quantidade_empregados
33 Sofia 472 3000 2 1 3
35 Lucas 549 500 2 2 3
37 Rebeca 465 400 3
40 Caio 555 800 1 3 1
57 Yasmin 800 400 1

♥ José Maria Monteiro SQL FODA 58


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL


select lotação, sum(salário)
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação sum of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200
33 Sofia 472 3000 2 2 11500
35 Lucas 549 500 2
37 Rebeca 465 400 3 3 400
40 Caio 555 800 1
57 Yasmin 800 400 1

♥ José Maria Monteiro SQL FODA 59


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL


select lotação, sum(salário), max(salário)
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200 9000
33 Sofia 472 3000 2
2 11500 8000
35 Lucas 549 500 2
37 Rebeca 465 400 3 3 400 400
40 Caio 555 800 1
57 Yasmin 800 400 1

♥ José Maria Monteiro SQL FODA 60


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos
• Listar nome dos departamentos cuja média salarial seja maior
que 7000
• Cláusula having
• Filtro de grupos

• Exemplo
select d.nome, avg(salario)
from Departamento d, Empregado e
where d.cod_depart=e.lotacao
group by d.nome
having avg(e.salario)>7000
Funções Agregadas
=> Podem ser
utilizados na cláusula
HAVING
♥ José Maria Monteiro SQL FODA 61
5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos
• Consulta com where e having
• predicado da cláusula where é avaliado primeiramente
• Tuplas que satisfazem o predicado são agrupadas pelo group by
• Predicado da cláusula having é avaliado
• Grupos que satisfazem o predicado aparecem no resultado

♥ José Maria Monteiro SQL FODA 62


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL


select lotação, sum(salário), max(salário)
from Empregado
group by lotação
having lotação > 1

Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 2 11500 8000
33 Sofia 472 3000 2
35 Lucas 549 500 2 3 400 400
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

♥ José Maria Monteiro SQL FODA 63


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL


select lotação, sum(salário), max(salário)
from Empregado
group by lotação
having max(salario) > 500

Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200 9000
33 Sofia 472 3000 2
2 11500 8000
35 Lucas 549 500 2
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

♥ José Maria Monteiro SQL FODA 64


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL


select lotação, sum(salário), max(salário)
from Empregado
group by lotação
having count(*) > 1

Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200 9000
33 Sofia 472 3000 2
2 11500 8000
35 Lucas 549 500 2
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

♥ José Maria Monteiro SQL FODA 65


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL


select lotação, sum(salário), max(salário)
from Empregado
where salário > 1.000
group by lotação

Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 9000 9000
33 Sofia 472 3000 2
2 11.000 8000
35 Lucas 549 500 2
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

♥ José Maria Monteiro SQL FODA 66


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL


select lotação, sum(salário), max(salário)
from Empregado
where salario > 1.000
group by lotação
having count(*) > 1

Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 2 11.000 8000
33 Sofia 472 3000 2
35 Lucas 549 500 2
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

♥ José Maria Monteiro SQL FODA 67


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL (cont.)


• Exemplos
• Lista de todos dependentes com respectivos
responsáveis e nome do departamento de lotação dos
responsáveis.
• Agrupar o resultado por departamento e por empregado
select d.nome, e.nome, p.nome
from Departamento d, Empregado e, Dependente p
where d.cod_dep=e.lotacao and e.matr=p.matr_resp
group by d.nome, e.nome, p.nome

GROUP BY Desnecessário

♥ José Maria Monteiro SQL FODA 68


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL (cont.)


• Exemplos (cont.)
• Listar para cada departamento o seu código, além do
maior e do menor salário
select lotacao, max(salario) as Maior_Salario, min(salario) as
Menor_Salario
from Empregado e
group by lotacao

• Listar para cada departamento o seu nome, além do


maior e do menor salário

select d.nome, max(e.salario) as Maior_Salario, min(e.salario) as


Menor_Salario
from Departamento d, Empregado e
where d.cod_dep=e.lotacao
group by d.nome

♥ José Maria Monteiro SQL FODA 69


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL (cont.)


• Exemplos (cont.)
• Listar para cada departamento o seu nome, além do
maior e do menor salário

SELECT d.nome, tab.Maior_Salario, tab.Menor_Salario


FROM (
SELECT lotacao, max(salario) as Maior_Salario,
min(salario) as Menor_Salario
FROM empregado e
GROUP BY lotacao
) AS tab, departamento d
WHERE tab.lotacao = d.cod_dep

♥ José Maria Monteiro SQL FODA 70


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL (cont.)


• Exemplos (cont.)
• Listar para cada departamento o seu nome, além do
maior e do menor salário

select lotacao, max(salario) as Maior_Salario, min(salario) as Menor_Salario


from Empregado e
group by lotacao

♥ José Maria Monteiro SQL FODA 71


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos
select lotação, count(*) as quantidade_empregados
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação quantidade_empregados
11 Bárbara 231 8000 2
21 André 451 9000 1 1 3
33 Sofia 472 3000 2 2 3
35 Lucas 549 500 2 3 1
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

select lotação, count(*) as quantidade_empregados


from Empregado
lotação quantidade_empregados
group by lotação
having count(*) > 1 1 3
2 3

♥ José Maria Monteiro SQL FODA 72


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos
select lotação, count(*) as quantidade_empregados
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação quantidade_empregados
11 Bárbara 231 8000 2
21 André 451 9000 1 1 3
33 Sofia 472 3000 2 2 3
35 Lucas 549 500 2 3 1
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

select lotação lotação


from Empregado 1
group by lotação 2
having count(*) > 1
♥ José Maria Monteiro SQL FODA 73
5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos
select lotação, sum(salário), max(salário)
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200 9000
33 Sofia 472 3000 2
2 11500 8000
35 Lucas 549 500 2
37 Rebeca 465 400 3 3 400 400
40 Caio 555 800 1
57 Yasmin 800 400 1

lotação sum of salário


select lotação , sum(salário)
from Empregado 1 10200
group by lotação 2 11500
having max(salário) > 500
♥ José Maria Monteiro SQL FODA 74
5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos
select lotação, sum(salário), max(salário)
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200 9000
33 Sofia 472 3000 2
2 11500 8000
35 Lucas 549 500 2
37 Rebeca 465 400 3 3 400 400
40 Caio 555 800 1
57 Yasmin 800 400 1

lotação sum of salário


select lotação , sum(salário)
from Empregado 1 10200
group by lotação 2 11500
having count(*) > 2
♥ José Maria Monteiro SQL FODA 75
5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos (cont.)


• Exemplos
• Listar nome e média salarial dos departamentos que
possuem mais de 10 empregados lotados
select d.nome, avg(e.salario) as Média_Salarial
from Departamento d, Empregado e
where d.cod_dep=e.lotacao
group by d.nome
having count(matr)>=11

• Listar nome e quantidade de empregados dos


departamentos cuja média salarial é maior que 5000
select d.nome, count(*) as Número_Empregados
from Departamento d, Empregado e
where d.cod_dep=e.lotacao
group by d.nome
having avg(e.salario)>=5000
♥ José Maria Monteiro SQL FODA 76
5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL (cont.)


• Exemplos (cont.)
• Totalizar a quantidade de itens vendidos por vendedor e
por item, considerando o seguinte esquema
• Vendedor(matr, nome, salário)
• Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda)
• Estoque(cod_item, referência, pr_compra,pr_venda,qtde)

select v.nome, e.referência, sum(d.qtde) as total


from Estoque e, Vendedor v, Vendas d
where e.cod_item=d.cod_item and v.matr=d.matr
group by v.nome, e.referência

♥ José Maria Monteiro SQL FODA 77


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos (cont.)


• Exemplos
• Listar nome de vendedores e quantidade de vendas efetuadas
dos vendedores com volume de vendas superior a R$ 10000
(classificado em ordem decrescente por quantidade de
vendas), considerando o seguinte esquema:
• Vendedor(matr, nome, salário)
• Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda)
• Estoque(cod_item, referência, pr_compra,pr_venda,qtde)

select v.nome, count(*) as total_de_vendas


from Vendedor v, Vendas d
where v.matr=d.matr
group by v.nome
having sum(d.qtde*d.pr_venda) > 10000
order by count(*) DESC

♥ José Maria Monteiro SQL FODA 78


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Checando valores nulos


• Predicado IS NULL
• Exemplo
select * from Empregado
where dt-nasc is null

♥ José Maria Monteiro SQL FODA 79


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (subconsulta)


• Consulta SQL especificada dentro de uma outra consulta
SQL
• Exemplo
• Listar todos os empregados que têm salário maior que a
média salarial da empresa
select e.nome
from Empregado e
where salário > (select avg(salário) from Empregado)

A subconsulta retorna um conjunto de valores para


a consulta mais externa (executada primeiro)

Neste caso específico, a subconsulta deve retornar


exatamente um único valor.

♥ José Maria Monteiro SQL FODA 80


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Listar o primeiro e segundo maiores salários da empresa
select max(salário)
from Empregado
union
select max(salario)
from Empregado
where salário <> (select max(salário) from Empregado)

• Listar nome dos departamentos com média salarial maior


que a média salarial da empresa
select d.nome
from Departamento d, Empregado e
where d.cod_depart=e.lotação
group by d.nome
having avg(e.salário) > (select avg(salário) from Empregado)

subconsulta na cláusula having


♥ José Maria Monteiro SQL FODA 81
5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Consulta correlacionada
• Listar todos os empregado que possuem salário maior
que a média salarial de seus departamentos
select nome
from Empregado
where salário > (
select avg(salário)
from Empregado
where lotação=?????
)

A subconsulta precisa utilizar o valor do atributo


lotação de cada tupla da consulta mais externa como
parâmetro de entrada

♥ José Maria Monteiro SQL FODA 82


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Consulta correlacionada
• Listar todos os empregado que possuem salário maior
que a média salarial de seus departamentos
• Variável de correlação
• Variável da consulta mais externa utilizada pela consulta
mais interna
select e.nome
from Empregado e
where salário > (
select avg(salário)
from Empregado
where lotação=e.lotação
)

Executado para cada tupla da


consulta mais externa

♥ José Maria Monteiro SQL FODA 83


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicado IN
• Verifica a pertinência de elementos em um conjunto

• Sintaxe
• expr [NOT] IN (subconsulta) | expr [NOT] IN (val [,val …])

• Exemplo
select nome
from Empregado
where matr in (1,5,8,9)

♥ José Maria Monteiro SQL FODA 84


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Exemplo:
• Listar os empregados lotados nos departamentos
localizados em Fortaleza, considerando o seguinte
esquema
Departamento(cod_depart, nome, ender,cidade)
Empregado(matr, nome, ender, cpf,salário,lotação)

select nome
from Empregado
where lotação in (
select cod_depart
from Departamento
where cidade=‘Fortaleza'
)

♥ José Maria Monteiro SQL FODA 85


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicado IN
• Listar os empregados lotados nos departamentos
localizados em Fortaleza, considerando o seguinte
esquema
Departamento(cod_depart, nome, ender,cidade)
Empregado(matr, nome, ender, cpf,salário,lotação)

select nome
from Empregado
where lotação in (select cod_depart from Departamento
where cidade='Fortaleza' )

select nome
from Empregado e, Departamento d
where e.lotação = d.cod_depart
and d.cidade='Fortaleza'

♥ José Maria Monteiro SQL FODA 86


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Listar os empregados lotados nos departamentos
localizados em Fortaleza, considerando o seguinte
esquema
Departamento(cod_depart, nome, ender,cidade)
Empregado(matr, nome, ender, cpf,salário,lotação)

select nome
from Empregado
where lotação in (select cod_depart from Departamento
where cidade='Fortaleza' or cidade='Natal')

select e.nome
from Empregado e, Departamento d
where e.lotacao = d.cod_depart
and (d.cidade = ‘Fortaleza' or d.cidade=‘Natal')

♥ José Maria Monteiro SQL FODA 87


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicados SOME, ANY e ALL
• Listar empregados que ganham salários maior ou igual
a média salarial de um departamento
• Sintaxe
• expr θ {SOME | ANY | ALL} (subconsulta)
• θ ∈ {<, <=,>, >=, =, <>}

select nome
from Empregado
where salário >=some ( select avg(salário)
from Empregado
group by lotação
)

♥ José Maria Monteiro SQL FODA 88


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicados SOME, ANY e ALL (cont.)
• SOME (subconsulta) e ANY (subconsulta)
• Retornam verdade se e somente se
• Para pelo menos um elemento s retornado pela
subconsulta, expr s é verdade
• São equivalentes

• ALL (subconsulta)
• Retorna verdade se e somente se,
• Para todo elemento s retornado pela subconsulta, expr
s é verdade

♥ José Maria Monteiro SQL FODA 89


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicados SOME, ANY e ALL (cont.)
• Listar empregados que ganham salários maior ou igual a
média salarial de cada departamento

select nome
from Empregado
where salário >=all (
select avg(salário)
from Empregado
group by lotação
)

♥ José Maria Monteiro SQL FODA 90


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicados SOME, ANY e ALL (cont.)
• Listar o departamento com maior média salarial
• Não é permitido função agregada composta
select d.nome
from Empregado e, Departamento d
where d.cod_depart=e.lotação
group by d.nome
having avg(salário) >=all (
select avg(salário)
from Empregado
group by lotação
)

♥ José Maria Monteiro SQL FODA 91


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Predicado EXISTS
• Verifica se o conjunto retornado por uma sbconsulta é
vazio ou não
• Listar empregados que possuem dependentes

select e.nome
from Empregado e
where exists (
select * from Dependente
where matr_resp=e.matr
)

♥ José Maria Monteiro SQL FODA 92


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicado EXISTS
• Listar empregados que possuem dependentes
select e.nome
from Empregado e
where exists (select * from Dependente where matr_resp=e.matr)

select DISTINCT e.nome


from Empregado e, Dependente d
where e.matr = d.matr_resp

select e.nome
from Empregado e
where e.matr IN (select d.matr_resp from Dependente d)

♥ José Maria Monteiro SQL FODA 93


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicado EXISTS (cont.)
• Sintaxe
• [NOT] EXISTS (subconsulta)
• EXISTS (subconsulta)
• Retorna verdade se e somente se
• O conjunto retornado por subconsulta não é vazio
• NOT EXISTS (subconsulta)
• Retorna verdade se e somente se
• O conjunto retornado por subconsulta é vazio
• Listar empregados que NÃO possuem dependentes

select e.nome
from Empregado e
where not exists (select * from Dependente where matr_resp=e.matr)

♥ José Maria Monteiro SQL FODA 94


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)

• Listar nome de departamentos com empregados ganhando


duas vezes mais que a média do departamento

select d.nome
from Departamento d
where exists (select * from Empregado e
where e.lotacao=d.cod_depart and
salário > (2*(select avg(salário)
from Empregado e2
where e2.lotação=e.lotação)))

♥ José Maria Monteiro SQL FODA 95


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)

• Listar nome de departamentos com empregados ganhando


duas vezes mais que a média do departamento

select d.nome
from Departamento d
where exists (select * from Empregado e
where e.lotacao=d.cod_depart and
salário > (2*(select avg(salário)
from Empregado e2
where e2.lotação=d.cod_depart)))

♥ José Maria Monteiro SQL FODA 96


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)

• Listar nome de departamentos com empregados ganhando


duas vezes mais que a média do departamento
select d.nome
from Departamento d
where cod_depart IN (
select lotação from Empregado e,
(
select lotacao, avg(salário) as media
from Empregado
group by lotação
) as tab
where e.lotacao = tab.lotacao
and e.salario > 2*tab.media
♥ José Maria Monteiro ) SQL FODA 97
5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)

• Listar nome de departamentos com empregados ganhando


duas vezes mais que a média do departamento
select DISTINCT d.nome
from departamento d, empregado e,
(
select lotacao, avg(salário) as media
from Empregado
group by lotação
) as tab
where d.cod_depart = e.lotacao and e.lotacao = tab.lotacao
and e.salario > 2*tab.media

♥ José Maria Monteiro SQL FODA 98


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Subconsulta escalar
• Subconsulta que retorna apenas um valor
• Pode aparecer na lista de argumentos da cláusula
select e na cláusula where
• Exemplo
• Listar nome dos empregados com a quantidade de
dependentes de cada empregado

select e.nome, (select count(*) From dependente where matr_resp=e.matr)


from Empregado e

♥ José Maria Monteiro SQL FODA 99


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Subconsulta escalar
• Exemplo
• Listar nome dos empregados com a quantidade de
dependentes de cada empregado
select e.nome, (select count(*) From dependente where matr_resp=e.matr)
from Empregado e

select e.nome, count(*) as qtd_dep Problema: Falha no caso de homônimos


from Empregado e, Dependente d
where e.matr = d.matr_resp
group by e.nome

select e.nome, t.qtd_dep


from Empregado e, ( select matr_resp, count(*) as qtd_dep
from Dependente
group by matr_resp
) as t
e.matr=t.matr_resp

♥ José Maria Monteiro SQL FODA 100


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Predicado Between
• Sintaxe
• expr1 [NOT] BETWEEN expr2 and expr3
• Exemplo
• matr between 2 and 10 ⇔ matr >= 2 and matr<=10
• Em geral, between é mais eficiente
select e.nome
from empregado e
where salario between 10000 and 20000

select e.nome
from empregado e
where salario >= 10000 and salario <= 20000

♥ José Maria Monteiro SQL FODA 101


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado


• Listar nome dos departamentos que possuem empregados
projeção
select d.nome produto cartesiano
from Empregado e, Departamento d
where d.cod_depart=e.lotação seleção

Πd.nome(σd.cod_depart=e.lotação(Departamento x Empregado))


Πd.nome( Departamento d.cod_depart=e.lotação
Empregado )

♥ José Maria Monteiro SQL FODA 102


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Sintaxe da cláusula FROM (cont.)
• Tipos de junção
• Junção theta
• INNER JOIN
• Junção externa à esquerda
• LEFT OUTER JOIN
• Junção externa à direita
• RIGHT OUTER JOIN
• Junção externa completa
• FULL OUTER JOIN

♥ José Maria Monteiro SQL FODA 103


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Junção theta
• Exemplo
• Listar nome dos empregados com o nome do respectivo
departamento

select e.nome, d.nome select e.nome, d.nome


from Empregado e, Departamento d from Empregado e, Departamento d
where e.lotação = d.cod_depart where d.cod_depart = e.lotação

select e.nome, d.nome


from Empregado e inner join Departamento d on e.lotação=d.cod_depart

♥ José Maria Monteiro SQL FODA 104


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Junção theta
• Exemplo
• Listar nome dos empregados com o nome do respectivo
SQLServer
departamento. Listar os empregados mesmo que estes
não estejam lotados em nenhum departamento. Oracle

select e.enome, d.dnome select e.enome, d.dnome


from eempresa.empregado e, from eempresa.empregado e,
eempresa.departamento d eempresa.departamento d
where e.cdep *= d.codigo where e.cdep (+)= d.codigo

select e.enome, d.dnome


from eempresa.empregado e left outer join eempresa.departamento d
on e.cdep = d.codigo

♥ José Maria Monteiro SQL FODA 105


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Junção theta
• Exemplo
• Listar nome dos empregados com o nome do respectivo
SQLServer
departamento. Listar os departamentos mesmo que estes
não possuam nenhum empregado. Oracle

select e.enome, d.dnome select e.enome, d.dnome


from eempresa.empregado e, from eempresa.empregado e,
eempresa.departamento d eempresa.departamento d
where e.cdep =* d.codigo where e.cdep =(+) d.codigo

select e.enome, d.dnome


from eempresa.empregado e right outer join eempresa.departamento d
on e.cdep = d.codigo

♥ José Maria Monteiro SQL FODA 106


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Junção theta
• Exemplo
• Listar nome dos empregados com o nome do respectivo
departamento. Listar os empregados mesmo que estes não estejam
SQLServer lotados em nenhum departamento e os departamentos mesmo que
estes não possuam nenhum empregado. Oracle
select e.enome, d.dnome select e.enome, d.dnome
from eempresa.empregado e, from eempresa.empregado e,
eempresa.departamento d eempresa.departamento d
where e.cdep *=* d.codigo where e.cdep (+)=(+) d.codigo

select e.enome, d.dnome


from eempresa.empregado e full outer join eempresa.departamento d
on e.cdep = d.codigo

♥ José Maria Monteiro SQL FODA 107


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Sintaxe da cláusula FROM
[ FROM {<tabela_fonte>} [,...n] ]

<table_fonte> ::=

nome_tabela [ [AS] qualificador ] [ WITH ( <table_hint> [,...n]) ]

| nome_tabela [ [AS] qualificador ] [ (column_alias [,...n] ) ]

Pode ser | (subquery) [AS] qualificador [ (column_alias [,...n] ) ]

uma visão
(view) | <tabela_fonte> <tipo_junção> <tabela_fonte> ON
<condição_junção>

<tipo_junção> ::=

[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ] [ <join_hint> ]

JOIN

♥ José Maria Monteiro SQL FODA 108


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Sintaxe da cláusula FROM (cont.)
• WITH (<table_hint> [,...n]) ])
• Especifica estratégias (dicas) para o otimizador de consultas
• Índices
• tipo e granularidade de bloqueio (lock)
• (column_alias [,...n] )
• Especifica alias para colunas retornadas de
• uma tabela (não suportado pelo SQL Server 7.0) ou
• subconsulta
• Um alias para cada coluna especificada na lista do select da
subconsulta
• join_hint
• Indica para o otimizador de consulta qual o algoritmo de junção
deve ser executado
• Nested loop join, merge join ou hash join (SQL Server 7.0)

♥ José Maria Monteiro SQL FODA 109


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Junção theta (INNER JOIN)
• Exemplo
• Para os empregados que têm salário maior que 15000,
listar nome com o nome do respectivo departamento,
select e.enome, d.dnome
from eempresa.empregado e inner join eempresa.departamento d
on e.cdep = d.codigo
where e.salario > 15000

♥ José Maria Monteiro SQL FODA 110


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Junção theta (INNER JOIN)
select e.enome, d.dnome
from eempresa.empregado e inner join eempresa.departamento d
on e.cdep = d.codigo
where e.salario > 15000

select e.enome, d.dnome


from eempresa.departamento d
inner join (select * from eempresa.empregado where salario > 15000) e
on d.codigo = e.cdep

select e.enome, d.dnome


from (select * from eempresa.empregado where salario > 15000) e
inner join eempresa.departamento d
on d.codigo = e.cdep

♥ José Maria Monteiro SQL FODA 111


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Junção theta (INNER JOIN)
• Exemplo
• Para os empregados que têm salário maior que 700, listar
nome com o nome do respectivo departamento,

select nome_empregado, d.nome from Departamento d inner join


(select nome, lotação from Empregado where salário>15000) e
(nome_empregado,departamento_lotação)
on departamento_lotação=d.cod_depart

♥ José Maria Monteiro SQL FODA 112


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• LEFT OUTER JOIN
• Calcula o resultado da junção
• Adiciona ao resultado da junção
• Tuplas da relação à esquerda que não satisfazem a
condição de junção
• Atribui valores nulos aos atributos não definidos para estas
tuplas
• Exemplo
• Listar o histórico de vendas de cada vendedor,
considerando o seguinte esquema
• Vendedor(matr, nome, salário)
• Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda)
• Estoque(cod_item, referência, pr_compra,pr_venda,qtde)
select v.nome, e.referência, d.qtde,d.qtde*d.pr_venda
from Vendedor v left outer join (Vendas d inner join Estoque e
on d.cod_item=e.cod_ item) on v.matr=d.matr

♥ José Maria Monteiro SQL FODA 113


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• RIGHT OUTER JOIN
• Calcula o resultado da junção
• Adiciona ao resultado da junção
• Tuplas da relação à direita que não satisfazem a condição
de junção
• Atribui valores nulos aos atributos não definidos para estas
tuplas
• Exemplo
• Para cada empregado, listar nome do empregado, nome
do departamento e nome dos dependentes

select e.nome, d.nome, p.nome


from Departamento d inner join (Dependente p right outer join
Empregado e on p.matr_resp=e.matr) on d.cod_dep=e.lotação

♥ José Maria Monteiro SQL FODA 114


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• FULL OUTER JOIN
• Calcula o resultado da junção
• Adiciona ao resultado da junção
• Tuplas das relações envolvidas na junção que não
satisfazem a condição de junção
• Atribui valores nulos aos atributos não definidos para estas
tuplas
• Incluindo tuplas em uma tabela
• Cláusula Insert
• Sintaxe
INSERT [INTO] nome_tabela [(lista_de_colunas))] 

{ VALUES ( { DEFAULT | NULL | expr }[,...n] )

| subquery } 


♥ José Maria Monteiro SQL FODA 115


5. SQL

- Conjunto de Operações para Manipulação de Dados -

• Atualizando tuplas de uma tabela


• Cláusula Update
• Sintaxe
UPDATE nome_tabela
SET nome_coluna = {expr | NULL | (subquery) }
{, nome_coluna = {expr | NULL | (subquery) }}
WHERE predicado
• Removendo tuplas de uma tabela
• Cláusula Delete
• Sintaxe
DELETE FROM nome_tabela
WHERE predicado

♥ José Maria Monteiro SQL FODA 116


5.- Visões
SQL
-

• Acesso a um banco de dados


• Requer conhecimento do esquema
• Indesejável
• Para usuários inexperientes
• Desenvolvedores de aplicativos que acessam o BD
• Por questões de segurança e privacidade
• Grupos de usuários devem ter acesso a dados de
interesse
• O acesso a todo o banco de dados é perigoso
• Janelas sobre o banco de dados
• Cada janela mostra parte do banco de dados
• Diferentes visões
• Visões (views)
• Definidas sobre tabelas do banco de dados
• Tabelas base

♥ José Maria Monteiro SQL FODA 117


5.- Visões
SQL
-

• Tipos de visões
• Visão virtual
• A definição da visão é armazenada
• Dados da visão não são persistentes
• Sempre que referenciada
• Os dados são materializados
• Custo praticamente igual a cada materialização
• Quanto ao acesso
• Somente leitura
• Visões que só permitem acesso de leitura
• Permitem atualização
• Visões que permitem atualizações nas tabelas base

♥ José Maria Monteiro SQL FODA 118


5.- Visões
SQL
-

• Tipos de visões (cont.)


• Visão materializada
• Dados e definição são persistentes
• Problema de atualização dos dados da visão
• Sempre que há uma atualização nas tabelas base da visão
• Recalculada
• Atualizada
• Com intervenção humana
• Automática
• Reduz custos de materialização de resultado
• Visões somente para leitura
• Aplicações
• Implementação Data Warehouse
• Integração de fontes de dados heterogêneas

♥ José Maria Monteiro SQL FODA 119


5.- Visões
SQL
-

• Definição de visões em SQL


CREATE VIEW nome_da_visão
[(nome_coluna {, nome_coluna …})]
AS
subquery [WITH CHECK OPTION]

• WITH CHECK OPTION


• Especifica que atualizações (INSERT ou UPDATE) na
tabela base só serão permitidas se
• resultam em tuplas visíveis para a visão

♥ José Maria Monteiro SQL FODA 120


Renomeias as
5.- Visões
SQL
- colunas da visão

• Exemplos

create view eempresa.v1 (nome_departamento, nome_empregado)


as
select d.dnome, e.enome
from eempresa.departamento d inner join eempresa.empregado e
on d.codigo = e.cdep

select * from eempresa.v1


select * O mesmo comando
from ( SQL que define a
visão v1
select d.dnome, e.enome
from eempresa.departamento d inner join eempresa.empregado e
on d.codigo = e.cdep
) as tab
♥ José Maria Monteiro SQL FODA 121
Renomeias as
5.- Visões
SQL
- colunas da visão

• Exemplos

create view eempresa.v1 (nome_departamento, nome_empregado)


as
select d.dnome, e.enome
from eempresa.departamento d inner join eempresa.empregado e
on d.codigo = e.cdep

select nome_empregado
from eempresa.v1
where nome_departamento = 'Marketing'

♥ José Maria Monteiro SQL FODA 122


Renomeias as
5.- Visões
SQL
- colunas da visão

• Exemplos

create view eempresa.v2 (nome_empregado, numero_de_dependentes)


as
select e.enome, (select count(*) from eempresa.dependente d where
d.cpf_responsavel = e.cpf)
from eempresa.empregado e

select * from eempresa.v2

select *
from eempresa.v2
where numero_de_dependentes > 0

♥ José Maria Monteiro SQL FODA 123


Renomeias as
5.- Visões
SQL
- colunas da visão

• Exemplos

create view eempresa.v3 (nome_empregado, salario)


as
select enome, salario
from eempresa.empregado e
where salario < 15000 with check option

select * from eempresa.v3

select *
from eempresa.v3
where salario > 10000

♥ José Maria Monteiro SQL FODA 124


Renomeias as
5.- Visões
SQL
- colunas da visão

• Exemplos

create view eempresa.v3 (nome_empregado, salario)


as
select enome, salario
from eempresa.empregado e
where salario < 15000 with check option

update eempresa.v3
set salario = salario + 1000

update eempresa.empregado
set salario = salario + 1000
where salario < 15000

♥ José Maria Monteiro SQL FODA 125


Renomeias as
5.- Visões
SQL
- colunas da visão

• Exemplos

create view eempresa.v3 (nome_empregado, salario)


as
select enome, salario
from eempresa.empregado e
where salario < 15000 with check option

update eempresa.v3
set salario = salario + 1000

select * from eempresa.v3

update eempresa.v3
set salario = salario + 1500

select * from eempresa.empregado

♥ José Maria Monteiro SQL FODA 126


5.- Visões
SQL
-
• Exemplos
• Acessando o banco de dados através de visões
select * from V3

nome_empregado salário
----------------------------------- ------------------------
caio 10000
rebeca 13000

• Atualizando o banco de dados através de visões


update v3 set salário=salário+1000
select * from V3
matrícula salário
----------------------------------- ------------------------
caio 11000
rebeca 14000 Erro, pois as tuplas a serem
alteradas vão deixar de ser visíveis
update v3 set salário=salário+1500 para V3 (where salario < 15000)
matrícula salário
----------------------------------- ------------------------
caio 12500
rebeca 15500

♥ José Maria Monteiro SQL FODA 127


5.- Visões
SQL
-

• Visões que permitem atualizações apresentam as


seguintes restrições na subconsulta
• A cláusula FROM deve possuir apenas uma tabela
• Tabela base
• Visão
• Deve permitir atualização
• Não estão especificadas as cláusulas group by e having
• A palavra reservada distinct não está especificada
• A cláusula where não contém subconsulta que referencia
qualquer tabela na cláusula from diretamente ou
indiretamente (via visões) Restrição não existente no SQL Server 7.0
• Todas as colunas da subconsulta são colunas simples
• Não são permitidas colunas do tipo avg(salário) ou
expressões aritméticas

♥ José Maria Monteiro SQL FODA 128


5.- Visões
SQL
-

• Visões que permitem atualizações apresentam as


seguintes restrições na subconsulta
• ORACLE permite atualização em visões com junção de
duas tabelas
• Desde que a junção seja entre tabelas com
relacionamento 1:N
• A tabela do lado N tenha chave primária
• A atualização só pode ser feita em colunas da tabela do
lado N
• Exceto o atributo de junção

♥ José Maria Monteiro SQL FODA 129

Potrebbero piacerti anche