Skip to content

Latest commit

 

History

History
92 lines (66 loc) · 6.39 KB

topico-21.md

File metadata and controls

92 lines (66 loc) · 6.39 KB

[Tópico T21] - SQL - DML (Data Manipulation Language): Subconsulta (parte 2)

by Prof. Plinio Sa Leitao-Junior (INF/UFG)

Os exemplos apresentados usam o esquema lógico do BD Empresa, conforme abaixo.

Subconsulta

Uma subconsulta consiste em um comando SELECT posicionado dentro de um outro comando SQL. Com maior frequência, subconsultas estão inseridas em outras consultas, ou seja, consultas aninhadas:

  • A subconsulta é denominada consulta interna.
  • A consulta na qual a subconsulta está embutida é chamada consulta externa.
  • A subconsulta usualmente está localizada na cláusula WHERE, na cláusula FROM e/ou na cláusula SELECT, conforme necessário.

Um classificação comum para subconsultas é:

  • Subconsulta Independente: a execução da subconsulta é independente da consulta mais externa:
    • a subconsulta é executada uma única vez;
    • o resultado da subconsulta é utilizado para o processamento da consulta mais externa.
  • Subconsulta Corretata: a execução da subconsulta é dependente da consulta mais externa:
    • a subconsulta é potencialmente executada várias vezes:
      • a subconsulta é avaliada uma vez para cada tupla (ou combinação de tuplas) na consulta externa.
    • a subconsulta requer dados oriundos da consulta externa para ser processada.

Cláusulas ANY e ALL

As cláusulas ANY e ALL são usadas conjuntamente com subconsultas com os seguintes significados:
■ O predicado que inclui a cláusula ANY será verdadeiro caso seja satisfeito para pelo menos um (qualquer) dos elementos resultantes da subconsulta.
■ O predicado que inclui a cláusula ALL será verdadeiro caso seja satisfeito para todos os elementos resultantes da subconsulta.

Exemplo 01: Cláusula ANY

Qual o nome dos funcionários que são gerentes de departamento?

Classificação SQL
Subconsulta independente SELECT Pnome, Unome
FROM FUNCIONARIO
WHERE Cpf = ANY (
    SELECT Cpf_gerente
    FROM DEPARTAMENTO )

Exemplo 02: Cláusula ALL

Qual o nome e salário dos funcionários que "têm o menor salário" da empresa?

Classificação SQL
Subconsulta independente SELECT Pnome, Unome, Salario
FROM FUNCIONARIO
WHERE Salario <= ALL (
    SELECT Salario
        FROM FUNCIONARIO )

Exemplo 03: Cláusulas ANY, ALL e EXISTS

<< As três expressões em SQL abaixo são equivalentes. Qual a consulta relacionada? >>

Classificação SQL
Subconsulta independente SELECT Pnome, Unome, Salario
FROM FUNCIONARIO
WHERE Salario >= ALL (
    SELECT Salario
        FROM FUNCIONARIO )
Subconsulta independente
Subconsulta independente
SELECT Pnome, Unome, Salario
FROM FUNCIONARIO
WHERE Salario NOT IN (
    SELECT Salario
    FROM FUNCIONARIO
    WHERE Salario < ANY (
        SELECT Salario
        FROM FUNCIONARIO ) )
Subconsulta independente
Subconsulta correlata
SELECT Pnome, Unome, Salario
FROM FUNCIONARIO AS EXTERNA
WHERE Salario NOT IN (
    SELECT Salario
    FROM FUNCIONARIO AS CENTRAL
    WHERE EXISTS (
        SELECT Salario
        FROM FUNCIONARIO AS INTERNA
        WHERE CENTRAL.Salario < INTERNA.Salario )
)

Exemplo 04: Funções agregadas

Qual o nome e salário dos funcionários que trabalham em 01 (um) ou em 04 (quatro) projetos?

Classificação SQL
Subconsulta correlata SELECT Pnome, Unome
FROM FUNCIONARIO
WHERE (
    SELECT COUNT(*)
    FROM TRABALHA_EM
    WHERE FUNCIONARIO.Cpf = TRABALHA_EM.Fcpf )
            IN (1, 4)

Exemplo 05: Operação UNIÃO

Qual o Cpf, nome e salário dos funcionários que são supervisores "ou" possuem dependentes?

Classificação SQL
Subconsulta independente SELECT Cpf, Pnome, Unome, Salario
FROM FUNCIONARIO
WHERE Cpf IN
      ( SELECT Cpf_supervisor FROM FUNCIONARIO )
      OR Cpf IN
      ( SELECT Fcpf FROM DEPENDENTE )

Exemplo 06: Operação INTERSEÇÃO

Qual o Cpf, nome e salário dos funcionários que são supervisores "e" possuem dependentes?

Classificação SQL
Subconsulta independente SELECT Cpf, Pnome, Unome, Salario
FROM FUNCIONARIO
WHERE Cpf IN
      ( SELECT Cpf_supervisor FROM FUNCIONARIO )
      AND Cpf IN
      ( SELECT Fcpf FROM DEPENDENTE )

Exemplo 07: Operação DIFERENÇA

Qual o Cpf, nome e salário dos funcionários que são supervisores "mas não" possuem dependentes?

Classificação SQL
Subconsulta independente SELECT Cpf, Pnome, Unome, Salario
FROM FUNCIONARIO
WHERE Cpf IN
      ( SELECT Cpf_supervisor FROM FUNCIONARIO )
      AND Cpf NOT IN
      ( SELECT Fcpf FROM DEPENDENTE )

Atividade (data limite: 26/09/2021 23h59min59s)

Criar uma issue no projeto https://github.com/plinioleitao/bd-2021-1-bia, com o título "Tópico 21", para responder:

  1. Você consegue entender e usar os exemplos de subconsulta apresentados no tópico?
    Favor selecionar uma das respostas a seguir:
    "Sim, eu consigo entender e usar os exemplos de subconsulta apresentados no tópico", ou
    "Não, pois eu tenho as seguintes dificuldades: blá, blá, ...". Nesta resposta, você deve descrever as suas dificuldades, em vez de apenas listá-las.

Artefatos

  1. Issue criada no projeto https://github.com/plinioleitao/bd-2021-1-bia, cujo título é "Tópico 21", para entender e usar subconsultas em consultas da SQL.