BDDAD Bases de Dados Linguagem SQL Comando SELECT Nelson Freire (ISEP LEI-BDDAD 2015/16) 1/9
Subquery Consiste num SELECT Dentro de outro. Que utiliza o resultado de outro SELECT. Exemplo Relação: Pessoa(, Nome,, Salario, ) Consulta: Lista de pessoas com o menor salário Nº de SELECT s encadeados Ilimitado 1/8 SELECT Nome FROM Pessoa WHERE Salario = ( SELECT MIN(Salario) FROM Pessoa ) SELECT exterior: Contém SELECT SELECT interior : Incluído no SELECT exterior. Tem acesso à tabela exterior. Neste caso: Usado como operando de condição WHERE. WHERE Salario = MIN(Salario) Ilegal Nelson Freire (ISEP LEI-BDDAD 2015/16) 2/9
Comando SELECT Pode ser incluído nas cláusulas: 2/8 Cláusula Observação SELECT SELECT pode ser operando numa expressão. Exemplo: SELECT nome, valor + (SELECT MAX( ) FROM ), FROM SELECT FROM (SELECT ) T, - - T serve de sinónimo (alias) WHERE HAVING SELECT pode ser operando nas condições: IN // Testa se valor pertence ao resultado do SELECT interior. EXISTS // Testa se resultado do SELECT interior não é vazio. ANY /* Testa se pelo menos um valor do resultado do SELECT interior satisfaz a condição especificada. */ ALL /* Testa se todos os valores do resultado do SELECT interior satisfazem a condição especificada */ Semelhante à cláusula WHERE. Nelson Freire (ISEP LEI-BDDAD 2015/16) 3/9
Funcionamento das Queries Depende do seu tipo Tipos de Não-Correlacionadas Correlacionadas Tipos de 3/8 Nelson Freire (ISEP LEI-BDDAD 2015/16) 4/9
SELECT Interior Não depende de valores do SELECT exterior Não referencia coluna do SELECT exterior Exemplo: Sentido da Execução Do interior para exterior SELECT interior executado Em 1º lugar 1 vez // teoricamente Não-Correlacionadas SELECT P1.Nome FROM Pessoa P1 WHERE P1.Salario = ( SELECT MIN(P2.Salario) FROM Pessoa P2 ) Porque SELECT exterior É que depende do SELECT interior Logo, executado depois. Valor constante para todas as linhas da tabela exterior 4/8 Nomes de pessoas com o menor salário Nelson Freire (ISEP LEI-BDDAD 2015/16) 5/9
Correlacionadas SELECT Interior Depende de valores do SELECT exterior Executado Tantas vezes quanto o SELECT exterior // semelhante a FOR s encaixados. Sentido da Execução Do exterior para o interior SELECT interior espera por valor do SELECT exterior Exemplo Relações: Pessoa( Id, Nome,, Salario, ) Comissao (, Id, Valor, ) Resultado: Pessoas cujo salário é inferior às suas comissões. SELECT Nome, Salario FROM Pessoa P WHERE Salario < ( SELECT SUM(Valor) FROM Comissao C WHERE C.Id = P.Id ) Valor variável que depende da linha da tabela exterior SELECT executado para cada pessoa Faz a ligação ao SELECT exterior Nome coluna associada ao respetivo SELECT (não é necessário C.Valor) SELECT interior tem de retornar uma única linha quando é usada em operadores relacionais ou lógicos. Nelson Freire (ISEP LEI-BDDAD 2015/16) 6/9 5/8
Tipos de Não-Correlacionadas Correlacionadas Características Resumo dos Tipos de 6/8 Caraterísticas SELECT Interior Não-Correlacionado SELECT Interior Correlacionado Dependência do SELECT Exterior Não depende Depende Sentido de Execução Exterior Interior SELECT ( SELECT( ) ) /* interior executado 1º e só depois o exterior */ Exterior Interior SELECT ( SELECT( ) ) /* execução interior intercalada com execução exterior */ Execução do SELECT interior 1 vez nº de vezes = ao do SELECT exterior Nelson Freire (ISEP LEI-BDDAD 2015/16) 7/9
Operadores IN e EXISTS 7/8 Operador Exemplo Observação IN coluna [NOT] IN (Subquery) Operador binário. Verifica se valor existe no resultado de uma subquery. Conjunto pode ser uma subquery. EXISTS [NOT] EXISTS (Subquery) Operador unário. Verifica se resultado de subquery é ou não um conjunto vazio. Pode ser usado em vez de INTERSECT Operador INTERSECT - exclusivo Oracle Exemplos SELECT Nome, Cod_Postal FROM Pessoa P WHERE Cod_Postal IN ( SELECT Codigo FROM Postal WHERE Localidade = Lisboa ) SELECT Nome, Cod_Postal FROM Pessoa P WHERE EXISTS ( SELECT Codigo FROM Postal WHERE P.Cod_Postal = Codigo AND Localidade = Lisboa ) Nelson Freire (ISEP LEI-BDDAD 2015/16) 8/9
Condições ANY e ALL Condições ANY e ALL 8/8 Palavra-Reservada Sintaxe Observação ANY expressão operador ANY(subquery) Condição ANY retorna TRUE quando qualquer dos valores do resultado da subquery satisfaz a condição. ALL expressão operador ALL(subquery) Condição ALL retorna TRUE quando todos os valores do resultado da subquery satisfazem a condição. Operador (relacional) >, <, >=, <=, =, <>,!= Exemplo: valor > ANY (SELECT ) valor <= ANY (SELECT ) valor > ALL(SELECT ) valor <= ALL (SELECT ) Nelson Freire (ISEP LEI-BDDAD 2015/16) 9/9