Você está na página 1de 25

Mais SQL: consultas

complexas, triggers,
views e modificação
de esquema
Comparações envolvendo
NULL e lógica de três
valores
 Considere os seguintes exemplos para ilustrar cada um dos
significados de NULL:

1. Valor desconhecido. A data de nascimento de uma pessoa


não é conhecida, e por isso é representada por NULL no
banco de dados. Um exemplo do outro caso de desconhecido
seria NULL para o telefone residencial de uma pessoa, pois
não se sabe se ela tem ou não um telefone residencial.

2. Valor indisponível ou retido. Uma pessoa tem telefone


residencial, mas não deseja que ele seja listado, por isso ele
é retido e representado como NULL no banco de dados.

3. Atributo não aplicável. Um atributo TituloUniversitario


seria NULL para uma pessoa que não tivesse nível
universitário, pois isso não se aplica a ela.
Comparações envolvendo
NULL e lógica de três
valores
 A SQL usa uma lógica de três valores com os valores TRUE,
FALSE e UNKNOWN.

 Conectivos lógicos na lógica de três valores:


Comparações envolvendo
NULL e lógica de três
valores
 A SQL usa uma lógica de três valores com os valores TRUE,
FALSE e UNKNOWN.

 Conectivos lógicos na lógica de três valores:


Comparações envolvendo
NULL e lógica de três
valores
 A SQL usa uma lógica de três valores com os valores TRUE,
FALSE e UNKNOWN.

 Conectivos lógicos na lógica de três valores:


Comparações envolvendo
NULL e lógica de três
valores
 A SQL permite consultas que verificam se o valor de um
atributo é NULL.

 Em vez de usar = ou <> para comparar o valor de um atributo


com NULL, a SQL usa os operadores de comparação IS ou IS
NOT.

 Por exemplo:

 Recuperar os nomes de todos os funcionários que não


possuem supervisores.

SELECT Primeiro_nome, Ultimo_nome


FROM FUNCIONARIO
WHERE Cpf_supervisor IS NULL;
Consultas aninhadas,
tuplas e comparações de
conjunto/
multiconjunto
 Algumas consultas precisam que os valores existentes no
banco de dados sejam buscados e depois usados em uma
condição de comparação.

 Essas consultas podem ser formuladas convenientemente com


o uso de consultas aninhadas, que são blocos select-from-
where completos dentro de outra consulta SQL.

 Essa outra consulta é chamada de consulta externa.

 Essas consultas aninhadas também podem aparecer na


cláusula WHERE, ou na cláusula FROM, ou na cláusula SELECT,
ou em outras cláusulas SQL, como for preciso.
Consultas aninhadas,
tuplas e comparações de
conjunto/
multiconjunto
SELECT DISTINCT Numero_projeto
FROM PROJETO
WHERE Numero_projeto IN
( SELECT Numero_projeto
FROM PROJETO, DEPARTAMENTO,
FUNCIONARIO
WHERE PROJETO.Numero_departamento =

DEPARTAMENTO.Numero_departamento
AND Cpf_gerente = Cpf AND
Ultimo_nome = ‘Silva’ )
OR
Numero_projeto IN
( SELECT Numero_projeto
FROM TRABALHA_EM, FUNCIONARIO
WHERE Cpf_funcionario = Cpf AND
Consultas aninhadas,
tuplas e comparações de
conjunto/
multiconjunto

 A SQL permite o uso de tuplas de valores em comparações,


colocando-os entre parênteses.

 Para ilustrar isso, considere a seguinte consulta:

SELECT DISTINCT Cpf_funcionario


FROM TRABALHA_EM
WHERE (Numero_projeto, Horas) IN ( SELECT Numero_projeto,
Horas
FROM TRABALHA_EM
WHERE Cpf_funcionario =
‘12345678966’ );
Consultas aninhadas,
tuplas e comparações de
conjunto/
multiconjunto
 O operador = ANY (ou = SOME) retorna TRUE se o valor v for
igual a algum valor no conjunto V e, portanto, é equivalente a
IN.

 As duas palavras-chave ANY e SOME possuem o mesmo efeito.

 Outros operadores que podem ser combinados com ANY (ou


SOME) incluem >, >=, <, <= e <>.

 A palavra-chave ALL também pode ser combinada:

SELECT Ultimo_nome, Primeiro_nome


FROM FUNCIONARIO
WHERE Salario > ALL ( SELECT Salario
FROM FUNCIONARIO
WHERE Numero_departamento =
Consultas aninhadas
correlacionadas
 Sempre que uma condição na cláusula WHERE de uma consulta
aninhada referencia algum atributo de uma relação declarada na
consulta externa, as duas são consideradas correlacionadas.

Podemos entender melhor uma consulta correlacionada ao


considerar que a consulta aninhada é avaliada uma vez para cada
tupla (ou combinação de tuplas) na consulta externa.

Em geral, uma consulta escrita com blocos aninhados select-from-


where e usando os operadores de comparação = ou IN sempre pode
ser expressa como uma única consulta em bloco.

SELECT F.Primeiro_nome, F.Ultimo_nome


FROM UNCIONARIO AS F, DEPENDENTE AS D
WHERE F.Cpf = D.Cpf_funcionario AND F.Sexo =
D.Sexo
AND F.Primeiro_nome = D.Nome_dependente;
As funções EXISTS e
UNIQUE em SQL

 EXISTS e UNIQUE são funções booleanas que retornam TRUE


ou FALSE; logo, elas podem ser usadas em uma condição da
cláusula WHERE.

 A função EXISTS em SQL é usada para verificar se o resultado


de uma consulta aninhada correlacionada é vazio (não contém
tuplas) ou não.

 O resultado de EXISTS é um valor booleano TRUE se o


resultado da consulta aninhada tiver pelo menos uma tupla, ou
FALSE, se o resultado da consulta aninhada não tiver tuplas.

 EXISTS e NOT EXISTS costumam ser usados em conjunto com


uma consulta aninhada correlacionada.
Conjuntos explícitos e
renomeação de atributos
em SQL

 Também é possível usar um conjunto explícito de valores


na cláusula WHERE, em vez de uma consulta aninhada.

 Esse conjunto é delimitado por parênteses em SQL.

 Por exemplo:

 Recuperar os números do CPF de todos os funcionários que


trabalham nos projetos de números 1, 2 ou 3:

SELECT DISTINCT Cpf_funcionario


FROM TRABALHA_EM
WHERE Numero_projeto IN (1, 2, 3);
Tabelas de junção em
SQL e junções externas
(outer joins)
 O conceito de uma tabela de junção (ou relação de junção)
foi incorporado na SQL para permitir aos usuários especificar
uma tabela resultante de uma operação de junção na cláusula
FROM de uma consulta.

 O conceito permite que o usuário especifique diferentes tipos


de junção, como NATURAL JOIN (junção natural), e vários
tipos de OUTER JOIN (junção externa).

 Em uma NATURAL JOIN sobre duas relações R e S, nenhuma


condição de junção é especificada; cria-se uma condição
EQUIJOIN implícita para cada par de atributos com o mesmo
nome de R e S.

 Cada par de atributos desse tipo é incluído apenas uma vez na


relação resultante.
Tabelas de junção em
SQL e junções externas
(outer joins)
 As opções disponíveis para especificar tabelas de junção incluem:

1. INNER JOIN (apenas pares de tuplas que combinam com a


condição de junção são recuperados, o mesmo que JOIN),

2. LEFT OUTER JOIN (toda tupla na tabela da esquerda precisa


aparecer no resultado; se não tiver uma tupla combinando, ela é
preenchida com valores NULL para os atributos da tabela da
direita),

3. RIGHT OUTER JOIN (toda tupla na tabela da direita precisa


aparecer no resultado; se não tiver uma tupla combinando, ela é
preenchida com valores NULL para os atributos da tabela da
esquerda) e

4. FULL OUTER JOIN.


Funções de agregação
em SQL
 As funções de agregação são usadas para resumir
informações de várias tuplas em uma síntese de tupla única.

 O agrupamento é usado para criar subgrupos de tuplas antes


do resumo.

 Existem diversas funções de agregação embutidas:

1. COUNT,
2. SUM,
3. MAX,
4. MIN e
5. AVG.
Agrupamento: as
cláusulas GROUP BY e
HAVING

 A cláusula GROUP BY especifica os atributos de agrupamento,


que também devem aparecer na cláusula SELECT, de modo
que o valor resultante da aplicação de cada função de
agregação a um grupo de tuplas apareça com o valor do(s)
atributo(s) de agrupamento.

 Se houver NULLs no atributo de agrupamento, um grupo


separado é criado para todas as tuplas com um valor NULL no
atributo de agrupamento.

 Às vezes, queremos recuperar os valores dessas funções


somente para grupos que satisfazem certas condições.

 A SQL oferece uma cláusula HAVING, que pode aparecer em


conjunto com uma cláusula GROUP BY, para essa finalidade.
Outras construções SQL:
WITH e CASE

 A cláusula WITH permite que um usuário defina uma tabela que


só será usada em uma consulta específica; ela é semelhante à
criação de uma visão, que será usada apenas em uma consulta
e depois descartada.

 A SQL também possui uma construção CASE, que pode ser


usada quando um valor pode ser diferente, com base em certas
condições.

 Isso pode ser usado em qualquer parte de uma consulta SQL na


qual se espera um valor, incluindo quando consultamos,
inserimos ou atualizamos tuplas.

 A construção CASE também pode ser usada na inserção de


tuplas que podem ter diferentes atributos sendo NULL,
dependendo do tipo de registro inserido em uma tabela.
Consultas recursivas em
SQL
 Essa sintaxe foi adicionada na SQL:99 para permitir aos usuários a
capacidade de especificar uma consulta recursiva de forma
declarativa.

 Um exemplo de um relacionamento recursivo entre as tuplas do


mesmo tipo é a relação entre um empregado e um supervisor.

WITH RECURSIVE SUPERVISIONA_SUPERVISIONADO (Cpf_


supervisiona, Cpf_supervisionado) AS
( SELECT Cpf_supervisor, Cpf
FROM FUNCIONARIO
UNION
SELECT F.Cpf, S.Cpf_supervisiona
FROM FUNCIONARIO AS F, SUPERVISIONA_
SUPERVISIONADO AS S
WHERE F.Cpf_supervisor = S.Cpf_supervisionado)
SELECT*
FROM SUPERVISIONA_SUPERVISIONADO;
Especificando restrições
gerais como asserções
em SQL
 Em SQL, os usuários podem especificar restrições gerais por meio
de asserções declarativas, usando o comando CREATE
ASSERTION.

 A técnica para escrever essas asserções é especificar uma consulta


que seleciona quaisquer tuplas que violam a condição desejada.

 Ao incluir essa consulta em uma cláusula NOT EXISTS, a asserção


especificará que o resultado dessa consulta precisa ser vazio para
que a condição seja sempre TRUE.

 Uma asserção é violada se o resultado da consulta não for vazio.

 A cláusula CHECK e a condição de restrição também podem ser


utilizadas para especificar restrições sobre atributos e domínios
individuais e sobre tuplas individuais.
Introdução a gatilhos
(triggers) em SQL
 Um gatilho típico, que é considerado um ECA (Evento, Condição,
Ação), possui três componentes:

1. O(s) evento(s): estes em geral são operações de atualização


no banco de dados, aplicadas explicitamente a ele.

2. A condição que determina se a ação da regra deve ser


executada: se nenhuma condição for especificada, a ação será
executada uma vez que o evento ocorra. Se uma condição for
especificada, ela primeiro é avaliada e, somente se for avaliada
como verdadeira, a ação da regra será executada.

3. A ação a ser tomada: a ação normalmente é uma sequência


de instruções em SQL, mas também poderia ser uma transação
de banco de dados ou um programa externo que será executado
automaticamente.
Visões (views) — tabelas
virtuais em SQL
 Uma visão em terminologia SQL é uma única tabela que é derivada
de outras tabelas.

 Uma visão não necessariamente existe em forma física; ela é


considerada uma tabela virtual, ao contrário das tabelas
básicas.

 Em SQL, o comando para especificar uma visão é CREATE VIEW.

 Uma estratégia, chamada modificação de consulta, consiste em


modificar ou transformar a consulta da visão (submetida pelo
usuário) em uma consulta nas tabelas básicas.

 A segunda estratégia, chamada materialização de visão, consiste


em criar fisicamente uma tabela de visão temporária quando a
visão for criada ou consultada pela primeira vez e manter essa
tabela na suposição de que outras consultas na visão acontecerão
em seguida.
Visões (views) — tabelas
virtuais em SQL

 É possível haver diferentes estratégias em relação a quando


uma visão materializada será atualizada:

1. A estratégia de atualização imediata atualiza uma visão


assim que as tabelas básicas são alteradas.

2. A estratégia de atualização adiada atualiza a visão


quando ela for necessária para uma consulta à visão.

3. A estratégia de atualização periódica atualiza a visão


periodicamente.

 Um usuário sempre poderá emitir uma consulta de


recuperação contra qualquer visão.
Visões (views) — tabelas
virtuais em SQL
 „Uma visão com uma única tabela de definição é atualizável
se seus atributos tiverem a chave primária da relação básica,
bem como todos os atributos com a restrição NOT NULL que
não têm valores default especificados.

 „„As visões definidas sobre múltiplas tabelas usando junções


geralmente não são atualizáveis.

 „„As visões definidas usando funções de agrupamento e


agregação não são atualizáveis.

 Em SQL, a cláusula WITH CHECK OPTION precisa ser


acrescentada ao final da definição de visão se uma visão tiver
de ser atualizada por comandos INSERT, DELETE ou UPDATE.
Isso permite que o sistema rejeite operações que violam as
regras da SQL para atualizações de visão.
Instruções de alteração
de esquema em SQL

 O comando DROP pode ser usado para remover elementos


nomeados do esquema, como tabelas, domínios, tipos ou
restrições.

 Também é possível remover um esquema.

 Existem duas opções de comportamento de drop: CASCADE e


RESTRICT.

 A definição de uma tabela básica ou de outros elementos de


esquema nomeados pode ser alterada usando o comando ALTER.

 Para as tabelas básicas, as possíveis ações de alteração de tabela


incluem acrescentar ou remover uma coluna (atributo), alterar
uma definição de coluna e acrescentar ou remover restrições de
tabela.

Você também pode gostar